88171.net

I stand with Ukraine🇺🇦

Blosxom more プラグイン

車輪の再発明。

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

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

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

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

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