テンプレート
HTML/XHTML/XML、またはプレーンテキストファイル
テンプレートファイルはドキュメント内に書くのではなく、別のファイルとして用意します。
そのため、表示内様に変更があったり、複数のテンプレートを使うときにテンプレートの記述位置をさがす必要もありませんし、テンプレート以外の部分を間違えて変更するなどのミスも防げます。
テンプレートには {tpl: から始まり } で終わる部分にJavaScriptオブジェクト(JSON)のプロパティが適用されます。
: で始まるいくつかのキーワードがスクリプト内で使用されます。
---- サンプル .1 ----
テンプレート
名前は{tpl:name}です。 {tpl::repeat} {tpl::endrepeat} {tpl::if id==2}IDは2です {tpl::endif}
変数表示
{tpl:var}
オブジェクトのプロパティーを代入します。
Templateで使用するキーワードと区別するため、区切り文字の : は 1つです。
---- サンプル .1 ----
テンプレート
<p>{tpl:item}</p>
スクリプト
data={item:'今日の天気は晴れ'}; html=Template.GetHTML(id, data);
出力
<p>今日の天気は晴れ</p>
繰り返し repeat endrepeat
{tpl::repeat=expr}
{tpl::endrepeat}
JavaScriptオブジェクトの階層下の配列を、その配列の個数文だけ繰り返します。
exprはオブジェクトの階層をディレクトリと見たてた / 区切りです。
---- サンプル .1 ----
テンプレート
{tpl::repeat=/students} <tr><td>{tpl:sid}</td><td>{tpl:name}</td></tr> {tpl::endrepeat}
スクリプト
data={students:[ {sid:1, name:'Joe'} ,{sid:2, name:'Peat'} ]}; html=Template.GetHTML(id, data);
出力
<tr><td>1</td><td>Joe</td></tr> <tr><td>2</td><td>Peat</td></tr>
---- サンプル .2 ----
repeatがネストしている場合は、exprは上位repeatで指定されたプロパティがrepeatのルートディレクトリに使われます。
テンプレート
{tpl::repeat=/classes} <tbody> {tpl::repeat=/students} <tr><td>{tpl:sid}</td><td>{tpl:name}</th></tr> {tpl::endrepeat} </tbody> {tpl::endrepeat}
スクリプト
data={ classes:[ {students:[ {sid:11, name:'Joe'} ,{sid:12, name:'Peat'} ]} ,{students:[ {sid:21, name:'Mina'} ,{sid:22, name:'Cindy'} ]} ]};
出力
<tbody> <tr><td>11</td><td>Joe</td></tr> <tr><td>12</td><td>Peat</td></tr> </tbody> <tbody> <tr><td>21</td><td>Mina</td></tr> <tr><td>22</td><td>Cindy</td></tr> </tbody>
繰り返し数表示 repeatcount
{tpl::repeatcount num}
{tpl::repeat}から{tpl::endrepeat}の間で使用し、繰り返しの数を表示します。
=に続けて数字を入力すると、その数字から始まります。
---- サンプル .1 ----
テンプレート
{tpl::repeat=/students} <tr><td>{tpl::repeatcount}</td><td>{tpl:sid}</td><td>{tpl:name}</td></tr> {tpl::endrepeat}
スクリプト
data={students:[ {sid:aec3964, name:'Joe'} ,{sid:aec6693, name:'Peat'} ]}; html=Template.GetHTML(id, data);
出力
<tr><td>0</td><td>aec3964</td><td>Joe</td></tr> <tr><td>1</td><td>aec6693</td><td>Peat</td></tr>
---- サンプル .2 ----
テンプレート
{tpl::repeat=/students} <tr><td>{tpl::repeatcount=5}</td><td>{tpl:sid}</td><td>{tpl:name}</td></tr> {tpl::endrepeat}
スクリプト
data={students:[ {sid:aec3964, name:'Joe'} ,{sid:aec6693, name:'Peat'} ]}; html=Template.GetHTML(id, data);
出力
<tr><td>5</td><td>aec3964</td><td>Joe</td></tr> <tr><td>6</td><td>aec6693</td><td>Peat</td></tr>
奇数/偶数 evenodd
{tpl::evenodd num}
numは数値を指定可能。
repeat
の内部で使用すると、"odd
"と"even
"が交互に出力されます。
numが2の場合は"even
"と"odd
"を出力します。
3以上の場合に "odd
"の後ろに1からの連番が付きます。
2が指定、または省略した場合は odd、even
3が指定された場合はodd1、odd2、even
4が指定された場合はodd1、odd2、odd3、even
という繰り返しになります。
repeatの外で指定すると、常にoddとなります。
---- サンプル .1----
evenodd の引数なし
テンプレート
{tpl::repeat=students} <tr class="{tpl::evenodd}"><td>{tpl:id}</td><td>{tpl:name}</td></tr> {tpl::endrepeat}
スクリプト
data={ {students:[ {id:1, name:'Joe'} ,{id:2, name:'Peat'} ,{id:3, name:'Mina'} ,{id:4, name:'Cindy'} ]};
出力
<tr class="odd"><td>1</td><td>Joe</td></tr> <tr class="even"><td>2</td><td>Peat</td></tr> <tr class="odd"><td>3</td><td>Mina</td></tr> <tr class="even"><td>4</td><td>Cindy</td></tr>
---- サンプル .2----
evenodd の引数に3を指定
テンプレート
{tpl::repeat=students} <tr class="{tpl::evenodd 3}"><td>{tpl:id}</td><td>{tpl:name}</td></tr> {tpl::endrepeat}
スクリプト
data={ {students:[ {id:1, name:'Joe'} ,{id:2, name:'Peat'} ,{id:3, name:'Mina'} ,{id:4, name:'Cindy'} ]};
出力
<tr class="odd1"><td>11</td><td>Joe</td></tr> <tr class="odd2"><td>id2</td><td>Peat</td></tr> <tr class="even"><td>id3</td><td>Mina</td></tr> <tr class="odd1"><td>id4</td><td>Cindy</td></tr>
条件分岐 if elif else endif
- {tpl::if = expr>
- {tpl::elif = expr>
- {tpl::else>
- {tpl::endif>
{tpl::if left==right} の形式、または {tpl::if expr}の形式で記述
左辺、右辺がある時の比較式は == または !=
単項式の場合は booleanとして判断します。
計算に使用出来る演算子は + - * / % ( )
% は割算の”あまり”です。
0除算は0となります。
全て数値計算ですが、それぞれの式の中に数字以外の文字があると、
オブジェクトのプロパティーと見なし、その値を代入します。
オブジェクトのプロパティーにその値がなければ0とみなします。
/ を区切りとしてオブジェクトのプロパティーツリーを追うことが出来ますが、割り算と区別するためにクォートして下さい。
---- サンプル .1----
テンプレート
{tpl::repeat=/students} <tr> <td>{tpl::if "birth/month"==4}誕生月{tpl::else} {tpl::endif}</td> <td>{tpl:id}</td><td>{tpl:name}</td></tr> {tpl::endrepeat}
スクリプト
data={students:[ {sid:1, name:'Joe', birth: {month:'3', day: '12}, sex: 1} ,{sid:2, name:'Peat', birth: {month:'4', day: '21}, sex: 1} ,{sid:3, name:'Mina', birth: {month:'6', day: '21}, sex: 2} ,{sid:4, name:'Cindy', birth: {month:'12', day: '2}, sex: 2} ]}; html=Template.GetHTML(id, data);
出力
<tr><td> </td><td>1</td><td>Joe</td></tr> <tr><td>誕生月</td><td>2</td><td>Peat</td></tr> <tr><td> </td><td>3</td><td>Mina</td></tr> <tr><td> </td><td>4</td><td>Cindy</td></tr>
リピートカウンター repeatcount
{tpl::repeat}の中にある条件分岐の計算式に使用できる繰り返しのカウンターです。
{tpl::repeat}ではテーブルの行を何度も書き出すなど、繰り返しを行いますので、その「何行目」にあたります。
---- サンプル .2----
テンプレート
{tpl::repeat=/students} <tr> <td>{tpl::if repeatcount==2}2行目{tpl::else} {tpl::endif}</td> <td>{tpl:id}</td><td>{tpl:name}</td></tr> {tpl::endrepeat}
スクリプト
data={students:[ {sid:1, name:'Joe', birth: {month:'3', day: '12}, sex: 1} ,{sid:2, name:'Peat', birth: {month:'4', day: '21}, sex: 1} ,{sid:3, name:'Mina', birth: {month:'6', day: '21}, sex: 2} ,{sid:4, name:'Cindy', birth: {month:'12', day: '2}, sex: 2} ]};
出力
<tr><td> </td><td>1</td><td>name1</td></tr> <tr><td>2行目</td><td>2</td><td>name2</td></tr> <tr><td> </td><td>3</td><td>name3</td></tr> <tr><td> </td><td>4</td><td>name4</td></tr>
---- サンプル .2----
テンプレート
<table> {tpl::repeat=user} {tpl::if (repeatcount-1)%3==0} <tr><th>名前</th><th>住所</th></tr> {tpl::endif} <tr class="{tpl::evenodd}"> <td>{tpl:name}</td><td>{tpl:addr}</td> </tr> {tpl::endrepeat} </table>
スクリプト
data={user:[ { name:'神崎',addr:'真栄田町'} ,{ name:'土居',addr:'北町'} ,{ name:'岸辺',addr:'西町'} ,{ name:'岡田',addr:'中倉町'} ,{ name:'岡本',addr:'藤が丘町'} ,{ name:'長井',addr:'北川町'} ,{ name:'松田',addr:'井手町'} ,{ name:'前田',addr:'真栄田町'} ]};
出力
3行ごとにヘッダが表示されます <table> <tr><th>名前</th><th>住所</th></tr> <tr class="odd"><td>神崎</td><td>真栄田町</td></tr></tr> <tr class="even"><td>土居</td><td>北町</td></tr></tr> <tr class="odd"><td>岸辺</td><td>西町</td></tr></tr> <tr><th>名前</th><th>住所</th></tr> <tr class="even"><td>岡田</td><td>中倉町</td></tr></tr> <tr class="odd"><td>岡本</td><td>藤が丘町</td></tr></tr> <tr class="even"><td>長井</td><td>北川町</td><tr></tr> <tr><th>名前</th><th>住所</th></tr> <tr class="odd"><td>松田</td><td>井手町</td></tr></tr> <tr class="even"><td>前田</td><td>真栄田町</td></tr></tr> </table>