0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

InDesign JavaScript 索引の参照の重複を解消

Last updated at Posted at 2021-10-25

索引の参照の重複を解消するスクリプトは、これで良いのかな・・・?

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

更新 2021/010/29
*/

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

// スクリプト名
var scriptName = "参照の重複を解消";

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

    // ダイアログ
    var dialogueFlg = confirm("索引の目次の参照の索引マーカーの前後の索引マーカーを調べ" + "\r"
    + "同じ目次の場合に参照が重複していると判断し削除します。"
    ,"", scriptName);

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

        // 終了
        exit();
    }

    // 数
    var number = 0;

    // 検索の初期化
    app.findTextPreferences = NothingEnum.NOTHING;

    // 重複している参照を削除
    number = deleteOverlappingPageReferences(app.activeDocument.indexes.firstItem().topics,number);

    // 検索の初期化
    app.findTextPreferences = NothingEnum.NOTHING;

    // 結果
    alert("削除数 " + number);

//スクリプトの動作指定の続き
}, ScriptLanguage.JAVASCRIPT, [scriptName], UndoModes.ENTIRE_SCRIPT, scriptName);

// 重複している参照を削除
function deleteOverlappingPageReferences(targetTopics,number){

    // 対象のIndex
    var targetIndex;

    // 対象の文字
    var targetCharacter;

    // 目次の数だけ繰り返す
    for(var i = 0; i < targetTopics.count(); i++){

        // 参照の数引く1だけ後ろから繰り返す
        pageReferencesLabel:
        for(var ii = targetTopics.item(i).pageReferences.count() - 1; ii > 0; ii--){

            // 対象のIndex
            targetIndex = targetTopics.item(i).pageReferences.item(ii).sourceText.index;

            // 最初の挿入点では無い場合
            if(targetIndex != 0){

                // 前に調べていく
                while(targetIndex >= 0){

                    // 減らす
                    targetIndex--;

                    // 対象の文字
                    targetCharacter = targetTopics.item(i).pageReferences.item(ii).sourceText.parent.characters.item(targetIndex);

                    // 検索文字列
                    app.findTextPreferences.findWhat = "^I";

                    // 索引マーカーが検索された場合
                    if(targetCharacter.findText().length > 0){

                        // 現在の参照のひとつ前から前に繰り返す
                        for(var iii = ii - 1; iii >= 0; iii--){

                            // 対象の索引マーカーの参照点が目次の参照点と同じ場合
                            if(targetCharacter.insertionPoints.firstItem() == targetTopics.item(i).pageReferences.item(iii).sourceText){

                                // 参照を削除
                                targetTopics.item(i).pageReferences.item(ii).remove();

                                // 増やす
                                number++;

                                // ラベルの次の繰り返しへ
                                continue pageReferencesLabel;
                            }
                        }
                    }

                    // 検索文字列
                    app.findTextPreferences.findWhat = "^a";

                    // アンカー付きオブジェクトマーカーが検索された場合
                    if(targetCharacter.findText().length > 0){

                        // 次の繰り返しへ
                        continue;
                    }

                    // 抜ける
                    break;
                }
            }

            // 対象のIndex
            targetIndex = targetTopics.item(i).pageReferences.item(ii).sourceText.index;

            // 最後のひとつ前では無い場合
            if(targetIndex + 1 != targetTopics.item(i).pageReferences.item(ii).sourceText.parent.characters.lastItem().insertionPoints.lastItem().index){

                // 後ろに調べていく
                while(targetIndex < targetTopics.item(i).pageReferences.item(ii).sourceText.parent.characters.lastItem().insertionPoints.lastItem().index){

                    // 増やす
                    targetIndex++;

                    // 対象の文字
                    targetCharacter = targetTopics.item(i).pageReferences.item(ii).sourceText.parent.characters.item(targetIndex);

                    // 検索文字列
                    app.findTextPreferences.findWhat = "^I";

                    // 索引マーカーが検索された場合
                    if(targetCharacter.findText().length > 0){

                        // 現在の参照のひとつ前から前に繰り返す
                        for(var iii = ii - 1; iii >= 0; iii--){

                            // 対象の索引マーカーの参照点が目次の参照点と同じ場合
                            if(targetCharacter.insertionPoints.firstItem() == targetTopics.item(i).pageReferences.item(iii).sourceText){

                                // 参照を削除
                                targetTopics.item(i).pageReferences.item(ii).remove();

                                // 増やす
                                number++;

                                // ラベルの次の繰り返しへ
                                continue pageReferencesLabel;
                            }
                        }
                    }
                
                    // 検索文字列
                    app.findTextPreferences.findWhat = "^a";

                    // アンカー付きオブジェクトマーカーが検索された場合
                    if(targetCharacter.findText().length > 0){

                        // 次の繰り返しへ
                        continue;
                    }

                    // 抜ける
                    break;
                }
            }
        }

        // 一つ下の階層の目次がある場合
        if(targetTopics[i].topics.count() != 0){

            // 循環
            number = deleteOverlappingPageReferences(targetTopics[i].topics,number);
        }
    }

    // 数を返す
    return number;
}
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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?