変数操作を無駄に拡張する MovableType プラグイン:MathOperatorExpander

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

 MovableType 4 から機能が改善されたテンプレートタグでは、変数に対して四則演算などの基本的な演算を行うことができるようになりました。しかし、それ以外の演算についてはサポートされておらず、今回、(その必要性は別として)各種のビット演算や切上げ・切捨て、乱数生成などが可能になるよう、これを無駄に拡張する MovableType プラグインを書いてみました。

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

拡張される演算

 MovableType 標準の op で指定できるパラメータに加えて、以下のパラメータを使用できるようになります。

& または and
左辺値に対して右辺値とのビットAND(論理積)を求めます。
| または or
左辺値に対して右辺値とのビットOR(論理和)を求めます。
^ または xor
左辺値に対して右辺値とのビットXOR(排他的論理和)を求めます。
~ または not
左辺値に対するビットNOT(論理否定)を求めます。右辺値が指定された場合、そのビットNOTを求めて左辺値として代入します。
<< または shl
左辺値に対して右辺値の値だけ左にビットシフトした値を求めます。
>> または shr
左辺値に対して右辺値の値だけ右にビットシフトした値を求めます。
<<< または sal
左辺値に対して右辺値の値だけ左に算術シフトした値を求めます。
abs
左辺値に対する絶対値を求めます。右辺値が指定された場合、その値の結果を求めて左辺値として代入します。
int
左辺値に対する小数部分を切り捨てます。右辺値が指定された場合、その値の結果を求めて左辺値として代入します。
ceil
左辺値に対する x 以上の最小の整数を求めます。右辺値が指定された場合、その値の結果を求めて左辺値として代入します。
floor
左辺値に対する x 以下の最大の整数を求めます。右辺値が指定された場合、その値の結果を求めて左辺値として代入します。
rand
左辺値に対する 0 以上 x 未満の任意の値を求めます。右辺値が指定された場合、その値未満の乱数値を求めて左辺値として代入します。
pack
左辺値に対して Perl の pack 関数を適用します。右辺値を変換用のテンプレートとして適用します。
unpack
左辺値に対して Perl の unpack 関数を適用します。右辺値を変換用のテンプレートとして適用します。

左辺値とは name で指定された対象となる変数、右辺値とは value で指定された値です。

 乱数生成を JavaScript で行う場合だと、その生成がクライアント側で行われるため、乱数値を用いてテンプレートを分岐するなどの処理(普通はやりません)ができません。このプラグインでは MTSetVar テンプレートタグが処理される段階、サーバ側でテンプレートが処理される段階で値が求められるのでアイディア次第で色々と使えると思います。…まぁ、テンプレートタグの構築にビット演算だとか、そもそもツッコミ満載の演算式が満載です。packunpack は地味に便利だと思うんですが(自信ナシ)

<MTSetVar name="var" value="12">
<MTSetVar name="var" value="4" op="&"> - <MTVar var> = 4

<MTSetVar name="var" value="8">
<MTSetVar name="var" value="3" op="or"> - <MTVar var> = 12

<MTSetVar name="var" value="255">
<MTSetVar name="var" value="3" op="^"> - <MTVar var> = 252

<MTSetVar name="var" value="128" op="~"> - <MTVar var> = 4294967167

<MTSetVar name="var" value="1">
<MTSetVar name="var" value="2" op="<<"> - <MTVar var> = 4
<MTSetVar name="var" value="1" op=">>"> - <MTVar var> = 2

<MTSetVar name="var" value="-123" op="abs"> - <MTVar var> = 123
<MTSetVar name="var" value="-123.456" op="int"> - <MTVar var> = -123
<MTSetVar name="var" value="-123.456" op="ceil"> - <MTVar var> = -123
<MTSetVar name="var" value="-123.456" op="floor"> - <MTVar var> = -124

<MTSetVar name="var" value="10" op="rand"> - <MTVar var> = 4.18844079672457
<MTSetVar name="var" value="10" op="rand"> - <MTVar var> = 1.45297858256043
<MTSetVar name="var" value="10" op="rand"> - <MTVar var> = 2.72018384459567

<MTSetVar name="var" value="65">
<MTSetVar name="var" value="C" op="pack"> - <MTVar var> = A
<MTSetVar name="var" value="C" op="unpack"> - <MTVar var> = 65

Value Swapping with XOR
<MTSetVar name="var1" value="123"> - <MTVar var1> = 123
<MTSetVar name="var2" value="456"> - <MTVar var2> = 456
<MTSetVar name="var1" value="$var2" op="xor">
<MTSetVar name="var2" value="$var1" op="xor">
<MTSetVar name="var1" value="$var2" op="xor">
- <MTVar var1> = 456
- <MTVar var2> = 123

ダウンロード

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



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

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

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

コメントを投稿する

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