ちょっと補習 その1

[InDesign]テキストオブジェクトが何行目か取得する
トックラバックラがおぼつかないのでこのようなはっつけ方で失礼しますが
ひとんちのscript記事で珍しく発案してみたところ、要求される物を履き違えてたのかコメント欄でこてんぱんですが orz
アプローチの提案をしたつもりが、根幹コード以外にちょこちょこ分岐を半端に入れてしまったせいか
なんだか提案というよりも提供めいてしまい、かっこよくない事になってます(笑)

せっかく添削いただいたのもあり、かといって「はじめまして」とか書いた記事のコメント欄ずんずら長くするのもナイので
自分のとこでちょこちょこ完成形にしてゆきます。年内に終わるかなー
商品化する気ではなかったとはいえ自分の肥やしになりそうなのでやるだけやる事に。

ウチの発案は、親フレームの先頭からターゲットとなる文字オブジェクト(選択ハニー)の先頭行までをTextオブジェクトとし、そのLines.lengthがターゲットの先頭行の番目になる、という物で、
処理にあたる前に条件のふるい分けをする段階で、選択範囲がテキストフレームの内容物である場合を想定してCharactersがあるか、で分岐させた。
InsertionPointは相手にしていなかった。思い込みで。実用する事を考えれば対象が単独の挿入点な場合も充分ある。正規表現絡みだとなおさら。

で仕切り直すにあたり、
「行の問題なんだからフツーにLineオブジェクトでやりゃいいじゃん」と今さら思ったので
テスト。

app.selection[0].lines[0].select();
はたして、挿入点がいる行がビロンと選択された。
が、行末・行頭の挿入点はエラーだ。なんでだ。どっちつかずだからか。
現に一行目行末の挿入点と二行目行頭の挿入点は視覚的には別物でもindexは一緒なので、混乱するよなコンピュータ様も。
 とか脳の足りないような妄想をしつつ
a=app.selection[0].lines;
とした次の行にブレークポイントを置いてESTKのデータブラウザを覗いてみた。
 結果、テストコードで走る挿入点もエラーになる挿入点も、Lines.Length=0 であった。
じゃあ何で結果が分岐するんだ? 降参。
わからない事には時間をかけないようにして(やなおとなやな)←回文 ←うそ
try{

app.selection[0].lines[0].select();
}

catch(e){ // エラーは行末・行頭の挿入点の場合のみ、という前提で

app.selection[0].parent.insertionPoints.nextItem(app.selection[0]).lines[0].select();
}

としてみてはどうだ。
ダメだった。try{} 内でエラーが出る。
try{} で括った内側でエラーが出る時わりとよくあるな。。
catsh(){} 内だけの1行コードにしてみたら、いちおう挿入点の次の行を拾いはするな。
いや、いや、そもそも、一行目行末がチカチカしてる時はターゲットは一行目であるべきだし、
二行目行頭がチカチカしてたら二行目がターゲットって事にしたくはないか? ないか。そうか。
あ、HorizontalOffsetがあるじゃないか。
 しかし一行目行末チカチカ時のHorizontalOffset値は、行頭のX座標だった。ひどいなこれー。
やっぱ区別はないのか。
でもでも、スタイルの変わり目に挿入点を入れて文字を入力するとき、目的の挿入点より前に入れた挿入点からカーソルで後ろに送っていった時とその逆とじゃ入力した文字にかかるスタイルが違うって事、あるよね。ある。
挿入点両者それぞれプロパティ書き出して比較してみるか。
どこかに違いを見出さないとウチの案は潰れるわけか。
 って、試してみたら元記事のスクリプトも行末行頭ではエラー出るな。。じゃいいのか。いや、ここで抜きん出て、えーと、いばろう(笑)
今日はここまで。
なんというモヤッとした進行。。

いちいちアクティブにしないscriptUIパレット

やれIFAだのPOTだの、一部の下っ端どもにそこそこ好評を頂いておりますが

懸念は、気軽にパシッと操作する為にいちいちパレットをクリックしてアクティブにしてからじゃないと操作できない所にありました。
ファミコン買ってもらった日から半年ぐらいは遊び終わったらいちいち化粧箱に戻してました。姉に触られると癪だったので。だだこねたのは俺だぞ。お前は脇でウンザリ眺めてただけじゃねえか。

閑話休題

scriptUIの手軽さの反面、SDKプラグイン系に大きく遅れを取る厄介な問題であります。ありました。

着火ボタンの代わりにListBoxを置く事で解決しました。
今後、公開済みの大物スクリプトに順次組み込んでゆく予定です。年末進行おさまってからになりますが。。

以下、シンプルなテスト。

#target indesign
#targetengine “session”
dlg=”palette{ text : ‘test_activate’, L : ListBox{}}”;
win=new Window(dlg);
win.L.add(“item”, “ignore”);
win.L.onChange = function(){
if(win.L.selection != null){
win.L.selection = null;
alert(“ハッセルホフ!”);
app.activeDocument=doc;
}
}
doc=app.activeDocument;
res=win.show();
InDesignCS3以上で、ドキュメントを開いた状態でお試しくださいまし。

実行するとこんなのが出ます

リストボックスに、ぽつんとリストアイテム。
このリストアイテム「ignore」を選択すると反応します。パレットが非アクティブ状態でも反応します。
反応した後はアラートを出し、リストアイテムを非選択状態に戻し、アクティブドキュメントに戻します。
これで、上述したようなわずわらし、わずらし、わらわざ、
えー、イヤな感じから解放されます。

課題は、スクロールアロー等のぶんの余分スペースをどう削ぐか。
まあ、なんとかします。


InDesign:アンカーだけに史上最大の手抜き作戦

タイトルの意味がわからない子はおじいちゃんかおばあちゃんに訊いてみよう。
 最近じゃニルヴァーナのカバーもするぜ。

とくにコレで何か作ってみましたーではないけど書き留めておきます。

年末進行が落ち着きしだい、アレとかコレとかに組み込むと気持ちよいです。

transform() はアンカー座標の指定を常にポイントで行う必要がある。
義務でこそないものの、狙った場所でちゃんと動作させるには必要である。

 しかしながら用事のあるドキュメントは得てして他の単位系に設定させている事が多い。シセロだのパイカだのハナゲだの。うそだけど。
多様な「ポイント以外の」単位に対応したスクリプトを書くとなると、一時的にドキュメントのルーラー設定を変えて、用事を済ませたあとササッと戻す、ような事をしてきたわけで。しかしスクリプトの内容が静かな物だった場合(オブジェクトの選択状態の操作だけとか、アンカーポイントの操作だけとか)、ムダにヒストリーが汚れて気持ちよくない。よくなかった。思い直した。考えた。

 多様な、とはいっても片手で数えられるほどの種類しか(二進数で)ないんだから、単位設定に応じた単位を数値のケツにくっつけて文字列を返す関数を用意しておけば済む。距離・座標に関わる入力値は単位つき文字列で受け付けてくれる。でもそれって新しくない。いや、新しくなくても別に構わない。でもつまんない。いや、つまんなくても別に(略

 というわけで、ヒストリーを汚さないで単位ごとの補正倍数を取得してみる。

function revScale(){

awObj=app.activeWindow;
dapObj=awObj.transformReferencePoint; //現状のアンカーポイントを記録。9種のAnchorPoint または座標の Array(x, y)
awObj.transformReferencePoint=[“1pt”,”1pt”]; //アンカー座標を任意位置へ指定
pepsi=awObj.transformReferencePoint; 
awObj.transformReferencePoint=dapObj; //アンカーポイントをもどす
return pepsi; //シュワ〜ッと返す
}

aa=app.activeDocument.selection[0];
tt=app.transformationMatrices.add(1.01,1.01,0,0,0,0);  //1.01倍する変形のじゅんび
cc=app.activeWindow.transformReferencePoint; 
if(cc.length==2){ //アンカーポイントが配列(任意座標)なら
dd=[[cc[0]/revScale()[0], cc[1]/revScale()[1]],[0,0]]; //戻り値は割って使う
} else{ dd=cc; }
aa.transform (2021222766, dd, tt, undefined, undefined); //変形の実行
transform() はとっくに何人かいじくってくれてますが、ドキュメントの単位設定をそのまま活かしてあれこれしてみせてよこした人というのはまだ見かけた事がなくて(頑張って探したわけでもないんですが)英語のマニュアルを棒読みしてココか?と踏んだ箇所をどれだけ突っついても変化が見られなかったので(頑張って突っついたわけでもないんですが)正攻法がおぼつくまではコレでしのぐとします。
関数内で既に小数第14位あたりで丸められちゃってる気もするけど、別段 InDesign上でスペースシャトルを設計するでもなし、へっちゃらです。自分だけは。