LoginSignup
0
0

More than 1 year has passed since last update.

InDesign スクリプト 違いのある段落を条件テキストに

Posted at

違いのある段落を条件テキストにするスクリプトは、これで良いのかな・・・?

/*
検索結果を属性にするスクリプトで正規表現に(?s).+を入れると文章全体を検索結果に出来ます。
更新 2021/06/29
*/

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

// スクリプト名
var scriptName = "違いのある段落を条件テキストに";

//スクリプト動作指定(一つのアンドゥ履歴にする及びアンドゥ名の指定)
app.doScript(function () {

    // ダイアログ
    var dialogueFlg = confirm("属性と要素を比較して違いのある段落に条件テキストを適用します。"
    + "\r\r" + "「属性を編集」で編集する(OKを押す)と段落の終わりと強制改行が変更されて正しく比較できなくなるので注意して下さい。"
    + "\r\r" + "比較して違いのない段落に指定された条件テキストが適用されている場合は適用を取消します。"
    + "\r\r" + "属性を選択して実行して下さい。","", scriptName);

    // Noの場合
    if (dialogueFlg == false) {

        // 終了
        exit();
    }

    /* ダイアログ処理開始 */
    // ダイアログX座標
    var dialogWidthXCoordinates = 0;

    // ダイアログY座標 
    var dialogWidthYCoordinates = 0;

    // ダイアログ幅
    var dialogWidth = 400;

    // ダイアログ高さ
    var dialogHeight = 105;

    // ダイアログ作成
    var dialogWindow = new Window("dialog", scriptName, [dialogWidthXCoordinates, dialogWidthYCoordinates, dialogWidthXCoordinates + dialogWidth, dialogWidthYCoordinates + dialogHeight]);

    // 説明文
    dialogWindow.add("statictext",[10,10,390,25],"条件テキスト:");

    // 条件テキストの名前一覧
    var conditionalTextNameList = ["[条件なし]"];

    // 条件テキストの数だけ繰り返す
    for (var i = 0; i < app.activeDocument.conditions.count(); i++) {

        // 条件テキストを収集
        conditionalTextNameList.push(app.activeDocument.conditions.item(i).name);
    }

    // 条件テキスト選択用ドロップダウンリスト作成
    var dropdownlist = dialogWindow.add("dropdownlist", [10,35,390,35], conditionalTextNameList);

    // 段落スタイル選択用ドロップダウンリストの初期選択
    dropdownlist.selection = 0;

    // ボタンの幅
    var buttonWidth = 80;

    // ボタンの高さ
    var buttonHeight = 25;

    // ボタンをウィンドウ下部中央に配置
    dialogWindow.add("button", [(dialogWidth / 2) - 10 - buttonWidth, dialogHeight - 10 - buttonHeight, (dialogWidth / 2) - 10, dialogHeight - 10], "適用", {name: "ok"});
    dialogWindow.add("button", [(dialogWidth / 2) + 10, dialogHeight - 10 - buttonHeight, (dialogWidth / 2) + 10 + buttonWidth, dialogHeight - 10], "キャンセル", {name: "cancel"});

    // ダイアログを画面のセンターに
    dialogWindow.center();

    // ダイアログを表示
    // キャンセルの場合
    if (dialogWindow.show() == 2) {

        // スクリプトを終了
        exit();
    }
    /* ダイアログ処理完了 */

    // 選択
    var selectObjects = app.activeDocument.selection;

    // 要素を分割した配列
    var elementContentsSplitArray = [];

    // 属性を分割した配列
    var attributeValueSplitArray = [];

    // 適用されている条件テキストの配列
    var appliedConditionsArray = [];

    // 条件テキストを調べるオブジェクト
    var checkConditionsObject;

    // 適用フラグ
    var applyFlg;

    // 適用数
    var appliedElementsNumber = 0;

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

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

        // 初期化
        applyFlg = false;

        // 選択が属性の場合
        if (selectObjects[i].constructor.name == "XMLAttribute"){

            // プロパティが存在する場合
            if (selectObjects[i].parent.xmlContent.hasOwnProperty("paragraphs") == true) {

                // 要素を\rで分割
                elementContentsSplitArray = selectObjects[i].parent.xmlContent.contents.split("\r");

                // 属性を\rで分割
                attributeValueSplitArray = selectObjects[i].value.split("\r");

                // 要素を分割した配列の数だけ繰り返す
                for(var ii = 0; ii < elementContentsSplitArray.length; ii++){

                    // iiが属性を分割した配列より小さい場合
                    if(ii < attributeValueSplitArray.length){

                        // 配列の最後の場合
                        if(ii == elementContentsSplitArray.length - 1){

                            // 要素の配列が小さい場合
                            if(attributeValueSplitArray.length > elementContentsSplitArray.length){

                                // paragraphsがある場合
                                if(selectObjects[i].parent.xmlContent.paragraphs.count() != 0){

                                    // 最後の段落に条件テキストを適用
                                    myApplyConditionsFunction(selectObjects[i].parent.xmlContent.paragraphs.item(-1),dropdownlist.selection);

                                // 以外(空)の場合
                                }else{

                                    // 最後の挿入点に条件テキストを適用
                                    myApplyConditionsFunction(selectObjects[i].parent.xmlContent.insertionPoints.item(-1),dropdownlist.selection);
                                }

                                // trueを入れる
                                applyFlg = true;

                                // 繰り返しを抜ける
                                break;
                            }
                        }

                        // 要素と属性が違う場合
                        if(elementContentsSplitArray[ii] != attributeValueSplitArray[ii]){

                            // 最後の配列で要素を分解した配列の数が要素の段落の数より多い(最後に空の行がある)場合
                            if(ii == elementContentsSplitArray.length - 1 && elementContentsSplitArray.length > selectObjects[i].parent.xmlContent.paragraphs.count()){

                                // paragraphsがある場合
                                if(selectObjects[i].parent.xmlContent.paragraphs.count() != 0){

                                    // 最後の段落に条件テキストを適用
                                    myApplyConditionsFunction(selectObjects[i].parent.xmlContent.paragraphs.item(-1),dropdownlist.selection);

                                // 以外(空)の場合
                                }else{

                                    // 最後の挿入点に条件テキストを適用
                                    myApplyConditionsFunction(selectObjects[i].parent.xmlContent.insertionPoints.item(-1),dropdownlist.selection);
                                }

                            // 以外の場合
                            }else{

                                // 段落に条件テキストを適用
                                myApplyConditionsFunction(selectObjects[i].parent.xmlContent.paragraphs.item(ii),dropdownlist.selection);
                            }

                            // trueを入れる
                            applyFlg = true;

                        // 要素と属性が同じ場合
                        }else{

                            // paragraphsがある場合
                            if(selectObjects[i].parent.xmlContent.paragraphs.count() != 0){

                                // 段落を入れる
                                checkConditionsObject = selectObjects[i].parent.xmlContent.paragraphs.item(ii);

                            // 以外(空)の場合
                            }else{

                                // 最後の挿入点を入れる
                                checkConditionsObject = selectObjects[i].parent.xmlContent.insertionPoints.item(-1);
                            }

                            // 適応されている条件テキストがある場合
                            if(checkConditionsObject.appliedConditions.length != 0){

                                // 適応されている条件テキストの配列の数だけ繰り返す
                                for(var iii = 0; iii < checkConditionsObject.appliedConditions.length; iii++){

                                    // 指定された条件テキストが適用されている場合
                                    if(checkConditionsObject.appliedConditions[iii].name == dropdownlist.selection.text){

                                        // 適用されている条件テキストの配列を入れる
                                        appliedConditionsArray = checkConditionsObject.appliedConditions;

                                        // 指定された条件テキストを配列から削除
                                        appliedConditionsArray.splice(iii,1);

                                        // 適用されている条件テキストに条件テキストの配列を入れる
                                        checkConditionsObject.appliedConditions = appliedConditionsArray;
                                    }
                                }
                            }
                        }

                    // 大きい場合
                    }else{

                        // 配列の最後で要素を分解した配列の数が要素の段落の数より多い(最後に空の行がある)場合
                        if(ii == elementContentsSplitArray.length - 1 && elementContentsSplitArray.length > selectObjects[i].parent.xmlContent.paragraphs.count()){

                            // 条件テキストを適用
                            applyFlg = myApplyConditionsFunction(selectObjects[i].parent.xmlContent.paragraphs.item(-1),dropdownlist.selection);

                        // 以外の場合
                        }else{

                            // 条件テキストを適用
                            applyFlg = myApplyConditionsFunction(selectObjects[i].parent.xmlContent.paragraphs.itemByRange(ii,-1),dropdownlist.selection);
                        }

                        // trueを入れる
                        applyFlg = true;

                        // 繰り返しを抜ける
                        break;
                    }
                }
            }
        }

        // trueの場合
        if(applyFlg == true){

            // 要素を選択
            selectObjects[i].parent.select(SelectionOptions.ADD_TO);

            // 数を増やす
            appliedElementsNumber++;
        }
    }

    // 適用数が0の場合
    if(appliedElementsNumber == 0){

        // 選択を戻す
        app.activeDocument.selection = selectObjects;
    }

    // 結果表示
    alert("違いがある要素数 " + appliedElementsNumber,scriptName);

//スクリプト動作指定(一つのアンドゥ履歴にする及びアンドゥ名の指定)の続き
}, ScriptLanguage.JAVASCRIPT, [scriptName], UndoModes.ENTIRE_SCRIPT, scriptName);

/* 条件テキストを適用する関数、引数(対象のオブジェクト、ドロップダウンリストの選択)の宣言*/
function myApplyConditionsFunction(targetObject,dropdownlistSelection) {

    // ドロップダウンリストの一番目ではない場合
    if(dropdownlistSelection.index != 0){

        // 条件テキストが存在する場合
        if(app.activeDocument.conditions.itemByName(dropdownlistSelection.text).isValid == true){

            // 条件テキストを適用
            targetObject.applyConditions(app.activeDocument.conditions.itemByName(dropdownlistSelection.text));
        }

    // 以外の場合
    }else{

        // 条件テキストを削除
        targetObject.appliedConditions = [];
    }
}
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