読者です 読者をやめる 読者になる 読者になる

コードリストや表組みなどで2行以上が折り返している箇所を探したい。

InDesign CS5 JavaScript

 選択している行と同じ段落スタイルを持つ行を検索し、2ラインにまたがっている箇所を表示します。
 例えば、コードリストや表組みなど2行以上の折り返しをチェックしたい箇所を探します。探すだけ。直し方はいろいろなので。
f:id:seuzo:20120312163716p:image

/*
    find_lines_pStyle.jsx
    選択している行と同じ段落スタイルを持つ行を検索し、2ラインにまたがっている箇所を表示します。
    例えば、コードリストや表組みなど2行以上の折り返しをチェックしたい箇所を探します。探すだけ。直し方はいろいろなので。
   
    2012-03-01  とりあえず昔書いたまんま
    2012-03-12  外に出すためにちょっと化粧なおし
*/

#target "InDesign"

////////////////////////////////////////////エラー処理 
function myerror(mess) { 
  if (arguments.length > 0) { alert(mess); }
  exit();
}

////////////////////////////////////////////正規表現検索置換
/*
my_range	検索置換の範囲
my_find	検索オブジェクト ex.) {findWhat:"(わたく?し|私)"}
my_change	置換オブジェクト ex.)  {changeTo:"ぼく"}

my_changeが渡されない時は検索のみ、マッチしたオブジェクトを返す。
my_changeが渡されると置換が実行されて、返値はなし。
*/
function my_RegexFindChange(my_range, my_find, my_change) {
    //検索の初期化
    app.findGrepPreferences = NothingEnum.nothing;
    app.changeGrepPreferences = NothingEnum.nothing;
    //検索オプション
    app.findChangeGrepOptions.includeLockedLayersForFind = false;//ロックされたレイヤーをふくめるかどうか
    app.findChangeGrepOptions.includeLockedStoriesForFind = false;//ロックされたストーリーを含めるかどうか
    app.findChangeGrepOptions.includeHiddenLayers = false;//非表示レイヤーを含めるかどうか
    app.findChangeGrepOptions.includeMasterPages = false;//マスターページを含めるかどうか
    app.findChangeGrepOptions.includeFootnotes = false;//脚注を含めるかどうか
    app.findChangeGrepOptions.kanaSensitive = true;//カナを区別するかどうか
    app.findChangeGrepOptions.widthSensitive = true;//全角半角を区別するかどうか

    app.findGrepPreferences.properties = my_find;//検索の設定
    if (my_change == null) {
        return my_range.findGrep();//検索のみの場合:マッチしたオブジェクトを返す
    } else {
        app.changeGrepPreferences.properties = my_change;//置換の設定
        my_range.changeGrep();//検索と置換の実行
    }
}

/////実行
////////////////まずは選択しているもののチェック
if (app.documents.length === 0) {myerror("ドキュメントが開かれていません")}
var my_doc = app.documents[0];
var my_message = "このスクリプトは選択している行と同じ段落スタイルを持つ行を検索し、2ラインにまたがっている箇所を表示します。\n検索したい段落スタイルを持つ行を1行だけ選択してください。";
if (my_doc.selection.length === 0) {myerror(my_message)}
var my_sel = my_doc.selection[0];
var myclass =my_sel.reflect.name;
myclass = "Text, TextColumn, Story, Paragraph, Line, Word, Character, TextStyleRange, InsertionPoint".match(myclass);
if (myclass == null) {myerror(my_message)}
if (my_sel.paragraphs.length !== 1) {myerror(my_message)}

//検索
var my_pStyle = my_sel.appliedParagraphStyle;
var hit_obj = my_RegexFindChange(my_doc, {findWhat:"^.+$", appliedParagraphStyle:my_pStyle});
if (hit_obj.length === 0) {myerror("2行以上になっている行はありませんでした");} 

//表示
var my_zoom = app.activeWindow.zoomPercentage;
for (var ii = 0; ii< hit_obj.length; ii++) {
    if (hit_obj[ii].lines.length > 1) {
        hit_obj[ii].select();
        app.activeWindow.zoomPercentage = my_zoom; //選択位置をフォーカス
        var tmp_pagename = app.layoutWindows[0].activePage.name; 
        var tmp_ans = confirm (tmp_pagename + "ページ:\n以下の部分が行分かれしています。\n" + hit_obj[ii].contents );
        if (tmp_ans === false) {exit();}
    }
}