あらまし
の文中に「(もっと簡単な方法ありますか?)」を見てムラリ
・ビビリつつ提案するも生半可すぎてダメ出しされ
・後味も夢見もよくないので自blogで後始末開始。しかも年の瀬だからだらだらちょっぴりずつ。
・行に関するスクリプトならLineオブジェクトでやってみよう
・なんとなく動いたけど行末・行頭の挿入点で実行すると不具合だ
・そもそも挿入点(InsertionPointオブジェクト)はLinesが格納されてるようだがいつでも中身は空だ
(エントリ後にmgさんにコメント頂き、CS3までの挙動と知る。あとでCS4で確認しときました)
・果たして行末・行頭の同一挿入点の区別はつくのだろうか
ちょっとテストと割り切って、以下のぶっきらぼうなコードを試した。
そろそろ本文とゴッチャにコード載せるのも見苦しいな。。
var my_AppleScript = ‘tell application \”System Events\”\r key code 115\r key code 119\r end tell’;
app.doScript (my_AppleScript, ScriptLanguage.APPLESCRIPT_LANGUAGE);
キーコード115は「home」、119は「end」。
InDesign上で同様の動作を手入力で行うと、「home」で先頭行の行頭にカーソルが移動したのち、「end」で行末に行く。
一行目行末で行うとカーソルは一行目行末に行く。
二行目行頭で行うとカーソルは二行目行末に行く。
あとはフレーム(セル)内の先頭行から当該挿入点までの行数を見ればいい。はず。
だったのだが、実際の挙動は
一行目行末で行うとカーソルは一行目行末を、
二行目行頭で行うとカーソルは一行目行末を指した。
単に元スクリプトと真逆になっただけ。
key code 115 と key code 119 を2つに分け、間に $.sleep(100) なんぞ差し挟んでみても変化なし。
ええと、没。
とりゃえず今回は、mgさんの元記事のコメント欄で指摘いただいた部分だけ仕上げて終了とします。
行末に挿入点を置いて実行した場合のみ(次行頭と区別がないので)見た目と異なる結果を返します。これ宿題。
以下次回。
(お、ちゃっかりCS対応か?と思ったがreflectがダメでエラー。constructorに書き換えたらセルでは動作したけどテキストフレームではparentTextFramesがダメでエラー。それ以上追うのは不毛なので)
CS3以降対応とします。
if(!app.documents.length){exit();}
if(!app.selection.length){exit();}
var sel=app.selection[0], par, ulObj, dlObj, fiObj, LLObj;
switch(sel.parent.reflect.name){
case “Cell” : par=sel.parent; break;
case “Story” : par=sel.parentTextFrames[0]; break;
default : exit();
}
fiObj=(sel.reflect.name==”InsertionPoint”)? sel : sel.insertionPoints[0];
span>
ulObj=par.texts.itemByRange(par.insertionPoints[0], fiObj).lines.length;
dlObj=par.texts.itemByRange(fiObj, par.insertionPoints[-1]).lines.length;
LLObj=(ulObj+dlObj>par.lines.length)? ulObj : ulObj+1;
alert(LLObj+”行目ですか”);
ちょっとコードの晒し方を考えよう。試してくださる人によくない。