Smartyを調べている
XslateがSmartyをサポートしたらいいのに、という要望があったので、Smartyを調べている。Smartyは極力「プログラミング」をできないようにしているようで、確かに使いやすそうだ。
調べてみるとcycle関数が面白そうなのでとりあえずXslateに似た機能を実装してみた。以下のようにすると、"even"と"odd"を交互に表示する。
#!perl use strict; use Text::Xslate; my $tx = Text::Xslate->new(); print $tx->render_string(<<'T'); : for [1, 2, 3, 4] -> $item { <: $~item.cycle("even", "odd") :> : } T __END__
Template Toolkit 2にはloop.even
やloop.odd
というイテレータ要素があるのだが、これはループカウントが1から始まるため、odd -> even -> odd ...という順で真になる。これはエンジニアとしてはまったく直観的ではないし、かといって逆にするのも混乱を助長するだけなのでよくない*1。しかしこのcycle()ならば直観的に使えるだろう。
TT2のodd/evenと同じように、真->偽というサイクルがほしいならば以下のようにすればよい。
: for [1, 2, 3, 4] -> $item { : if $~item.cycle(true, false) { ... : } : }
あるいは、偽->真というサイクルがほしいならば逆にすればよい。
: for [1, 2, 3, 4] -> $item { : if $~item.cycle(false, true) { ... : } : }
なお、Smartyのcycleには様々なオプションがあるが、それらはサポートしていない。
*1:と、id:tokuhiromに反対された