Mitsukiの魔法実験室

Mitsuki's Magic Laboratory
Since 2002.09.14

blosxomをタグ化してみる

Posted at 2006/08/05 00:55 in Programming|WebDev

 今更blosxom? とか言われそうですが(笑)、久しぶりにいじってみました。テーマは「タグ化」。

 blosxomは標準ではディレクトリ=カテゴリーなわけですが、はてなブックマーク等に慣れてくると、なにかと自由の利くタグを使いたくなってきます。タグ対応pluginは探せば既存でもいくつかあるようですが、やり方を思いついたので自分でも実装してみました。
 ソースはこちら

 おおざっぱな仕組みは、filter()で

  1. エントリーファイルの1行目(タイトル行)からタグ([]で囲った文字列)を収集
  2. エントリーファイルの存在するパスもタグとして収集
  3. リクエストのパスをターゲットのタグとし、対象となるファイル以外をファイル一覧(%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の方が好きだなあ(ぉぃ)。