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 パスを渡してください。
ちなみに、JavaScript のコードにパラメータを埋め込む仕様になっています。できれば、with parameters を使って、パラメータとしてヘルプブックを開くバンドルのパスを JavaScript コードに渡したかったのですが、なぜか、タイプ -4960 というエラーが発生してしまうので、上のような仕様になりました。
こんなのを頑張って、じゃあヘルプブックを持ったアプレット/ドロップレットをいっぱい作ったか?というと残念ながら、あまりうまく利用できず。だって、アプレット/ドロップレットは起動をアクションに、お仕事終わったらとっとと終了してしまうのが常ですから、ヘルプを表示させるインターフェースを付ける所が見つけられない。
もっぱら、AppleScript ライブラリにマニュアルをもたせることに使っています。