トップ «前の日記(2017年08月01日) 最新 次の日記(2017年11月17日)» 編集

KeN's GNU/Linux Diary


2017年09月11日

_ [indesign] DTPerのスクリプトもくもく会#3に参加してきた

前々から気になっていた DTPerのスクリプトもくもく会 にようやく参加でき、Yusukeさんらお会いしてみたかった方々にもお会いできてたいへん有意義な時間でした。

新たな知見も得られて、今後のAdobeツール向けのスクリプト開発がまた一段とはかどりそうです。ありがとうございました。

  • ESTKのオブジェクトモデルビューアの元データは、~/Library/Preferences/ExtendScript Toolkit/<ESTKバージョン>/omv$indesign-<バージョン>.xmlのようにして格納されている(ユーザー環境から拾っていることから推測できるように、一度そのバージョンをビューする必要がある)。これを拾えば、普通には困難なEnumerator値の逆引きができる。具体的には/dictionary/package/classdef[@enumeration='true']から簡単に拾い出せた。
  • ESTKの不快なプチフリは、すべてのAdobeツールのnapを切りまくればよい。ESTKとInDesignだけはやっていたのだけれども、全部やらないと効果がないらしい。( https://ten5963.wordpress.com/2017/06/22/estkのプチフリについて/ から転載)
while read domain; do defaults write "$domain" NSAppSleepDisabled -bool YES; done < <(defaults domains | awk 'BEGIN {FS=", "} {for(i=1;i<=NF;i++)print $i}' | grep -i adobe)

私は「スクリプト作成のためのスクリプト支援」として、InDesign上での検索UIで指定した内容を、JavaScriptのソースとして書き出すというスクリプトをもくもく会の間に作ってみました(ある程度作っていたものをブラッシュアップしました)。

実行するとこんな感じで吐き出します。

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.underline = (new Boolean(true));
// app.findTextPreferences.strikeThru = (new Boolean(true));
app.findTextPreferences.underlineColor = "C=0 M=0 Y=0 K=60";
app.findTextPreferences.underlineGapColor = "C=100 M=47 Y=0 K=44";
app.findTextPreferences.underlineGapTint = 50;
// app.findTextPreferences.underlineGapOverprint = (new Boolean(true));
app.findTextPreferences.underlineType = "直線ハッシュ";
app.findTextPreferences.underlineOffset = 8;
app.findTextPreferences.underlineWeight = 1;
app.findTextPreferences.strikeThroughType = "二重線";
app.findTextPreferences.strikeThroughOffset = 0.5;
app.findTextPreferences.leadingModel = LeadingModel.LEADING_MODEL_CENTER;
// app.findTextPreferences.allowArbitraryHyphenation = (new Boolean(true));
// 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.changeConditionsMode = ChangeConditionsModes.REPLACE_WITH;
// 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();

テスト用に適当に設定したのでちょっと長くなっていますが、設定項目がnullやデフォルト値の場合は書き出さないので、普通はもっと少なくなります。皆さんがもくもくしている中でお時間をいただいて、スクリプト実装内容の発表もさせていただきました。

資料にもあるとおり、私のサイトHacking InDesign with JavaScriptにて、dialogExportFindSet.jsxという名前で公開しています。Enumeratorの逆引きテーブルができたので、「この設定はJavaScriptだとどうなるんだろう?」というときにもちょっと使えるかもしれません。

InDesignのXML探索や、characterの操作などはかなり遅いのに対し、find/grepの検索・置換はチューニングされているのか圧倒的に高速です。InDesignのXMLドキュメント操作においては「ダミー文字を入れておいてdocument.findTextしたりdoument.changeGrepしたりする」というテクニックをよく使います。

そういえばMD5500さんからの宿題となっていたInDesign XMLのDOMの一部を取り出してまた戻す、という操作ですが、やはり綺麗にできそうな気がしません。InDesignのDOM処理はかなり怪しく、ツリー上のUI操作もスクリプト命令も貧弱だし、DOMの「変更」操作は容易にクラッシュするので、コンテンツを直したら一部ではなく全体を組み直すようにしないとやっぱりうまくいかないのでは……というなんとも心許ない返答となります。