LoginSignup
0
1

More than 1 year has passed since last update.

InDesign JavaScript XML アンカー画像にオブジェクトスタイルを適応(AFTER_NEW版)

Last updated at Posted at 2021-11-21

構造からレイアウトにドラッグして配置された要素にアンカー画像が含まれている場合、アンカー画像にオブジェクトスタイルを適応するスクリプトは、これで良いのかな・・・?

adobeコミュニティにて助けて頂きました。

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

更新 2021/11/23
*/

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

// 名前空間
#targetengine "kohakuNekotarouAnchoredObjectApplyObjectStyle"

// スクリプト名
var scriptName = "アンカー画像にオブジェクトスタイルを適応(AFTER_NEW版)";

// eventListener名
eventListenerNameArray = ["kohakuNekotarouAfterNew","kohakuNekotarouAfterSelectionAttributeChanged"];

// eventListenerを削除
eventListenerRemove(eventListenerNameArray);

/* GUI */
// ウィンドウ
var window1 = new Window("window", undefined, undefined, {maximizeButton: false, minimizeButton: true});
window1.text = scriptName;
window1.orientation = "column";
window1.alignChildren = ["left","center"];
window1.spacing = 8; 
window1.margins = 16;

// グループ
var group1 = window1.add("group", undefined); 
group1.orientation = "row"; 
group1.spacing = 10; 
group1.margins = 0;

// テキスト
group1.add("statictext", undefined, "適応するオブジェクトスタイル:"); 

// オブジェクトスタイルの名前一覧
var dropdown1_name_array = [];

// オブジェクトスタイルのID一覧
var dropdown1_id_array = [];

// オブジェクトスタイル一覧
var dropdown1_object_array = [];

// オブジェクトスタイルの数だけ繰り返す
for(var i = 0; i < app.activeDocument.allObjectStyles.length; i++){

    // オブジェクトスタイル名をgetStyleString関数を使い入れる
    dropdown1_name_array.push(getStyleString(app.activeDocument.allObjectStyles[i]));

    dropdown1_id_array.push(app.activeDocument.allObjectStyles[i].id);

    // オブジェクトスタイルを入れる
    dropdown1_object_array.push(app.activeDocument.allObjectStyles[i]);
}

// ドロップダウンリスト
var dropdown1 = group1.add("dropdownlist", undefined, undefined, {items: dropdown1_name_array}); 
dropdown1.selection = 0;

// テキスト
window1.add("statictext", undefined,"・構造からレイアウトにドラッグして配置された要素にアンカー画像が含まれている場合、アンカー画像に指定のオブジェクトスタイルを適応します。");
window1.add("statictext", undefined,"・新しく画像がリンクされた際に処理が行われます。配置をやり直す場合は配置したオブジェクトを削除するのでは無く、アンドゥを行ってください。");
window1.add("statictext", undefined, "・スクリプトの操作をアンドゥに含めません。ウィンドウを閉じるとスクリプトを終了します。");

// 閉じられた場合の処理
window1.onClose = function(){

    // eventListenerを削除
    eventListenerRemove(eventListenerNameArray);
}

// 表示
window1.show();
/* GUI */

// 検索結果配列
var searchResultArray;

// Link.AFTER_NEWのeventListenerを追加
var myEventListener1 = app.addEventListener(Link.AFTER_NEW, function(){

    // 選択が有る場合
    if(app.activeDocument.selection.length > 0){

        // 選択が要素の場合
        if(app.activeDocument.selection[0].constructor.name == "XMLElement"){

            // オブジェクトスタイルが存在する場合
            if(dropdown1_object_array[dropdown1.selection.index].isValid == true){

                // オブジェクトスタイルが一致する場合
                if(dropdown1_object_array[dropdown1.selection.index].id == dropdown1_id_array[dropdown1.selection.index]){

                    // Application.AFTER_SELECTION_ATTRIBUTE_CHANGEDのeventListenerを追加
                    var myEventListener2 = app.addEventListener(Application.AFTER_SELECTION_ATTRIBUTE_CHANGED, function(){

                        // eventListenerを削除
                        myEventListener2.remove();

                        /* 操作をアンドゥに含めない */
                        app.doScript(function(){

                            // 検索文字を初期化
                            app.findTextPreferences = NothingEnum.NOTHING;

                            // アンカー付きオブジェクトマーカーを検索対象に
                            app.findTextPreferences.findWhat = "^a";

                            // 選択の数だけ繰り返す
                            for(var i = 0; i < app.activeDocument.selection.length; i++){

                                // テキスト検索の結果を入れる
                                searchResultArray = app.activeDocument.selection[i].findText();

                                // 検索結果の数だけ繰り返す
                                for(var ii = 0; ii < searchResultArray.length; ii++){

                                    // 検索結果の子にRectangleが有る場合
                                    if(searchResultArray[ii].rectangles.length > 0){

                                        // オブジェクトスタイル適応
                                        searchResultArray[ii].rectangles[0].applyObjectStyle(dropdown1_object_array[dropdown1.selection.index],true,true);
                                    }
                                }
                            }

                            // 検索文字を初期化
                            app.findTextPreferences = NothingEnum.NOTHING;

                        // 言語、引数(配列)、操作をアンドゥに含めない、メニューのアンドゥ名
                        }, ScriptLanguage.JAVASCRIPT,[], UndoModes.AUTO_UNDO, scriptName);
                        /* 操作をアンドゥに含めない */

                    });

                    // eventListenerに名前を付ける
                    myEventListener2.name = eventListenerNameArray[1];

                // 以外の場合
                }else{

                    // 警告
                    alert("オブジェクトスタイルが一致しません。");

                    // 閉じる
                    window1.close();
                }

            // 以外の場合
            }else{

                // 警告
                alert("オブジェクトスタイルが見つかりません。");

                // 閉じる
                window1.close();
            }
        }
    }
});

// eventListenerに名前を付ける
myEventListener1.name = eventListenerNameArray[0];

// eventListenerを削除
function eventListenerRemove(eventListenerNameArray){

    // eventListenerの名前の数だけ繰り返す
    for(var i = 0; i < eventListenerNameArray.length; i++){

        // 指定した名前のeventListenerが存在する場合
        while(app.eventListeners.itemByName(eventListenerNameArray[i]).isValid){

            // eventListenerを削除
            app.eventListeners.itemByName(eventListenerNameArray[i]).remove();
        }
    }
}

// スタイルグループの参照(コミュニティスクリプトのClearStyleOverridesより拝借)
function getStyleString(style) {
    var styleName = style.name;
    while (style.parent.constructor.name.match(/Group$/)) {
        style = style.parent;
        styleName = style.name + ":" + styleName;
    }
    return styleName;
}
0
1
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
1