指定のアプリケーションが扱えるデータ拡張子を取得するAppleScriptです。
アプリケーションバンドル内のInfo.plistの、CFBundleDocumentTypesエントリの中のCFBundleTypeExtensionsを拾ってリストで返します。用途は、このアプリケーションに表示させるためのものです。
ただ、この標準的といいますか一般的な処理でこのデータを拾ってこれないアプリケーション(凝った処理をしているもよう)がかなりの数存在し、それらについては個別に対応処理を書かないとダメっぽいです。
だいたい、AppleのiWork Appsが全滅。BBEditも独自の記述をしているらしく、Pixelmator Proも少し凝った書き方をしているもよう(Pixelmator Proが「凝っていない」部分なんてないみたいですが)。個別にInfo.plistからエントリをたどって拡張子リストを作るしかなさそうです。
OS内、具体的に言えばNSApplicationとかNSBundleにそういうInfo.plistをあさってこなくても対応ドキュメントデータ型を渡してくれるようなサービスがありそうな気がとてもするのですが、なかなか見つかりそうにありません。
あまりに対応が大変だった場合には、機能を盛り込むことを断念するかもしれません。メタデータから拾ってこれたりすると楽でよいのですが……。
AppleScript名:アプリケーションが扱えるデータ拡張子を取得.scptd |
— – Created by: Takaaki Naganoya – Created on: 2020/10/28 — – Copyright © 2020 Piyomaru Software, All Rights Reserved — use AppleScript version "2.4" — Yosemite (10.10) or later use framework "Foundation" use scripting additions set aPath to POSIX path of (choose file of type {"com.apple.application-bundle"}) set aURL to (current application’s |NSURL|’s fileURLWithPath:aPath) set exResList to getDocumentTypesExtensionsFromPath(aURL) of me return exResList –> {".INDD", ".INX", ".IDMS", ".INCD", ".INCX", ".ICML", ".INCA", ".ICMA", ".P65", ".T65", ".PMD", ".PMT", ".QXD", ".QXT", ".INDT", ".INDB", ".INDL", ".INLX", ".FLST", ".PRST", ".PDFS", ".joboptions", ".DCST", ".LNST", ".UDC", ".InDesignPlugin", ".PSET", ".SMRD", ".SMWT", ".IDML", ".IDPP", ".INDK", ".INLK", ".CSF", ".ASE", ".ACB", ".ACBL", ".IDPK", ".INJB", ".INRS", ".INCP", ".INDP", ".ICAP", ".IDAP", ".INMS", ".epub"} on getDocumentTypesExtensionsFromPath(aURL) set aRes to getDocumentTypesFromAppURL(aURL) of me set exRes to {} repeat with i in (aRes as list) set j to (current application’s NSDictionary’s dictionaryWithDictionary:(contents of i)) set tmpExt to (j’s valueForKey:"CFBundleTypeExtensions") if tmpExt is not equal to missing value then set tmpExt to tmpExt as list repeat with ii in tmpExt set jj to "." & (contents of ii) if (jj is not in exRes) and (jj is not equal to ".*") and (jj is not equal to ".???") then set the end of exRes to jj end if end repeat end if end repeat return exRes end getDocumentTypesExtensionsFromPath on getDocumentTypesFromAppURL(aURL) set aBundle to current application’s NSBundle’s bundleWithURL:aURL if aBundle = missing value then return {} set aInfo to aBundle’s infoDictionary() if aInfo = missing value then return {} set aRes to aInfo’s objectForKey:"CFBundleDocumentTypes" –Document Types if aRes = missing value then return {} return aRes end getDocumentTypesFromAppURL |