指定アプリケーションのsdefの内容を強引に取得するAppleScriptです。
スクリプトエディタをAppleScriptからコントロールして、指定アプリケーションのsdef(AppleScript用語辞書)の内容を取得します。もちろん、AppleScript対応のアプリケーションに限ります。対応/非対応の判定はあらかじめ行なっておいてください。
そもそも、なんでこれが必要になったかといえば、各種AppleScript Libraryの整備のための資料として、既存のAppleScript対応アプリケーションの識別コード(4文字コード)を取得して確認しておきたかったためです。
そこで、まっとうな方法だと、
step 1:対象アプリケーションのInfo.plistの内容を確認してsdefの名称を取得
step 2:アプリケーションバンドル内のsdefを取得
という流れになります。これで済めば処理は非常に短時間に完了します。ファイル処理だけなので。
しかし、実際にやってみると…………標準的な方法でsdefを取得できないアプリケーションがいくつか存在することに気づきます。
(1)Adobe Illustratorなど
バンドル内にsdefが存在しない。動的にプログラムでsdefを生成しているのでは?
(2)scriptSuite+scriptTerminologyに分かれている場合
バンドル内にsdefではなく.scriptSuiteファイルと.scriptTerminologyファイルを格納。テキストエディット(TextEdit.app)やスクリプトエディタ(Script Editor.app)などが該当する。
また、一部のアプリケーション(MS-Officeなど)ではsdefファイルのうち一部を外部からincludeしているため、アプリケーションバンドル内のsdefファイルを読んだだけでは完全なsdefが取得できないといった問題もあります。
そこで、この「スクリプトエディタをコントロールしてsdefの内容を取得する」という頭の悪そうな処理が必要になりました。シェルのsdefコマンドを使えばいいんじゃない? という意見も出てきそうですが、現行環境(macOS 10.14.x)でsdefコマンドはうまく動いていないように見えます。
AppleScript名:sdefの内容を強引に取得する.scptd |
— – Created by: Takaaki Naganoya – Created on: 2019/09/12 — – Copyright © 2019 jp.piyomarusoft, All Rights Reserved — use AppleScript version "2.4" — Yosemite (10.10) or later use framework "Foundation" use scripting additions set aPath to (choose file of type "com.apple.application-bundle" default location (path to applications folder) with prompt "Select an application") set sdefContents to getForceSdefContentsUsingSE2(aPath) of me on getForceSdefContentsUsingSE2(anAlias) try tell application id "com.apple.ScriptEditor2" open anAlias tell front document set dictPath to path end tell end tell on error erM return erM end try tell current application set aSdef to read dictPath end tell tell application id "com.apple.ScriptEditor2" tell front document close without saving end tell end tell return aSdef end getForceSdefContentsUsingSE2 |