88171.net

Blosxom moreプラグイン

車輪の再発明。

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

Blosxom more plugin · GitHub

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

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

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

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

ロックされているRCSファイルを探す

RCSを使っていると、ロックしたまま放置されたファイルがあちこちに出来て辛い。

いや、都度きちんとアンロックすべきなことは明白で前向きに善処する所存にございますが、忘れるものは忘れるのでスクリプトを書いて /usr/local/bin あたりに置く。 余談だけど、スクリプトをファイルにまとめる時は面倒がらずにlongなoptionを使いたい。 後で読んだときにさっぱりわからない。

#!/bin/sh
locate \*,v | \
    xargs --no-run-if-empty --replace find {} -user $USER | \
    xargs --no-run-if-empty rlog -L -h

locate が気に入らなければ find / しても良い。 耐えられるのであれば。

実行するとこんな感じのがずらずらっと出てきて捗る。

RCS file: /etc/aliases,v
Working file: aliases
head: 1.13
branch:
locks: strict
    root: 1.13
access list:
symbolic names:
keyword substitution: kv
total revisions: 13
=============================================================================

ネタが古い。

GitでBlosxomに記事を投げる

Blogging –and, indeed, any online publishing– should be as simple as typing away in your favourite text editor and hitting Save.

blosxom :: the zen of blogging

この潔さはBlosxomの美点なんだけど、デバイスもネットワークも多様化したこのご時世だからこそ、手持ちの端末でいつでもどこでも快適にSSHできるとは限らないし、手元でMacDownみたいに素敵なエディタを使いたいことだってある。

そこでナウいエンジニアの皆様が大好きな 「Gitでpushしてapplicationをdeploy」 を応用してみましょう、と。

ファイルの更新時刻

まずいきなり細かい話から始めると、今回Blosxomには一切手を入れてなくて、単に $blosxom::datadir にGitリポジトリを指定しているだけ。 なので、ファイルの更新時刻をきちんと管理しないとGitが書き換えまくって大変なことになる。

これにはrsync付属のgit-set-file-timesをベースに、コミットのauthor dateに基づいて全ファイルの更新時刻を再設定するように少しだけ手を入れたスクリプトを使っている。

set-file-times · GitHub

なぜわざわざcommitter dateでなくauthor dateを見ているのかと言うと、コマンドラインで簡単に上書きできるから。 更新時刻を変えるまでもないようなほんのちょっとした修正は、--date オプションでauthor dateを変えずにこっそりコミットしたりしている。 あと意味合い的にもauthorの方が適当なんじゃないかと思うけど、そこはよくわからない。

リポジトリ構成と設定

結果的に、リポジトリ構成はこんな感じ。

リポジトリ構成のイメージ

真ん中のbareリポジトリのpost-receiveフックはこう。まあこれはみんなやってるのと同じ。

#!/bin/sh
cd /path/to/repo/for/blosxom && git --git-dir=.git pull

Blosxomが参照するnon-bareリポジトリのpost-mergeフックはこう。scripts/ に前述のスクリプトがコミットしてあって、それを叩いている。

#!/bin/sh
scripts/git-set-file-times

post-mergeフックには他にも、記事の更新時に走らせたい処理を書いてもいい。うちではエントリキャッシュの削除を仕込んでる。


これで、ローカルから git push するだけでBlosxomに記事を投げることができるようになった。

草稿はどう管理したものかと悩んだけれど、結局は安直にドットファイルにして隠している。いちいちトピックブランチ切るのも面倒だし。

勢い余って手元のiOSデバイスたちにWorking Copyで環境を整えたりもしたけれど、機会があれば書くかもしれない。

ネタが10年古い。