// 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); // 処理済みとしてマーク
}
}
}
}