DTPab

印刷やデザイン、アドビ製アプリやスクリプトなど、雑多な技術ブログ

自分的ヘルパーオブジェクトの使いどころ

ヘルパーオブジェクトについて

最初はヘルパーオブジェクト(以下、$オブジェクト)のそれぞれちょっとした説明でもと思ったのですが、僕には全然知識が足らず諦めましたorz
この記事で解説していない他の$オブジェクトについて具体的に知見をお持ちの方、是非にご教示くださいませ。

で、自分での解説はさておき(おい)、Ten先生が解説してくださっているこの記事から。
https://ten5963.wordpress.com/2012/09/28/post_17/
こちらの記事では、以下のようなオブジェクトに言及されています。

  • $.about()

  • $.strict(boolean)

  • $.version

  • $.build

  • $.buildDate

  • $.decimalPoint

  • $.engineName

  • $.hiresTimer

  • $.screens

  • $.stack

  • $.memCache

  • $.gc()

  • $.sleep(ms)*1

ほかにどんなものがあるのか、オブジェクトモデルビューアで確認してみてください。それも煩わしい横着な人には、こんな方法もあります。

for (key in $){
    $.writeln(key + ": " + eval("$."+key) + " //" + typeof(eval("$."+key)));
    }

でもこれだとメソッドは引っ張ってきません(末尾の追記に追加情報があります)。メソッドについては横着しないでビューアを見てください。このスクリプトでは、$オブジェクトのプロパティ名とその値、そしてオブジェクト型を表示します。

$.sleep()の注意点

$.sleepは注意すべき点があります。このメソッドは、スクリプトを強制的に一時停止するときに使います。あくまでも強制的な一時停止なので、その間に別の関数の処理を待つとか、そういうことには向きません。もっというとアプリケーションごと強制的に一時停止するので、InDesignの処理を待つ…みたいな使い方もできません。例えば、以下のような処理で自動で消えるフローティングウィンドウみたいなものを実装しようとしても、結果的にモーダルダイアログ*2のようになってしまいます。

with (new Window('palette', undefined, undefined, {borderless: true})){
    add('statictext', undefined, "sample text");
    show();
    $.sleep(600); //600マイクロ秒だけ表示する
    close();
    }

これだったらWindowタイプがpaletteの意味ないよね、dialogと同じだよね、という。結局アプリケーションの処理自体も止めてしまう$.sleepは、使い方が限られます。何かいい例が見つかれば、そのうち紹介したいと思います。

個人的によく使うもの

  • $.bp()

  • $.os

  • $.fileName

  • $.screens

$.bp()

これは前回の記事で散々使ったのでいいでしょう。

$.os

これはOSの判別を行います。戻り値はStringで、例えば「Macintosh OS 10.10.5」のように返ってきます。ファイルパスを書き分ける場合によく使いますね。すごく雑な書き方をすれば、こんな感じになりますw

if (/^m/i.test($.os)) $.writeln("Macだよ");
else $.writeln("Winかな?");
$.fileName

これはスクリプト自身の(OSに依拠した)絶対パスをString型で返します。保存していないスクリプトで実行すると「(Script1)」のような戻り値になります。一応String型ではあるのですが、これ自体はエンコードされた文字列です。例えば、デスクトップのフォルダ「テストです」の中に「test.jsx」を置いて、スクリプトを実行してみます。test.jsxの中身はこれです。

var a = $.fileName;
$.writeln(a);

実行結果のコンソールは

f:id:uske_S:20170627084029p:plain

となります。このままだと利用しづらいので、decodeURIメソッドを噛ませてあげるのが通例です。

var a = decodeURI($.fileName);
$.writeln(a);

こうしてあげると

f:id:uske_S:20170627101230p:plain

と、ちょっとだけまともな形で戻り値が得られます。「ちょっとだけまとも」というのは、Macの場合はファイルシステムの都合で濁点・半濁点が分離するのです。試しにMac環境で先ほどのコードにこの1行を足してコンソールを見てみてください。

$.writeln(a.charAt(14));

濁点だけ出力されましたか? Unicode正規化やNFDはとてもややこしい沼で僕も門外漢なので、気になる方はUnicode正規化や、ものかのさんのこちらのまとめなどをご覧くださいませ。
したがって、スクリプト自身のファイルパスを取得して文字列同士で比較するとか、正規表現でマッチさせるといった処理は、少しコツが要ります。コツが要りますが、今回の内容から逸脱してしまうのでそれはまた別の機会に譲ります(たぶん探せばどなたか書いてくださっているはず)。

$.screens

さて、やっと最後に、$.screensです。これを説明したかった。typeof演算子で調べるとObject型とありますので、中身を見てみましょう。

var a = $.screens;
$.bp();

こんな感じのコードを実行してデータブラウザを覗いてみます。

f:id:uske_S:20170626225001p:plain

というようにピクセル値でスクリーンのサイズを得ることができます。これを利用すると、モニタの左下に表示するウィンドウ、というのも簡単に実装できるのです。

//ウィンドウの天地サイズ
var myHeight = 150;
//スクリーンサイズから位置を逆算
var bottomLoc = $.screens[0].bottom - myHeight;
with (new Window('dialog', "sample", undefined)){
    preferredSize = [200, myHeight];
    add('statictext', undefined, "location test");
    frameLocation = [0, bottomLoc];
    show();
    }

実行結果はこんな感じ。

f:id:uske_S:20170627101628p:plain

frameLocationはWindowオブジェクトの表示位置に関するプロパティで、ウィンドウ左上の位置を[x, y]として指定します。これに$.screensから受け取った値を調整して渡してあげるだけで、スクリーン上のどこへでもウィンドウを配置することができます。ただし、メニューバーの上には表示できない(メニューバーの下にウィンドウが隠れる)ので、y座標を指定する場合はそこだけ注意してください。

というわけでちょっと長くなってしまいましたが、個人的なヘルパーオブジェクトの使い方でした。

追記(2017.8.21)

ten先生より、

$.reflect.methods 試してみようか?

という有り難いコメントをいただきました。

var methods = $.reflect.methods;

for (var i=0; i<methods.length; i++){
    $.writeln(methods[i]);
    }

これでメソッドも抽出できるのですね。感謝です!

*1:コメント欄に指摘がありますが、正確な単位はマイクロ秒

*2:alert()のような、表示中はアプリケーションを操作できなくなるダイアログ。それに対してウィンドウ表示中もアプリケーションを操作できるものをモーダレスダイアログと呼ぶ