Safari + JXA その 2

この間 の続きです。

いや、書いていてですね、ちょっとかったるかったんですよ、doJavaScript。

理由はいくつかあって、要するに文字列にしないといけないので、syntax highlighting が使えないとか。
それ以前の問題として、JavaScript って here document ってないですよね、多分。
複数行にまたがるような長いものは書きづらいと。

なもんで、ゴリゴリやってもいいんだけど、あまりに汚らしいので、ちょっとは綺麗に書こうかしらと。

今回の参考記事。

Marionette = function() {
    this.app = Application('Safari');
    this.world = this.app.windows[0].tabs[0];
};

Marionette.prototype.doJavaScript = function(script) {
    return this.app.doJavaScript('(' + script.toString() + ')()', {in: this.world});
}

Marionette.prototype.say = function(message) {
    var app = Application.currentApplication();
    app.includeStandardAdditions = true;
    app.say(message);
}

m = new Marionette();

result = m.doJavaScript(function(){
    return confirm("Hello, world!");
});

/* NG
var hello = "Hello, world!"
result = m.doJavaScript(function(){
    return confirm(hello);
});
*/

m.say((result ? 'OK' : 'Cancel') + ' returned');

というわけで、半分くらいうまくいったようですが、変数の受け渡しは、当然に NG でした。

これは、JSON.stringify() を使えばなんとかなるんじゃないかと思います。

(function (argv) {
    argv = JSON.parse(argv);
    console.log(argv);
    return 0;
})(JSON.stringify(['foo', 'bar', 'baz']));

say についても、Application.currentApplication() に対して呼べばうまく行きました。
ただ、日本語を喋れません。

Terminal の say コマンドだと -v で Kyoko を指定すればいいんですが、まあ、別に無理して日本語を喋らせる必要はないので、英語のままでいい気もしています。

そういえば、JXA で doShellScript すればいいという話かもしれません。

にほんブログ村 ライフスタイルブログ 薪ストーブ暮らしへ
にほんブログ村 ライフスタイルブログ 薪ストーブ暮らしに参加しています。 励みになりますので、足あとがわりに、ランクアップにご協力下さい。

Leave a Reply