忍者ブログ

ぼんぷろぐ

イラレとも仲良くなりたいInDesign使いのブログ

[ExtendScript]
#includeはどこに書いてもよく、コードの断片でもいい

ExtendScriptの#includeって、案外自由度が高くて、

①行頭でさえあればどこに書いてもよく、書いた場所にインクルードしたファイルの内容が展開される。

②インクルードする側、される側のコードがそれぞれJavascriptのコードとして成立していなくてもいい(インクルード後に成立していれば)

という特徴があります。




①は割と重要です。ひょっとしたら#includeは冒頭に書かなきゃいけないと思ってる方もいるのではと思いますが、たとえば

(function (){
    #include "nanka.jsx"
    …
})()

のように書けば、nanka.jsxを関数内のローカルスコープで読み込むことができます。




②はどういうことかと言うと、たとえば、

alert(1

という")"が抜けたコードがあって、

)

という1文字だけのテキストファイルkakkotoji.txtがあったとして、

alert(1
#include "kakkotoji.txt"

を実行すれば、

alert(1
)

と同じになって1がアラートされるのです(kakkotoji.txtは実行するjsxファイルと同じフォルダに入れます)。
だからどうしたという感じですが…

唯一役に立ちそうな使い道として思いついたのが、jsonファイルの読み込みです。
ExtendScriptのオブジェクトとしてそのまま読めるようなjsonファイルであれば、

var hoge=
#include "hoge.json"

とするだけで、変数hogeにhoge.jsonをパースしたオブジェクトが入ります。

他になんか面白い使い道思いついた方は教えてくださーい
PR

[ExtendScript]
ExtendScriptのMath.randomはわりといい加減

前にMath.random()使っててやたら値が被るなぁと思って調べんたんですけど、

ExtendScriptのMath.randomが作る値は65536通りしかありません。

そして、Math.random()*65536は常に整数です。

2進数で書くと
0.0000000000000000
0.0000000000000001
0.0000000000000010
0.0000000000000011

0.1111111111111111
のような小数点以下16桁の数の中からランダムに出てくるわけです。

65536通りって案外少ないです。たとえば100個の乱数を取得したとすると、その中で値が被ってしまう確率が7%もあります。

なおAfterEffectsにはgenerateRandomNumber()という組み込み関数があって、Math.randomの代わりに使うことが推奨されているそうです。

[ExtendScript]
IllustratorスクリプトとInDesignスクリプトの違い

1.実行方法

実行方法はほぼ同じで、主に以下の3つの方法があります。

①ESTKから実行
②アプリケーション上で実行
 InDesign:スクリプトパネルまたはキーボードショートカット
 Illustrator:ファイルメニューのスクリプト>その他のスクリプト
③エクスプローラー上でjsxファイルをダブルクリック
 #targetでターゲットアプリケーションを指定している場合に限る

※最近はESTKの代わりにVisual Studio Codeを使ってる方もいます。

2.エンジンの違い

ExtendScriptは#targetengineで実行エンジンの名前を指定できます。
同じ名前のエンジンで実行するとグローバル変数などを共有できます。
また、1回実行するごとにリセットされ、グローバル変数などが引き継がれない特殊なエンジンもあります(使い捨てのエンジンと呼ぶことにします)。

Illustrator InDesign
ESTKから実行時のデフォルトのエンジン名 main main
アプリケーション上で実行時のデフォルトのエンジン名 transient main
jsxをダブルクリックで実行時のデフォルトのエンジン名 main(※1) main(※1)
使い捨てのエンジン名 transient main
ESTKから実行時にエンジンを指定できる? できない できる
アプリケーション上で実行時にエンジンを指定できる? できる できる
jsxをダブルクリックで実行時にエンジンを指定できる? できない できない

※1 BridgeTalk経由で実行される

重要なのは同じ"main"エンジンが、InDesignでは使い捨てであり、Illustratorではそうでないという点です。
Illustratorの使い捨てのエンジン名はtransientですが、これをESTKから指定することはできません。

したがって、IllustratorでESTKを使う場合、1つのmainエンジンでスクリプトを何度も実行することになります。
各所で配布されているIllustratorスクリプトで、全体を(function(){.....})()で囲み、極力グローバル変数を作らないようにしているものが多いのはこうした事情によるものです(たぶん)。

3.テキスト選択時のselection

InDesignではテキストオブジェクトが入った配列です。
Illustratorではテキストオブジェクトそのものになります。配列のつもりで書いてたらエラーになります。よくやらかします。

4.y軸の方向

InDesignは下が正、Illustratorは上が正です。

5.visibleBoundsとかgeometricBoundsとかの順番

InDesignは上左下右、Illustratorは左上右下です。

6.InDesignはexit()が使える

7.Illustratorはなぜかappとか省略できる

8.サロゲートペア文字

text.charactersにおいて、サロゲートペア文字はInDesignだと1文字、Illustratorだと2文字とカウントされます。

9.ScriptUIでモーダルダイアログ

モーダルダイアログっていうのはダイアログが出ている間アプリを操作できない系のダイアログのことです。
Illustratorではモーダルダイアログが出てる間もスクリプトからはDOMをいじることができ、app.redraw()で表示を更新できます。
しかし、InDesignではできません。つまりInDesignでは、モーダルだけどプレビューを更新できる系のダイアログを作ることができません。なんとかならんかな。

10.ほかにもいーっぱいあるよ


[ExtendScript]
ExtendScriptでUTF-8 BOM付きで保存する

ExtendScriptのFileオブジェクトで、encodingプロパティに使えるエンコーディング形式の名前はAdobeの『JavaScript Tools Guide』にずらっと出てくるのですが、




この中にUTF-8 BOM付きに相当するものはあるのでしょうか。さっぱり分かりません。探すよりバイナリモードで書き込んでやる方が早いと思ったので関数を書いてみました。

function saveUTF8BOM(fileObj,txt){
fileObj.encoding="binary";
fileObj.open ("w");
fileObj.write("\xEF\xBB\xBF");
fileObj.close();
fileObj.encoding="utf-8";
fileObj.open ("a");
fileObj.write(txt);
fileObj.close();
}

これができるとどんなおいしいことがあるかというと、AutoHotkey(AHK)スクリプトが書き出せます。AHKで日本語を扱うにはBOM付きで保存しないといけません。
AHKを使うと、たとえばクリップボードに文字列を格納するのが超カンタンにできます。

clipboard = クリップボードに入れたい文字列

と書くだけです。右辺は""で囲んだりする必要もありません。複数行にわたる場合は

clipboard =
(
クリップボードに
入れたい
文字列
)
のように書きます。

※『%』と『`』は特殊な意味を持つ記号なので、クリップボードに入れたい文字列に含まれる場合は『`%』『``』のようにエスケープしてやる必要があります。

これを使って、InDesignで選択文字列に適用されているフォントのフォントファミリーネームをクリップボードに入れるExtendScriptを書いてみましょう。拡張子.ahkがAutoHotkeyに関連付けられていることが必要です。

var fontFamilyName=app.selection[0].texts[0].appliedFont.fontFamily;
var ahkCode="clipboard="+fontFamilyName;
var f=File(Folder.desktop+"/es001.ahk");
saveUTF8BOM(f,ahkCode);
f.execute();

おしまい

プロフィール

kawamoto_α
(あるふぁ(仮))


InDesignで新聞組版のようなことをしています。

ツイッタ


イラレ用トーンカーブスクリプト(¥1500)



クロソイド式角丸長方形スクリプト(¥500)
Illustrator用
InDesign用



イラレスクリプトをキーボードショートカットで実行するやつ(Win用)