2020-02-20T17:25:53+09:00

JXA を使って AppleScript からヘルプビューアでヘルプを表示する

任意のバンドルの中にあるヘルプブックをヘルプビューアで表示する AppleScript (中身はほとんど JavaScript)を紹介します。

ちなみに、ヘルプブックとはアプリケーションのヘルプメニューから「アプリ名ヘルプ」を選択するとヘルプビューアで表示されるマニュアルです。中にはどっかのウェブサイトを開く動作をするアプリケーションもあるかもしれませんが、多くの場合はバンドル内に含まれている HTML ファイルを表示します。

アプリケーションの詳細なマニュアルがよく整理された形でアプリケーションと一体になっている構造は、Mac ならではの大変すぐれた機能だと思います。普通のアプリケーションだけでなく、AppleScript アプレットやドロップレットにもヘルプブックをもたせたい!なんかいいことあるんちゃうの!という衝動で、そのための開発をずいぶん昔からやってました。AppleScript からヘルプブックを開くためにスクリプティング機能追加 HelpBook.osax とか、AppleScript ライブラリ OpenHelpBook.scptd とか。

ちなみに、ヘルプブックをヘルプビューアで開くためには、C 言語の API を使う必要があります。Cocoa にはなぜか用意されていないので、AppleScriptObjC ではどうにもならないんですね。だから、C言語で開発されたスクリプティング機能追加やコマンドラインツールの下請けが必要です。 OpenHelpBook.scptd は AppleScript ライブラリのふりをしていますが、本体はバンドル内にあるコマンドラインツールです。

これらはこれでいいのですが、最近 JavaScript for Automation (JXA) を使えば、C 言語の API を呼びだせること知りました。run script を使えば、AppleScript のコードないから C 言語の API を呼び出せることになります。スクリプティング機能追加やコマンドラインツールでもいいのですが、同等なことが AppleScript コード内の数行で済ませられることには魅力を感じます。

以下は、iTunes.app のヘルプを表示するスクリプトです。ハンドラ show_help に 任意のバンドルの POSIX パスを渡してください。

on show_help(a_path)
run script "ObjC.import('Foundation');
ObjC.import('Carbon');
const bundle_url = $.NSURL.fileURLWithPath(" & a_path's quoted form & ");
let status = $.AHRegisterHelpBookWithURL(bundle_url);
const book_name = $.NSBundle.bundleWithURL(bundle_url).objectForInfoDictionaryKey('CFBundleHelpBookName');
status = $.AHGotoPage(book_name, $(), $());
" in "JavaScript"
end show_help

show_help("/Applications/iTunes.app")

ちなみに、JavaScript のコードにパラメータを埋め込む仕様になっています。できれば、with parameters を使って、パラメータとしてヘルプブックを開くバンドルのパスを JavaScript コードに渡したかったのですが、なぜか、タイプ -4960 というエラーが発生してしまうので、上のような仕様になりました。

こんなのを頑張って、じゃあヘルプブックを持ったアプレット/ドロップレットをいっぱい作ったか?というと残念ながら、あまりうまく利用できず。だって、アプレット/ドロップレットは起動をアクションに、お仕事終わったらとっとと終了してしまうのが常ですから、ヘルプを表示させるインターフェースを付ける所が見つけられない。

もっぱら、AppleScript ライブラリにマニュアルをもたせることに使っています。