mod_blosxomのフレームワーク部がようやく形になりました。これからこのフレームワークが本当に柔軟か否かを確かめるために、プラグインの実装に移ります。というわけでPreview 2です。
ダウンロード
まだビルドシステムが手抜きなので使いにくいですが、Preview 2は次のURLからダウンロードできます。mod_blosxom2-pre2.tar.gz
変更点
Plugin APIの見直し
開発当初はBlosxomのPlugin APIを参考に実装していましたが、Apacheモジュールベースのフレームワークとして意味のある(と信じたい)APIに変更しました。これに伴いプラグインの構造を示すblosxom_plugin構造体は次のように変更しました。typedef struct blosxom_plugin_rec { const char *name; struct blosxom_plugin_rec *prev; int (*server_init)(server_rec *s, pool *p); int (*child_init)(server_rec *s, pool *p); int (*start)(blosxom_context_rec *ctx); int (*entries)(blosxom_context_rec *ctx); int (*filter)(blosxom_context_rec *ctx); int (*skip)(blosxom_context_rec *ctx); int (*sort)(blosxom_context_rec *ctx); blosxom_story *(*load_story)(blosxom_context_rec *ctx, blosxom_entry *entry); const char *(*template)(blosxom_context_rec *ctx, const char *chunk); const char *(*interpolate)(blosxom_context_rec *ctx, const char *str); const char *(*format_head)(blosxom_context_rec *ctx, const char *str); const char *(*format_foot)(blosxom_context_rec *ctx, const char *str); const char *(*format_date)(blosxom_context_rec *ctx, const char *str); const char *(*format_story)(blosxom_context_rec *ctx, const char *str); int (*encode)(blosxom_context_rec *ctx); int (*send)(blosxom_context_rec *ctx); int (*end)(blosxom_context_rec *ctx); } blosxom_plugin;うんー、これだけみてもワケわかりませんね。。。BlosxomのPluginで介入できる処理フェーズとほぼ同じですが、次の点が異なります。
- Apache起動時に実行するフック
- Apacheの子プロセスfork時に実行するフック
- 記事のロード処理を実装するフック
- コンテンツ送信直前にコンテンツを変換するフック(多段のフィルタ)
- コンテンツ送信処理を実装するフック
リクエストパラメータ取得用API追加
URIやリクエストボディ(POST)で渡されるパラメータを解析した結果を、パラメータ名で参照できるようにしました。下記のようにblosxom_context_rec構造体のparamフィールドから参照できます。char *flavour_name = ap_table_get(ctx->param, "flav");デフォルトの解析処理はカナーリ適当で、ファイル等を受信することはできません。そのかわりlibapreqなどを利用して「完全な」パラメータ解析処理をプラグインでオーバーライドすることができます。
flavourファイルのロード処理追加
preview 1では関数はあれど機能していなかった、ファイルシステム上のflavourファイルをロードする処理を有効にしました(汗)コンテキストにLast-Modified用のフィールドを追加
条件リクエストなどを実装できるように、blosxom_context_rec構造体にmtimeフィールドを追加しました。デフォルトではリクエストを受けたディレクトリ配下の最も新しい記事のタイムスタンプがLast-Modifiedフィールドにセットされます。実装するプラグイン
まだ決めていません。サンプルになり得る小技系(?)からやるとして、とりあえずこのサイトやShibuya Perl Mongersなどのサイトでの使用に耐えうるプラグインを用意して見ようかなと。全部できるか否かわかりませんけど。あとプラグイン開発のためのドキュメントに力を入れないと、利用者複数開発者一人とかいう悲しい状態になってしまうのでがむばります。そうそう、誰かNet::YahooMessengerを引き取ってください。最近「gaimやTrillianは新しいプロトコルに対応したけど君のはドーよ?」みたいなメールがポロポロ来るんです。
立場的に無理とか英語(Excite語)で説明メール書くのがめんどくさいので放置ですが。
きっとMやがわ氏とかVarun kacholia氏が引き取ってくれるんだろうとか想っていますが、作者がアクション起こさないとなんとも。うーん。めんどくさいな。←おぃ!