Keynote書類上の指定画像のアーカイブ中のパスを求め、指定画像のファイル名と照合し、当該画像ファイルのみアーカイブ展開してからPreview.appでオープンするAppleScriptです。
Keynote書類には2つの形式(パッケージ形式、フラット形式)があり、現在のデフォルトはフラット形式です。
パッケージ形式についてはFinder上でパッケージバンドルを表示させて、内部データ構造を実際に見られるようになっています。
では、フラット形式はどうかといえば、上記のパッケージ形式データをZip圧縮して拡張子を「.key」に変更したものです。
そのため、拡張子を「.key」から「.zip」に付け替えて、アーカイブ展開すると、実際にパッケージ内部のファイルにアクセスできます。
本Scriptは、フラット形式のKeynote書類に対して動作します。パッケージ形式は想定していません(パッケージ形式は単にファイル構造にアクセスすればよいだけなので)。
画像を貼り付けたスライドを表示した状態で本AppleScriptを実行すると、スライド上に貼り付けた画像をデスクトップフォルダに展開し、Previw.appでオープンします。1回実行するとデスクトップに画像ファイルの名前のフォルダが作られ、その中に画像が展開されています。この状態でScriptを再実行すると、フォルダ名が重複するためエラーになります。再実行したい場合にはデスクトップ上の画像名のフォルダを削除しておいてください。
指定Keynote書類の、指定スライド上にある指定イメージについては、ファイル名がわかるだけでパスやデータを取得できるわけではありません。
そこで、フラット形式のKeynote書類中の画像一覧を取得し、このファイル名と符合するものをピックアップします。ただし、ファイル名が完全一致するわけではなく、オリジナルのファイル名が「someImage.png」だった場合に、「someImage-221.png」といったファイル名が見つかります。
また、見つかるのは実ファイルだけでなくプレビュー用の「someImage-small-221.png」といったものも入っています。このプレビュー用イメージについてはスキップしています。
その後、さまざまな処理を行なってもよいでしょうけれども、とりあえず現状ではPreview.appでファイルをオープンしています。
AppleScript名:Keynote書類上の画像をアーカイブ展開して実パスを求めて展開.scptd |
— – Created by: Takaaki Naganoya – Created on: 2020/07/04 — – Copyright © 2020 Piyomaru Software, All Rights Reserved — use AppleScript version "2.4" — Yosemite (10.10) or later use framework "Foundation" use scripting additions tell application "Keynote" set dCount to count (every document) if dCount = 0 then return tell front document set myPath to (file of it) if myPath = missing value then return false –Unsaved tell current slide tell image 1 set aFile to file name –> "switchControl.png" end tell end tell end tell end tell set myPOSIXPath to POSIX path of (myPath as alias) –Extract document internal image paths by extracting Keynote’s zip archive set dList to getInternalImagesWithinKeynote(myPath) of me –Extract file name and ext from image 1 path set pPath to POSIX path of aFile set {aName, aExt} to getExtAndFilenameFromPath(pPath) of me –Filter Keynote internal image list by image 1’s file name and ext set theArray to current application’s NSArray’s arrayWithArray:dList set thePred to current application’s NSPredicate’s predicateWithFormat_("self.pathExtension == %@ && self.lastPathComponent beginswith %@ ", aExt, aName) set bList to (theArray’s filteredArrayUsingPredicate:thePred) as list –> {"Data/switchControl-226.png", "Data/switchControl-small-227.png"} –Extrat file set exF to false repeat with i in bList set outName to getFilenameAndExtFromPath(i) of me if outName does not contain "-small-" then –Skip Preview Image set outPath to POSIX path of (path to desktop) & outName set bRes to do shell script "unzip -j " & quoted form of myPOSIXPath & " " & quoted form of i & " -d " & " " & outPath set extractPath to POSIX path of (path to desktop) & outName & "/" & outName do shell script "open " & quoted form of extractPath –Open for test set exF to true end if end repeat if exF = false then return false –Keynote書類中の画像ファイル一覧を取得 on getInternalImagesWithinKeynote(myPath) set kPath to POSIX path of myPath set aRes to do shell script "unzip -Z1 " & quoted form of kPath & " | grep ^Data/" set aList to paragraphs of aRes return aList end getInternalImagesWithinKeynote –ファイルパスからファイル名部分と拡張子を分離 on getExtAndFilenameFromPath(aPOSIXpath) set pathString to current application’s NSString’s stringWithString:aPOSIXpath set aStr to pathString’s lastPathComponent() set aExt to (aStr’s pathExtension()) set bStr to aStr’s stringByDeletingPathExtension() return {bStr as string, aExt as string} end getExtAndFilenameFromPath –ファイルパスからファイル名部分のみ取得 on getFilenameAndExtFromPath(aPOSIXpath) set pathString to current application’s NSString’s stringWithString:aPOSIXpath set aStr to pathString’s lastPathComponent() return aStr as string end getFilenameAndExtFromPath |