// 20240811 ///

// すべてのストーリーを取得

var stories = app.documents[0].stories;

 

// フラグを追加して、該当箇所が見つかったかどうかを追跡

var found = false;

 

// 処理済みの文字を追跡する配列

var processedCharacters = [];

 

// ストーリーを走査

for (var i = 0; i < stories.length; i++) {

    var story = stories[i];

    

    // ストーリ内のすべてのテキストフレームを走査

    for (var j = 0; j < story.textContainers.length; j++) {

        var textFrame = story.textContainers[j];

 

        // 親ページを持たないアイテムは処理の対象外

        if (textFrame.parentPage == null) {

            continue;

        }

        

        // 段落を走査

        for (var k = 0; k < textFrame.paragraphs.length; k++) {

            var paragraph = textFrame.paragraphs[k];

            

            // 段落先頭ではない行の先頭を走査

            processLineStartCharacters(paragraph, processedCharacters);

 

            // 段落の最後ではない行の最後の文字を走査

            processLineEndCharacters(paragraph, processedCharacters);

        }

 

        // テキストフレーム内のすべてのテーブルを取得して処理

        var tables = textFrame.tables;

        processTables(tables);

    }

}

 

// 再帰的にテーブルを処理する関数

function processTables(tables) {

    for (var i = 0; i < tables.length; i++) {

        var table = tables[i];

        for (var j = 0; j < table.cells.length; j++) {

            var cell = table.cells[j];

            

            // セル内の段落を走査

            for (var k = 0; k < cell.paragraphs.length; k++) {

                var paragraph = cell.paragraphs[k];

                

                // 段落先頭ではない行の先頭を走査

                processLineStartCharacters(paragraph, processedCharacters);

                

                // 段落の最後ではない行の最後の文字を走査

                processLineEndCharacters(paragraph, processedCharacters);

            }

            

            // セル内のテーブルを再帰的に処理

            if (cell.tables.length > 0) {

                processTables(cell.tables);

            }

        }

    }

}

 

// 確認ダイアログを表示する関数

function showConfirmationDialog(character, position) {

    // 画面中央に表示

    app.activeWindow.activePage = character.parentTextFrames[0].parentPage;

    app.activeWindow.zoom(ZoomOptions.FIT_PAGE);

    character.select();

    var userResponse;

    if (position === "行頭") {

        userResponse = confirm(character.contents + " の前に\n強制改行を入れますか?");

    } else if (position === "行末") {

        userResponse = confirm(character.contents + " の後に\n強制改行を入れますか?");

    }

    if (userResponse) {

        insertLineBreak(character, position);

    }

    found = true; // 該当箇所が見つかった場合にフラグを設定

}

 

// 改行を挿入する関数

function insertLineBreak(character, position) {

    if (position === "行頭") {

        character.insertionPoints[0].contents = "\n";

    } else if (position === "行末") {

        character.insertionPoints[-1].contents = "\n";

    }

}

 

// 該当箇所が見つからなかった場合のアラート

if (!found) {

    alert("該当箇所はありませんでした。");

} else {

    alert("処理完了");

}

 

// 処理済みの文字かどうかをチェックする関数

function isProcessed(character, processedCharacters) {

    for (var i = 0; i < processedCharacters.length; i++) {

        if (processedCharacters[i] === character) {

            return true;

        }

    }

    return false;

}

 

// 段落の最後ではない行の最後の文字を走査する関数

function processLineEndCharacters(paragraph, processedCharacters) {

    var lines = paragraph.lines;

    for (var l = 0; l < lines.length - 1; l++) { // 最後の行は除外

        var line = lines[l];

        var lastChar = line.characters[line.characters.length - 1];

        

        // 処理済みの文字をスキップ

        if (isProcessed(lastChar, processedCharacters)) {

            continue;

        }

        

        // 最後の一文字目が数字(全角数字も含む)でその手前の文字が[\d\.,0-9]ではない場合

        if (lastChar.isValid && typeof lastChar.contents === "string" && lastChar.contents.match(/^[\d0-9]$/) && !line.characters[line.characters.length - 2].contents.match(/[\d\.,0-9]/)) {

            showConfirmationDialog(lastChar, "行末");

            processedCharacters.push(lastChar); // 処理済みとしてマーク

        }

    }

}

 

// 段落先頭ではない行の先頭を走査する関数

function processLineStartCharacters(paragraph, processedCharacters) {

    var lines = paragraph.lines;

    for (var l = 1; l < lines.length; l++) { // 最初の行は除外

        var line = lines[l];

        var firstChar = line.characters[0];

        

        // 処理済みの文字をスキップ

        if (isProcessed(firstChar, processedCharacters)) {

            continue;

        }

        

        // 一文字目が数字(全角数字も含む)で次の文字が[\d\.,]ではない場合

        if (firstChar.isValid && typeof firstChar.contents === "string" && firstChar.contents.match(/^[\d0-9]$/) && (line.characters.length <= 1 || (line.characters[1] && typeof line.characters[1].contents === "string" && !line.characters[1].contents.match(/[\d\.,0-9]/)))) {

 

            // 行頭の前の文字が"1397124194"の場合はスキップ

            var previousLine = lines[l - 1];

            var previousLineLastChar = previousLine.characters[previousLine.characters.length - 1];

            if (previousLineLastChar.contents !== "1397124194") {

                showConfirmationDialog(firstChar, "行頭");

                processedCharacters.push(firstChar); // 処理済みとしてマーク

            }

        }

    }

}