AmXML

Amrita2は、AmritaV1.Xと同じくXMLドキュメントに対して、データを展開していくテンプレートエンジンです。

Amrita2では、idではなく、am:srcという属性をキーとして使用します。

    # テンプレート
    t = Amrita2::Template.new <<-END
      <html>
        <head>
          <title am:src="page_title" />
       </head>
       <body>
         <h1 am:src="header_title" />
          <p class="text" am:src="text">
             <span am:src="template" /> is a html template library for <span am:src="lang" />
         </p>
       </body>
      </html>
    END

    # データ
    data = { 
      :page_title=>'Amrita2',
      :header_title=>'Hello, Amrita2',
      :text=>{
        :template => 'Amrita2',
        :lang => 'Ruby'
      }
    }

    # 結果
    expected = <<-END
      <html>
      <head>
        <title>Amrita2</title>
      </head>
      <body>
        <h1>Hello, Amrita2</h1>
        <p class="text">Amrita2 is a html template library for Ruby</p>   
      </body>
      </html>
    END

    # 結果の出力
    puts t.render_with(data)

    # 結果の確認
    t.render_with(data).should_be_samexml_as(expected)

XML整形式のテキストを与え、Amrita2::Templateオブジェクトを生成し、render_with というメソッドにデータを渡すと、そのデータを埋めこんだ結果を文字列として返却します。(API変更の可能性有り)

サンプルの形式について

should_be_samexml_asは、RSpecに追加したメソッドで、二つの文字列がXMLとして一致しているかテストするものです。

   "<a class='aaa' href='bbb'> xxxxx </a>".should_be_samexml_as("<a href='bbb' class='aaa'>xxxx</a>") #->OK
   "<a class='aaa' href='bbb'> zzzzz </a>".should_be_samexml_as("<a href='bbb' class='aaa'>xxxx</a>") #->NG

このように属性の順番やタグの間のスペースを無視して、両者の一致を比較します。このチュートリアルでは、サンプルコードの結果は、このメソッドを使って実行可能な形で示します。アーカイブの specs/intro.rb には、このチュートリアルで示すサンプルとほぼ同じコードがありますので、そちらも参照してください。

AmXML

テンプレートをXMLで書くのは冗長なので、Amrita2では、AmXMLという専用の記述形式をサポートしています。上記のサンプルをAmXMLで書くと以下のようになります。

    t2 = Amrita2::Template.new <<-END
      <<html<
        <<head<
          <<title:page_title>>
        >>>
        <<body<
          <<h1:header_title>>
          <<p class="text":text<
             <<:template>> is a html template library for <<:lang>>
          >>>
        >>>
      >>>
    END

AmXMLは、内部的にはプリプロセッサとして実装されており、XMLに変換してから、REXMLで読みこんでいます。ですから、AmXMLの記述には、全て、対応するXMLの記述があります。ですから、Amrita2では、テンプレートとしてXML形式のドキュメントを使用することもできます。