DTPab

印刷やデザイン、アドビ製アプリやスクリプトなど、雑多な技術ブログ

InDesign 15.0.2 コミュニティスクリプトを紐解く 1

昨日速報的に書いた記事の続きです。

uske-s.hatenablog.com

今回はBreakTextThread.jsxを読み込んでみます。

はじめに

Adobeのヘルプだけでは心許ないので、中身をざっと解読してみました。その上でなるべく条件を整理してみたものです。間違いがあればご指摘ください。

BreakTextThread.jsx

機能の説明

テキスト連結を下記のように解除します。

  • 選択したテキストフレーム同士
    (Before the Selected Frame / After the Selected Frame)
  • 選択したストーリーのすべてのテキストフレーム同士
    (All Frames in the Selected Story)
  • 選択した段落スタイル(ドキュメントを通して)
    (Before Frames with Paragraph Style)

前提条件

  • 連結されたテキストフレーム、もしくはテキストを選択した状態で実行する
  • Before / After the Selected Frame を対象とする場合、当然ながらBeforeといって先頭のフレーム、Afterといって最後のフレームを選択して実行はできない
  • 複数のテキストフレームを選択しても実行できない

注意点

  • 条件によってEndnotes(後注)が消えてしまう可能性がある*1らしい。(その場合、Undoで作業を戻してください、とのこと*2
    この件の注意点原文はこちら。

You have lost some endnotes!!
(This can happen if the thread between two frames of a single set of endnotes has been broken.)
Press Ctrl-Z (or Cmd-Z on a Mac) to undo.

スクリプト的には、実行前にEndnotesの数を確認しておき、実行後のEndnotesの数と比較して、そこに齟齬があった場合に上記文言の警告文が出るようになっています。

  • 対象をBefore Frames with Paragraph Style とした際、スタイル名に>が入っていると意図しない動作になる可能性があります。
    基本的にはエラーになるものの、スタイルグループ名とスタイル名次第では最後まで実行されてしまいます。
  • 対象をBefore Frames with Paragraph Style とした際、段落スタイルを参照できるのはスタイルグループ1階層まで。2階層より深い段落スタイルを参照させるとエラーでスクリプトが終了します。
  • 対象をBefore Frames with Paragraph Style とした際、選択した段落スタイルが入っているテキストフレームのストーリーが分割されます。要するにそれがフレームの先頭にあるかどうかまでは見てません。
  • 連結時状態で先のテキストフレームの末尾に改行\rか改段が入っていたら、連結を解除したあと、それは削除されます。削除されるのはその2文字だけです。
  • ロックされたレイヤーがあるとエラーになります*3
  • 複数のテキストフレームを選択してスクリプトを実行し、ダイアログでオプションを選んでも、警告も出ずなにもしないでスクリプトが終了します。

BreakTextThread について雑感

使い方次第では非常に便利です。特に段落スタイルの段落分離禁止オプションで段落の開始位置を「次の段」などにしている場合です。
「Before Frames with Paragraph Style」を設定して実行すると、指定した段落スタイルが入っているテキストフレームと前のテキストフレームの連結を解除してくれます。開発者も冒頭のコメントアウトに書いている通り*4、ひとつなぎの長いストーリーで作ったデータを、章見出し単位でフレームを分けたい、というときにいいな〜と思いました。
機能とは別に、例外処理(開発者が想定していないエラーなど)がtry/catch文に丸投げだったり*5、段落スタイルのグループ参照が1階層までであったり、スタイル名に>が入る可能性を加味していなかったり、Endnotesが消えたらUndoしてくれとか投げやりだったり*6、不具合と思われる挙動のフォローをもう少し詰めるといいなと思います。

可読性やメンテナンス性には言及しませんが、変数をスコープの先頭で定義するというES3らしい所作とか、コンストラクタとインスタンスの関係をしっかり把握している*7な、というところは勉強になりました。
あと好みの問題といっていいのか、if ((A instanceof B) == false)みたいな処理があって、わざわざ == falseではなく、否定演算子!で良さそう…という部分がありました。

以上がこの BreakTextThread スクリプトの説明です。
開発者の意図通りにハマれば非常に面白く便利なスクリプトなので、おすすめです。

*1:僕は再現できなかった。連結状態が壊れていると起きるらしい

*2:UndoModeが設定されており、スクリプト処理中はUndo履歴が残らないよう配慮されています

*3:ロックされたテキストフレームは問題なく動作します

*4:原文:great for dividing a long document into separate stories, one per chapter

*5:それはそれで労力をかけずに例外処理にできるので便利ではあるものの、しっかりやるならどんな不具合・エラーが起こるか、実行前にきちんとドキュメントや選択状態を確認してバリデーションしたほうがより堅実かと僕は考えます

*6:僕ならスクリプト実行前に保存させて、Endnotesが消えたら復帰するようにするかも…

*7:instanceof演算子の使い方を見て思った