DTPab

DTPにまつわるあれこれ

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

今回はオーバーライドを削除するというClearStyleOverridesスクリプトについてです。
こちらの記事の続きです。

uske-s.hatenablog.com

uske-s.hatenablog.com

はじめに

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

ClearStyleOverrides.jsx

機能の説明

段落スタイル、文字スタイル、表スタイル・セルスタイル、オブジェクトスタイルのオーバーライドをすべてクリアします。
それぞれ特定のスタイルのみをターゲットにオーバーライドをクリアすることも可能です。

f:id:uske_S:20200305101358p:plain
設定ダイアログ

ダイアログからオーバーライドをクリアしたいものにチェックを入れ、スタイルを特定する場合はそれを選択。でなければ [All] でドキュメント中のすべてのスタイルでオーバーライドをクリアします。

前提条件

ドキュメントを開いた状態で実行します。
スクリプトの対象となるのは最前面のドキュメントです。

注意点

  • UndoModeが設定されていないため、スクリプト実行後にUndoするのは危険です。どこまでUndoできているか確認するのが大変。
  • 表スタイルのオーバーライドをクリアすると、その表のセルも同時にオーバーライドをクリアされる。
    しかしセルスタイルは選べない。
  • ロックされたレイヤー、オブジェクトは対象外。
  • 非表示のレイヤー、非表示のオブジェクトは対象となる。
  • スタイル名に:が使われていると意図しない動作になる可能性があります。
    基本的にはエラーになるものの、スタイルグループ名とスタイル名次第では最後まで実行されてしまいます。
  • オブジェクトスタイルについてはかなり注意が必要。
    f:id:uske_S:20200305103916p:plain
    デフォルトのオブジェクトスタイル
    オブジェクトスタイルを新規に作成した上でそれを設定していない(要するにデフォルトスタイルのママ)ものは、デフォルトスタイルに戻される*1

ClearStyleOverrides について雑感

  • スタイルグループの参照をwhile文でやっていて、スマートかつシンプル。
function getStyleString(style) {
    var styleName = style.name;
    while (style.parent.constructor.name.match(/Group$/)) {
        style = style.parent;
        styleName = style.name + ":" + styleName;
    }
    return styleName;
}

while文らしい使い方! ちょっと感動した。これなら関数を再帰的に呼び出す必要もないのでスタックオーバーフローに怯えなくてよい。

  • 処理を終えたかどうかのメッセージはあったほうが嬉しい。
  • UndoModeの設定もあったほうが嬉しい。
  • セルスタイルもCell.clearCellStyleOverrides()メソッドで解除されることは明記したほうがよかったのでは。
    • その場合にセルスタイルは選べるようにしたほうがよかったのでは。
  • SUIのオブジェクトとプロパティの使い方がいいなと思った。
    item.characterStyle = "[All]";のようにプロパティを自分好みに追加しているので便利に使える。

個人的には、このスクリプトの出番はほとんどなさそう。だってどこがどう変わるか予想できないので怖すぎるから…。
まぁ使うシーンが想定できなくはないんですけど、それでもひとつずつ確認して処理したいなと思う。

*1:例えば、基本グラフィックフレームのスタイルが設定されたまま、塗り色などを変更しているものは(基本グラフィックフレームが塗りなしなら)塗り色がなしになる