オープンソースのZipZap frameworkを用いて、指定Zipアーカイブ内の情報を取得し、ファイルタイプごとに対応した出力を行うAppleScriptです。
–> ZipZap.framework(To ~/Library/Frameworks/)
客観的に動作内容を書くとわかりにくいですが、「目的」を書くと非常にわかりやすい部品です。
「バンドル内にパスワード付きのZipアーカイブ化したAppleScript書類を入れておいて、実行時にアーカイブからAppleScriptのソースを取り出して実行する」
というのが、その用途です。
プレーンテキストと画像を取り出せるような記述になっていますが、それらはあくまでも実験用で、AppleScript書類のソースを取り出すのが本来の目的です。
AppleScriptでGUIアプリケーションを作成したときに、GUIまわりは普通にXcode上で記述して(あるいは、外部エディタ上で記述して)おきますが、外部のアプリケーションをコントロールするコードは、実行専用の.scpt形式でかつ書き込み禁止状態にしてバンドル内に入れておいたりします(SandBox対応のため)。
ただ、さまざまな要求を満たすようにGUIアプリケーション操作用のScriptを呼び出そうとすると、load scriptで読み込んで実行させていたのでは、都合がよくない場合があります(何らかのキーを長押しすると実行を停止できるとか、システム内の別の要素……たとえばCPUの温度が上がりすぎたら停止させるとか)。
load scriptで実行すると、
(1)途中で実行停止しにくい
(2)セキュリティ上の制約がきつい(とくにGUI Scriptingまわり)
(3)スクリプトエディタ上で動かしていた時と挙動が変わる箇所がある(Finder上のselectionを取得していた場合とか)
といった問題がありますが、OSAScriptView上にAppleScriptのソースを展開して実行すると、これらの問題を解決できる一方、ソースが見える形式でアプリケーションバンドル内に入れるのはためらわれます。
その問題を解決するために書いたものです。展開したデータをファイル出力せず、すべて変数上で(オンメモリで)処理できるので都合がいいです。
Mac App Storeで販売するアプリケーションでこの部品を使ったことはありませんが、客先に納品するアプリケーションでは使えるといったところでしょうか。ここまで手の込んだプログラムだとリジェクトできないとは思っています(もっとレベルの低い指摘しか来ないので)。
AppleScript名:ZipZap frameworkを使ってZipアーカイブ内の情報を取得してファイルタイプごとに対応出力 v2 |
— Created 2018-09-28 by Takaaki Naganoya — 2018 Piyomaru Software use AppleScript version "2.5" use scripting additions use framework "Foundation" use framework "OSAKit" use framework "ZipZap" –https://github.com/pixelglow/zipzap use bPlus : script "BridgePlus" –https://www.macosxautomation.com/applescript/apps/BridgePlus.html property |NSURL| : a reference to current application’s |NSURL| property NSArray : a reference to current application’s NSArray property NSString : a reference to current application’s NSString property NSImage : a reference to current application’s NSImage property ZZArchive : a reference to current application’s ZZArchive property OSAScript : a reference to current application’s OSAScript property NSPredicate : a reference to current application’s NSPredicate property NSUTF8StringEncoding : a reference to current application’s NSUTF8StringEncoding property NSURLTypeIdentifierKey : a reference to current application’s NSURLTypeIdentifierKey set aPassword to "piyomarusoftware" set aPath to POSIX path of (choose file of type {"public.zip-archive"}) set aList to extractArchive(aPath, aPassword) of me on extractArchive(aPath, aPass) set oldArchive to ZZArchive’s archiveWithURL:(|NSURL|’s fileURLWithPath:aPath) |error|:(missing value) set aList to oldArchive’s entries() as list set outList to {} repeat with i in aList set encF to i’s encrypted() as boolean set aFileName to i’s fileName() if (aFileName as string) does not start with "__MACOSX/" then set aExt to (aFileName’s pathExtension()) as string set aUTI to my retFileFormatUTI(aExt) set aData to (i’s newDataWithError:(missing value)) –Uncompressed raw data if aData = missing value then set aData to (i’s newDataWithPassword:(aPass) |error|:(missing value)) if aData is equal to (missing value) then error "Internal archive error in extracting" end if end if if aUTI = "public.plain-text" then –Plain Text set aStr to (NSString’s alloc()’s initWithData:aData encoding:(NSUTF8StringEncoding)) as string else if aUTI = "com.apple.applescript.script" then –AppleScript .scpt file set aScript to (OSAScript’s alloc()’s initWithCompiledData:aData |error|:(missing value)) set aStr to (aScript’s source()) as string else if (my filterUTIList({aUTI}, "public.image")) is not equal to {} then –Various Images set aStr to (NSImage’s alloc()’s initWithData:aData) end if set the end of outList to aStr end if end repeat return outList end extractArchive on retFileFormatUTI(aExt as string) tell script "BridgePlus" load framework return (current application’s SMSForder’s UTIForExtension:aExt) as string end tell end retFileFormatUTI –UTIリストが指定UTIに含まれているかどうか演算を行う on filterUTIList(aUTIList, aUTIstr) set anArray to NSArray’s arrayWithArray:aUTIList set aPred to NSPredicate’s predicateWithFormat_("SELF UTI-CONFORMS-TO %@", aUTIstr) set bRes to (anArray’s filteredArrayUsingPredicate:aPred) as list return bRes end filterUTIList |