BPT #3: エントリを読み込む

blosxomのプラグインから、任意のエントリを読みたい時はままあります。僕の作成したプラグインだとback_and_forthなどですね。blosxom本体でFileHandleというモジュールを使っているので、それを使って書くのが手っ取り早いです。

単にエントリのタイトルと本文を分けて取得する場合は、

my $fh = new FileHandle;
my $file = '/home/nagashima/www/blosxom/entries/foo/bar.txt';
my($title, $body);

if (-f $file and $fh->open($file)) {
  chomp($title = <$fh>);
  chomp($body = join '', <$fh>);
  $fh->close;
}

こんな感じのコードでOK(blosxom本体まんまでOKとも言う)。

実際にこういうコードを利用する場合、鍵になるのは読み込みたいエントリのパスを取得する部分です。なので、基本的にはこんなコードをサブルーチンにして再利用しまくるのが手間が減って良い感じです。

例えば、前後のエントリのタイトルを拾ってくるback_and_forthの元となったprevnextentryでは、まずfilterサブルーチンで時間順にソートされた全エントリのパスの配列を取得しておき、次にheadサブルーチンで基準となるエントリのパスを取得します。そして、全エントリの配列から基準となるエントリを探し出し、その前後を参照することによって読み込みたいエントリのパスを取得しています。

また、一年前の同じ日に書いたエントリの一覧をリストにするone_year_agoでは、まずfilterサブルーチンで時間順にソートされた全エントリのパスのハッシュをコピー(mtime情報も利用するので)しておき、次にdateサブルーチンで基準となるエントリの一年前の日付けの午前0時と午後23時59分59秒のunixtimeを取得します。そして、全エントリのハッシュを走査し、ハッシュの値が一年前の日付けの午前0時と午後23時59分59秒の間の場合にそのキーをファイルのパスとして取得しています。

本来、filterサブルーチンは「通常はエントリとしてみなされるファイルを削除または通常はエントリとみなされないファイルを追加」というフィルター(まんま)の役割りを持たせられているサブルーチンなのですが、以上の例からもわかるように、エントリの一覧を容易に取得できる貴重なサブルーチンでもあります。怪しげクール(!)なプラグインを作ろうとすると、使う機会が多くなるんじゃないかなと。