2008年4月アーカイブ
できました。
Runemaster (http://hatotech.org/runemaster/)
これまで「PHP DOMパーサを使ってテンプレートエンジンを作ってみる」としてエントリをあげてきたライブラリが、このたびめでたく(まだベータ的なものですが)初めてのリリースと相成りました。
ライブラリが今の形に落ち着いてからドキュメントをカリカリと書いてたんですがこれが地味に時間がかかってしまっていたので、思い切って 2/3 ほど書いた現在の状態でひとまずリリースしちゃうことにしました。
このまま継続してドキュメントは書き進めていきます。数日単位でポツポツといった感じになるでしょうが、上記サイトに掲載していきますのでどうぞよろしくお願いします。
ちなみにこいつの名前については、はてブにて小山さんより「カッコイイ名前を付けるように」というお達しがありましたので、このようになりました。
Runemasterは、多彩なSpellを組み合わせることで (x)html の力を Runeストーンに刻み込み、埋め込まれた秘められし力を引き出すことで様々な能力を発揮させることができるのだ!(ドギャァーン)
この辺までくると、機能的なところでそんなに大きく進展はしてない感じではありますが、継続的に報告もせんといかんよね!
新しく追加した機能は、フォームに対する値やエレメントの操作。この辺はPEARのHTML_Template_Flexyが良い感じだったので、それと出来る限り同じような使い方が出来るように。
Template
<form name="example">
<input type="text" name="email" />
<select name="person">
<option value="1">foo</option>
<option value="2">bar</option>
<option value="3">baz</option>
</select>
<input name="item" type="radio" value="1" />foo
<input name="item" type="radio" value="2" />bar
<input name="item" type="radio" value="3" />baz
</form>
PHP
<?php
$template = new Template();
$values = new stdClass();
$values->email = 'foo@example.com';
$values->person = 1;
$values->item = 2;
$template->setFormValues('example', $values);
$template->renderer('Example');
?>
Result
<form name="example">
<input type="text" name="email" value="foo@example.com" />
<select name="person">
<option value="1" selected="selected">foo</option>
<option value="2">bar</option>
<option value="3">baz</option>
</select>
<input name="item" type="radio" value="1" />foo
<input name="item" type="radio" value="2" checked="checked" />bar
<input name="item" type="radio" value="3" />baz
</form>
地味に「PHPSpec を使った開発のケーススタディ」的な感じでテンプレートよりも好評な、Specによる仕様確認の現在はこちら。
テンプレート変数割り当て - オブジェクトを割り当てると、プロパティがテンプレート変数として利用される - 連想配列を割り当てると、配列キーがテンプレート変数として利用される - テンプレート変数として配列が利用できる - テンプレート変数としてオブジェクトが利用できる - テンプレート変数は配列とオブジェクトが混合で利用できる - テンプレート変数として割り当てたクラスオブジェクトのメソッドが利用できる - テンプレート変数に対して関数が利用できる - テンプレート変数として指定する属性の名称が変更できる - 置換されるテンプレート変数は何もせずともhtmlspecialchars済み - 置換されるテンプレート変数のhtmlspecialcharsは個別で無効にできる - テンプレート内で同じ変数は、利用タグに関係なく何度でも使える - 値がassignされていないテンプレート変数は無視される - 値を割り当てるのに利用したタグは明示的に消去することができる - エレメント属性の値に対してのみ{}で囲んだテンプレート変数を利用できる エレメント操作 - セレクタによる指定ノードのエレメントが追加、変更できる - セレクタによる複数対象のエレメントが追加、変更できる - エレメントの各要素のうち、今のところタグ名は変えれない フォーム操作 - テキストラインへ値をセットすることができる - テキストエリアへ値をセットすることができる - hiddenへ値をセットすることができる - セレクトボックスを選択状態にできる - ラジオボタンをチェック状態にできる - チェックボックスをチェック状態にできる - ボタンやサブミットへ値がセットすることができる - 指定するフォームに値をhiddenとしてセットすることができる - リストをセレクトオプションとして登録することができる 条件による表示切り替え処理 - テンプレート変数値がtrueであれば表示、偽であれば非表示にできる - テンプレート変数値の条件を反転評価して表示非表示を切り替えることができる - オブジェクトのテンプレート変数を使って表示非表示を切り替えることができる - 配列のテンプレート変数を使って表示非表示を切り替えることができる - クラスメソッドの評価によって表示非表示を切り替えることができる - 関数の評価によって表示非表示を切り替えることができる 挿入処理 - セレクタによる指定ノード内の末尾にコンテンツが追加できる - セレクタによる指定ノード内の末尾にノードが追加できる - セレクタによる指定ノード内の先頭にコンテンツが追加できる - セレクタによる指定ノード内の先頭にノードが追加できる 繰り返し処理 - phpのforeach_as_valueのような処理ができる - phpのforeach_as_key_valueのような処理ができる - 繰り返し処理エレメント内でも、トップレベルのテンプレート変数が使える - 通常の変数と繰り返し対象の展開変数の変数名が重複した場合は、展開変数が優先さ れる - 繰り返し対象の展開変数がオブジェクトや配列も利用できる - 繰り返し処理はネストできる - foreach属性と同じエレメントにkey属性を設定して変数展開できる - リスト変数が空もしくはnullの場合はinnertextが消える 機能の複合利用 - foreach構文とif構文を組み合わせて利用できるが、同エレメント内にてリスト変数と同時に利用できる条件は展開変数になる - foreach構文で繰り返されるコンテンツ内のエレメント要素が{}変数で変更できる - foreach構文で繰り返されるコンテンツ内でチェックボックスの生成およびチェック状態が実現できる 47 examples, 0 failures
かなり充実してきた感じで、今回から若干コードの内容や構成に手を入れ始めています。もうすぐ本当にベータリリースできそうな気もしますが、ここからは引き続きコードのリファクタリングを続けながら、あとは仕様の若干の追加や見直しなども進めます。条件分岐として <span if="foo > 10"> みたいな記述もできるようにしたい。
鈍足ながら少しずつ機能を増やしていっています。
前回から追加された機能は、if 記法によって表示箇所を切り替えできるようにしてみたのと、指定したノード内にコンテンツを挿入するという機構。
if 記法の切り替えとは、次のようにエレメントに if 属性を準備しておき
Template
<div> <span if="foo">Message A</span> <span if="bar">Message B</span> </div>
変数の値が「真」判定されればそのまま表示、「偽」判定されればエレメントが消滅します。foo = 1, bar = 0 とした場合なら、次のようになります。
Result
<div> <span if="foo">Message A</span> </div>
一方のノード内へのコンテンツ挿入は、セレクタで指定するノードへ append で末尾に、prepend で先頭に挿入します。
Template
<p id="foo">Content</p> <p id="bar">Content</p>
PHP
<?php
$template = new Template();
$text = 'Insertion';
$node = '<span>Insertion</span>';
/* id="foo", id="bar" にそれぞれ $text, $node を挿入 */
$template->append('#foo', $text);
$template->prepend('#bar', $node);
$template->renderer('Example');
?>
Result
<p id="foo">ContentInsertion</p> <p id="bar"><span>Insertion</span>Content</p>
恒例の PHPSpec による仕様確認はこちら。大分充実してきました。
テンプレート変数割り当て - オブジェクトを割り当てると、プロパティがテンプレート変数として利用される - 連想配列を割り当てると、配列キーがテンプレート変数として利用される - テンプレート変数として配列が利用できる - テンプレート変数としてオブジェクトが利用できる - テンプレート変数は配列とオブジェクトが混合で利用できる - テンプレート変数として割り当てたクラスオブジェクトのメソッドが利用できる - テンプレート変数に対して関数が利用できる - テンプレート変数として指定する属性の名称が変更できる - 置換されるテンプレート変数は何もせずともhtmlspecialchars済み - 置換されるテンプレート変数のhtmlspecialcharsは個別で無効にできる - テンプレート内で同じ変数は、利用タグに関係なく何度でも使える - 値がassignされていないテンプレート変数は無視される - 値を割り当てるのに利用したタグは明示的に消去することができる エレメント操作 - セレクタによる指定ノードのエレメントが追加、変更できる - セレクタによる複数対象のエレメントが追加、変更できる - エレメントの各要素のうち、今のところタグ名は変えれない 条件による表示切り替え処理 - テンプレート変数値がtrueであれば表示、偽であれば非表示にできる - テンプレート変数値の条件を反転評価して表示非表示を切り替えることができる - オブジェクトのテンプレート変数を使って表示非表示を切り替えることができる - 配列のテンプレート変数を使って表示非表示を切り替えることができる - クラスメソッドの評価によって表示非表示を切り替えることができる - 関数の評価によって表示非表示を切り替えることができる - foreach構文と組み合わせて表示非表示を切り替えることができるが、同エレメント内にてリスト変数と同時に利用できる条件は展開変数 挿入処理 - セレクタによる指定ノード内の末尾にコンテンツが追加できる - セレクタによる指定ノード内の末尾にノードが追加できる - セレクタによる指定ノード内の先頭にコンテンツが追加できる - セレクタによる指定ノード内の先頭にノードが追加できる 繰り返し処理 - phpのforeach_as_valueのような処理ができる - phpのforeach_as_key_valueのような処理ができる - 通常の変数と繰り返し対象の展開変数の変数名が重複した場合は、展開変数が優先さ れる - 繰り返し対象の展開変数がオブジェクトや配列も利用できる - 繰り返し処理はネストできる - foreach属性と同じエレメントにkey属性を設定して変数展開できる - リスト変数が空もしくはnullの場合はinnertextが消える 34 examples, 0 failures
