Posted at 2006/08/05 00:55
in Programming|WebDev
今更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の方が好きだなあ(ぉぃ)。