Script Editorをコントロールして、AppleScriptの各構文要素の色情報を取得するAppleScriptです。
AppleScriptの構文要素の色分けを取得するのに、当初はplistファイルから読み込んでいたのですが、途中から(Mac OS X 10.5あたり?)plistファイルのフォーマットがテキスト形式からバイナリ形式に変更になり、AppleScriptから読み込んでも判定できない内容になりました(Cocoaの機能を使うと読み取れるのですが)。
そこで、「プログラム的には意味はないが、対象の構文要素が入っているテキスト」でAppleScriptを新規ドキュメントを作成してコンパイル(構文確認)を実行。新規ドキュメントからリッチテキストとして書式情報を取得し、想定した文字の位置から指定構文要素に対応する色情報を取得します。
plistの保存形式が途中で変更されたのとは別に、書式つきテキスト(attribute runs)の挙動もOSバージョンによって微妙に変わってきました。
同じデータを与えても、書式の区切りが微妙に変わって、書式(色)情報を固定の箇所から読み取っていてはそのようなOSバージョン変更に伴う挙動の微妙な変更に対応し切れませんでした。そのため、文字列をサーチして毎回動的にデータ位置を検出するように書き換えた経緯があります。
本ルーチンは、変数名のリネーム用に作成したので構文要素確認用のダミーテキストは最低限のものだけを含んでいますが、その気になればすべての構文要素の色情報を取得可能です。
これとは別に、Cocoaの機能を用いてplistから構文書式情報を取得するAppleScriptも存在するものの、計算して微妙に色情報が合わないので、9年前に作成した本ルーチンを使い続けています(当時)。
→ さすがに重要なルーチンなので、Cocoa系の機能を使って処理するように書き換えました。いまはCocoa系ルーチンを使っています
AppleScript名:Script Editorをコントロールして各構文要素の色情報を取得する v5 |
— Created 2009-06-01 by Takaaki Naganoya — 2009-2018 Piyomaru Software set scList to getRexicalColorOfScriptEditor() of me –> {{32053, 4213, 32213}, {15672, 3071, 15831}, {2841, 6963, 64125}, {8259, 42547, 64473}, {0, 0, 0}, {32202, 16452, 3889}} –色書式データ。先頭から順番に、、、 –新規テキスト, 演算子など, スクリプティング予約語, コマンド名, 値(数値、データ), 変数およびサブルーチン名 –スクリプトエディタの各構文要素の指定色を返す –v5の変更点:Leopard以降のStyle runsの挙動変化(スペースを分離する/しない)に対応し、動的にサンプル文を走査するようにした –v4の変更点:構文要素検出時のテンポラリウィンドウ作成時にScript Editorを隠す –v3の変更点:重複時のエラー検出を追加 on getRexicalColorOfScriptEditor() set aRes to setVisibleOfSpecifiedProcess("Script Editor", false) of me set rexList to {"+", "set", "application", "Comment", "1", "a"} –文中から検索するテキスト要素 set colList to {} –色情報を入れるリスト tell application "Script Editor" set aDoc to make new document tell front document set aName to name –end tell –tell document aName –未コンパイル時のテキストを取得 set contents to "aaaaa" set rexItem1 to (color of attribute runs) set rexItem1 to contents of (item 1 of rexItem1) set colList to {rexItem1} –各種構文要素を含む文字を入れる set contents to "1 + 1 set a to \"abc\" tell application \"Finder\" end tell –Comment " –追加する場合には、テキストを後ろに追加すること try compile on error close without saving return false end try set rex1 to attribute runs set rex2 to color of attribute runs repeat with i in rexList set j to contents of i set rC to 1 repeat with ii in rex1 set jj to contents of ii set jj to replaceText(jj, " ", "") of me –スペースを削除する if j = jj then set the end of colList to contents of item rC of rex2 exit repeat –抜けていた end if set rC to rC + 1 end repeat end repeat close without saving end tell end tell –Script Editorの再表示 set aRes to setVisibleOfSpecifiedProcess("Script Editor", true) of me –要素の重複検出 set aRes to detectDuplicationSimple(colList) of me if aRes = false then return false else return colList end if end getRexicalColorOfScriptEditor –リスト中の重複検出 on detectDuplicationSimple(cList) copy cList to ccList set j to length of ccList repeat with i from 2 to j set first_item to item 1 of ccList set ccList to rest of ccList if first_item is in ccList then return false end if end repeat return true end detectDuplicationSimple –指定プロセスの可視/不可視切り替え on setVisibleOfSpecifiedProcess(aProc, aBoolean) tell application "System Events" if exists process aProc then set visible of process aProc to aBoolean set resF to true else set resF to false end if end tell return resF end setVisibleOfSpecifiedProcess –任意のデータから特定の文字列を置換 on replaceText(origData, origText, repText) set curDelim to AppleScript’s text item delimiters set AppleScript’s text item delimiters to {origText} set origData to text items of origData set AppleScript’s text item delimiters to {repText} set origData to origData as text set AppleScript’s text item delimiters to curDelim return origData end replaceText |
AppleScript書類から指定の構文要素をピックアップ(ハンドラ名称) v1 - AppleScript Hole says:
[…] plistから色分け情報を取得してスクリプトエディタ上でattribute runsを取得して照合すると色の数値が合わなくて不思議に思っていました。plistから取り出した値とCocoaの機能を用いてAppleScriptソースの書式情報との照合を行なったところ、問題なく構文要素を抽出できました。 […]