macOS標準搭載のテキストエディタ、「テキストエディット」(TextEdit)をコントロールして、最前面のウィンドウの書類から、指定のフォント名とサイズに該当するテキストを抽出するAppleScriptです。
テキストエディットはApple純正のアプリケーションの割にはAppleScriptサポート機能がよくできていて、選択範囲(selection)を取得できないことをのぞけば、けっこう使えます。
テキストエディットのAppleScript系の機能で最も重要なものは、書類からの書式取得機能(attribute run)です。
▲最前面の書類がリッチテキストフォーマットになっている必要があります
▲Github上のGPUImageのフィルタ紹介文からコピペしてきた文章
▲この書類のこのレベルの見出しだけを抽出したい場合にはHelvetica Neue Bold 20pointを指定
▲この書類のこのレベルの見出しだけを抽出したい場合にはHelvetica Neue Bold 16pointを指定
Webブラウザなどからコピペしてきたスタイル付きテキストから、特定のフォントや文字サイズの箇所を抽出したい場合に使います。
実行すると、リッチテキストで使用されているフォント名とサイズの一覧を生成し、ダイアログでフォント名の選択、
そして、文字サイズの選択を実行。
すると、該当箇所のみ抽出して返します。さらに改行で区切ったテキストに変換するとかいった処理を行なってもよいでしょう。
RTFのファイルを処理するのであれば、テキストエディットを使わなくてもCocoaの機能を用いて同様の処理を行えますが、割と書き捨てレベルの瑣末なScriptなのでテキストエディット経由で書式情報を取得するように組んでみました。
AppleScript名:指定のフォントとサイズに該当するテキストを抽出する |
— Created 2019-11-22 by Takaaki Naganoya — 2019 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" script spd property fontList : {} property fontSizes : {} property textList : {} property outList : {} end script set (outList of spd) to {} set (fontList of spd) to {} set (fontSizes of spd) to {} set (textList of spd) to {} –TextEdit書類から書式情報を根こそぎ取得 tell application "TextEdit" tell text of front document set (fontList of spd) to font of every attribute run –フォント名 set (fontSizes of spd) to size of every attribute run –文字サイズ set (textList of spd) to character of every attribute run –文字 end tell end tell –取得したフォント名一覧から重複部分を除去してどれを対象にするかユーザーに問い合わせ set fRes to uniquify1DList((fontList of spd), true) of me set targFont to choose from list fRes set aFont to contents of first item of targFont –取得したフォントサイズ一覧から重複部分を除去してどれを対象にするかユーザーに問い合わせ set sRes to uniquify1DList((fontSizes of spd), true) of me set targSize to choose from list sRes set aSize to contents of first item of targSize –取得した条件にもとづいて、根こそぎ取得した書式と照合を行いつつループ repeat with i from 1 to length of (fontList of spd) set tmpFont to contents of item i of (fontList of spd) set tmpSize to contents of item i of (fontSizes of spd) –文字サイズをざっくり判定することで「大、中、小」といったおおまかな切り分けも可能 if {tmpFont, tmpSize} = {aFont, aSize} then set tmpCon to (contents of item i of (textList of spd)) as string if tmpCon does not contain "•" then –ごみ取り set the end of (outList of spd) to tmpCon end if end if end repeat return (outList of spd) –1D/2D Listをユニーク化 on uniquify1DList(theList as list, aBool as boolean) set aArray to current application’s NSArray’s arrayWithArray:theList set bArray to aArray’s valueForKeyPath:"@distinctUnionOfObjects.self" if aBool = true then return bArray as list else return bArray end if end uniquify1DList |