This is the 'hello world' for Amrita2.
| --- ../sample/hello/step1.rb --- |
require "amrita2/template"
include Amrita2
class PO
def title
"hello world"
end
def body
"Amrita2 is a html template libraly for Ruby"
end
end
tmpl = TemplateFile.new("template.html")
tmpl.expand(STDOUT, PO.new)
|
| --- ../sample/hello/template.html --- |
<html>
<body>
<h1 id='title'>title will be inserted here</h1>
<p id='body'>body text will be inserted here</p>
</body>
</html>
|
<html>
<body>
<h1>hello world</h1>
<p>Amrita2 is a html template library for Ruby</p>
</body>
</html>There are two kind of objects in this example: Presentation Object(PO) and Template Object(TO).
Amrita2::TemplateFile is a TO which accepts HTML template from a file. This is how to create a Amrita2::TemplateFile object.
require "amrita2/template"
include Amrita2
tmpl = TemplateFile.new("template.html")TO treats an element with id attribute as a dynamic element and will get the data for it from PO data using id attribute's value as method name.
Almost any Ruby object can be a Presentation Object only if PO has methods for dynamic elements.
class PO
def title
"hello world"
end
def body
"Amrita2 is a html template libraly for Ruby"
end
endPassive PO methods returns a value for template expansion. This sample describes how TO expand values.
| --- ../sample/hello/step2.rb --- |
require "amrita2/template"
include Amrita2
class PO
def array_data
[1, 2, 3]
end
def nested_struct
Time.gm(2005,2,23, 4,5,6)
end
def nested_structs
[Time.gm(2005,2,23, 4,5,6),Time.gm(2005,2,24, 4,5,6) ]
end
end
tmpl = TemplateText.new <<-END
<html>
<body>
<h1>array data</h1>
<span id='array_data'> </span>
<h1>nested struct</h1>
<p id='nested_struct'>
<span id='hour' />:<span id='min' />:<span id='sec' />
</p>
<h1>array of nested struct</h1>
<p id='nested_structs'>
<span id='day' />
</p>
</body>
</html>
END
tmpl.expand(STDOUT, PO.new)
|
<html>
<body>
<h1>array data</h1>
<span>1</span><span>2</span><span>3</span>
<h1>nested struct</h1>
<p>
<span>4</span>:<span>5</span>:<span>6</span>
</p>
<h1>array of nested struct</h1>
<p>
<span>23</span>
</p><p>
<span>24</span>
</p>
</body>
</html>If a passive PO method returns Array ( or an Enumerable object)
def array_data [1, 2, 3] end
then the matching element will be expanded many times.
From
<h1>array data</h1> <span id='array_data'> </span>
To
<h1>array data</h1> <span>1</span><span>2</span><span>3</span>
If the element has inner struct like this
<p id='nested_struct'> <span id='hour' />:<span id='min' />:<span id='sec' /> </p>
then the PO method must return an object with the same methods with ID
def nested_struct Time.gm(2005,2,23, 4,5,6) end
A Time Object has hour, min, sec as method. These methods will be called by TO and the result of the method will be inserted into the matching element.
<h1>nested struct</h1> <p> <span>4</span>:<span>5</span>:<span>6</span> </p>
If a PO method returns an Array of Struct
def nested_structs [Time.gm(2005,2,23, 4,5,6),Time.gm(2005,2,24, 4,5,6) ] end
then the element will be expanded two time each for an element of the Array.
From
<p id='nested_structs'> <span id='day' /> </p>
To
<h1>array of nested struct</h1> <p> <span>23</span> </p><p> <span>24</span> </p>
| --- ../sample/hello/step3.rb --- |
require "amrita2/template"
include Amrita2
class PO
def passive
"passive PO method"
end
def active(m)
m.active("active PO method can replace attrs", :href=>"http://www.ruby-lang.org/")
end
def active_with_proc
proc do |m|
m.active_with_proc("output in a Proc")
end
end
def active_nest(m)
m.active_nest do |mm|
mm.nested("active PO method can ")
mm.nested("call dynamic element method ")
mm.nested("many times")
end
end
end
tmpl = TemplateText.new <<-END
<html>
<body>
<h1>passive method</h1>
<span id='passive'> </span>
<h1>active method</h1>
<a id='active'> </a>
<div id='active_with_proc'> </div>
<h1>active nested</h1>
<p id='active_nest'>
<span id='nested' />
</p>
</body>
</html>
END
tmpl.expand(STDOUT, PO.new)
|
<html>
<body>
<h1>passive method</h1>
<span>passive PO method</span>
<h1>active method</h1>
<a href='http://www.ruby-lang.org/'>active PO method can replace attrs</a>
<div>output in a Proc</div>
<h1>active nested</h1>
<p>
<span>active PO method can </span><span>call dynamic element method </span><span>many times</span>
</p>
</body>
</html>If a PO method has a parameter, it will be regarded as an active PO method to which TO passes a Module compiled from the template. The active PO method calls a method of it to produce an output.
def active(m)
m.active("active PO method can replace attrs", :href=>"http://www.ruby-lang.org/")
endUsing this mechanisim, you can use many feature of Amrita2. Most usable one is setting an attribute.
<h1>active method</h1> <a href='http://www.ruby-lang.org/'>active PO method can replace attrs</a>
If the element has inner structures
<h1>active nested</h1> <p id='active_nest'> <span id='nested' /> </p>
The active PO method should call the method of the template module with a Block.
def active_nest(m)
m.active_nest do |mm|
mm.nested("active PO method")
end
endThen another Module for inner element will be passed. You can call the methods for inner elements.
<h1>active nested</h1> <p> <span>active PO method</span> </p>
You can call the method of template module any times
def active_nest(m)
m.active_nest do |mm|
mm.nested("active PO method can ")
mm.nested("call dynamic element method ")
mm.nested("many times")
end
endThen output is
<h1>active nested</h1> <p> <span>active PO method can </span> <span>call dynamic element method </span> <span>many times</span> </p>
If you don't call the method in an active PO method, then there will be no output.