今更blosxom? とか言われそうですが(笑)、久しぶりにいじってみました。テーマは「タグ化」。
blosxomは標準ではディレクトリ=カテゴリーなわけですが、はてなブックマーク等に慣れてくると、なにかと自由の利くタグを使いたくなってきます。タグ対応pluginは探せば既存でもいくつかあるようですが、やり方を思いついたので自分でも実装してみました。
ソースはこちら。
おおざっぱな仕組みは、filter()で
- エントリーファイルの1行目(タイトル行)からタグ([]で囲った文字列)を収集
- エントリーファイルの存在するパスもタグとして収集
- リクエストのパスをターゲットのタグとし、対象となるファイル以外をファイル一覧(%files)から削除
あとは通常のシーケンスでエントリーが表示されるので、story()で表示用のタグリンクを作成、というシンプルもの。
ただし、通常はカテゴリー(ディレクトリ)内のエントリー以外は表示をスキップする処理が走るので、blosxom.cgiを修正してカテゴリー機能自体を無効にする必要があります。
sub generate { (中略) # Only stories in the right hierarchy # $path =~ /^$currentdir/ \ or $path_file eq "$datadir/$currentdir" \ or next; #←コメントアウト(実際は1行)
また、recentwritebacks_treeのような、エントリーファイルからタイトルを拾ってくるpluginは、タイトルからタグ部分を除去するように改造する必要があります。
sub gettitle { (中略) if($fh->open($file)) { $ret = <$fh>; $fh->close; $ret =~ s!(\[[^]]+\])*!!g; #←追加 } chomp($ret);
他にもタグリストのキャッシュ機能なんかも実装してありますが、細かい話なので省略。
この仕組みので面白いのは、エントリーファイルのパスも自動的にタグ扱いしてくれる点。つまり、既にカテゴリー分けされてる既存のエントリーは、何もしなくても最初から自動的にそのカテゴリー(ディレクトリ)名のタグが付いてくれます。
また、カテゴリーを2階層以上掘ってある場合、エントリーが属する上位のカテゴリーも全てタグとして付いてきます。例えば「/NetGame/RagnarokOnline/sample.txt」というエントリーの場合、「NetGame」と「RagnarokOnline」のタグが一気に付くわけです。「NetGame」直下に置けば「NetGame」だけに属し、「RagnarokOnline」の下に置けば「NetGame」「RagnarokOnline」両方に属する、つまり「RagnarokOnline」は「NetGame」をも含むという、タグ同士の包含関係のようなことが実現できるわけですね。
というわけで、かなり久しぶりにperlをいじりましたが……やっぱり自分で書くならrubyの方が好きだなあ(ぉぃ)。