構造の要素の属性名から属性を選択するスクリプトはこれで良いのかな・・・?
/*
構造内の属性名から属性を選択
更新 2021/06/09
*/
// アプリ指定
# target "indesign";
// スクリプト名
var scriptName = "構造内の属性を選択(属性名から)";
// 検索文字を入力
var findGrepText = prompt("構造内の属性名(JavaScriptの正規表現)\r(選択された構造内の属性がある場合はその中から検索)","",scriptName);
// キャンセルされた時の処理
if(findGrepText == null){
// スクリプトを終了
exit();
}
// エラーが発生した場合の処理
try{
// 正規表現オブジェクトを作り検索文字に入れる
findGrepText = new RegExp(findGrepText);
// エラーの場合
}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].name.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;
}