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