2007年 10月 24日

RubyCocoa で chm 読むアプリケーションつくりはじめた

Mac でつかえる chm (HTML Help) よむやつでまともなのがないので作ってみた、けど、微妙にうまくいってない。

NSSearchField にフォーカスがあるとき、それ自身をサブクラスにしても親の NSWindow をサブクラスにしてもキーイベントがとれない。なんでだろ。これが解決しないことにはつかえないお……全部メニューコマンドにしちゃうかなぁ……Cmd+L でサーチエリアにフォーカスあたるようにしてる。ぎりぎり使えるかつかえないかレベル。HHK だと使う気にならない。


まともなのっていうのは

  • インデックスのインクリメンタルサーチができる
  • ストレスないぐらいには速い
  • 日本語がおかしかったりしない
  • キーバインドがまとも

っていう最低最低限レベルであって、なんか特別なことやりたいわけじゃない。探しかたがわるいだけなのかほんと見つからない。

作るなら Ruby で書きたいなと思って、chmlib っていう C のライブラリの ruby binding を swig 使って作って、それを利用して RubyCocoa 使ってすかすかつくった。chmlib をやるまえに pure ruby で書いてたんだけど、途中でめんどくさくなってやめた。swig は思ったより簡単だったけどめんどかった (でも一部の関数は使わないのもあって使えるようにしてない)

本体の処理は Chmox からだいたいパクってて、chmlib のバインディングのほうは PyCHM からパクってる。ぜんぶパクり。

あとユーザ CSS ほしいですね。すぐ実装できそう。

あとあと、ぜんぜんどうでもいいかもしれないのだけれど

url = "#{SCHEME}://#{doc.object_id}#{path}"
NSURL.URLWithString_relativeToURL(url, "#{SCHEME}://#{doc.object_id}/")

って感じで内部 URL を作るのに object_id を使っているのに萌えませんか! せんか!

URL はクラスを横断したりするから、ObjectSpace._id2ref だけでとれるとすごいスッキリ! 後処理も doc の参照はずすだけでいいし!

dylib をアプリケーションバンドルにふくめるにはどうしたらいいんだろう

static link しようとおもったらできないしなぁ。どうやるんだろう……
ld の仕組みもいまいちよくわかってない…… .a が static アーカイブ? でも直接指定しても otool -L するとシステムのほうを参照してるしファイルサイズ増えないしなぞい。OS X はリンクするときフルパスでリンクするんだなぁ……

DYLD_LIBRARY_PATH つかうのかなぁ。ruby の require の前に DYLD_LIBRARY_PATH をバンドルの Resource dir にしたらいけるかなぁ……わかんないけどやってみよう……

あれもしかして standaloneify ってこれもやってくれるのかな。やってくれるのかな、っていうか、実行すると dylib もあつめてつかってるライブラリとおなじディレクトリにほうりこむみたいだ。これでうごくの?

sudo mv /usr/local/lib/libchm.0.dylib /usr/local/lib/libchm.0.dylib.t 

とかやって standaloneify 後のアプリひらいてみたけどちゃんと起動した。すげ

CHM メモ

Gauche のへるぷで落ちまくってたけど、がんばってデバッグしたら (うそ。Chmox では読めたので (同じライブラリつかっているのに) ロジックをパクってきた) みれるようになった。よいかんじ

Gauche とか、あんまり知らない言語はほんとにリファレンスをひきまくるから、かんたんにひけると超絶早く言語が習得できそう。