2008年5月29日木曜日

【InDesign】【VBS】スクリプト未対応の操作を呼出すには?(文字あふれの検索)/解説編

前エントリーの解説です。
VBSで作ったInDesign CS2のスクリプト。Windows版専用です。

※当ブログのスクリプトを実行した結果、データが壊れたとか、パソコンが壊れたとか、なんかおかしくなったとか、あらゆる損害にたいする苦情等は受け付けられません。すべて自己責任でご利用ください。

【動作内容】
文字あふれしたテキストフレームを探し出し、そのフレームを画面中央に表示、あふれている内容をダイアログで確認できるスクリプトです。改行は「¶」として表現します。でないと改行だけであふれている場合にわかりにくいからね。
文字あふれがあったらその場で修正したいこともあるでしょうから、他の文字あふれフレームも続けて表示するかどうか問いかけます。
表示しないことを選択した場合も文字あふれフレームの検索は(裏で)行い、最終的な文字あふれフレーム数をダイアログで表示して終わります。
...
※連結されているフレームからあふれた内容を取得するのはメンドクサイ&長くなりそう、という理由で未対応です(検索自体はできます。また、内容を取得できませんという表示はしています)。

※[オブジェクト全体を表示]のショートカットキー([Alt]+[Ctrl]+[-])を変更していると、予測不能の結果になります。

【スクリプト未対応の操作とは】
InDesignのスクリプトでは、あるフレームを画面に表示するというメソッドが用意されていません(少なくともCS2で私が調べた範囲では。あったらショック)。
そこで私はWindows Script Hostを利用し、ショートカットキーが押されたという情報を直接InDesignに送り込むという荒業を考えました。InDesign上のJavaScriptでWindows Script Hostを利用する方法がわからなかったので、Windows専用スクリプトとなってしまうVBSです(つーかJSで作れたところで使う機能がWin専用だけど)。MacならAppleScriptでなんとかしてアプリにショートカットを送信できれば、同じようなことができるかもしれませんね。どうかな?
しかしあまり褒められたやり方ではないと思いますが・・・まあ、この世は結果がすべてということで。

・2,3行目(Windows Script Hostの利用準備)
Dim WshShell
Set WshShell = CreateObject("WScript.Shell")

・24行目(ショートカットキー送信)
WshShell.SendKeys "%^-"

これで[オブジェクト全体を表示]コマンドのショートカットキー([Alt]+[Ctrl]+[-])がInDesignに送信されます。他にも、スクリプトでは実行不可能な機能に対してショートカットキーを割り当てられれば、この方法で何とかなるのではないでしょうか。
ちなみに、ショートカットキーを送ってからすぐに次の処理を始めると、InDesignの画面切り替え処理が追いつかないため、次の25行目で無駄な処理を行うslp関数を呼び出しています。この無駄がないと、文字あふれ発見ダイアログが画面の切り替えより早く出てしまい、文字あふれフレームの表示がうまくいきません。ダイアログを閉じた後で表示されるとか(これでスゲー悩んだ・・・)。このまま実行してもうまく[オブジェクト全体を表示]が働かない場合はslp関数に渡す数値を増やしてみてください。サンプルでは10000としていますが、当方Core2 Duo 1.8GHz(メモリ1GB)のマシンでいい感じに動いています。

0 件のコメント: