ほぼ1年ほったらかしだったApacheモジュールによるWeblogツール mod_blosxomですが、いいかげんBlosxom 2.0に追従させたバージョンを作ろうかと思っています。実装とかそのへんについてのメモと言うか、意見希望というか。
本当に365日ほったらかしでした
去年勢いだけで作ったApacheモジュールベースのWeblogツールmod_blosxomのリリースが滞ってから今週でまる一年ですよ一年。まったく何もしていないかと言えばそうでは無くて、怪しい英語のスペイン人な人からのバグレポートの応対や、これまた怪しい英語のインド人の人からのヘルプ対応などなど、それなりに活動(???)していたのです。cvsのコードは全然更新してないので証明できませんが。
今年に入ってからトニモカクニモWeblog、Blog、ウェブログ、ウェブロ(?)と話題に上がっては関連書籍も売れまくっている今日この頃、ここらで一発 ゆんゆんと発信してみたい年頃なのです。いや単にたまたまフォーカスがBlosxomに向いただけかもしれませんが。
どう実装するか
前作のmod_blosxomが当時のBlosxomの機能をそのまま使え、テンプレートも共通。つまりblosxom.cgiユーザはApacheにmod_blosxomを入れればそのまま移行ができる。というのがウリの一つだったわけで、基本機能に関してこの辺は継続してサポートしたいと思っています。昔のバージョンと比較して現行のBlosxom 2.0は色々な機能が増えていますが、基本的な仕事は旧バージョンと大差は有りません。一番面倒なのはPluginの仕組みのあたりでしょう。そして2.0を魅力的にしているのがその簡単なPlugin機構と、バラエティー豊かな3rd party Pluginに有ると思います。
こちとらCなので既存のPerlベースのPluginをサポートするつもりは有りません。この辺はばっさり切り捨てさせてもらうとして、Plugin機構は提供したい。でもC + Apache module APIでPlugin書くのもなー、と正直思ったりもしますがまぁ我慢でしょう。なんならmod_perl環境下ではPerlで書いたBlosxom用Pluginをそのまま利用可能、とかもやりようは有りますし。とmod_insertでも言われましたが
インタープリタ埋め込み系Pluginができた時点でプロジェクト終了という危険性は相変わらずありますね。はい。
Plugin機構はベタに実装しちゃうと、名前空間を切り分けられないCではシンボルがすぐ衝突してしまうので、Apacheのmodule構造体と同様にPluginの各関数(メソッド)のポインタを保持した構造体を各プラグインにもたせ、共有ライブラリとして個々にビルドさせるつもりです。各Plugin固有のシンボルは基本的にstatic宣言んしてもらうって事で。
typedef struct blosxom_plugin_rec { struct blosxom_plugin_rec *next; int (*start) (); int (*template) (); int (*entries) (); int (*filter) (); int (*end) (); int (*skip) (); int (*interpolate) (); int (*head) (); int (*sort) (); int (*date) (); int (*story) (); int (*foot) (); int (*last) (); } blosxom_plugin;といった構造体でPluginの各フック関数へのポインタを保持するみたいな。呼び出す場面では
blosxom_plugin *plugin; for (plugin = plugin_root; plugin->next; plugin = plugin->next) { plugin->filter(); }ってな感じ。引数とか返り値とかはまだちゃんと現行のBlosxomを見てないので適当。こうおしておいて適当臭いPluginをいくつか添付して配付すれば、そこそこ楽しいのでは無いかなと。
ひとまずどんなPluginがあって、どんな実装がなされているのかを一度眺めてみない事には実装方法が決められないと思うので、まず見てみますか。
というわけで(?)ご意見求むです。