Keynoteの書類上で選択中のオブジェクト(image)を特定するAppleScriptです。
Keynoteには、選択中のオブジェクトを求めるという重要な機能「selection」が実装されていません。一応、最新版のKeynoteには「selection」の予約語が存在しているものの、slide中の選択オブジェクトではなく「選択中のスライド」が返ってきます。current slideとほぼ同じ動作です。これでは実用性がいまひとつです。
ないと困るselection(get selected object)ですが、実装されていないのは仕方ありません。
そのものズバリの機能が存在していないものの、他のやりかたで選択中の画像を特定してみました。数が少なかったり重複するものが存在していない場合には有効のようです。
本Scriptでは、Keynote書類上で選択中の画像があるという前提の上で、GUI Scripting経由でコピーを行い、選択対象をクリップボードに入れます。このクリップボード内の画像のサイズを取得。次に、現在のKeynote書類の現在のスライド(ページ)上の画像(imageオブジェクト)のサイズを取得し、順次照合。同じサイズのものがあれば、それが選択中のオブジェクトであると類推します。
かなり穴の多いロジックですが、最初の一歩としては悪くないでしょう。とりあえずは、サイズで比較を行い、同一のものがあれば画像同士の類似性を計算するといった方法も検討できそうです。
お手上げになってしまうのは、画像サイズや内容ともに同一のものが複数あった場合です。その場合を除けば割と識別できそうに思えます。
また、ながらく調査を行なってきた「ローカライズ言語に依存しないGUI Scripting」を用いて選択中のオブジェクトのコピーができるとよさそうです。
AppleScript名:Keynoteで選択中の画像を特定する.scptd |
— – Created by: Takaaki Naganoya – Created on: 2020/01/22 — – Copyright © 2020 Piyomaru Software, All Rights Reserved — use AppleScript version "2.7" use scripting additions use framework "Foundation" use framework "AppKit" set kRes to getSelectedImage() of me –> image 3 of slide 24 of document id "534F4E65-4459-4B00-95D4-34C3E020467E" on getSelectedImage() my executeKeynoteItemCopy() –Execute Copy From Menu –クリップボードの内容をNSImageに set aNSIMage to my getClipboardASImage() if aNSIMage = false then return false end if –クリップボード中のNSImageのサイズを取得 set aSize to aNSIMage’s |size|() set selWidth to (aSize’s width) as real set selHeight to (aSize’s height) as real –Keynoteの最前面のドキュメントの現在のスライド上の画像からサイズを取得してクリップボード内の画像サイズと照合する tell application "Keynote" tell front document tell current slide set iList to every image repeat with i in iList set myHeight to (height of i) as real set myWidth to (width of i) as real if {myWidth, myHeight} = {selWidth, selHeight} then return contents of i end if end repeat end tell end tell end tell return false end getSelectedImage — クリップボードの内容をNSImageとして取り出して返す on getClipboardASImage() set theNSPasteboard to current application’s NSPasteboard’s generalPasteboard() set theAttributedStringNSArray to theNSPasteboard’s readObjectsForClasses:({current application’s NSImage}) options:(missing value) if theAttributedStringNSArray = {} then return false set theNSAttributedString to theAttributedStringNSArray’s objectAtIndex:0 return theNSAttributedString end getClipboardASImage on executeKeynoteItemCopy() activate application "Keynote" tell application "System Events" tell process "Keynote" –click menu item "Copy" of menu 1 of menu bar item "Edit" of menu bar 1 click menu item "コピー" of menu 1 of menu bar item "編集" of menu bar 1 end tell end tell end executeKeynoteItemCopy |