有言実行おじさん

これに対し、こうほざいたのですが
当然、ご冗談だったのですが

ちっさいボタンを試しておかねばならなかった事(なんかこうオトコだぜ的な理由で)とか、
今の自分は内部処理をどこまでかっこよくやれるんだろうか、とか
そもそも自分に(しかもJavascriptで)作れるんだろうか、とか
いろいろ考えてるうちに気が付いたらできてました(としておくと、ちょっとかっこいい)

ええと、あくまで自分のスキルに挑戦したついでの産物ですので、
 場をわきまえてお使い下さい。当局に関知されて年収が下がっても知りませんから。
…あまり笑えない。




ExtendScript ToolKit 2.0、
InDesignCS3、
PhotoshopCS3 いずれもMacOS10.4.11で動作確認済み。




Windowsでも問題ないと思われます。
CS5でも同様に動作すると思われます。
CS4は前科があるので試してないのでわかりませんと思われます。
CS5.5なんか見たこともないのですみません。
IllustratorCS3のみ、所定のスクリプトフォルダに入れてもアプリケーション上からは起動できず。
ESTKからIllustratorを指定して実行するぶんには可能。
 しかし、ものかのさんのScriptPalette AIからは起動でけました。なんという便利さ。
勝手に不祥事の片棒担がせてるようでナントモですが。。w
 BridgeTalkかませないとダメなのかもだなあ。
  6/2追記:ファイル→スクリプト→その他のスクリプト…(困+F12)
  でも起動できた旨、mgさんより報告いただきました。感謝です。忘れてた


【説明】
ルールについては割愛。むかし自分も触ってるうちにわかったし大丈夫でしょう。
 途中で己の使命に目覚めたときは、escキーで終了できます。
スクリプト1行目の変数 W、H、L を変更する事で、神にも悪魔にもなれます。
  上限、下限はそこに記載してありますが、W、H は5〜50、L は1〜10。


きっと、判定にはビット演算とかやるのがかっこいいんだろうなあとは思いつつも、
うっかり配列結合&正規表現を多用してしまいました。 ..かっこわるい。
くっつき判定は視覚効果を狙って意図的にまわりくどくしてあります。
 当然、あとづけの理屈です。 かっこわるい。

アドバイスの類い、お寄せ頂ければにこにこします。

ちょっと補習 その3


忘れてたわけではなくて手詰まり加減だったわけで。
 昔から宿題ぜんぜんやってこない子でしたが

問題の「挿入点が行頭か行末か判別する」というくだり、一時的にキーボード操作で home → end と
 入力してやれば視認上の行の先頭か末尾に挿入点を移動できるわけで、それさえできれば元の状態からindexに変更があったかどうか見るだけで解決してしまう。そして事後に元の挿入点に選択を戻して終了、とスイートな思いつきがあったので実践。

これには、まったくわからないなりに一部AppleScriptを使ってみる。

tell application “System Events”
key code 115 –homeキー
key code 119 –endキー
  end tell

これをJavascriptに組み込む。
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);

で、問題。
 これ単体ではちゃんと動く。カーソルのチカチカが、あっち行ってこっち行って落っこちる。いや落ちない。
しかし、コード本体に混ぜるとおかしくなるようで。
よくわからんなりに、最後に出している
alert(lineObj+”行目ですべ!”);
をコメントアウトして代わりに
app.activeDocument.activeLayer.name=(lineObj+”行目ですだべ!”);
 としてみたら、最後の最後にapp.doScript が走っているっぽい。
どうやらアラートウィンドウが出て隙にホームスティールされてたようで。。
 どうにかして挿入点の移動を待つ必要がある。

安直に、それ以下の処理もexecuteScriptにしてしまえば先着順のご案内になるかな、などと思い、
 こうしてみた。めでたくカーソルが移動した判定はまだ入れてない.


if(!app.documents.length){exit();}
if(!app.selection.length){exit();}
var selAry=app.selection;

var my_AppleScript = ‘tell application \”System Events\”\r key code 115\r key code 119\r end tell’;
var my_Javascript = “\
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();\
}\
fi
Obj=(sel.reflect.name==\”InsertionPoint\”)? sel : sel.insertionPoints[0];\
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;\
app.selection[0]=sel;\
alert(LLObj+\”行目ですか\”);\
“;

app.doScript (my_AppleScript, ScriptLanguage.APPLESCRIPT_LANGUAGE);
app.doScript (my_Javascript);



が、key codeはやっぱりalertの影でコソコソ動いた。。
全部ASでやれって事ですか。
 やだ。

つづく

ちょっと補習 その2

あらまし
・mgさんのスクリプト公開記事「テキストオブジェクトが何行目か取得する
の文中に「(もっと簡単な方法ありますか?)」を見てムラリ
・ビビリつつ提案するも生半可すぎてダメ出しされ
・後味も夢見もよくないので自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];
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+”行目ですか”);


ちょっとコードの晒し方を考えよう。試してくださる人によくない。