Angerwhale #0

コメント/トラックバックスパムがうざいので、一時的に受け付けないようにしました。

で、blosxom で対策してもいいのですが、これを機会にブログツールを乗り換えようと、Angerwhale を試すことに。(本当は Catlxom への乗換えを前々から検討していたのですが、大きく作り変えると typester さんがおっしゃっていたので、ちょっと様子見。)

Angerwhale と同様に、Catalyst ベースのブログツールに Typeface というのがあるのですが、Angerwhale はエントリをファイルベースで管理するので、blosxom に近いものがあるし、作者の jrockwayYAPC::Asia Tokyo 2007 にも来るので、もしかしたら話す機会もあるかもしれないので、こちらを使ってみることに。

使ってみてちょっと不便だな、と思ったのは、

の2点。

以下、もう少し詳しく説明します。まずはエントリタイトルの件。

Angerwhale ではエントリの作成時間などを、メタデータとして管理します。メタデータは File::Attributes を利用して作られ、.entry_file_name.attributes といったファイルが、エントリファイルと同じディレクトリに作られます。内容は以下のように YAML になってます。

---
creation_time: 1172377648
guid: 813B071C-C488-11DB-BB28-6F396B4151C7

このメタデータファイルに、

title: エントリタイトル

といった記述があれば、これをエントリのタイトルとみなします。なければ、ファイル名から拡張子を除いたものがエントリのタイトルになります。

ファイル名とタイトルが違う、なんてことがよくあるわけですが、そうしたい場合には今の仕様だと、

  1. エントリファイルを置く
  2. 一度ブラウザでアクセスしてメタデータファイルを作らせる
  3. メタデータファイルを開いてエントリタイトルを記述する

なんてことをしなければいけない、ということになります。めんどいですね。

次にカテゴリ名の問題。

Angerwhale は カテゴリ = ディレクトリなんですが、ブラウザ上にはディレクトリ名をそのまま表示しちゃうんですね。ディレクトリは英語で、表示は日本語でしたい、ってのもよくあることなので、これも不便ですね。

この辺り、パッチ作ったりして対応したいな、と思ってます。

また、以下のバグと思わしき問題もありました。

これは以下のパッチを書いて、jrockway に送ってみました。

Index: lib/Angerwhale/Model/Filesystem.pm
===================================================================
--- lib/Angerwhale/Model/Filesystem.pm  (revision 573)
+++ lib/Angerwhale/Model/Filesystem.pm  (working copy)
@@ -58,7 +58,7 @@
 sub get_article {
     my $self    = shift;
     my $article = shift;
-    my $base    = $self->base;
+    my $base    = shift || $self->base;

     die "article name contains weird characters"
       if $article =~ m{/};
@@ -90,10 +90,14 @@
         my $entry = "$base/$article";
         next if $article =~ m{^[.]};    # hidden files are also ignored
         next if !-r $entry;
-        next if -d $entry;

+        #next if -d $entry;
+        if ( -d $entry ) {
+            push @articles, $self->_ls($entry);
+            next;
+        }
         #entry is acceptable
-        my $article = $self->get_article($article);
+        my $article = $self->get_article($article, $base);
         push @articles, $article;

     }