「display text fields」AppleScriptライブラリをv1.3にアップデートしました。
–> Download display text fields_v13 (To ~/Library/Script Libraries/)
v1.3ではテキストフィールドの最大横幅の計算を修正し、フィールド数が増えたときにダイアログ上から項目がはみ出さないようにScroll Viewをつけるようにしました。
本来目的としていた用途に使ってみたらイマイチだった点を修正した格好です。AppleScriptで取得した各種アプリケーションのオブジェクトのプロパティ情報をダイアログ上で一覧表示して確認するというのが、自分がこのライブラリを作った目的です。
以下は、サンプルスクリプト「文字列で指定したAppleScriptの実行結果をテキストで取得する v2」についての説明です。
割とえげつない処理をしていますが、作りためておいたルーチンを引っ張り出してきただけなので、書くのにさほど時間はかけていません。
こうしたAppleScriptのプロパティ値をparseするには、スクリプトエディタの結果欄を文字列として取得するか(GUI Scripting経由でやったことがあります)、こうしてメモリ上にスクリプトエディタ+結果表示用のビューを生成してメモリ上でAppleScriptを実行して結果をテキストで取得するということになると思います。前者だとGUI Scriptingの実行権限が必要になるため、Cocoaの機能を利用したほうが手軽という状況です。
(途中で入れ替えた)v2では、macOS 10.15対応、ランタイム環境によってはうまく動かない「as anything」の使用をやめるなどの変更を加えました。
AppleScript名:文字列で指定したAppleScriptの実行結果をテキストで取得する v2.scpt |
— Created 2016-01-08 by Takaaki Naganoya — 2016 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "OSAKit" use framework "AppKit" use tfLib : script "display text fields" property OSAScript : a reference to current application’s OSAScript property NSTextView : a reference to current application’s NSTextView property OSAScriptView : a reference to current application’s OSAScriptView property OSAScriptController : a reference to current application’s OSAScriptController property myRes : "" –OSのメジャーバージョンを数値で取得 set osVer to system attribute "sys2" if osVer ≥ 15 then set srcStr to "tell application \"Music\" set aSel to first item of selection set aRes to (properties of aSel) end tell" else set srcStr to "tell application \"iTunes\" set aSel to first item of selection set aRes to (properties of aSel) end tell" end if my performSelectorOnMainThread:"getResultStringFromScript:" withObject:(srcStr) waitUntilDone:true set aRes to getListFromText(myRes) of me set aList to {} set bList to {} set aLen to length of aRes repeat with i from 1 to aLen set {aCon, bCon} to contents of item i of aRes set the end of aList to aCon set the end of bList to bCon end repeat confirm text fields main message "Track Info" sub message "Properties about selected track" key list aList value list bList –Get AppleScript’s Result as string on getResultStringFromScript:paramObj set srcStr to paramObj as string set myRes to "" set targX to 500 –View Width set targY to 200 –View Height set osaCon to OSAScriptController’s alloc()’s init() set osaView to OSAScriptView’s alloc()’s initWithFrame:(current application’s NSMakeRect(0, 0, targX, targY)) set resView to NSTextView’s alloc()’s initWithFrame:(current application’s NSMakeRect(0, 0, targX, targY)) resView’s setRichText:true resView’s useAllLigatures:true osaCon’s setScriptView:osaView osaCon’s setResultView:resView osaView’s setString:srcStr osaCon’s runScript:(missing value) set myRes to resView’s |string|() as string end getResultStringFromScript: –スクリプトエディタのresult欄に返ってきたテキストをリストに変える on getListFromText(aText) script getListFromTextO property aaText : "" property gList : {} property outList : {} property aG : "" property valList : {} end script copy aText to (aaText of getListFromTextO) set (gList of getListFromTextO) to {} set (outList of getListFromTextO) to {} set (aG of getListFromTextO) to "" set (valList of getListFromTextO) to {} if (aaText of getListFromTextO) does not start with "{" and (aaText of getListFromTextO) does not end with "}" then return {} end if set aLen to length of (aaText of getListFromTextO) set (aG of getListFromTextO) to text 2 thru -2 of (aaText of getListFromTextO) set (gList of getListFromTextO) to characters of (aG of getListFromTextO) set sPos to 2 –1文字目は\"{\"なので2文字目からスキャンを開始する set ePos to 2 set imdF to false –Immediate Data Flag(文字列中を示すダブルクォート内の場合にはtrueになる) set listF to 0 –stacking段数が入る set attrF to true –属性ラベルスキャン時にtrue、データ末尾スキャン時にfalse repeat with i in (gList of getListFromTextO) set j to contents of i if attrF = true and imdF = false and listF = 0 then –属性値部分の末尾検出 if j = ":" then if text sPos thru sPos of (aaText of getListFromTextO) = " " then set sPos to sPos + 1 end if set anOut to text sPos thru ePos of (aaText of getListFromTextO) set sPos to ePos + 1 set the end of (valList of getListFromTextO) to anOut set attrF to false –データのスキャンを開始する set imdF to false set listF to 0 end if else if imdF = false and listF = 0 and j = "," then –データ部分の末尾検出 set anOut to text sPos thru (ePos – 1) of (aaText of getListFromTextO) set sPos to ePos + 1 set the end of (valList of getListFromTextO) to anOut set the end of (outList of getListFromTextO) to (valList of getListFromTextO) set (valList of getListFromTextO) to {} set attrF to true –次が属性値ラベルであることを宣言 set imdF to false set listF to 0 else if j = "{" then if imdF = false then set listF to listF + 1 –1段スタックにpush end if else if j = "}" then if imdF = false then set listF to listF – 1 –1段スタックからpop end if else if j = "\"" then if imdF = true then set imdF to false else set imdF to true end if end if set ePos to ePos + 1 end repeat –ラストのデータ部分を出力 try set the end of (valList of getListFromTextO) to text sPos thru (ePos – 1) of (aaText of getListFromTextO) set the end of (outList of getListFromTextO) to (valList of getListFromTextO) on error false end try return contents of (outList of getListFromTextO) end getListFromText |