スタイルつきテキストの中をスタイルつきテキストで検索するAppleScriptです。フォント、サイズ、色の属性を考慮して文字とこれらの属性値が合っている場合に合致しているものとみなします。
たかだか3Kバイトごときの文字量のスタイルつきテキストから検索を行うのに、M2 Airで2・3秒ぐらいかかります。
属性値をDictionary in Arrayとして解釈して検索を行うよりも、大幅に処理に時間がかかるようです。
1文字ずつ開始位置をズラして文字&書式の再照合を行っているので、アホみたいに処理時間がかかります。Cocoaの機能を使って処理しているのに、Pagesに問い合わせるよりも時間がかかっている雰囲気です。
本ScriptはChatGPTに書かせたもので、おそらく処理に時間がかかって「無駄」になるものと見込んでいました。
スタイルつきテキストに対してスタイルつきテキストによる検索を行うのは、予想どおりものすごく負荷が大きくなるようで……本Scriptは残念ながら作り捨てになりそうです。
もう少し頭を使って、文字だけで出現位置チェックを行い、出現位置情報をもとに書式の照合を行うようにすれば、10倍ぐらい高速に処理できそうです。
AppleScript名:find Styled Text in Styled Text.scptd |
— – Created by: Takaaki Naganoya – Created on: 2025/01/12 — – Copyright © 2025 Piyomaru Software, All Rights Reserved — use AppleScript use framework "Foundation" use scripting additions — 使用例 set targetText to "これはサンプルテキストです。サンプルは重要です。サンプルだよー。" set searchText to "サンプル" — 属性付き文字列の作成 set targetAttributedString to current application’s NSMutableAttributedString’s alloc()’s initWithString:targetText set searchAttributedString to current application’s NSMutableAttributedString’s alloc()’s initWithString:searchText — 属性を設定 (例: フォントと色) set targetFont to current application’s NSFont’s fontWithName:"HiraginoSans-W2" |size|:13 set targetColor to current application’s NSColor’s redColor() set searchFont to current application’s NSFont’s fontWithName:"HiraginoSans-W2" |size|:13 set searchColor to current application’s NSColor’s redColor() — 属性を追加 targetAttributedString’s addAttribute:(current application’s NSFontAttributeName) value:targetFont range:{0, targetAttributedString’s |length|()} targetAttributedString’s addAttribute:(current application’s NSForegroundColorAttributeName) value:targetColor range:{0, targetAttributedString’s |length|()} searchAttributedString’s addAttribute:(current application’s NSFontAttributeName) value:searchFont range:{0, searchAttributedString’s |length|()} searchAttributedString’s addAttribute:(current application’s NSForegroundColorAttributeName) value:searchColor range:{0, searchAttributedString’s |length|()} — 属性付き検索を実行 set matches to searchAttributedStringWithAttributes(targetAttributedString, searchAttributedString) of me –> {{location:3, |length|:4}, {location:14, |length|:4}, {location:24, |length|:4}} — NSAttributedStringの属性付き検索を行うハンドラー(複数一致対応、変数名変更) on searchAttributedStringWithAttributes(targetAttributedString, searchAttributedString) — 検索対象の全長を取得 set targetLength to targetAttributedString’s |length|() set searchLength to searchAttributedString’s |length|() — 検索する属性辞書を取得 set searchAttributes to searchAttributedString’s attributesAtIndex:0 effectiveRange:(missing value) set searchString to searchAttributedString’s |string|() as string — 結果を格納するリスト set matches to {} — ループで対象の文字列を検索 set currentIndex to 1 repeat while (currentIndex + searchLength ≤ targetLength) — 対象範囲の属性辞書を取得 set targetAttributes to targetAttributedString’s attributesAtIndex:currentIndex effectiveRange:(missing value) — 対象範囲の文字列を取得 set targetRange to (current application’s NSMakeRange(currentIndex, searchLength)) set targetSubstring to (targetAttributedString’s attributedSubstringFromRange:(targetRange))’s |string|() — 属性と文字列の一致を確認 if (targetSubstring as string = searchString) and (targetAttributes = searchAttributes) then set end of matches to {location:currentIndex, |length|:searchLength} end if — 次の位置に進む set currentIndex to currentIndex + 1 end repeat return matches — 一致したすべての範囲を返す end searchAttributedStringWithAttributes |
More from my site
(Visited 1 times, 1 visits today)