ローカルスコープ変数を作る MovableType プラグイン:LocalBlock

Posted by
ぴろり
Posted at
2008/02/24 12:15
Trackbacks
関連記事 (0)
Post Comment
コメントできます
Category
プラグイン カテゴリ

 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

テンプレート タグ リファレンス

MTLocalBlock
 ブロック内の全ての変数を局所化します。MTLocalBlockが使用された段階で定義されている全ての変数はブロック内に引き継がれますが、ブロック内で変数に対して行われた変更はブロック外の変数には影響を与えません。ブロック内で新しく定義された変数は、ブロック外では未定義となって参照することはできません。ブロック内の変数をブロック外で参照するには後述のglobalsオプションを使用してください。
globals
 ここで指定された正規表現にマッチする名前を持つ変数はグローバル変数として、ブロック内での変更はブロック外でも参照することができます。
  • globals="^foo$" … 変数 foo はグローバルです
  • globals="^g_.+$" … g_ で始まる変数は全てグローバルです

ダウンロード

このエントリーをはてなブックマークに追加  



関連記事/トラックバック

関連記事/トラックバックはまだありません

この記事にトラックバックを送るには?

コメントを投稿する

 
 (必須, 匿名可, 公開, トリップが使えます)
 (必須, 匿名可, 非公開, Gravatar に対応しています)
 (必須)
スパム コメント防止のため「投稿確認」欄に ランダムな数字 CAPTCHAについて を入力してから送信してください。お手数ですがご協力のほど宜しくお願いいたします。