Archive for 3月, 2014

2014/03/31 現在見えているWiFiネットワークの情報を返す

現在Macから見えているWiFi(無線LAN)ネットワークの情報を取得するAppleScriptです。

ssid1.png

airportコマンドでいろいろ情報を取得しているので、WiFiネットワーク名(SSID_STR)以外にもいろいろ取得できます。

記述してテストしたのはSSD搭載のMacBook Pro Retinaだったのですが、airportコマンドで情報をplistに書き込ませたあとにSystem Eventsで読み込む際、ディスクの書き込みが終わる前に次の処理に進んでしまって「ファイルがない」と言われるケースがあったので、少々しつこくsyncコマンドを実行しています。

あとは、WiFiネットワークが見えたり見えなかったりで、実行するたびに毎回結果が微妙に異なったりするのは「お約束」です。

気のせいか、airportコマンドで-xでXML出力指定すると、(オプションによっては)通常出力される場合とデータ項目数が微妙に異なっている場合があるように見えます。「-I -x」と指定したときに、単に「-I」とは項目が違っており、びみょーにバグの香りが、、、、

スクリプト名:現在見えているWiFiネットワークの情報を返す

set aRec to getVisibleWiFiNetInfo() of me

set nList to {}

repeat with i in aRec
  set j to contents of SSID_STR of item 2 of i
  
set the end of nList to j
end repeat

nList
–> {”0622XXXXXXXX-X”, “ExtrXXXXXXX_XX”, “Buffalo-X-XXXX”, “0024XXXXXXXX”, “auhome_XXXXXX”, “BCW7XXXXXXXXXXX”, “0024XXXXXXXX-X”, “4CE6XXXXXXXX-X”, “BCW7XXX-XXXXX-X”, “4CE6XXXXXXXX”}

–現在見えているWiFiネットワークの情報を返す
on getVisibleWiFiNetInfo()
  
  
–一時ファイルのパス生成
  
set tPath to retTempPosixPath(“.plist”) of me
  
  
do shell script (“/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -s -x > “ & tPath)
  
  
do shell script “sync” –たまにディスク書き込みが間に合わないケースがあったので、強制実行
  
do shell script “sync” –たまにディスク書き込みが間に合わないケースがあったので、強制実行
  
do shell script “sync” –たまにディスク書き込みが間に合わないケースがあったので、強制実行
  
  
set wifiRes to {}
  
  
tell application “System Events”
    set plif to property list file tPath
    
set pitm to every property list item of plif
    
repeat with p in pitm
      set end of wifiRes to {name, value} of p
    end repeat
  end tell
  
  
–一時ファイルの削除
  
do shell script “rm -f “ & tPath
  
  
return wifiRes
  
end getVisibleWiFiNetInfo

–テンポラリフォルダ内のテンポラリファイルを返す
on retTempPosixPath(aExt)
  set tPath to path to temporary items from user domain
  
set tpPath to POSIX path of tPath
  
set aFile to (do shell script “uuidgen”) & aExt
  
set tFile to tpPath & aFile
  
return tFile
end retTempPosixPath

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2014/03/31 NTTコミュニケーションズのVOIP電話アプリ「050 plus」で電話番号を指定して発信

NTTコミュニケーションズのVOIP電話アプリ「050 plus」で電話番号を指定して発信……するんじゃないかというAppleScriptです。

050p.png

050 plusは契約することで050番号での発信/着信が行えるvoip電話サービスです。Mac用アプリケーションがMac AppStoreで公開された(無料アプリ)ので、興味本位でダウンロードして……アプリケーションバンドルの中身をほじくり返して、いろいろ調べてみました。

すると、Info.plistにURLスキームの登録があり、それを読むかぎりでは、こんな感じでAppleScriptから指定電話番号への発信が行えるはずです。

「はず」というのは、私自身が050 plusに契約していないからで…………この確認のためだけに契約するというのもナニですし、どなたか契約中の方はぜひお試しを。そして、結果を教えてください。

スクリプト名:050plusで指定の電話番号を発信する
set aURL to “com050voip:177″ –com050voip://177かも?
open location aURL

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2014/03/30 画像の縦長横長を見てフォルダ仕分け v2

指定フォルダ内の画像の縦横のドット数を見て、縦長の画像か横長の画像かを検出して、フォルダ分けするAppleScriptです。

元ネタはAppleのサンプルScript(変数名の命名ルールがAppleっぽい)だったのですが、書いたのが随分昔で最近も使っていなかったため、その後のOSのバージョンアップで動かなくなっていたのを検出できていませんでした。

問題のあった部分を書き直しておきました。

スクリプト名:画像の縦長横長を見てフォルダ仕分け v2
set a to choose folder with prompt "画像フォルダを選択"
tell application "Finder"
  set allF to every file in a
end tell

set b to choose folder with prompt "出力先フォルダ(縦)を選択"
set c to choose folder with prompt "出力先フォルダ(横)を選択"

tell application "Image Events" to launch
repeat with i in allF
  set j to i as alias
  
set bb to retDirectionOfImage(j) of me
  
if bb = false then
    tell application "Finder"
      move i to b
    end tell
  else
    tell application "Finder"
      move i to c
    end tell
    
  end if
end repeat

on retDirectionOfImage(aFile)
  tell application "Image Events"
    activate
    
set this_image to open aFile
    
set {aWidth, aHeight} to dimensions of this_image
    
close this_image –修正した
  end tell
  
if aHeight > aWidth then
    return false –縦
  else
    return true –横
  end if
end retDirectionOfImage

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2014/03/24 Xcode 5.1でAppleScriptObjC関連の機能が向上

3月に入ってXcode 5.1がリリースされ、AppleScriptObjCまわりの機能が向上したことが明らかになりました(ちょっとだけ)。

以前のXcode バージョン5.0.2では、OS X 10.9になってあたらしくサポートされた、

 on clicked:sender

  tell current application
   display dialog “TEST”
  end tell

 end clicked:

のような記法を行うと、Interface Builder上で「clicked:」イベントハンドラをGUI部品に紐づけようとしたときに、画面上で見えなくなるという問題がありました。Xcode 5.1では、これが解消されています。

xc51.png

あとは、GC=オンのビルドができなくなっています。いつかはこの日が来ると思っていましたが、案外早く到来しました。

2014/03/20 Gapplin v1.2.3でAppleScript対応機能をひととおり確認

フリーのSVGビューワー「Gapplin」v1.2.3がリリースされました。

以前はAppleScript対応機能に問題があって、(AppleScript経由での)SVGファイルの他のグラフィックフォーマットへの変換などが機能していなかったのですが、本バージョンからは機能するようになりました。

ただし、SVGファイルをGapplinにオープンする際に、

gap1.png

といったエラーメッセージが出るケースがあり、いますこしの熟成が必要という印象を受けます。

あと、書き出されたTIFF画像に添付されているICC Profileが謎のキリル文字(「一般RGB」を指定しているもよう)で文字化けした状態で名称が表示されており、ちょっと謎です(Photoshopでオープンすると一般RGBと解釈される)。

gap4.png

AppleScriptでSVGファイルのオープンを行わせる場合には、try〜on errorのエラートラップを仕掛けて、オープン時に発生するかもしれないエラーに備えることをお忘れなく。各機能にアクセスするたびにエラートラップを仕掛けてエラー処理を行わないと、大量のSVGファイルの処理を行うにはちょっとまだ心もとない感じがします。

指定フォルダ以下に存在するすべてのSVGファイルを取得して、TIFFに変換するサンプルのAppleScriptを書いてみました。極力、Gapplinを信用しないで処理を行っています。

スクリプト名:test3.scpt
script spd
  property origList : {}
end script

set origList of spd to {}

tell application “Gapplin”
  close every document saving no –ねんのため、オープン中の書類をすべてクローズ
end tell

set aFol to choose folder with prompt “変換対象のSVGファイルの入っているフォルダを選択”

set bFol to choose folder with prompt “出力先フォルダを選択” –変換後のファイル名
set bPathStr to bFol as string

–mdfindで指定フォルダ以下にあるすべてのSVGファイルを取得
set (origList of spd) to getFileListWithSpotLight(“kMDItemContentType”, “public.svg-image”, aFol) of me

–変換をループで行う
repeat with i in (origList of spd)
  
  
set j to contents of i
  
tell application “Finder”
    set aName to name of j
  end tell
  
  
set newPath to bPathStr & aName & “.tiff”
  
  
–エラー検出は行っているが、エラー後の対策処理はとくに行っていない
  
set aRes to exportASVGtoFol(j, newPath) of me
  
end repeat

–指定のSVGファイルをTIFFに変換
on exportASVGtoFol(aSVG, outPath)
  tell application “Gapplin”
    
    
–GUI側からファイルのオープンを問題なく行えるのに、AS側からオープンするとエラーになるケースが見られた。その対策
    
try
      open aSVG
    on error
      return false
    end try
    
    
–ファイルをオープンしても、AppleScript側に通知されるまでに時間がかかるケースが見られた(大量にSVGファイルを処理した場合に発生)。その対策
    
set ofF to false
    
repeat 100 times
      set dCount to count every document
      
if dCount 1 then
        set ofF to true
        
exit repeat
      end if
      
delay 0.1
    end repeat
    
if ofF = false then return false
    
    
–ファイル書き出しでエラーが出る場合に備える
    
try
      tell document 1
        export to file outPath as TIFF
        
close saving no
      end tell
    on error
      return false
    end try
  end tell
  
  
return true
end exportASVGtoFol

–指定階層下で、指定クリエータコードのファイルを取得(Mac OS X 10.4.x以上で動作)
on getFileListWithSpotLight(aMetaDataItem, aParam, startDir)
  
  
set sDirText to quoted form of POSIX path of startDir
  
set shellText to “mdfind ‘” & aMetaDataItem & ” == \”" & aParam & “\”‘ -onlyin “ & sDirText
  
try
    set aRes to do shell script shellText
  on error
    return {}
  end try
  
set pList to paragraphs of aRes
  
set aList to {}
  
repeat with i in pList
    set aPath to POSIX file i
    
set aPath to aPath as alias
    
set the end of aList to aPath
  end repeat
  
return aList
end getFileListWithSpotLight

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

Gapplin v1.2.3のAppleScript用語辞書を前バージョンと差分チェックしてみたところ、documentオブジェクトにtextというプロパティが追加されたことを確認しました。

フリーのSVGデータをopenclipartのサイトであさって、いろいろ調べてみたところ……

gap2.png

この「MoonBook」というSVGグラフィックのロゴ部分に書かれている「MoonBook」という文字がtext属性として取得できることを確認。実際に、SVGデータをテキストとしてオープンし、中身を確認してみたところ……

gap3.png

textタグで囲まれたデータがtext属性に出力されていることを確認しました。なかなか面白い試みだと思います。

2014/03/08 なんでもデータを文字列化 v2

AppleScriptがネイティブでもっているデータ型(integer, number, real, string, text, Unicode text, list, record、boolean、missing value)を文字列化するAppleScriptです。

# 本来、AppleScriptにはlistやrecordをそのままテキストにcastする機能はありません

掲載したプログラムで、boolean(true/false)とmissing valueが抜けていたので対応したものです。

リストに入ったレコードも文字列化しますし、リストを含んだレコードも文字列化します。

データのログ書き出しやら、AppleScriptの実行結果をテキストエディタやらMacJournalやらに文字で返す場合に利用します。

各アプリケーションのオブジェクトについても、AppleScriptエディタをAppleScriptからコントロールすれば、なんとか文字列として取得できるのですが……「そこまでやるの?」という点が疑問だったのでやっていません。

スクリプト名:なんでもデータを文字列化 v2
set a to {{aName:“PiyoPiyo”, anAge:10}, {aName:“Piyoko”, anAge:9}} –record in list
–set a to {aName:”PiyoPiyo”, anAge:10}–record
–set a to {{1, 2, 3}, {4, 5, 6}}–list
–set a to 1.0 as real–real
–set a to 1 as integer–integer
–set a to “1.0″ as string–string
–set a to true–boolean
–set a to front window of application “Finder”–アプリケーションのオブジェクトはエラーになるよ!
–set a to missing value

set aRes to convToStr(a) of somethingToStrKit
–> “{{aName:\”PiyoPiyo\”, anAge:10}, {aName:\”Piyoko\”, anAge:9}}”

–リストでもレコードでもなんでも文字列化して返すキット
script somethingToStrKit
  
  
on convToStr(aRec)
    
    
set aClass to (class of aRec) as string
    
    
if (aClass = “integer”) or (aClass = “number”) or (aClass = “real”) or (aClass = “string”) or (aClass = “text”) or (aClass = “Unicode text”) or (aClass = “boolean”) then
      set aRes to aRec as string
    else if aClass is “list” then
      set aRes to listToString(aRec)
    else if aClass is “record” then
      set aRes to recToString(aRec)
    else
      try
        set aRes to aRec as string
      on error
        –アプリケーションのオブジェクトとかはエラーで返す
        
return false
      end try
    end if
    
    
return aRes
    
  end convToStr
  
  
  
–レコードをStringに変換
  
  
–エラートラップを使って、わざとエラーを発生させ、エラーメッセージからレコードをstringに変換する
  
on recToString(aRec)
    
    
–レコードを無理矢理stringにcastして、エラーメッセージを取得する
    
try
      set a to aRec as string –ここでエラー発生
    on error aMes
      set a to aMes
    end try
    
    
–エラーメッセージ文字列から、元のレコードの情報を組み立てる
    
set b to trimStrFromTo(a, “{”, “}”)
    
set b to “{” & b & “}”
    
    
return b
    
  end recToString
  
  
  
on trimStrFromTo(aStr, fromStr, toStr)
    –fromStrは前から探す
    
if fromStr is not equal to “” then
      set sPos to (offset of fromStr in aStr) + 1
    else
      set sPos to 1
    end if
    
    
–toStrは後ろから探す
    
if toStr is not equal to “” then
      set b to (reverse of characters of aStr) as string
      
set ePos to (offset of toStr in b)
      
set ePos to ((length of aStr) - ePos)
    else
      set ePos to length of aStr
    end if
    
set aRes to text sPos thru ePos of aStr
    
    
return aRes
    
  end trimStrFromTo
  
  
  
–リストおよびリストに入ったレコードをStringに変換
  
  
on listToString(aList)
    set listText to {“{”}
    
set quotChar to ASCII character 34
    
set firstFlag to true
    
    
repeat with i in aList
      set j to contents of i
      
set aClass to (class of i) as string
      
if (aClass = “integer”) or (aClass = “number”) or (aClass = “real”) then
        set the end of listText to (getFirst(firstFlag) of me & j as text)
        
set firstFlag to false
      else if (aClass = “string”) or (aClass = “text”) or (aClass = “Unicode text”) then
        set the end of listText to ((getFirst(firstFlag) of me & quotChar & j as text) & quotChar)
        
set firstFlag to false
      else if aClass is “list” then
        set the end of listText to (getFirst(firstFlag) & listToString(j)) –ちょっと再帰処理
        
set firstFlag to false
      else if aClass is “record” then
        set the end of listText to (getFirst(firstFlag) & recToString(j))
        
set firstFlag to false
      end if
    end repeat
    
    
set the end of listText to “}”
    
set listText to listText as text
    
    
return listText
  end listToString
  
  
on getFirst(aFlag)
    if aFlag = true then return “”
    
if aFlag = false then return “, “
  end getFirst
  
end script

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2014/03/07 なんでもデータを文字列化

AppleScriptがネイティブでもっているデータ型(integer, number, real, string, text, Unicode text, list, record)を文字列化するAppleScriptです。

「なんでも」と書いておいてナニですが、アプリケーションのオブジェクト(window 1 of application “Finder”など)を入れて渡しても文字列化はしてくれません。

リストに入ったレコードも文字列化しますし、リストを含んだレコードも文字列化します。

データのログ書き出しやら、AppleScriptの実行結果をテキストエディタやらMacJournalやらに文字で返す場合に利用するものです。

スクリプト名:なんでもデータを文字列化
set a to {{aName:“PiyoPiyo”, anAge:10}, {aName:“Piyoko”, anAge:9}} –record in list
–set a to {aName:”PiyoPiyo”, anAge:10}–record
–set a to {{1, 2, 3}, {4, 5, 6}}–list
–set a to 1.0 as real–real
–set a to 1 as integer–integer
–set a to “1.0″ as string–string
–set a to front window of application “Finder”–アプリケーションのオブジェクトはエラーになるよ!

set aRes to convToStr(a) of somethingToStrKit
–> “{{aName:\”PiyoPiyo\”, anAge:10}, {aName:\”Piyoko\”, anAge:9}}”

–リストでもレコードでもなんでも文字列化して返すキット
script somethingToStrKit
  
  
on convToStr(aRec)
    
    
set aClass to (class of aRec) as string
    
    
if (aClass = “integer”) or (aClass = “number”) or (aClass = “real”) or (aClass = “string”) or (aClass = “text”) or (aClass = “Unicode text”) then
      set aRes to aRec as string
    else if aClass is “list” then
      set aRes to listToString(aRec)
    else if aClass is “record” then
      set aRes to recToString(aRec)
    else
      –アプリケーションのオブジェクトとかはエラーで返す
      
return false
    end if
    
    
return aRes
    
  end convToStr
  
  
  
–レコードをStringに変換
  
  
–エラートラップを使って、わざとエラーを発生させ、エラーメッセージからレコードをstringに変換する
  
on recToString(aRec)
    
    
–レコードを無理矢理stringにcastして、エラーメッセージを取得する
    
try
      set a to aRec as string –ここでエラー発生
    on error aMes
      set a to aMes
    end try
    
    
–エラーメッセージ文字列から、元のレコードの情報を組み立てる
    
set b to trimStrFromTo(a, “{”, “}”)
    
set b to “{” & b & “}”
    
    
return b
    
  end recToString
  
  
  
on trimStrFromTo(aStr, fromStr, toStr)
    –fromStrは前から探す
    
if fromStr is not equal to “” then
      set sPos to (offset of fromStr in aStr) + 1
    else
      set sPos to 1
    end if
    
    
–toStrは後ろから探す
    
if toStr is not equal to “” then
      set b to (reverse of characters of aStr) as string
      
set ePos to (offset of toStr in b)
      
set ePos to ((length of aStr) - ePos)
    else
      set ePos to length of aStr
    end if
    
set aRes to text sPos thru ePos of aStr
    
    
return aRes
    
  end trimStrFromTo
  
  
  
–リストおよびリストに入ったレコードをStringに変換
  
  
on listToString(aList)
    set listText to {“{”}
    
set quotChar to ASCII character 34
    
set firstFlag to true
    
    
repeat with i in aList
      set j to contents of i
      
set aClass to (class of i) as string
      
if (aClass = “integer”) or (aClass = “number”) or (aClass = “real”) then
        set the end of listText to (getFirst(firstFlag) of me & j as text)
        
set firstFlag to false
      else if (aClass = “string”) or (aClass = “text”) or (aClass = “Unicode text”) then
        set the end of listText to ((getFirst(firstFlag) of me & quotChar & j as text) & quotChar)
        
set firstFlag to false
      else if aClass is “list” then
        set the end of listText to (getFirst(firstFlag) & listToString(j)) –ちょっと再帰処理
        
set firstFlag to false
      else if aClass is “record” then
        set the end of listText to (getFirst(firstFlag) & recToString(j))
        
set firstFlag to false
      end if
    end repeat
    
    
set the end of listText to “}”
    
set listText to listText as text
    
    
return listText
  end listToString
  
  
on getFirst(aFlag)
    if aFlag = true then return “”
    
if aFlag = false then return “, “
  end getFirst
  
end script

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2014/03/06 MacJournalで選択中のテキストにASが存在すれば実行して結果を返す

選択範囲(selected text)の読み書きができるようになったMacJournal 6.10で、作者のDan Schimpfいわく「そんなことしてどーすんだ?」と疑問を呈していたとのこと。

テキストエディタ的なソフトウェアで、selectionの書き換えができないと逆に不便で仕方ないのですが……ここは、選択範囲の書き換えができるから「こそ」の用途を提示してみる必要があります。

書いておいた日本語の文章をparseして簡易コマンドを受け付けるようにするとか(すべてAppleScriptで記述した人工知能風インタフェース「Newt On」的に)、いろいろありますが……空いた時間にちょっと作ってみたのがコレです。

MacJournalのEntry本文中に<AppleScript>〜</AppleScript>のタグでくくったAppleScriptを書いておいて、本Scriptを(Script Menuなどから)実行すると、選択範囲中のテキストをAppleScriptとみなして、実行し、結果をMacJournalの選択範囲のうしろに返します。

実行すると危険なScriptでも強引に実行してしまうので、事前に実行しても安全なものだけを実行してください。

プログラムとドキュメントと実行結果やスクリーンショットなどをMacJournal上で一括管理して、Script単体で転がしておくと、操作手順や実行結果の履歴などをほったらかしにしがちなところを「なんでも取り込める」MacJournal上でまとめておくことができるのでは? というアイデアを手っ取り早くAppleScriptとして書いてみたものです。

mj10.png
▲MacJournalのエントリに、タグでくくったAppleScriptを書いて、選択する

mj11.png
▲Script Menuから本Scriptを呼び出す

mj12.png
▲MacJournalに書かれていたAppleScriptを実行

mj13.png
▲結果をMacJournalに返す。RecordやListでもテキストに(強引に)変換して返す

mj14.png
▲用意しておいた別のScriptを選択して実行

mj15.png
▲実行結果である100個の乱数をMacJournalに返した

スクリプト名:MacJournalで選択中のテキストにASが存在すれば実行して結果を返す
property asBeginTag :
property asEndTag : “”

tell application “MacJournal”
  tell document 1
    set aSel to selected text
  end tell
end tell

set aSel to aSel as string

if ( is in aSel) and (“” is in aSel) then
  
  
–replace double quote characters
  
set bSel to repChar(aSel, ““”, “\”") of me
  
set bSel to repChar(bSel, “””, “\”") of me
  
  
set aPos to offset of asBeginTag in bSel
  
set bPos to offset of asEndTag in bSel
  
  
if bPos > aPos then
    set scriptStr to text (aPos + (length of asBeginTag) + 1) thru (bPos - 1) of bSel
    
    
try
      set aRes to run script scriptStr
    on error erM
      set aRes to erM
    end try
  else
    
    
tell application “MacJournal”
      display dialog “AS Fetch Error” buttons {“OK”} default button 1 with icon 1
    end tell
    
    
return
    
  end if
  
  
set aClass to (class of aRes) as string
  
if aClass = “record” then
    set aRes to recToString(aRes) of recToStrKit
  else if aClass = “list” then
    set aRes to listToText(aRes) of me
  else
    set aRes to aRes as string
  end if
else
  tell application “MacJournal”
    display dialog “AS Fetch Error” buttons {“OK”} default button 1 with icon 1
  end tell
  
  
return
  
end if

tell application “MacJournal”
  tell document 1
    set selected text to aSel & return & “–> “ & aRes
  end tell
end tell

–文字置換ルーチン
on repChar(origText, targStr, repStr)
  set {txdl, AppleScript’s text item delimiters} to {AppleScript’s text item delimiters, targStr}
  
set temp to text items of origText
  
set AppleScript’s text item delimiters to repStr
  
set res to temp as text
  
set AppleScript’s text item delimiters to txdl
  
return res
end repChar

–リストを任意のデリミタ付きでテキストに
on retArrowText(aList, aDelim)
  set aText to “”
  
set curDelim to AppleScript’s text item delimiters
  
set AppleScript’s text item delimiters to aDelim
  
set aText to aList as text
  
set AppleScript’s text item delimiters to curDelim
  
return aText
end retArrowText

script recToStrKit
  
  
–エラートラップを使って、わざとエラーを発生させ、エラーメッセージからレコードをstringに変換する
  
on recToString(aRec)
    
    
–レコードを無理矢理stringにcastして、エラーメッセージを取得する
    
try
      set a to aRec as string –ここでエラー発生
    on error aMes
      set a to aMes
    end try
    
    
–エラーメッセージ文字列から、元のレコードの情報を組み立てる
    
set b to trimStrFromTo(a, “{”, “}”)
    
set b to “{” & b & “}”
    
    
return b
    
  end recToString
  
  
  
on trimStrFromTo(aStr, fromStr, toStr)
    –fromStrは前から探す
    
if fromStr is not equal to “” then
      set sPos to (offset of fromStr in aStr) + 1
    else
      set sPos to 1
    end if
    
    
–toStrは後ろから探す
    
if toStr is not equal to “” then
      set b to (reverse of characters of aStr) as string
      
set ePos to (offset of toStr in b)
      
set ePos to ((length of aStr) - ePos)
    else
      set ePos to length of aStr
    end if
    
set aRes to text sPos thru ePos of aStr
    
    
return aRes
    
  end trimStrFromTo
  
end script

on listToText(aList)
  set listText to {“{”}
  
set quotChar to ASCII character 34
  
set firstFlag to true
  
repeat with i in aList
    set j to contents of i
    
set aClass to class of i
    
if (aClass = integer) or (aClass = number) or (aClass = real) then
      set the end of listText to (getFirst(firstFlag) of me & j as text)
      
set firstFlag to false
    else if (aClass = string) or (aClass = text) or (aClass = Unicode text) then
      set the end of listText to ((getFirst(firstFlag) of me & quotChar & j as text) & quotChar)
      
set firstFlag to false
    else if aClass is list then
      set the end of listText to (getFirst(firstFlag) of me & listToText(j)) –ちょっと再帰処理
      
set firstFlag to false
    end if
  end repeat
  
set the end of listText to “}”
  
set listText to listText as text
  
return listText
end listToText

on getFirst(aFlag)
  if aFlag = true then return “”
  
if aFlag = false then return “,”
end getFirst

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2014/03/06 MacJournal 6.10で選択中のテキスト(selected text)の書き換えが可能に

Dan Schimpf Software(販売はMariner Software)のジャーナリングソフトウェア(日常の雑多なメモやWebページの内容をコピペして放り込んでおく記録ソフト)「MacJournal」は誰にでもおすすめできる「定番ソフトウェア」です。iOS版とのデータのシンクロもスピーディーに行うことができ、非常に有用性が高いソフトウェアです。

img_2443.jpg

最新のバージョン6.10で、AppleScriptの機能が強化され、選択中のテキスト(selected text)を書き換えられるようになりました(r/oからr/wになった)。

mj0.png

前回紹介したときに、『「読むだけで書けない」というのはナンセンスです。』と書いていましたが、今回のアップデートで対応されたことになります。

MacJournal上で、

mj1.png

と、テキストを選択した状態で……

スクリプト名:MacJournalでselected textを書き換えるテスト
tell application “MacJournal”
  tell document 1
    
    
set a to selected text
    
set selected text to “text”
    
  end tell
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

というテストAppleScriptを実行すると……

mj2.png

のようになります。選択範囲を書き換えると、選択範囲が解除されるのでその点にのみご注意ください。