フック

Amrita2では、テンプレートの展開方法は、与えたデータによって制御されます。

しかし、必要なロジックが複雑である場合、そのロジックをデータの形式によって表現することが難しい場合や不可能な場合があります。

その場合には、「フック」という機能を使用します。

  specify "Hook" do
    t = Amrita2::Template.new <<-'END'
      <<:mail_hook|AcceptData[:hook] <
        <<a :m|Attr[:href]>>
      >>>
    END

    mail = @data[:mail]
    hook1 = Amrita2::Core::Hook.new do
      href = "http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/#{mail[:no]}"
      body = "[ruby-talk:#{mail[:no]}]#{mail[:title]}"
      render_child(:m, :href=>href, :body=>body)
    end
  
    #t.set_trace(STDOUT)
    t.render_with(:mail_hook=>hook1).should_be_samexml_as(@expected)
  end

このオブジェクトを渡すと、そのデータを展開する時に、フックメソッド(Hookオブジェクトの生成時に渡したブロック)が呼ばれます。

フックメソッドは、必要なデータを作成してから、render_childというメソッドを呼びます。

これによって、指定したXMLの子要素が、その位置に展開されます。

render_childを複数回呼んでもいいし、全く呼ばないでフックメソッドを終了してもいいので、これによって、展開の方法を細かく制御することができます。

また、フックメソッド内で、テンプレートを使わず直接結果の文字列を出力することや、該当するXML要素をREXMLのオブジェクトとしてアクセス参照することもできます。(API検討中)