索引の参照の重複を解消するスクリプトは、これで良いのかな・・・?
/*
このスクリプトを利用して起こった、どのような不具合にも責任は取れません。
ご了承下さい。
更新 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;
}