MovableTypeの変数タグでフィボナッチ数を求めようとした場合(?)、テンプレートの変数はグローバル変数としてしか扱えないという仕様がテンプレートを煩雑にしています。
そこで、MovableTypeのテンプレートの変数についてローカル変数を任意に定義できるようなプラグインを書いてみました。ローカル変数によってテンプレートの変数を局所化し、相互依存性や複雑性を軽減できると期待できます。
プラグインを導入すると、ブロック内の変数を局所化する<MTLocalBlock>というブロックタグが使用できるようになります。<MTLocalBlock>ブロック内で定義された変数や、既存の変数に加えられた変更は、ブロックの外に戻ると無かったことになります。
<MTSetVar name="foo" value="123"> - <MTGetVar name="foo"> = 123 <MTSetVar name="bar" value="ABC"> - <MTGetVar name="bar"> = ABC <MTLocalBlock globals="^bar$"> <MTSetVar name="foo" value="456"> - <MTGetVar name="foo"> = 456 <MTSetVar name="bar" value="XYZ"> - <MTGetVar name="bar"> = XYZ </MTLocalBlock> - <MTGetVar name="foo"> = 123 - <MTGetVar name="bar"> = XYZ
グローバル変数とテンプレートタグでフィボナッチ数を求める時に使ったテンプレートを<MTLocalBlock>を用いて書き直すと以下のようになります。フィボナッチ数を再帰で求める部分で fib_x 変数の周辺がよりスマートに書けるようになりました。また、使用されているテンプレートタグの総数が減ったことでパフォーマンスの向上も期待できます。
<MTSetVar name="fib" index="1" value="1">
<MTSetVar name="fib" index="2" value="1">
<MTSetVarTemplate name="Fibonacci">
<MTUnless name="fib" index="$fib_x">
<MTSetVarBlock name="fib" index="$fib_x"><MTLocalBlock><MTSetVar name="fib_x" value="1" op="-"><MTGetVar name="Fibonacci" regex_replace="/s+/",""></MTLocalBlock></MTSetVarBlock>
<MTSetVarBlock name="fib" index="$fib_x" op="+"><MTLocalBlock><MTSetVar name="fib_x" value="2" op="-"><MTGetVar name="Fibonacci" regex_replace="/s+/",""></MTLocalBlock></MTSetVarBlock>
</MTUnless>
<$MTGetVar name="fib" index="$fib_x"$>
</MTSetVarTemplate>
<MTSetVar name="fib_x" value="10">
fib(<$MTGetVar name="fib_x"$>) = <$MTGetVar name="Fibonacci" regex_replace="/s+/",""$>
fibonacci series= <$MTGetVar name="fib" glue=","$>
そもそもテンプレートタグでフィボナッチ数列を計算する意味が(ry
MTLocalBlockMTLocalBlockが使用された段階で定義されている全ての変数はブロック内に引き継がれますが、ブロック内で変数に対して行われた変更はブロック外の変数には影響を与えません。ブロック内で新しく定義された変数は、ブロック外では未定義となって参照することはできません。ブロック内の変数をブロック外で参照するには後述のglobalsオプションを使用してください。
globalsglobals="^foo$" … 変数 foo はグローバルですglobals="^g_.+$" … g_ で始まる変数は全てグローバルですmaster) ... バグ修正や機能追加など開発途中のバージョンです。開発中の新機能などをいち早く利用できますが、新しいバグが生まれていたり、テストが不十分な場合があります。