Movable Type のスタティック・パブリッシングでループ以外でも odd と even を出力する方法

リストや表を出力するときに、交互に odd(奇数)や even(偶数)というクラス名などを付けたいことって結構ありますよね。

それを実現する方法としては、jQuery など JavaScript を使う方法が簡単ですが、Movable Type を使っているなら、できればスタティック・パブリッシングで直接出力しておきたいですよね。

MTLoop などの繰り返しタグの中であれば、<mt:If name="__odd__"> などで簡単にできますが、ループの中以外では少し工夫が必要です。

今回は、ループ以外でそれを実現する方法の紹介です。

出力結果サンプル

サンプルとして、次のようなリストに odd、even を交互に付けたいとします。

<ul>
<li>1 : odd</li>
<li>2 : even</li>
<li>3 : odd</li>
<li>4 : even</li>
<li>5 : odd</li>
<li>6 : even</li>
<li>7 : odd</li>
<li>8 : even</li>
<li>9 : odd</li>
<li>10 : even</li>
</ul>

テンプレート

まず、odd、even を付けたいソースの手前に、次のテンプレートを挿入します。

<$mt:SetVar name="_count" value="0"$>
<mt:SetVarTemplate name="odd_even">
<$mt:SetVar name="_count" op="++"$>
<$mt:Var name="_count" op="%" value="2" setvar="_mod"$>
<mt:If name="_mod">odd<mt:Else>even</mt:If>
</mt:SetVarTemplate>

このテンプレートの解説は次のとおりです。

変数_countを初期化(=0)します。
<$mt:SetVar name="_count" value="0"$>

mt:SetVarTemplateは、その変数がmt:Varされる場所で変数の内容が展開されます。
<mt:SetVarTemplate name="odd_even">

変数_countをインクリメント(+1)します。
<$mt:SetVar name="_count" op="++"$>

変数_countを2で割った余り(0か1)を変数_modに入れます。
<$mt:Var name="_count" op="%" value="2" setvar="_mod"$>

余りが1のときは奇数なのでodd、0のときは偶数なのでevenを出力します。
<mt:If name="_mod">odd<mt:Else>even</mt:If>

</mt:SetVarTemplate>

この MTSetVarTemplate でセットされた変数 odd_even を、odd か even を交互に出力したい場所で MTVar すればOKです。

<ul>
<li>1 : <$mt:Var name="odd_even"$></li>
<li>2 : <$mt:Var name="odd_even"$></li>
<li>3 : <$mt:Var name="odd_even"$></li>
<li>4 : <$mt:Var name="odd_even"$></li>
<li>5 : <$mt:Var name="odd_even"$></li>
<li>6 : <$mt:Var name="odd_even"$></li>
<li>7 : <$mt:Var name="odd_even"$></li>
<li>8 : <$mt:Var name="odd_even"$></li>
<li>9 : <$mt:Var name="odd_even"$></li>
<li>10 : <$mt:Var name="odd_even"$></li>
</ul>

以上です。ナイス・アイデア。