テンプレート

テンプレートとは言っても、C++のテンプレートとは全く別物です。(期待された方すみません)
出力のテンプレート化です。WEBサイト制作ではお馴染みだと思います。
基本的にテンプレート自体にはロジックを組み込まず、できるだけシンプルに扱えるような構造にしてあります。


テンプレートのルール

三つのルールがあります。

  • %でくくられた文字列(%文字列%)は、文字列をキーワードとする置換用文字列として扱われます。
  • %でくくられた文字列のうち、%!文字列!%として記述された物は、文字列をキーワードとする置換用文字列として扱われますが、値がセットされていない場合には、最終出力結果取得時に削除されます。
  • %でくくられた文字列のうち、%+文字列+%として記述された物は、テンプレートブロックの始まりを意味し、
    次に出てくる%-文字列-%までを、ひとかたまりのブロックとして扱います。文字列はブロック名とされます。

  • : テンプレートファイルの内容(sample.tmpl)

    こんにちは、%name%さん!%!erase!%%noremove%
    今日は%month%%day%日です。
    %name%さんは幾つになられましたでしょうか。
    今日の献立
    %+menu+%
    内容: %food%
    %-menu-%
    

    青字の部分が置換用文字列、赤字の部分がテンプレートブロックです。



    テンプレート処理の流れ

    テンプレートファイル読み込み(TMPL_Load)

    テンプレートオブジェクトに置換文字列設定(Object.set_param)
    テンプレートオブジェクトにブロック挿入(Object.insert_block)

    テンプレートオブジェクトから最終出力結果取得(Object.body)

    出力

    : 処理例

    // テンプレートファイルを読み込み、テンプレートオブジェクトを取得
    obj_tmpl = TMPL_Load("./sample.tmpl");
    
    // キーワード毎に置換文字列を設定(この時点ではまだ置換はされない)
    obj_tmpl.set_param("name", "kim");
    obj_tmpl.set_param("month", "9");
    obj_tmpl.set_param("day", "22");
    
    // ブロック内で利用するキーワードを設定し、ブロックを挿入
    // ブロックは挿入しない限り、出力結果には含まれない
    // また挿入時点で、ブロック内部のキーワードのみ置換される
    obj_tmpl.set_param("food", "肉");
    obj_tmpl.insert_block("menu");
    
    // ブロックは連続して挿入ができる
    obj_tmpl.set_param("food", "野菜");
    obj_tmpl.insert_block("menu");
    
    // 出力結果を取得し(この時点で全てのキーワードが再帰的に置換される)表示
    // println は表示のために利用
    println(obj_tmpl.body());
    

    : 上記処理後の出力結果
    %!erase!%は、値を設定しなかったため削除されている。

    こんにちは、kimさん!%noremove%
    今日は922日です。
    kimさんは幾つになられましたでしょうか。
    今日の献立
    内容: 
    内容: 野菜
    


    テンプレートブロック

    テンプレートブロックは、ネストを許します。(ブロック内部にブロックを持てる)
    ネストの数に制限はありません。

    : ブロックのネスト例

    今日の献立
    %+menu+%
    %food%
    %+sub_menu+%
    %seasoning%
    %-sub_menu-%
    %-menu-%
    

    ブロック内部のブロックを指定するには、/(スラッシュ)を区切りとして一番上のブロック名から指定します。
    (上記sub_menuを指定したい場合には、insert_block("menu/sub_menu")とする)
    サブブロックも、明示して挿入しない限りは、出力結果には含まれません。