指定アプリケーションのSDEFを走査して、アプリケーションのAppleScript用語辞書に掲載されているオブジェクトを抽出するAppleScriptです。まだ、実験的な段階のものです。
XMLをパースするためのライブラリ(Shaneがつくったもの)を併用するため、Scriptライブラリ入りのScriptをダウンロードして実行してみてください。
–>Download Bundle Script With Script Library
ここまで試しておいてナニですが、Adobe系のアプリケーションの用語辞書については、アプリケーション上で動的に生成するようなので、Adobe系のアプリケーションに対して正しい結果を取得できることは期待しないでください。
XML的にアクセスすると、「属性値がここで取得できるはずなのだが」といった不思議な現象のオンパレードでした。edama2さんからの助言もあり、XMLをそのままではなくNSDictionaryに変換してアクセスしたのが本Scriptです。
ちょっとした試行錯誤を経て、Keynote.appのオブジェクトについては取得できている印象です。
オブジェクトを取得したら、各オブジェクトの属性値を取れるようにして、オブジェクトが応答するコマンドの一覧を取得し…というところまではいけるんじゃないでしょうか。
AppleScript名:Bundle IDで指定したアプリケーションのSDEFからオブジェクトを抽出.scptd |
— – Created by: Takaaki Naganoya – Created on: 2022/08/2 — – Copyright © 2022 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 set aRes to parseSdefAndRetObjects("com.apple.iWork.Keynote") of me –> {"column", "text item", "application", "word", "image", "rich text", "iWork item", "window", "group", "movie", "slide layout", "line", "paragraph", "slide", "audio clip", "shape", "table", "range", "row", "cell", "theme", "iWork container", "character", "document", "chart"} set bRes to parseSdefAndRetObjects("com.apple.iWork.Pages") of me –> {"column", "text item", "application", "word", "image", "rich text", "iWork item", "template", "window", "group", "movie", "shape", "line", "row", "paragraph", "placeholder text", "range", "audio clip", "table", "cell", "document", "page", "iWork container", "chart", "character", "section"} set cRes to parseSdefAndRetObjects("com.apple.iWork.Numbers") of me –> {"column", "text item", "application", "word", "image", "rich text", "iWork item", "template", "window", "group", "movie", "shape", "line", "paragraph", "row", "audio clip", "range", "table", "cell", "iWork container", "document", "character", "chart", "sheet"} set dRes to parseSdefAndRetObjects("com.apple.Finder") of me –> {"container", "application", "alias list", "list view options", "alias file", "item", "document file", "preferences", "icon view options", "application process", "trash-object", "internet location file", "process", "Finder window", "desktop window", "window", "application file", "computer-object", "column view options", "clipping window", "desktop-object", "clipping", "file", "icon family", "folder", "desk accessory process", "label", "column", "preferences window", "information window", "package", "disk"} set eRes to parseSdefAndRetObjects("com.apple.Safari") of me –> {"document", "contentsProvider", "tab", "application", "sourceProvider", "window"} set fRes to parseSdefAndRetObjects("com.apple.Mail") of me –> {"account", "container", "application", "cc recipient", "mailbox", "word", "outgoing message", "rich text", "smtp server", "attachment", "bcc recipient", "pop account", "window", "signature", "to recipient", "OLD message editor", "paragraph", "iCloud account", "ldap server", "recipient", "message", "rule condition", "header", "document", "attribute run", "rule", "imap account", "mail attachment", "message viewer", "character"} set gRes to parseSdefAndRetObjects("com.coteditor.CotEditor") of me –> {"window", "paragraph", "word", "character", "attribute run", "document", "text selection", "rich text", "application", "attachment"} set hRes to parseSdefAndRetObjects("com.pixelmatorteam.pixelmator.x") of me –> {"vortex effect", "paragraph", "focus effect", "bump effect", "layer", "color adjustments", "box effect", "stripes effect", "window", "circle splash effect", "document info", "word", "text layer", "tilt shift effect", "image fill effect", "disc effect", "gaussian effect", "color fill effect", "effects layer", "ellipse shape layer", "styles", "motion effect", "rich text", "pattern fill effect", "spin effect", "line shape layer", "application", "light tunnel effect", "image layer", "group layer", "character", "rounded rectangle shape layer", "crystallize effect", "shape layer", "star shape layer", "pinch effect", "checkerboard effect", "effect", "rectangle shape layer", "pixelate effect", "pointillize effect", "document", "hole effect", "twirl effect", "polygon shape layer", "zoom effect", "color adjustments layer"} on parseSdefAndRetObjects(targAppBundleID) set aRes to parseSDEFandRetXMLStr(targAppBundleID) of me set cRes to (xmlLib’s makeRecordWithXML:aRes) –2つのタイプのオブジェクトがある? まだある??? set e1Res to cRes’s valueForKeyPath:"dictionary.suite.class.element.attributes.type" set e2Res to cRes’s valueForKeyPath:"dictionary.suite.class.attributes.name" set eRes to (e1Res as list) & (e2Res as list) set fRes to FlattenList(eRes) of me set bList to cleanUp1DList(fRes, {"missing value"}) of me set gRes to uniquify1DList(bList, true) of me set hRes to uniquify1DList(gRes, true) of me return hRes end parseSdefAndRetObjects on pickUpFromToStr(aStr as string, s1Str as string, s2Str as string) set a1Offset to offset of s1Str in aStr if a1Offset = 0 then return -1 set bStr to text (a1Offset + (length of s1Str)) thru -1 of aStr set a2Offset to offset of s2Str in bStr if a2Offset = 0 then return -2 set cStr to text 1 thru (a2Offset – (length of s2Str)) of bStr return cStr as string end pickUpFromToStr –指定文字と終了文字に囲まれた内容を抽出 on extractStrFromTo(aParamStr, fromStr, toStr) set theScanner to current application’s NSScanner’s scannerWithString:aParamStr set anArray to current application’s NSMutableArray’s array() repeat until (theScanner’s isAtEnd as boolean) set {theResult, theKey} to theScanner’s scanUpToString:fromStr intoString:(reference) theScanner’s scanString:fromStr intoString:(missing value) set {theResult, theValue} to theScanner’s scanUpToString:toStr intoString:(reference) if theValue is missing value then set theValue to "" –>追加 theScanner’s scanString:toStr intoString:(missing value) anArray’s addObject:theValue end repeat if anArray’s |count|() is not equal to 1 then return false return first item of (anArray as list) end extractStrFromTo –SDEFをXincludeを考慮しつつ展開 on parseSDEFandRetXMLStr(targAppBundleID) set thePath to POSIX path of (path to application id targAppBundleID) set aSDEFname to retAppSdefNameFromBundleIPath(thePath, "OSAScriptingDefinition") of me if aSDEFname = false then return if aSDEFname does not end with ".sdef" then set aSDEFname to aSDEFname & ".sdef" set sdefFullPath to thePath & "Contents/Resources/" & aSDEFname 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 parseSDEFandRetXMLStr –指定パスからアプリケーションのInfo.plist中の属性値を返す on retAppSdefNameFromBundleIPath(appPath as string, aKey as string) set aDict to (current application’s NSBundle’s bundleWithPath:appPath)’s infoDictionary() set aRes to aDict’s valueForKey:(aKey) if aRes = missing value then return false set asRes to aRes as string return asRes as string end retAppSdefNameFromBundleIPath –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 |
More from my site
(Visited 41 times, 1 visits today)