LoginSignup
0
0

More than 1 year has passed since last update.

InDesign スクリプト 属性を選択(構造の属性の値の検索結果から)

Last updated at Posted at 2021-06-08

構造の属性の値の検索結果から属性を選択するスクリプトはこれで良いのかな・・・?

/*
構造の属性の値の検索結果から属性を選択
更新 2021/06/09
*/

// アプリ指定
#target "indesign";

// スクリプト名
var scriptName = "属性を選択(構造の属性の値の検索結果から)";

// 検索文字を入力
var findGrepText = prompt("検索する属性の値(JavaScriptの正規表現)\r(選択された構造内の属性がある場合はその中から検索)","",scriptName);

// キャンセルされた時の処理
if(findGrepText == null){

    // スクリプトを終了
    exit();
}

// エラーが発生した場合の処理
try{

    // 正規表現オブジェクトを作り検索文字に入れる
    // mでマルチラインモード(^と$を各行の行頭、行末に一致させる為)
    findGrepText  = new RegExp(findGrepText,"m");

// エラーの場合
}catch(e){

    // 検索文字にnullを入れる
    findGrepText = null;
}

// 選択されているオブジェクト記憶用
var selectObjects = [];

// 選択が存在しない場合
if(app.activeDocument.selection.length == 0){

    // 構造内のすべての要素を選択する関数を使用
    selectObjects = selectAllAttributes(app.activeDocument.xmlElements,selectObjects);

// 選択が存在する場合
}else{

    // 選択されているオブジェクト
    selectObjects = app.activeDocument.selection;

    // すべての選択を解除
    app.activeDocument.selection = null;
}

// 選択オブジェクトの数だけ繰り返す
for(var i = 0; i < selectObjects.length; i++){

    // 選択オブジェクトが属性の場合
    if(selectObjects[i].constructor.name == "XMLAttribute"){

        // 属性名を検索して引っかかった場合
        if(selectObjects[i].value.match(findGrepText)){

            // 選択に追加
            selectObjects[i].select(SelectionOptions.addTo);
        }
    }
}

// 結果表示
alert("選択数 " + app.activeDocument.selection.length,scriptName);

/* 構造内の全ての属性を選択する為の関数、引数(xmlElements,再帰的処理の為の選択を記憶する配列) */
function selectAllAttributes(hierarchyElements,selectObjects){

    // 要素の数だけ繰り返す
    for (var i = 0; i < hierarchyElements.length; i++) {

        // 要素に子要素が存在するか
        if(hierarchyElements[i].xmlElements.length > 0){

            // 存在する場合再帰的処理
            number = selectAllAttributes(hierarchyElements[i].xmlElements,selectObjects);
        }

        // 属性の数だけ繰り返す
        for (var ii = 0; ii < hierarchyElements[i].xmlAttributes.length; ii++) {

            // 要素を選択を記憶する為の配列に追加
            selectObjects.push(hierarchyElements[i].xmlAttributes[ii]);
        }
    }

    // 選択する為のオブジェクトの値を戻す
    return selectObjects;
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0