re:NabeAzzテンプレート問題・パート2
素敵に変態(MT的な意味で)なネタなのでチャレンジしてみました。
問題
- 1から200の数を、1行あたり10列のテーブルにして出力します。
- テーブルの個々のセルの背景に色を付けて、市松模様になるようにします。
- 3で割り切れる数(例:6)は、bタグで囲みます。
- 3を含む数(例:13)は、uタグで囲みます。
- 5で割り切れる数(例:10)は、iタグで囲みます。
- 5を含む数(例:52)は、sタグで囲みます。
- 上記の4つの条件を複数満たす場合は、それらすべてを適用します。
回答
<mt:for from="1" to="200">
<mt:if name="__first__"><table></mt:if>
<mt:if test="$__index__%10 == 1"><tr></mt:if>
<td<mt:if test="(($__index__-1)/10+$__index__%10)%2 == 1"> style="background:red"</mt:if>>
<mt:setvar name="num" value="$__index__">
<mt:if test="$__index__%3 == 0"><mt:getvar name="num" regex_replace="/^(.+)$/","<b>$1</b>" setvar="num"></mt:if>
<mt:if name="__index__" like="3"><mt:getvar name="num" regex_replace="/^(.+)$/","<u>$1</u>" setvar="num"></mt:if>
<mt:if test="$__index__%5 == 0"><mt:getvar name="num" regex_replace="/^(.+)$/","<i>$1</i>" setvar="num"></mt:if>
<mt:if name="__index__" like="5"><mt:getvar name="num" regex_replace="/^(.+)$/","<s>$1</s>" setvar="num"></mt:if>
<mt:getvar name="num">
</td>
<mt:if test="$__index__%10 == 0"></tr></mt:if>
<mt:if name="__last__"></table></mt:if>
</mt:for>
解説
まず、1から200の数字を出力するということでMTForを使い200回のループを回します。
<mt:for from="1" to="200">
</mt:for>
次に「1行あたり10列のテーブルにして出力」します。
最初にtable要素の開始タグと最後にtable要素の閉じタグを出力。
現在の数値(__index__)に10割って1あまる時にtr要素の開始タグを出力。
現在の数値(__index__)に10割って0あまる時(つまり割り切れるとき)にtr要素の終了タグを出力。
td要素は毎回出力します。
これでテーブルは完成。
<mt:for from="1" to="200">
<mt:if name="__first__"><table></mt:if>
<mt:if test="$__index__%10 == 1"><tr></mt:if>
<td>
</td>
<mt:if test="$__index__%10 == 0"></tr></mt:if>
<mt:if name="__last__"></table></mt:if>
</mt:for>
次にテーブルの個々のセルの背景に色を付けて、市松模様になるようにするとのことで、
1の位と10足した値が奇数(もしくは偶数)のときに色を指定すればよい。
と、ここで少しはまったのですが10とか20などの1の位が0の時だけすこし法則が異なります。
1行目が10の位が0、2行目が10の位が1という具合に法則性を持たすには、現在の数値から1引いたものを基準値として計算します。
($__index__-1)/10で10の位の値、正確には10の位以上の数値なんですが奇数の判定なので100の位は気にしなくて大丈夫。
$__index__%10で1の位の値。
それらを足したものを2で割ってあまりが1の時だけ背景色を出力します。
<td<mt:if test="(($__index__-1)/10+$__index__%10)%2 == 1"> style="background:red"</mt:if>>
次に3で割り切れる数(例:6)をbタグで囲みます。
ループ変数($__index__)のままだと加工ができないので一度、MTsetVarタグを使い変数numに代入。
3で割り切れる場合はMTifタグのtestモディファイアで判定。
MTGetVarタグでnumを取得して、regex_replaceを利用して前後にb要素を追加してsetvarモディファイアで、再び変数numに格納。
ここら辺は、MTSetVarBlockタグで書いたほうが、書き方として綺麗だけど、無駄に短く書きたかったので。。。
<mt:setvar name="num" value="$__index__">
<mt:if test="$__index__%3 == 0"><mt:getvar name="num" regex_replace="/^(.+)$/","<b>$1</b>" setvar="num"></mt:if>
同様にして3を含むとき、含むときはlikeモディファイアを利用すればよいです。
<mt:if name="__index__" like="3"><mt:getvar name="num" regex_replace="/^(.+)$/","<u>$1</u>" setvar="num"></mt:if>
5も同じ要領で処理すれば完成です。
「よってたかってMTテンプレ。」たのしいコミュニティだ。
関連エントリー
MTカスタムフィールド画像を見えるようにする(正規表現)
MTでopモディファイアを利用して複雑なレイアウトを行う
Movable TypeでSEO対策-Feed編-
Movable Typeの再構築 高速化いろいろ
MTのカテゴリー操作 色々