手軽にblosxomのflavourシステムを強化することが出来るようになるinterpolate_fancyプラグインについて今さら書いてみようかとか。本当に今さらすぎて笑えない。今さらとはいえ、blosxomのflavourシステムを強化するプラグインとしてはこれくらいしか選択肢はないので書いておいても損ではないはず。

少し前にもちょっとだけ使い方を書いたけど、文字数稼ぎ興味を持てずに飛ばしてしまった人のために簡単に使い方を説明してみる。基本は、

<$foo /> = $foo
<?$foo>$fooがdefinedなら表示される</?>
<!?$foo>$fooがundefinedなら表示される</?>

の3つで、これらに加えて、

<?$foo eq="1">$fooが1なら表示される。</?>
<?$foo ne="1">$fooが1でないなら表示される。</?>
<?$foo lt="1">$fooが1より小さいなら表示される。</?>
<?$foo gt="1">$fooが1より大きいなら表示される。</?>
<?$foo like="^[a-z]$">$fooが正規表現^[a-z]$にマッチするなら表示される。</?>
<?$foo unlike="^[a-z]$">$fooが正規表現^[a-z]$にマッチしないなら表示される。</?>

などといった条件比較も可能。更に、他にインストールしているプラグインのサブルーチンを呼べたりとかもする。

以下に具体的な利用例を挙げてみる。

permalinkではタイトルにリンクを張らない

このblogのように、$path/$fn.htmlという形のpermalinkを採用している場合は、$path_info.htmlで終わっているかどうかを調べることによってpermalinkかどうかを判断できる。つまり、

<h3>
<?$path_info unlike="\.html$">
<a href="/blog$path/$fn.$default_flavour" title="&quot;$title&quot; への恒久的なリンク">
</?>
$title
<?$path_info unlike="\.html$">
</a>
</?>
</h3>

というような書き方(見やすいように改行を入れている)をしてやれば、permalinkではタイトルにリンクが張られなくなる。else系の条件分岐が無いのでくだくだしい書き方。

文字列を保護する

blosxomのinterpolate()の仕様上、$yr-$mo_num-$daT$ti:00とか書いた場合、意図した通りに表示されない。しかし、適当な変数名を利用して、

$yr-$mo_num-$da<?$yr>T</?>$ti<?$yr>:</?>00+09:00

と、書くことができる。こうすると「T」や「:」が保護されるので、きちんと意図した通りに表示される。バッド・ノウハウ。

簡単な条件分岐を利用して都合よく体裁を整える

このサイトのトップ・ページに表示している最近のエントリ一覧を実現しているjs flavourで利用してたりします。story.jsの内容は、

<?$push_if_first::is_first eq="1">
document.write('<h4><a href="$url$path/$fn.$default_flavour" title="&quot;$title&quot; への恒久的なリンク">$title</a></h4>');
document.write('<p class="date">Posted at $yr-$mo_num-$da<?$yr>T</?>$ti<?$yr>:</?>00+09:00 in <a href="/blog$path/" title="&quot;$categories::name&quot; 関連のエントリを閲覧する">$categories::name</a></p>');
document.write('<p>$rss::excerpt</p>');
document.write('<p class="seemore"><a href="$url$path/$fn.$default_flavour" title="&quot;$title&quot; の全文を読む">&#187; Read full entry</a></p>');
document.write('<ul>');
</?>

<?$push_if_first::is_first ne="1">
document.write('<li><a href="$url$path/$fn.$default_flavour" title="$title Posted at $yr/$mo_num/$da ($dw) $ti in $categories::name">$title</a></li>');
</?>

と、push_if_firstプラグインと組み合わせることによって、最初のエントリの場合は概要まで表示しエントリ全文へのリンクを追加、それ以外の場合はタイトルをリストで並べるという形を実現している。

特定のエントリではwritebackを禁止する

特定のエントリということを判断させるためにmetaプラグインが必要になるが、作業的には面倒ではない。まず、writebackのフォームを表示しているstory.htmlなどで、

<?!$meta::nowriteback>
<form ...>
...
</form>
</?>

といったように、writebackのフォームをくくる。その上で、その特定のエントリに、

meta-nowriteback: 1

と書いておけば良い。metaプラグインはエントリに対してメタ・データを付与できるプラグインなので、こういったケースでもわかるようにinterpolate_fancyプラグインとは相性が良い。

禁止するというかフォームを表示させないだけ。指定の日数すぎたらwritebackを禁止するとかいう場合は、プラグインを書かないとならない(と思う)。例えば、現在の時間とエントリの時間の差を秒数で取得し、変数に格納するだけのプラグインをつくり、ltでその指定の日数を秒に変換した数字(30日なら2592000)と比較とか。


基本的には他のプラグインとうまく組み合わせてやると力を発揮するプラグインだと思う。また、逆に他のプラグイン側も条件分岐をinterpolate_fancy側に任せたりすることも可能なので、プラグインが多少書きやすくなる。これがデフォルトのinterpolate()だったらなぁ・・・とかは思っていても口に出してはいけない。