コモノExtendScript100本ノック

超初心者のDTPオペレーターが週にひとつスクリプトを書くブログ

014.【ID】複数の段落スタイルの正規表現スタイルを一括設定する

書いたコード

#targetengine "addNestedGrepStyles"

var doc = app.activeDocument;
var pStyles = doc.allParagraphStyles
pStyles.splice(0, 2); // 基本段落と段落スタイルなしを除外
var pStylesNames = [];
var pStylesLen = pStyles.length;

var cStyles = doc.characterStyles;
var cStylesNames = [];
var cStylesLen = cStyles.length;

if (pStylesLen <= 0) {
  alert("段落スタイルがありません")
} else if (cStylesLen <= 0) {
  alert("文字スタイルがありません")

} else {
  for (var i = 0; i < pStylesLen; i++) {
    pStylesNames.push(pStyles[i].name)
  }
  for (var i = 0; i < cStylesLen; i++) {
    cStylesNames.push(cStyles[i].name)
  }


  // ウィンドウ作成
  var wnd = new Window("window", "正規表現スタイル一括設定");
  wnd.alignChildren = "top";
  wnd.orientation = "row";

  var leftCol = wnd.add("panel", undefined, "対象段落スタイル")
  leftCol.preferredSize = [120, 100]
  leftCol.alignChildren = "left";
  var tgtPstyles = []
  for (var i = 0; i < pStylesLen; i++) {
    tgtPstyles.push(leftCol.add("checkbox", undefined, pStylesNames[i])) // 一時的にチェックボックスオブジェクトを格納する変数をつくるべき?
  }

  var rightCol = wnd.add("group {alignChildren: 'fill', orientation: 'column' }");
  rightCol.preferredSize = [120, 100]
  rightCol.add("statictext", undefined, "スタイルを適用:");
  var appliedCStyleList = rightCol.add("dropdownlist", undefined, cStylesNames)
  rightCol.add("statictext", undefined, "テキスト:");
  var pttrn = rightCol.add("edittext", undefined);


  var start = wnd.add("button", undefined, "実行");
  wnd.show();
  start.onClick = function () {
    if (pttrn.text === "") {
      alert("正規表現を入力してください")
    } else if (!appliedCStyleList.selection) {
      alert("文字スタイルを選択してください")
    } else {
      for (var j = 0; j < pStylesLen; j++) {
        if (tgtPstyles[j].value) {
          var appliedCStyle = cStyles.itemByName(appliedCStyleList.selection.text);

          var tgtPstyle = pStyles[j];
          tgtPstyle.nestedGrepStyles.add({
            appliedCharacterStyle: appliedCStyle,
            grepExpression: pttrn.text
          });
        }
      }
    }
  }

}

メモ

知ったこと

  • ParagraphStyleのプロパティNestedGrepStylesはコレクションオブジェクト

疑問点

  • panel
    • var leftCol = wnd.add("panel{alignChildren: 'left'}", undefined, "対象段落スタイル") とするとパネルのタイトルが表示されない。
    • パネルのタイトルとチェックボックスの間隔をあけたかったのだけどやり方が分からなかった。

積み残し

  • 既に同じ正規表現スタイルが設定されていたら飛ばす処理を追加
  • コードの整形&テスト不十分

参考