アプリからスクリプトエディタを用いて書き出したSDEFファイル(AppleScript用語説明ファイル)から、コマンドを抽出するAppleScriptです。
–> Download sdef command lister.scptd (Including AS Lib in its bundle)
個人的に、SDEFの差分を確認するために極力アプリの各バージョンのSDEFを書き出して保存するようにしており、
用語辞書ベースで機能追加や変更が行われたことを確認しています。
こうしたSDEFのままでは比較できないので、FileMerge(XcodeについてくるGUI版diffの傑作)を使ってバージョン間の差分を取って確認するのが「通常営業」なわけです。
これがv1.0から最新版までの経緯をおおまかに把握したい、といったときには細かすぎますし、用途に合っていません。
そこで本Scriptを書いて利用することにしました。各バージョンごとにコマンドを抽出して、存在する/しないといった比較ができれば全体的な傾向を把握できます。
Apple純正アプリのSDEF、Adobe Creative Cloudアプリ、Microsoft OfficeのSDEFなどひととおり処理してみましたが、自分が使った範囲ではとくに問題は見つかっていません。ただ、まだ間違いがあるかもしれないため、処理ミスが見られた場合にはコメントで報告してください。
▲本Scriptを用いて、Skim各バージョンのAppleScript用語辞書からコマンドの分布を表にしたもの
AppleScript名:指定のSDEFファイルからコマンドを抽出.scptd |
— – Created by: Takaaki Naganoya – Created on: 2024/10/16 — – Copyright © 2022-2024 Piyomaru Software, All Rights Reserved — use AppleScript version "2.4" — Yosemite (10.10) or later use framework "Foundation" use framework "AppKit" use xmlLib : script "piyoXML" use scripting additions script myDict property sdefDict : {} end script set sdefPath to (POSIX path of (choose file of type {"com.apple.scripting-definition"} with prompt "SDEFファイルを選択")) set comRes to {} set (sdefDict of myDict) to {} set comList to parseSdefAndRetObjects(sdefPath) of me repeat with i in comList set j to contents of i set aRes to parseSdefFileAndRetCommandStructure(sdefPath, j) of me if aRes is not equal to "" then set aRes to "OK" set the end of comRes to j end repeat set aStr to listToStringUsingTextItemDelimiter(comRes, return) of me on parseSdefFileAndRetCommandStructure(targSDEFPath, aTargCom) set suitesList to ((sdefDict of myDict)’s valueForKeyPath:"dictionary.suite.command") repeat with i in suitesList –SuitesでLoop set j to contents of i try if j is not equal to missing value and j is not equal to current application’s NSNull then repeat with ii in j –CommandでLoop set jj to contents of ii set tmpName to jj’s attributes’s |name| if aTargCom is in (tmpName as list) then return jj end repeat end if on error return "" end try end repeat return false end parseSdefFileAndRetCommandStructure –指定Bundle IDのコマンド一覧を取得する on parseSdefAndRetObjects(sdefPath) if (sdefDict of myDict) = {} then set aRes to parseSDEFfileAndRetXMLStr(sdefPath) of me set (sdefDict of myDict) to (xmlLib’s makeRecordWithXML:aRes) end if set e1Res to (sdefDict of myDict)’s valueForKeyPath:"dictionary.suite.command.attributes.name" set fRes to FlattenList(e1Res as list) of me set bList to cleanUp1DList(fRes, {"missing value"}) of me set gRes to uniquify1DList(bList, true) of me return gRes end parseSdefAndRetObjects –SDEFをXincludeを考慮しつつ展開 on parseSDEFfileAndRetXMLStr(sdefFullPath) set sdefAlias to (POSIX file sdefFullPath) as alias –sdefのフルパスを求める –SDEF読み込み(Xincludeの展開が必要な状態) tell current application set theXML to read sdefAlias as «class utf8» end tell –NSXMLDocumentの生成、Xincludeを有効に set {theXMLDoc, theError} to current application’s NSXMLDocument’s alloc()’s initWithXMLString:theXML options:(current application’s NSXMLDocumentXInclude) |error|:(reference) –XMLを文字データ化 set aDocStr to (theXMLDoc’s XMLData) set aDocStr2 to (current application’s NSString’s alloc()’s initWithData:(aDocStr) encoding:(current application’s NSUTF8StringEncoding)) as string return aDocStr2 end parseSDEFfileAndRetXMLStr –By Paul Berkowitz –2009年1月27日 2:24:08:JST –Re: Flattening Nested Lists on FlattenList(aList) set oldDelims to AppleScript’s text item delimiters set AppleScript’s text item delimiters to {"????"} set aString to aList as text set aList to text items of aString set AppleScript’s text item delimiters to oldDelims return aList end FlattenList on cleanUp1DList(aList as list, cleanUpItems as list) set bList to {} repeat with i in aList set j to contents of i if j is not in cleanUpItems then set the end of bList to j end if end repeat return bList end cleanUp1DList –1D/2D Listをユニーク化 on uniquify1DList(theList as list, aBool as boolean) set aArray to current application’s NSArray’s arrayWithArray:theList set bArray to aArray’s valueForKeyPath:"@distinctUnionOfObjects.self" if aBool = true then return bArray as list else return bArray end if end uniquify1DList –1D Listを指定デリミタをはさんでテキスト化(Shane Stanley) on listToStringUsingTextItemDelimiter(sourceList, textItemDelimiter) set CocoaArray to current application’s NSArray’s arrayWithArray:sourceList set CocoaString to CocoaArray’s componentsJoinedByString:textItemDelimiter return (CocoaString as string) end listToStringUsingTextItemDelimiter |