LoginSignup
0
0

More than 1 year has passed since last update.

InDesign JavaScript XML 属性の名前を変更

Last updated at Posted at 2022-01-15

属性の名前を変更するスクリプトは、これで良いのかな・・・?

/*
このスクリプトを利用して起こった不具合の責任は取れません。
ご了承下さい。

更新 2022/02/22
*/

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

// スクリプト名
var scriptName = "属性の名前を変更";

// スクリプトを実行
app.doScript(function(){
    
    // 変更名
    var changeName = prompt("選択された属性の名前を変更します。" + "\r"
                                            + "親要素が同名の属性を持つ場合は変更しません。" + "\r"
                                            + "名前を入力して下さい。", "", scriptName);

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

        // スクリプトを終了
        exit();
        
    // 名前にXML文法の問題がないか
    }else if(isXMLName(changeName) == false){
        
        // 警告
        alert("入力された属性名にXML文法の問題が有るようです。");
        
        // スクリプトを終了
        exit();
    }
        
    // 即時関数
    var palette = (function(){
        
        // パレットを作成
        var myPalette = new Window("palette","進行状況");
    
        // 間隔
        myPalette.spacing = 5;
        
        // 余白
        myPalette.margins = 10; 

        // 文字
        myPalette.add("statictext", [0, 0, 570, 15], "", {name: "statictext1"});

        // 表示
        myPalette.show();
        
        // パレットオブジェクトを戻す
        return myPalette;
    }());
    
    // 選択が属性の場合
    if (app.activeDocument.selection[0].constructor.name == "XMLAttribute") {
        
        // 選択数
        var selectionNumber = app.activeDocument.selection.length;
        
        // 選択の配列
        var selectionArray = app.activeDocument.selection;
        
        // 名前変更後の属性の配列
        var afterChangeNameAttributeArray = [];
        
        // 親要素
        var parentElement;
        
        // 結果数
        var resultNumber = 0;
        
        // 結果数2
        var resultNumber2 = 0;

        // 選択の数だけ後ろから繰り返す
        for (var i = selectionNumber - 1; i >= 0; i--){

            // 進行状況テキスト
            palette.statictext1.text =  (selectionNumber - i) + "/" + selectionNumber + "" + selectionArray[i].name + "" + changeName;

            // 変更名と選択されている属性の名前が違う場合
            if(selectionArray[i].name != changeName){

                // 親要素に変更名の属性が存在しない場合
                if(selectionArray[i].parent.xmlAttributes.itemByName(changeName).isValid == false){
                    
                    // 属性の親要素を入れる
                    parentElement = selectionArray[i].parent;
                    
                    // 名前変更
                    selectionArray[i].name = changeName;

                    // 名前変更後の属性の配列に追加
                    afterChangeNameAttributeArray.push(parentElement.xmlAttributes.itemByName(changeName));
                    
                    // 結果数を追加
                    resultNumber++;
                    
                // 存在する場合
                }else{
                    
                    // 増やす
                    resultNumber2++;
                }

            // 名前が同じ場合
            }else{

                // 名前変更後の属性の配列に追加
                afterChangeNameAttributeArray.push(selectionArray[i]);
            }
        }
    
        // 選択を解除
        app.activeDocument.selection = null;
    
        // 名前変更後の属性の数だけ繰り返す
        for(var i = 0; i < afterChangeNameAttributeArray.length; i++){
            
            // 名前変更後の属性を選択
            afterChangeNameAttributeArray[i].select(SelectionOptions.ADD_TO)
        }
        
        // 結果表示
        alert("変更数 " + resultNumber + "\r" + "親要素が同名の属性を持っており変更出来なかった数 " + resultNumber2, scriptName);

    // 以外の場合
    }else{
        
        // 警告
        alert("属性以外が選択されているようです。", scriptName);
    }

// 一つのアンドゥ履歴にする
}, ScriptLanguage.JAVASCRIPT, [], UndoModes.ENTIRE_SCRIPT, scriptName);
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