macOSにインストールされているフォントの情報をsystem_profiler経由で取得し、各フォントのパス情報をもとに、/System/Library/Fonts以下に入っているものだけを抽出して、フォント名をリストアップするAppleScriptです。
Pages書類に含まれているフォントのうち、デフォルトインストールされたものではないものを抽出するために、OSにデフォルトインストールされたものだけを取得すべく、基礎情報を得るために書いてみたものです(現在執筆中の電子書籍「Pages+AppleScriptで本をつくろう!」の付録Scriptとして用意しました)。
事前に何か設定するといった必要はありません。スクリプトエディタやScript Debuggerで実行するだけです。
AppleScriptからフォントの存在するパス情報はなかなか取得しにくい、FontBook.appがAppleScript非対応になったので、ほぼ無理なのですが、system_profilerから取得すれば、それほど難しくありません。
実行所要時間は、
M1 Mac mini (macOS 13.6):6秒
M2 Mac mini(macOS 14.6):10秒
M2 MacBook Air(macOS 14.6):15秒
ぐらいで、M1 Mac miniの速さが光ります。OSの違いから、macOS 13.6環境ではallFontsが1168、macOS 14.6環境では1603とフォント数がどうやら異なっているのですが(M2 miniも同じ)、フォント数を考慮してもM1 Mac miniの処理の速さが光ります。
もしくは、macOSのバージョンの違いにより、system_profilerの実行速度が大きく異なるとか? macOS 13.6環境と14.6環境にそれほど差があるものなんでしょうか。
無駄な処理も入っていますが、いろいろチェックしながら作ったもので、ベンチマーク用に作ったものではありません。
# M2 Airってなんでこんなに時間がかかるんだろう? 放熱台に乗せて処理しているのに。処理のほとんどの時間がsystem_profilerの実行で消費しています
AppleScript名:OSデフォルトインストールされたフォント名を取得.scpt |
— – Created by: Takaaki Naganoya – Created on: 2024/08/03 — – Copyright © 2024 Piyomaru Software, All Rights Reserved — use AppleScript version "2.4" — Yosemite (10.10) or later use framework "Foundation" use scripting additions property NSArray : a reference to current application’s NSArray property NSString : a reference to current application’s NSString property NSPredicate : a reference to current application’s NSPredicate property NSMutableArray : a reference to current application’s NSMutableArray property NSMutableDictionary : a reference to current application’s NSMutableDictionary property NSPropertyListFormat : a reference to current application’s NSPropertyListFormat property NSUTF8StringEncoding : a reference to current application’s NSUTF8StringEncoding property NSPropertyListImmutable : a reference to current application’s NSPropertyListImmutable property NSPropertyListSerialization : a reference to current application’s NSPropertyListSerialization script spd property sRes : missing value property aSource : missing value property bRes : missing value property fontNames : {} property fontPath : {} property outList : {} end script –システムにインストールされているフォントの情報を全抽出 set sRes of spd to do shell script "system_profiler -xml SPFontsDataType" set aSource of spd to first item of (readPlistFromStr(sRes of spd) of me) –全フォント情報から、名称とパス情報を抽出 set bRes of spd to (((aSource of spd)’s valueForKeyPath:"_items")) set fontNames of spd to ((bRes of spd)’s valueForKeyPath:"_name") as list set fontPath of spd to ((bRes of spd)’s valueForKeyPath:"path") as list –ループでOSデフォルトインストールされているフォントを抽出 set outList of spd to {} set aCount to 1 repeat with i in (fontPath of spd) set j to contents of i if j begins with "/System/Library/Fonts/" then –指定のフォントに複数のTypefaceが含まれていることを考慮し、情報を取り出す set outItem to (((item aCount of (bRes of spd)))’s valueForKeyPath:"typefaces._name") as list set the end of (outList of spd) to outItem end if set aCount to aCount + 1 end repeat –すべてのTypefaceを入れた入れ子の2D Listから1D Listに変換 set allFonts to FlattenList((outList of spd)) of me –ドット(.)ではじまるフォントを除外 set outList to {} repeat with i in allFonts set j to contents of i if j does not start with "." then set the end of outList to j end if end repeat return outList –stringのplistを読み込んでRecordに on readPlistFromStr(theString) set aSource to NSString’s stringWithString:theString set pListData to aSource’s dataUsingEncoding:(NSUTF8StringEncoding) set aPlist to NSPropertyListSerialization’s propertyListFromData:pListData mutabilityOption:(NSPropertyListImmutable) format:(NSPropertyListFormat) errorDescription:(missing value) return aPlist end readPlistFromStr –リストに入れたレコードを、指定の属性ラベルの値で抽出 on filterRecListByLabel(aRecList as list, aPredicate as string) set aArray to NSArray’s arrayWithArray:aRecList set aPredicate to NSPredicate’s predicateWithFormat:aPredicate set filteredArray to aArray’s filteredArrayUsingPredicate:aPredicate set bList to filteredArray as list return bList end filterRecListByLabel –リストに入れたレコードを、指定の属性ラベルの値で抽出 on filterRecListByLabel1(aRecList, aPredicate as string) set aArray to current application’s NSArray’s arrayWithArray:aRecList set aPredicate to current application’s NSPredicate’s predicateWithFormat:aPredicate set filteredArray to aArray’s filteredArrayUsingPredicate:aPredicate return filteredArray end filterRecListByLabel1 –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 |