Saturday, 28 January 2006

FreeMind のファイルフォーマット



フォーマットをいじって、自分のいつも使っているテキスト形式に相互変換しようとしてます。2週間ぐらい前にやって敗れさってました。昨日、一昨日と、飲み屋さんで「先生、なにやってるの?」とか言われながら変換プログラム書いて、一応、動きました。

FreeMind の何があほかって文章に改行が入れられないこと。<html>にして<br>入れるってのをようやっと発見。MS-DOSな文化とか西欧文化だと改行は入れないのが普通なのか?

Unicodeの変換とかは NKF.pm があるんで楽勝。PerlのUnicodeの機能は、iconv とかと同じで入出力コードを指定しないといけないので、ちょっと使いづらいんだよね。vim とかは、iconv に受け入れるコードを順に食わしてチェックなんてことをやっているらしいが... とはいえ、自分のPCの内部コード(っていうのか?)を全部、Unicode にして、もはや問題ない。問題は、むしろ、大学にある時代遅れの Vine Linux なんだよな。

ただ、UTF-16って2byte目に0Aが入るのね。0Aは、Perl の正規表現の.にデフォルトでマッチしないってのがあるので、ちょっとはまりました。s option で回避。

で、引っかかったのは<node.../>と<node...></node>の区別。混合されているとは気づきませんでした。普通、後者で統一だろ? あと、ID="Freemind_Link_1690494718" という謎のID。最初は、それで落されているのかと思って、思わず、ソースを確認にいきましたよ。

  grep Freemind_Link **/*.java

とかで一発で見つかりましたが(zsh 偉大)、

freemind/modes/LinkRegistryAdapter.java:
 returnValue = "Freemind_Link_" + Integer.toString(ran.nextInt(2000000000));

なんじゃ、そりゃ。結局、付けなくてもいいってことが判明。そんなものファイルに吐き出すんじゃね〜 好意的に取れば、セキュリティかなんかに使いたかったのかも知れないが、Hash も計算してんだから、まったく不要なものだよな... もちろん、この後で「乱数だから衝突しているかどうかをcontainsKey()で調べる」なんてことをやっているわけで...

 うちの学生みたいなプログラミングするな〜

と思いました。これを含めて、作り方は微妙なソフトだ。でも、IDなしフォーマットを受け付けるのは許せる。どんなにたこくても、動くソフトは偉い。

ソース読んじゃったから、本体側に入れてもいいんだよな。

No comments: