最近のMacではBridgeという技術を使ってPython経由やRuby経由でObjective-Cを使う事ができるみたいですが最近、JSCocoaっていうJavaScript経由で使用可能な実装も有るみたいです。これをちょっといじってみました。
メインページはこちらの様です。
JSCocoa — A bridge from JavascriptCore to Cocoa
http://inexdo.com/JSCocoa
またGoogle Codeも使われているみたいです。関連ファイルはこちらの「Featured Downloads:」からZipファイルで落とすのが手っ取り早いです。
jscocoa - Google Code
http://code.google.com/p/jscocoa/
Zipを解凍すると以下の2つのアプリがソースコード付きで見つかります。
JSCocoa.app : ワンライン程度に収まる短いJavaScriptをテストするためのツール。
JSCoreAnimation.app : Core Animationのサンプル。プロセスビューア兼、ランチャー。
※特にライブラリ部分だけのフォルダなどは準備されていないようです。コピーするか参照で使う様にとのことです。
今回は簡単に試してみるために JSCocoa.app のソースをベースにいじってみました。
ツールバーの「Run Tests」ボタンを押されたときの処理を変更してみます。
このプログラムの主な処理は main.js で行っています。該当箇所は先頭の以下の部分になります。
runTests が押されたときの動作が function() {} に定義されています。
defineClass('ApplicationController < NSObject', { runTests : ['IBAction', function () { JSCocoaController.log('Running tests …') var path = NSBundle.mainBundle.bundlePath + '/Contents/Resources/Tests' var r = JSCocoaController.sharedController.runTests(path) if (r) JSCocoaController.log('All tests OK') }]
ここをこの様に変更します。
defineClass('ApplicationController < NSObject', { runTests : ['IBAction', function () { NSApplication.sharedApplication.keyWindow.title = 'test' /* JSCocoaController.log('Running tests …') var path = NSBundle.mainBundle.bundlePath + '/Contents/Resources/Tests' var r = JSCocoaController.sharedController.runTests(path) if (r) JSCocoaController.log('All tests OK') */
ビルドした後、「Run Tests」ボタンを押すとタイトルが「test」になります。
Unicodeにも対応しているためにこの様な記述も可能みたいです。
function 追加する(最初の, 次の) { return 最初の+ 次の } defineClass('ApplicationController < NSObject', { runTests : ['IBAction', function () { var 結果 = 追加する('こんにちは', '世界') NSApplication.sharedApplication.keyWindow.title = 結果 /* JSCocoaController.log('Running tests …') var path = NSBundle.mainBundle.bundlePath + '/Contents/Resources/Tests' var r = JSCocoaController.sharedController.runTests(path) if (r) JSCocoaController.log('All tests OK') */ }]
また、 JSCocoa.app を右クリックし、「パッケージの内容を表示」を実行した後に表示されるフォルダから以下の main.js を直接編集することも可能です。こちらの方法であれば編集後にアプリを実行すると即、反映されます。
しかもこの方法であればXcodeが必要なく、エディタだけで編集が可能です。
※まぁ、GUIの作成部分はめんどくさいのでInterface Builderを使った方が良いと思いますけど(^_^;)