88171.net

Blosxom moreプラグイン

車輪の再発明。

indexに長いエントリがどんと載ると正直邪魔な感じがするので、いわゆる「read more」を実現したい。 ただseemoreのように自分で区切り位置を指定するのは面倒。 なので、そこそこ良い感じに勝手に切り詰めてくれるプラグインを可能な限りお手軽に実装してみたら、こうなった。

最初は一応汎用性を考えて、MarkdownソースからHTMLに変換した後にHTML::TruncateHTML::Splitを使って切り詰めようと思っていたのだけど、なかなか思うような結果にならなかった。 そこで汎用化はさっさと諦めて、 Markdownソースの先頭から1024バイト以降に初めて出現した空行 を基準として切り詰めることにし、さらにmicrotemplateといった、少なくとも条件分岐が可能なテンプレートエンジンを利用していることを前提とした。

ASCII文字列が多い場合に見かけ上のボリュームが結構ばらついてしまうので、文字単位ではなく敢えてバイト単位で数えている。 空行を区切りにしているのでマルチバイト文字に対する害はない。 タイトルやマークアップまでカウントしてしまうが、そこは諦めた。

プラグインのファイル名を01moreのようにナンバリングして、Markdownプラグインよりも先にロードさせる。 するとindexの出力時に(だけ)切り詰めが行なわれ、同時に$more::truncatedというフラグが立つ。 story.htmlでフラグを見てあれこれしつつ、スタイルシートで頑張る。

定義を削除してしまうケースがどうしてもあるので、参照スタイルのリンク記法([id]: URL)が使えなくなるという不可避な弊害がある。 個人的には多用していないので許容できたのだけど、もしそうでないならレンダリング後にクライアントサイドで処理するしかない。