Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

スクリプト作成のためのスクリプト支援 -検索内容の実行コード書き出し

3,808 views

Published on

InDesignの検索ダイアログの内容をJavaScriptコードで書き出すスクリプトを作ってみた

Published in: Design
  • Follow the link, new dating source: ♥♥♥ http://bit.ly/36cXjBY ♥♥♥
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Dating direct: ♥♥♥ http://bit.ly/36cXjBY ♥♥♥
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Be the first to like this

スクリプト作成のためのスクリプト支援 -検索内容の実行コード書き出し

  1. 1. スクリプト作成のための スクリプト支援 武藤健志 Twitter: @kmuto 2017.9.9 at DTPerのスクリプトもくもく会#3
  2. 2. こんなのを作ってみた ● スクリプトを書いていると、UIの検索置換の内容をスク リプト化したいことがある ● InDesignの検索ダイアログの内容を、JavaScriptコード で書き出す – テキスト – 正規表現 – 字形 – オブジェクト – (文字種変換は内部的にもテキストの一種っぽい)
  3. 3. デモ...の結果 app.findChangeTextOptions.caseSensitive = false; app.findChangeTextOptions.ignoreDiacritics = false; app.findChangeTextOptions.ignoreKashidas = true; app.findChangeTextOptions.includeFootnotes = true; app.findChangeTextOptions.includeHiddenLayers = false; app.findChangeTextOptions.includeLockedLayersForFind = false; app.findChangeTextOptions.includeLockedStoriesForFind = false; app.findChangeTextOptions.includeMasterPages = false; app.findChangeTextOptions.kanaSensitive = true; app.findChangeTextOptions.wholeWord = false; app.findChangeTextOptions.widthSensitive = true; app.findTextPreferences = NothingEnum.NOTHING; app.findTextPreferences.findWhat = "あああ"; app.findTextPreferences.justification = Justification.RIGHT_ALIGN; // app.findTextPreferences.numberingRestartPolicies = resolve("/@find-text-preferences/@numbering-restart-policies"); // app.findTextPreferences.bulletChar = resolve("/@find-text-preferences/@bullet-char"); // app.findTextPreferences.parent = resolve("/"); app.changeTextPreferences = NothingEnum.NOTHING; app.changeTextPreferences.changeTo = "いいい"; // app.changeTextPreferences.numberingRestartPolicies = resolve("/@change-text-preferences/@numbering-restart-policies"); // app.changeTextPreferences.bulletChar = resolve("/@change-text-preferences/@bullet-char"); // app.changeTextPreferences.parent = resolve("/"); // app.activeDocument.changeText();)
  4. 4. ポイント ● コピーバッファに文字列を保存 – 既存ドキュメントを壊したくない→app.documents.add() で空ドキュメント・空テキストフレームを作ってコンテン ツ配置、app.copy()してドキュメント破棄 – 本当はウィンドウを一切出したくないが、app.copy()は ウィンドウが必要 ● スタイルグループを深追い ● propertiesの解析
  5. 5. 気づき: スタイルグループの取り扱い ● findのappliedParagraphStyle, appliedCharacterStyle, appliedObjectStyleは妥当なオブジェクトではなく「文字列」 ● appliedParagraphStyle, appliedCharacterStyleの文字列か らはグループ名が落ちてる… – Yusukeさんのように検索データをいったんファイル保存(XML形式)し て解析? – あまりファイルは作りたくないので、別グループに同じスタイル名を 作る人は「ギルティ」ということで考えない – 再帰でとりあえず最初に一致したものに
  6. 6. 新しい革袋? ● appliedObjectStyle
  7. 7. 新しい革袋? ● オブジェクトスタイルは、InDesignにとって比 較的新参。そのオブジェクトスタイル向けの appliedObjectStyleは uE00B というプライ ベート領域の文字を使ってスタイル名を区切る ● これはもしかして、内部ロジックがいろいろ改 善されていて、実はほかでも使えたり?
  8. 8. 検証 ● findText/changeText/findGrep/ changeGrep – appliedParagraphStyle, appliedCharacterStyle – ○ "スタイルグループ 1ue00b文字スタイル 1"; ● findObject – appliedObjectStyle – ○ "スタイルグループ 1ue00bオブジェクトスタイル 1";
  9. 9. ● changeObject – appliedObjectStyle – × "スタイルグループ 1ue00bオブジェクトスタイル 1"; なんだと… 結論:新しい革袋じゃなくて、 やっぱりつぎはぎだったよ… ちなみにXMLスタイル名にもダメだった orz
  10. 10. なぜ文字列か ● 検索置換は「app.documents[0].findTextPreferences」 ではなく「app.findTextPreferences」で設定 (範囲は「検索置換範囲.findText()」とはなるが) – たとえばapp.findText()とすると、単一ドキュメントではなく、 関係のない他ドキュメントも含まれる – 検索や置換のスタイルを「オブジェクト」として取れない可能性 – じゃぁオブジェクトスタイルのはなんで、と問われるとおそらく 何も考えてなかったのではという印象 ● アプリケーション手動操作のほうではたぶん中で例外処理し てるフシがある(検索保存して実行するときも同様)
  11. 11. 設定値の展開 ● 取得/設定可能値を全部並べるのはだるいので、オブジェ クトのpropertiesを利用 ● ロジック的に簡単にとれる文字列、数値、論理値 (true/false)のもののみを展開 ● さらに別のオブジェクトの値になっているものはちょっと 追いきれない – // app.change... = resolve("/@change-object- preferences/@transparency-settings"); みたいな感じでコメントで保持 ● とはいえEnumerator値くらいはなんとかしたい – Justification.RIGHT_ALIGNみたいなの
  12. 12. 逆引き不能… ● Enumeratorオブジェクトには まともな情報なし
  13. 13. あとはがんばれ // Enumerator解釈 function getEnumerator(e) { switch(e) { case Justification.AWAY_FROM_BINDING_SIDE: return "Justification.AWAY_FROM_BINDING_SIDE"; case Justification.CENTER_ALIGN: return "Justification.CENTER_ALIGN"; case Justification.CENTER_JUSTIFIED: return "Justification.JUSTIFIED"; case Justification.FULLY_JUSTIFIED: return "Justification.FULLY_JUSTIFIED"; case Justification.LEFT_ALIGN: return "Justification.LEFT_ALIGN"; case Justification.LEFT_JUSTIFIED: return "Justification.LEFT_JUSTIFIED"; case Justification.RIGHT_ALIGN: return "Justification.RIGHT_ALIGN"; case Justification.RIGHT_JUSTIFIED: return "Justification.RIGHT_JUSTIFIED"; case Justification.TO_BINDING_SIDE: return "Justification.TO_BINDING_SIDE"; …… default: return null; } }
  14. 14. 補足 ● ~/Library/Preferences/ExtendScript ToolkitにESTKのオブジェクトモデルビューア の元データXMLがあるよ by おおまちさん ● 取り出し自体は簡単にできた(5分で書いた Rubyスクリプト)ので、あとはこれを反映し ていく予定
  15. 15. URL ● Hacking InDesign with JavaScript – https://kmuto.jp/indesign/ ● 今回のスクリプト https://kmuto.jp/indesign/scripts/ dialogs/dialogExportFindSet.jsx 2017, @kmuto

×