Pagesの最前面の書類中のテキストアイテム(ボックス)中のテキストと、本文テキスト(body text)で文字サイズが最大のものを取得するAppleScriptです。Pagesで書いた書類からタイトルらしきものを抽出するために書いたものです。
まず、前提条件を書いておかなければなりません。
一般的なDTPアプリケーション(InDesignとか)やワープロであれば、書式スタイルが「タイトル」のテキストを求めるといった処理になりますが、Pagesにはその機能がありません。正確にいえば、PagesのAppleScript用語辞書にはその機能がありません。そこで、「各文書のタイトルには文章中で最大の文字サイズを設定しておく」というルールを自分に課して、文字サイズが最大のものを取得すればタイトル文字列が取得できるように決めておきました。
テキストアイテム中の最大サイズの文字を抽出し、そのあとで本文テキスト(body text)の最大サイズの文字を抽出、両者の間で最大サイズのものを求めて返します。
目下、実際に本を書き出すのに「指定フォルダ以下のPages、Markdown、Word Document、PDFをすべてPDF化してファイル名順でソートして結合」するAppleScriptを作って利用しているのですが、これにTOCつきPDFを書き出す機能を結合できるといいなーと思って書いています。
Keynote書類からTOCつきPDFを書き出すAppleScriptは実戦レベルのものを作って運用しており、これを用いて電子書籍を作っています(逆をいえば、このAppleScriptの開発に成功したのでバカスカ電子書籍を作れているわけで)。
TOCつきPDFをPagesなどの書類群から書き出せるようになれば、PagesやMarkdownで書いた書籍も自動でTOCつきPDFを生成できるわけで、PagesやMarkdown系の書類で作った書籍も手軽に生成できるようになるはずです。
AppleScript名:pagesTitleLib.scptd |
— – Created by: Takaaki Naganoya – Created on: 2020/06/12 – Modified on: 2021/04/10 — – Copyright © 2020 Piyomaru Software, All Rights Reserved — use AppleScript version "2.4" — Yosemite (10.10) or later use framework "Foundation" use scripting additions property NSString : a reference to current application’s NSString property NSCharacterSet : a reference to current application’s NSCharacterSet property NSMutableArray : a reference to current application’s NSMutableArray set aRes to pagesTitleGetter() of me –> "商標、著作権について" on pagesTitleGetter() set tiList to getLargestTextItem() of me –Text Item set bList to getLargestBodyText() of me –Body Text if tiList = {} and bList = {} then return "" if tiList = {} and bList ≠ {} then set allList to bList if tiList ≠ {} and bList = {} then set allList to tiList set allList to tiList & bList –> {{10.0, "Macrovector – jp.freepik.com によって作成された business ベクトル"}, {16.0, "商標、著作権について"}} set allRes to returnMaxItem(allList, 1, 2) of me set bRes to repChar(allRes, string id 10, "") of me set bRes to repChar(bRes, string id 13, "") of me return bRes end pagesTitleGetter –2D Listのうち、指定アイテム目の最大値をもとめ、その指定アイテムを返す on returnMaxItem(aList, seekItemNum, retItemNum) script spd property aList : {} end script set (aList of spd) to aList set tmpMax to 0 set tmpItem to 0 set aCount to 1 repeat with i in (aList of spd) set tmpV to item seekItemNum of i if tmpV > tmpMax then copy tmpV to tmpMax set tmpItem to aCount end if set aCount to aCount + 1 end repeat return item retItemNum of item tmpItem of (aList of spd) end returnMaxItem –Pagesの最大文字サイズのText Item中の最大テキストを返す on getLargestTextItem() set rList to {} tell application "Pages" if not running then return {} if every document = {} then return {} tell front document set tmpList to every text item if length of tmpList = 0 then return –テキストアイテムがない場合には処理終了 set szList to size of object text of every text item if szList is not equal to {} then set aMaxPoint to calcMax(szList) of me –最大の文字サイズを取得 –文字サイズが最大のテキストアイテムを抽出 –set resList to object text of every text item whose size of object text is aMaxPoint set resList to every text item whose size of object text is aMaxPoint repeat with ii in resList –指定のtet item内の文字のサイズをすべて取得 set cList to size of every character of object text of ii –文字サイズのうち最大のものを取得 set cMax to calcMax(cList) of me –最大サイズの文字のみ抽出 set cRes to (every character of object text of ii whose size = cMax) set cText to cRes as string –取得したテキストの前後の改行などを削除してクリーンアップ set c2Text to cleanUpTextFromHEadAndTail(cText) of me set c2Text to repChar(c2Text, string id 10, "") of me set c2Text to repChar(c2Text, string id 13, "") of me –何か結果が得られていたら、リストに加える if c2Text is not equal to "" then set the end of rList to {cMax, c2Text} end if end repeat end if end tell end tell return rList –> {{10.0, "Macrovector – jp.freepik.com によって作成された business ベクトル"}} end getLargestTextItem on getLargestBodyText() set esList to {} tell application "Pages" if not running then return {} if every document = {} then return {} tell front document set sCount to count every section repeat with i from 1 to sCount tell section sCount set sList to size of every character of body text if sList is not equal to {} then set cMax to calcMax(sList) of me –最大サイズの文字のみ抽出 set cRes to (every character of body text of it whose size = cMax) set cText to cRes as string –取得したテキストの前後の改行などを削除してクリーンアップ set c2Text to cleanUpTextFromHEadAndTail(cText) of me set c2Text to repChar(c2Text, string id 10, "") of me set c2Text to repChar(c2Text, string id 13, "") of me set tmpList to {cMax, c2Text} set the end of esList to tmpList end if end tell end repeat end tell end tell return esList end getLargestBodyText on repChar(origText as string, targStr as string, repStr as string) set {txdl, AppleScript’s text item delimiters} to {AppleScript’s text item delimiters, targStr} set temp to text items of origText set AppleScript’s text item delimiters to repStr set res to temp as text set AppleScript’s text item delimiters to txdl return res end repChar on calcMax(aList as list) set nArray to (NSMutableArray’s arrayWithArray:aList) set maxRes to (nArray’s valueForKeyPath:"@max.self")’s doubleValue() return maxRes end calcMax on cleanUpTextFromHEadAndTail(aStr) set aString to NSString’s stringWithString:aStr set bStr to (aString’s stringByTrimmingCharactersInSet:(NSCharacterSet’s whitespaceAndNewlineCharacterSet())) return bStr as string end cleanUpTextFromHEadAndTail |
2021年に書いた価値あるAppleScript – AppleScriptの穴 says:
[…] 4/12 Pagesで最前面の書類中のテキストアイテムと本文テキストで文字サイズが最大のもののテキストを求める […]