JavaScriptにObjective C/Smalltalk的な拡張を追加してMacOSXのスクリプティングに使用できるOSSのJSTalk。面白そうなのですが日本語の情報が殆ど無いので少しメモ。
似たようなコンセプトのモノにJSCocoaやCapputinoのObjective Jがありますが、JSTalkが最もスクリプト言語的(といっていいのか)でお手軽です。マイナーで完成度はこれからという感じで軽微な問題はありますが、今のところ大きな不具合はなく使えています。私のようにAppleScriptになかなか馴染めない人には面白い選択肢ではないかと思います。
インストール等
- MacのApp Storeから"JSTalk Editor"を入手可能 (フリー)
- JSTalk: Index-- 本家サイト
- ccgus/jstalk - GitHub-- githubのソースリポジトリ
まずは本家のパッケージにも含まれますがApp Storeから落とせるJSTalk Editorを入れてみます。AppleScript Editorライクに試せるエディタで動作確認をすぐに行なえます。
コマンドラインからスクリプトとして使うためには本家パッケージ内のjstalkコマンドを手動で/usr/local/binあたりにコピー。
簡単な説明と例
基本的な文法はJavaScriptですが、Objective C的に'[]'で括ってメッセージ式が記述できます。以下は最初にeditorを開いたときに出てくるHello Worldです。[]の中はほとんどObjective Cと同じような感じということがわかると思います。
[[JSTalk application:"JSTalk Editor"] displayDialog:message];
iTunesのプレイリストをダンプしてみる
Hello WorldだけではなんなのでiTunesをスクリプティングしてみます。
var sources = [iTunes sources]; // iTunes.sources();とも書ける
var numSources = [sources count];
var src = sources[0];
var playlists = [src playlists];
var numPlayList = [playlists count];
for (var i = 0; i < numPlayList; i++) {
var playlist = playlists[i];
print(" " + i + ":" + [playlist name]+" "+[playlist specialKind]);
}
コマンドラインから使ってみる(iTunesの曲リストを表示)
コマンドラインから引数をとったりする方法です。#!記法が使えますが、JSTalk Editorではエラーになるのでテスト時は先頭行は//してください。またEditor内のスクリプトで[NSApp terminate ]等とするとEditor自身が終了してしまうのでご注意。
// 引数を文字列に変換しておく(例)
var av = NSProcessInfo.processInfo().arguments();
var argc = av.count(); // 0:jstalk, 1:scriptの情報, 2〜:引数
var argv = new Array();
for (var i = 0; i < argc; i++) {
argv[i] = av[i].UTF8String();
print("arg["+i+"] = " + argv[i]);
}
// ... 引数の処理をしたりする
// がここでは使わないので無視して
var sources = iTunes.sources();
var numSources = [sources count];
var src = sources[0];
var playlists = [src playlists];
var numPlayList = [playlists count];
for (var i = 0; i < numPlayList; i++) {
var playlist = playlists[i];
var kind = [playlist specialKind];
if (kind == 1800630362) { // 直値で適当過ぎだが...
print(i + ":" + [playlist name]);
var tracks = [playlist tracks];
var n = [tracks count];
for (j = 0; j < n; j++) {
t = tracks[j];
print( ([t enabled] ? " v " : " ") + j + " [" + [t name] + "]");
// [t setEnabled: false]などとするとチェックを外すことが出来る
}
break;
}
}
保存したスクリプトは"jstalk hoge.jstalk"などとして実行可能です。ちゃんと弄ればmp4のタグを設定したりも出来ると思います(多分)
最後に
JavaScriptにもAppleScriptにも不慣れなのでコードが稚拙なのはご勘弁下さい。
AppleScript EditorでライブラリのsdefとAppleのScripting Bridgeのドキュメントを見つつ書けばさほど難しくはないと思います。メッセージはAppleScriptと少し異なるので注意。値をセットするにはsetHoge。また文字列等の扱いが微妙なのでJavaScriptの型への変換は適宜考慮した方が良さそうです。
JS実行環境といえばやはりnode.js(v8)。あちらはリソースも大量にあるので、JSTalk言語 to Pure JavaScriptのトランスレータを作るか、node.jsベースになればもっと面白い事も簡単に出来そうですし、普及するかもしれないと思いつつ。