この間 の続きです。
いや、書いていてですね、ちょっとかったるかったんですよ、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 すればいいという話かもしれません。