2008年02月22日

特殊文字処理、リナンバリング

あいかわらずInDesign Hacking with JavaScriptの作業にいそしんでいます。

InDesign側では強制改ページや1/4スペースなどのいろいろな特別な文字を入れることができるのですが、XMLではそのような表現ができません(一部はエンティティで可能ですが、必要なものほどそういうのが用意されていない…)。流し込みで済ませる上ではこういった見栄え操作もできるだけ元テキスト内に含めておきたいので、XMLインストラクションに埋め込まれたデータを拾って特殊文字化するライブラリ(libProcessXMLforSpecialCharacters.jsx)を書きました。

XML側ではこんな感じですね。「dtp」というパラメータ名の値にInDesign JavaScriptのSpecialCharacters enumerationで定義されている名前を全部小文字で書く。

<p>ほげほげ</p>
<?dtp pagebreak?><p>もげもげ...

あとはライブラリを次のように呼び出せば、インストラクションの直前に該当の特殊文字が挿入されます。

processXMLforSpecialCharacters(app.activeDocument, app.activeDocument.xmlItems);

もう1つ作ったのは、段落の自動連番機能の支援です。InDesignには連番機能が一応あるのですが、これはタグ構造ではなくて連続する同一段落スタイルかどうかで判断されちゃっています。このため、たとえば1番の説明の途中でコード例を挟んだりすると、2番目のものの番号が「2.」になるはずがリセットされて「1.」に戻ってしまうと。番号を単にテキスト化して編集するという手もありますがミスを招きやすそうです。ということで、スクリプトlibProcessXMLforRenumbering.jsxを作成。たとえばHTML風にol要素の中にli要素で各番号リスト項目が入っている場合、次のような感じになります。

processXMLforRenumbering(app.activeDocument.xmlItems, "ol", "li");

ロジックとしてはわりあい単純で、リストブロック要素を発見したらその中で項目となる要素を探していって、同じ項目要素が続いているならそのまま継続して番号を控えておき、別のものが挟まったら次に項目要素が来たときにその段落のnumberStartAtを変更するというものです。番号の前のほうで連番が変わったときには再度スクリプトを実行する必要があります。