このサイトのBlosxomの構成

このサイトでは org-modeで書いた原稿をBlosxomを使って表示している と前に書いたが、 その環境もだいぶ落ち着いてきたので、ここにまとめておく。

手元で試してみる

このサイトの構成をまるっとそのまま githubにあげてある ので、 だれでもすぐに試してみることができる。

git cloneと依存ライブラリのインストール

まず、 git clone して、

# git clone
git clone https://github.com/typester/unknownplace.org.git
cd unknownplace.org

cpanm を使ってPerlの依存ライブラリをインストール

# 依存ライブラリをインストール
cpanm --installdeps .

実行

plackupで簡単に動作させられるように app.psgi を同封してあるので

BLOSXOM_CONFIG_FILE=$PWD/config.pl plackup

のように実行するだけで、 http://127.0.0.1:5000 をブラウザで開けばサイトを見ることができる。 良い時代になったものである。

エントリを書く

そのままだとなにもエントリがないのでなにも表示されない。 エントリを書くにはまずエントリ置き場を設定する。

config.pl

our $datadir = "...";

という箇所があるので、そこを適当に自分がエントリを置きたい場所に変更する。そしてそのディレクトリに、

という .txt ファイルを置けばOKだ。たとえば、 hello.txt という名前で、

Hello World

<p>This is my first entry!</p>

みたいに書いて保存したら、その記事を、 http://127.0.0.1:5000/hello.html で見ることができる。 また、 http://127.0.0.1:5000/ を開けばその階層以下のエントリを一覧表示することができる。[1]

このサイトで使っているBlosxomプラグイン

Blosxomのキモはplugin機能で、pluginを書くことでとても柔軟にBlosxomの機能をカスタマイズできるようになっている。 機能を拡張するだけでなく、本体の機能そのものも、ほぼすべてpluginで上書き可能になっている。

現在このサイトでは以下のpluginを使用している。

metaプラグイン以外はこのサイトのために自作したもの。 また基本的に、静的生成のことは一切考えて作っていない。

archives

/archives/ ではタイトル一覧を表示したいが、 /archives/hoge.html では記事内容を表示したいので、 /archives/ の場合のみ別のテンプレをロードできるようにしてくれるプラグイン。

また、dateとstoryフック時に、 $archives::last_yr で直前に処理したエントリの年数を取得できる。 これはマークアップ用

entries_cache

metaプラグインを使用すると、エントリの更新日を取得するためだけでも、ファイル内容を読み込む必要があり、 エントリ数が増えるとだいぶつらくなってくるので、主にその更新日をキャッシュするプラグイン。

fixpath

$blosxom::pathundef になることがあってそれのケアが面倒なことが多いので、 undef の場合は空文字に置きかえてしまう、ってことをするだけのプラグイン。

meta

1行目タイトル、2行目以降が本文というBlosxomのエントリ形式に、 HTTPヘッダーのような感じでいろいろなメタ情報を付けられるようにするプラグイン。

さきほどのサンプルエントリに日時を設定する場合は以下のようにする。

Hello World
meta-creation_date: 2013-01-01T00:00:00+0900

<p>This is my first entry!</p>

microtemplate

Blosxom標準のテンプレ機能は貧弱すぎて禿げるのでそれを Text::MicroTemplate に置きかえるプラグイン。

notfound

Blosxomはエントリが見つからなくても404をださないので、そういう場合にちゃんと404を返すようにするプラグイン。

site_title

記事単体ページの場合に <title> にも記事タイトルが含まれるようにするプラグイン。

template_dir

デフォルトではテンプレートもエントリとおなじ場所に置くようになっているが、 それだと使いにくいのでテンプレートディレクトリは別に設定できるようにするプラグイン。

timepiece

デフォルトの日付の扱いは $yr とか $mo とかそういう変数に入ってるのを使ってがんばらないといけなくて、 これをそのまま使っていると禿げるので、

$timepiece::current_date

で現在の時刻、

$timepiece::entry_date

で、処理しているエントリの時刻をそれぞれ Time::Piece オブジェクトで取得できるようにするプラグイン

top

トップの階層ではその階層 だけ のファイルをレンダリングするようにするプラグイン。[2]

現在のトップページ は /about.txt だけが表示されている状態。

汎用プラグインと特化型プラグイン

microtemplateと、timepieceだけは、他のサイトでも使えると思う。

それ以外のプラグインはこのサイトでしかほとんど役にたたないだろう。 でもそれでいいんだと思う。

Blosxomのプラグインは下手に汎用的にしないでサイトに特化させて作ったほうがシンプルになることが多いから。

テンプレート

templatesディレクトリ以下にはhtmlとrssのテンプレートが入っている。

microtemplateプラグインでテンプレート機能を置き換えているので、どちらも Text::MicroTemplate のテンプレートとなっている。

microtemplate プラグインのなかに定義した関数はそのままテンプレート中でも呼べるので、 いろいろ便利な関数を書いておくと良いと思う。[3]

それと、 MicroTemplate はデフォルトでHTMLエスケープするようになっているので、 HTMLをそのまま吐きたいというような場合には <?= encoded_string $html ?> のようにする必要がある。

スタイル

sassディレクトリにscssファイルで書いていて、それをpublic/cssに出力している。 sassってみたかっただけでだいぶ適当感あふれる感じになっているので、徐々にアップデートしていきたいと思っている。

.txtの生成

Emacsのorg-modeから C-c C-e P a とすれば、公開用のディレクトリ以下の .org ファイルがすべて一括で blosxom 用としてエクスポートされる、というように設定している。

Blosxomは基本的にエントリをそのまま表示するだけなので、 org-mode ととても相性が良い。 これはおすすめの組み合せだ。

まとめ

いまごろBlosxomなどという古いCGIを使うのは迷った。

けれども、個人サイトのテキストを配信する程度なら別にCGIでもいいだろうと思ったこと。そしてやはりプラグインで機能をガシガシ拡張していけるのがとても手に馴染むから、結果的には満足している。

このエントリを見て真似してくれる人が増えれば、 ox-blosxom の開発も進んで(僕が)捗る。 是非試してみてほしい。

comments powered by Disqus