tenjin 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- data/MIT-LICENSE +20 -0
- data/README.txt +54 -0
- data/benchmark/bench.rb +502 -0
- data/benchmark/bench_context.rb +17 -0
- data/benchmark/bench_context.yaml +141 -0
- data/benchmark/templates/_footer.html +4 -0
- data/benchmark/templates/_header.html +52 -0
- data/benchmark/templates/bench_eruby.rhtml +29 -0
- data/benchmark/templates/bench_tenjin.rbhtml +29 -0
- data/bin/rbtenjin +449 -0
- data/doc-api/classes/Tenjin.html +141 -0
- data/doc-api/classes/Tenjin/ArrayBufferTemplate.html +270 -0
- data/doc-api/classes/Tenjin/BaseContext.html +312 -0
- data/doc-api/classes/Tenjin/Context.html +126 -0
- data/doc-api/classes/Tenjin/ContextHelper.html +433 -0
- data/doc-api/classes/Tenjin/Engine.html +616 -0
- data/doc-api/classes/Tenjin/ErubisTemplate.html +166 -0
- data/doc-api/classes/Tenjin/HtmlHelper.html +359 -0
- data/doc-api/classes/Tenjin/Preprocessor.html +242 -0
- data/doc-api/classes/Tenjin/Template.html +916 -0
- data/doc-api/created.rid +1 -0
- data/doc-api/files/README_txt.html +185 -0
- data/doc-api/files/lib/tenjin_rb.html +136 -0
- data/doc-api/fr_class_index.html +36 -0
- data/doc-api/fr_file_index.html +28 -0
- data/doc-api/fr_method_index.html +89 -0
- data/doc-api/index.html +24 -0
- data/doc-api/rdoc-style.css +208 -0
- data/doc/docstyle.css +188 -0
- data/doc/examples.html +312 -0
- data/doc/faq.html +909 -0
- data/doc/users-guide.html +1691 -0
- data/lib/tenjin.rb +959 -0
- data/setup.rb +1331 -0
- data/tenjin.gemspec +58 -0
- data/test/assert-text-equal.rb +45 -0
- data/test/data/examples/form/create.rbhtml +4 -0
- data/test/data/examples/form/form.rbhtml +14 -0
- data/test/data/examples/form/layout.rbhtml +8 -0
- data/test/data/examples/form/main.rb +9 -0
- data/test/data/examples/form/main.result +21 -0
- data/test/data/examples/form/update.rbhtml +4 -0
- data/test/data/examples/preprocessing/helper.rb +16 -0
- data/test/data/examples/preprocessing/main.rb +11 -0
- data/test/data/examples/preprocessing/main.result +17 -0
- data/test/data/examples/preprocessing/select.rbhtml +15 -0
- data/test/data/examples/preprocessing/select_P.result +18 -0
- data/test/data/examples/table/table.rb +9 -0
- data/test/data/examples/table/table.rbhtml +16 -0
- data/test/data/examples/table/table.result +20 -0
- data/test/data/examples/table/table_s.result +18 -0
- data/test/data/faq/ex1.rbhtml +5 -0
- data/test/data/faq/ex10-baselayout.rbhtml +27 -0
- data/test/data/faq/ex10-content.rbhtml +12 -0
- data/test/data/faq/ex10-customlayout.rbhtml +11 -0
- data/test/data/faq/ex10_inherit.result +25 -0
- data/test/data/faq/ex11-bench.rb +28 -0
- data/test/data/faq/ex11-content.rbhtml +9 -0
- data/test/data/faq/ex11-layout1.rbhtml +5 -0
- data/test/data/faq/ex11-layout2.rbhtml +6 -0
- data/test/data/faq/ex11.rb +5 -0
- data/test/data/faq/ex11.rbhtml +8 -0
- data/test/data/faq/ex11.source +11 -0
- data/test/data/faq/ex11_arraybuffer.result +15 -0
- data/test/data/faq/ex1_chksyntax.result +3 -0
- data/test/data/faq/ex2-content.rbhtml +3 -0
- data/test/data/faq/ex2-layout.rbhtml +11 -0
- data/test/data/faq/ex2_removenl.result +19 -0
- data/test/data/faq/ex3.rb +4 -0
- data/test/data/faq/ex3.rbhtml +1 -0
- data/test/data/faq/ex3_escapefunc1.result +2 -0
- data/test/data/faq/ex3_escapefunc2.result +2 -0
- data/test/data/faq/ex5.rbhtml +7 -0
- data/test/data/faq/ex5_template_args.source +9 -0
- data/test/data/faq/ex6-content.rhtml +6 -0
- data/test/data/faq/ex6-layout.rhtml +6 -0
- data/test/data/faq/ex6.rb +10 -0
- data/test/data/faq/ex6_eruby.result +12 -0
- data/test/data/faq/ex7-expr-pattern.rb +34 -0
- data/test/data/faq/ex7-expr-pattern.rbhtml +3 -0
- data/test/data/faq/ex7_expr_pattern.result +4 -0
- data/test/data/faq/ex8-m18n.rb +77 -0
- data/test/data/faq/ex8-m18n.rbhtml +4 -0
- data/test/data/faq/ex8_m18n.result +10 -0
- data/test/data/faq/ex9-baselayout.rbhtml +8 -0
- data/test/data/faq/ex9-content.rbhtml +6 -0
- data/test/data/faq/ex9-mylayout.rbhtml +5 -0
- data/test/data/faq/ex9_changelayout.result +11 -0
- data/test/data/users_guide/content6.rbhtml +3 -0
- data/test/data/users_guide/content7.rbhtml +5 -0
- data/test/data/users_guide/content8.rbhtml +2 -0
- data/test/data/users_guide/contextdata.rb +7 -0
- data/test/data/users_guide/datafile.rb +5 -0
- data/test/data/users_guide/datafile.yaml +10 -0
- data/test/data/users_guide/ex.rbhtml +6 -0
- data/test/data/users_guide/ex.result +7 -0
- data/test/data/users_guide/ex.script +5 -0
- data/test/data/users_guide/ex_script.result +7 -0
- data/test/data/users_guide/ex_source.result +8 -0
- data/test/data/users_guide/example1.rbhtml +12 -0
- data/test/data/users_guide/example1.result +17 -0
- data/test/data/users_guide/example10.rbhtml +4 -0
- data/test/data/users_guide/example10_template_args.result +6 -0
- data/test/data/users_guide/example11.rbhtml +5 -0
- data/test/data/users_guide/example11_template_args_result +2 -0
- data/test/data/users_guide/example12.rbhtml +12 -0
- data/test/data/users_guide/example12_preprocessed.result +10 -0
- data/test/data/users_guide/example12_preprocessed_source.result +10 -0
- data/test/data/users_guide/example13.rbhtml +6 -0
- data/test/data/users_guide/example13_preprocessed.result +2 -0
- data/test/data/users_guide/example13_preprocessed_source.result +2 -0
- data/test/data/users_guide/example14.rb +32 -0
- data/test/data/users_guide/example14.rbhtml +6 -0
- data/test/data/users_guide/example14_tmplclass.result +15 -0
- data/test/data/users_guide/example15.rb +10 -0
- data/test/data/users_guide/example15_escapefunc.result +14 -0
- data/test/data/users_guide/example16.rbhtml +4 -0
- data/test/data/users_guide/example16a.rb +10 -0
- data/test/data/users_guide/example16a.result +4 -0
- data/test/data/users_guide/example16b.rb +13 -0
- data/test/data/users_guide/example16b.result +4 -0
- data/test/data/users_guide/example16c.rb +12 -0
- data/test/data/users_guide/example16c.result +4 -0
- data/test/data/users_guide/example1_S.result +14 -0
- data/test/data/users_guide/example1_SXNC.result +10 -0
- data/test/data/users_guide/example1_source.result +14 -0
- data/test/data/users_guide/example2.rbhtml +3 -0
- data/test/data/users_guide/example2_sb.result2 +9 -0
- data/test/data/users_guide/example3.rbhtml +5 -0
- data/test/data/users_guide/example3_syntaxcheck.result +2 -0
- data/test/data/users_guide/example4.rbhtml +13 -0
- data/test/data/users_guide/example4_datafile_rb.result +13 -0
- data/test/data/users_guide/example4_yaml.result +13 -0
- data/test/data/users_guide/example5.rbhtml +9 -0
- data/test/data/users_guide/example5_datastr_rb.result +9 -0
- data/test/data/users_guide/example5_datastr_yaml.result +9 -0
- data/test/data/users_guide/example6.rbhtml +19 -0
- data/test/data/users_guide/example6_layout.result +29 -0
- data/test/data/users_guide/example6_nested.result +28 -0
- data/test/data/users_guide/example7_layout2.result +13 -0
- data/test/data/users_guide/example8_layout3.result +8 -0
- data/test/data/users_guide/example9.rbhtml +18 -0
- data/test/data/users_guide/example9_capture.result +26 -0
- data/test/data/users_guide/footer.html +5 -0
- data/test/data/users_guide/footer.rbhtml +4 -0
- data/test/data/users_guide/layout6.rbhtml +17 -0
- data/test/data/users_guide/layout7.rbhtml +9 -0
- data/test/data/users_guide/layout8_html.rbhtml +5 -0
- data/test/data/users_guide/layout8_xhtml.rbhtml +6 -0
- data/test/data/users_guide/layout9.rbhtml +25 -0
- data/test/data/users_guide/sidemenu.rbhtml +5 -0
- data/test/data/users_guide/user_app.cgi +39 -0
- data/test/data/users_guide/user_app.result +30 -0
- data/test/data/users_guide/user_create.rbhtml +6 -0
- data/test/data/users_guide/user_edit.rbhtml +7 -0
- data/test/data/users_guide/user_form.rbhtml +10 -0
- data/test/data/users_guide/user_layout.rbhtml +16 -0
- data/test/test_all.rb +23 -0
- data/test/test_engine.rb +526 -0
- data/test/test_engine.yaml +2039 -0
- data/test/test_examples.rb +81 -0
- data/test/test_faq.rb +60 -0
- data/test/test_htmlhelper.rb +78 -0
- data/test/test_main.rb +564 -0
- data/test/test_main.yaml +174 -0
- data/test/test_template.rb +113 -0
- data/test/test_template.yaml +1244 -0
- data/test/test_users_guide.rb +75 -0
- data/test/testcase-helper.rb +166 -0
- metadata +226 -0
data/tenjin.gemspec
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
|
3
|
+
###
|
4
|
+
### $Rev: 61 $
|
5
|
+
### $Release: 0.6.0 $
|
6
|
+
### copyright(c) 2007 kuwata-lab all rights reserved.
|
7
|
+
###
|
8
|
+
|
9
|
+
require 'rubygems'
|
10
|
+
|
11
|
+
spec = Gem::Specification.new do |s|
|
12
|
+
## package information
|
13
|
+
s.name = "tenjin"
|
14
|
+
s.author = "kwatch"
|
15
|
+
s.version = ("$Release: 0.6.0 $" =~ /[\.\d]+/) && $&
|
16
|
+
s.platform = Gem::Platform::RUBY
|
17
|
+
s.homepage = "http://www.kuwata-lab.com/tenjin"
|
18
|
+
s.summary = "eRuby-like template engine"
|
19
|
+
s.description = <<-'END'
|
20
|
+
Tenjin is a template engine which is similar to eRuby.
|
21
|
+
Tenjin has the following features.
|
22
|
+
* Very fast and lightweight
|
23
|
+
* Auto escaping support
|
24
|
+
* Auto trimming spaces around embedded statements
|
25
|
+
* Context object available and easy to combine eRuby template with YAML datafile
|
26
|
+
END
|
27
|
+
|
28
|
+
## files
|
29
|
+
files = []
|
30
|
+
files += Dir.glob('lib/**/*')
|
31
|
+
files += Dir.glob('bin/*')
|
32
|
+
#files += Dir.glob('examples/**/*')
|
33
|
+
files += Dir.glob('test/**/*')
|
34
|
+
files += Dir.glob('doc/**/*')
|
35
|
+
#files += %w[README.txt MIT-LICENSE setup.rb tenjin.gemspec CHANGES]
|
36
|
+
files += %w[README.txt MIT-LICENSE setup.rb tenjin.gemspec]
|
37
|
+
#files += Dir.glob('contrib/*')
|
38
|
+
files += Dir.glob('benchmark/**/*')
|
39
|
+
files += Dir.glob('doc-api/**/*')
|
40
|
+
s.files = files
|
41
|
+
s.executables = ['rbtenjin']
|
42
|
+
s.bindir = 'bin'
|
43
|
+
s.test_file = 'test/test_all.rb'
|
44
|
+
end
|
45
|
+
|
46
|
+
# Quick fix for Ruby 1.8.3 / YAML bug (thanks to Ross Bamford)
|
47
|
+
if (RUBY_VERSION == '1.8.3')
|
48
|
+
def spec.to_yaml
|
49
|
+
out = super
|
50
|
+
out = '--- ' + out unless out =~ /^---/
|
51
|
+
out
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
if $0 == __FILE__
|
56
|
+
Gem::manage_gems
|
57
|
+
Gem::Builder.new(spec).build
|
58
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
###
|
2
|
+
### $Rev: 30 $
|
3
|
+
### 0.6.0
|
4
|
+
### copyright(c) 2007 kuwata-lab all rights reserved.
|
5
|
+
###
|
6
|
+
|
7
|
+
require 'test/unit'
|
8
|
+
require 'tempfile'
|
9
|
+
|
10
|
+
|
11
|
+
module Test
|
12
|
+
module Unit
|
13
|
+
class TestCase
|
14
|
+
|
15
|
+
def assert_text_equal(expected, actual, message=nil, diffopt='-u', flag_cut=true)
|
16
|
+
if expected == actual
|
17
|
+
assert(true)
|
18
|
+
return
|
19
|
+
end
|
20
|
+
if expected && actual && (expected[-1] != ?\n || actual[-1] != ?\n)
|
21
|
+
expected += "\n"
|
22
|
+
actual += "\n"
|
23
|
+
end
|
24
|
+
begin
|
25
|
+
expfile = Tempfile.new(".expected.")
|
26
|
+
expfile.write(expected); expfile.flush()
|
27
|
+
actfile = Tempfile.new(".actual.")
|
28
|
+
actfile.write(actual); actfile.flush()
|
29
|
+
diff = `diff #{diffopt} #{expfile.path} #{actfile.path}`
|
30
|
+
ensure
|
31
|
+
expfile.close(true) if expfile
|
32
|
+
actfile.close(true) if actfile
|
33
|
+
end
|
34
|
+
# cut 1st & 2nd lines
|
35
|
+
message = (flag_cut ? diff.gsub(/\A.*\n.*\n/, '') : diff) unless message
|
36
|
+
#raise Test::Unit::AssertionFailedError.new(message)
|
37
|
+
assert_block(message) { false } # or assert(false, message)
|
38
|
+
end
|
39
|
+
|
40
|
+
alias assert_equal_with_diff assert_text_equal # for compatibility
|
41
|
+
alias assert_text_equals assert_text_equal # for typo
|
42
|
+
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
<?rb #@ARGS action, params, label ?>
|
2
|
+
<form action="${@action}" method="post">
|
3
|
+
<p>
|
4
|
+
<label>Name:</label>
|
5
|
+
<input type="text" name="name" value="${@params[:name]}" />
|
6
|
+
</p>
|
7
|
+
<p>
|
8
|
+
<label>Gender:</label>
|
9
|
+
<?rb gender = @params[:gender] ?>
|
10
|
+
<input type="radio" name="gender" value="M" #{checked(gender=='M')} />Man
|
11
|
+
<input type="radio" name="gender" value="W" #{checked(gender=='W')} />Woman
|
12
|
+
</p>
|
13
|
+
<input type="submit" value="${@label}" />
|
14
|
+
</form>
|
@@ -0,0 +1,9 @@
|
|
1
|
+
## create Engine object
|
2
|
+
require 'tenjin'
|
3
|
+
engine = Tenjin::Engine.new(:postfix=>'.rbhtml', :layout=>'layout.rbhtml')
|
4
|
+
|
5
|
+
## render template with context data
|
6
|
+
params = { :name=>'Foo', :gender=>'M' }
|
7
|
+
context = { :params=>params }
|
8
|
+
output = engine.render(:update, context) # :update == 'update'+postfix
|
9
|
+
puts output
|
@@ -0,0 +1,21 @@
|
|
1
|
+
$ ruby main.rb
|
2
|
+
<html>
|
3
|
+
<body>
|
4
|
+
<h1>Update user</h1>
|
5
|
+
<div class="main-content">
|
6
|
+
<form action="update.cgi" method="post">
|
7
|
+
<p>
|
8
|
+
<label>Name:</label>
|
9
|
+
<input type="text" name="name" value="Foo" />
|
10
|
+
</p>
|
11
|
+
<p>
|
12
|
+
<label>Gender:</label>
|
13
|
+
<input type="radio" name="gender" value="M" checked="checked" />Man
|
14
|
+
<input type="radio" name="gender" value="W" />Woman
|
15
|
+
</p>
|
16
|
+
<input type="submit" value="Update" />
|
17
|
+
</form>
|
18
|
+
|
19
|
+
</div>
|
20
|
+
</body>
|
21
|
+
</html>
|
@@ -0,0 +1,16 @@
|
|
1
|
+
LANGUAGES = [
|
2
|
+
['en', 'Engilish'],
|
3
|
+
['fr', 'French'],
|
4
|
+
['de', 'German'],
|
5
|
+
['es', 'Spanish'],
|
6
|
+
['ch', 'Chinese'],
|
7
|
+
['ja', 'Japanese'],
|
8
|
+
]
|
9
|
+
|
10
|
+
def link_to(label, options={})
|
11
|
+
action, id = options[:action], options[:id]
|
12
|
+
url = '/app'
|
13
|
+
url << '/' << action if action && !action.empty?
|
14
|
+
url << '/' << id if id
|
15
|
+
return "<a href=\"#{CGI::escape(url).gsub(/%2F/i, '/')}\">#{label}</a>"
|
16
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
## create engine
|
4
|
+
require 'tenjin'
|
5
|
+
engine = Tenjin::Engine.new(:postfix=>'.rbhtml', :preprocess=>true)
|
6
|
+
|
7
|
+
## render template with context data
|
8
|
+
params = { :id=>1234, :name=>'Foo', :lang=>'ch' }
|
9
|
+
context = { :params => params }
|
10
|
+
output = engine.render(:select, context)
|
11
|
+
puts output
|
@@ -0,0 +1,17 @@
|
|
1
|
+
$ ruby main.rb
|
2
|
+
<form>
|
3
|
+
<label>Select your language:</label>
|
4
|
+
<select name="lang">
|
5
|
+
<option value="en" >Engilish</option>
|
6
|
+
<option value="fr" >French</option>
|
7
|
+
<option value="de" >German</option>
|
8
|
+
<option value="es" >Spanish</option>
|
9
|
+
<option value="ch" selected="selected">Chinese</option>
|
10
|
+
<option value="ja" >Japanese</option>
|
11
|
+
</select>
|
12
|
+
<input type="submit" value="OK" />
|
13
|
+
</form>
|
14
|
+
<p>
|
15
|
+
<a href="/app/index">Back</a> |
|
16
|
+
<a href="/app/show/1234">Show Foo</a>
|
17
|
+
</p>
|
@@ -0,0 +1,15 @@
|
|
1
|
+
<?RB require 'helper' ?>
|
2
|
+
<form>
|
3
|
+
<label>Select your language:</label>
|
4
|
+
<select name="lang">
|
5
|
+
<?rb table = { @params[:lang] => ' selected="selected"' } ?>
|
6
|
+
<?RB for val, name in LANGUAGES ?>
|
7
|
+
<option value="${{val}}" #{table[#{{val.inspect}}]}>${{name}}</option>
|
8
|
+
<?RB end ?>
|
9
|
+
</select>
|
10
|
+
<input type="submit" value="OK" />
|
11
|
+
</form>
|
12
|
+
<p>
|
13
|
+
#{{link_to('Back', :action=>'index')}} |
|
14
|
+
#{{link_to('Show '+_P('@params[:name]'), :action=>'show', :id=>_p('@params[:id]'))}}
|
15
|
+
</p>
|
@@ -0,0 +1,18 @@
|
|
1
|
+
$ rbtenjin -a preprocess select.rbhtml
|
2
|
+
<form>
|
3
|
+
<label>Select your language:</label>
|
4
|
+
<select name="lang">
|
5
|
+
<?rb table = { @params[:lang] => ' selected="selected"' } ?>
|
6
|
+
<option value="en" #{table["en"]}>Engilish</option>
|
7
|
+
<option value="fr" #{table["fr"]}>French</option>
|
8
|
+
<option value="de" #{table["de"]}>German</option>
|
9
|
+
<option value="es" #{table["es"]}>Spanish</option>
|
10
|
+
<option value="ch" #{table["ch"]}>Chinese</option>
|
11
|
+
<option value="ja" #{table["ja"]}>Japanese</option>
|
12
|
+
</select>
|
13
|
+
<input type="submit" value="OK" />
|
14
|
+
</form>
|
15
|
+
<p>
|
16
|
+
<a href="/app/index">Back</a> |
|
17
|
+
<a href="/app/show/#{@params[:id]}">Show ${@params[:name]}</a>
|
18
|
+
</p>
|
@@ -0,0 +1,9 @@
|
|
1
|
+
## create Engine object
|
2
|
+
require 'tenjin'
|
3
|
+
engine = Tenjin::Engine.new()
|
4
|
+
|
5
|
+
## render template with context data
|
6
|
+
context = { :title => 'Bordered Table Example',
|
7
|
+
:items => [ '<AAA>', 'B&B', '"CCC"' ] }
|
8
|
+
output = engine.render('table.rbhtml', context)
|
9
|
+
puts output
|
@@ -0,0 +1,16 @@
|
|
1
|
+
<html>
|
2
|
+
<body>
|
3
|
+
<h1>${@title}</h1>
|
4
|
+
<table>
|
5
|
+
<?rb i = 0 ?>
|
6
|
+
<?rb for item in @items ?>
|
7
|
+
<?rb i += 1 ?>
|
8
|
+
<?rb color = i % 2 == 0 ? '#FFCCCC' : '#CCCCFF' ?>
|
9
|
+
<tr bgcolor="#{color}">
|
10
|
+
<td>#{i}</td>
|
11
|
+
<td>${item}</td>
|
12
|
+
</tr>
|
13
|
+
<?rb end ?>
|
14
|
+
</table>
|
15
|
+
</body>
|
16
|
+
</html>
|
@@ -0,0 +1,20 @@
|
|
1
|
+
$ ruby table.rb
|
2
|
+
<html>
|
3
|
+
<body>
|
4
|
+
<h1>Bordered Table Example</h1>
|
5
|
+
<table>
|
6
|
+
<tr bgcolor="#CCCCFF">
|
7
|
+
<td>1</td>
|
8
|
+
<td><AAA></td>
|
9
|
+
</tr>
|
10
|
+
<tr bgcolor="#FFCCCC">
|
11
|
+
<td>2</td>
|
12
|
+
<td>B&B</td>
|
13
|
+
</tr>
|
14
|
+
<tr bgcolor="#CCCCFF">
|
15
|
+
<td>3</td>
|
16
|
+
<td>"CCC"</td>
|
17
|
+
</tr>
|
18
|
+
</table>
|
19
|
+
</body>
|
20
|
+
</html>
|
@@ -0,0 +1,18 @@
|
|
1
|
+
$ rbtenjin -a convert table.rbhtml
|
2
|
+
_buf = ''; _buf << %Q`<html>
|
3
|
+
<body>
|
4
|
+
<h1>#{escape((@title).to_s)}</h1>
|
5
|
+
<table>\n`
|
6
|
+
i = 0
|
7
|
+
for item in @items
|
8
|
+
i += 1
|
9
|
+
color = i % 2 == 0 ? '#FFCCCC' : '#CCCCFF'
|
10
|
+
_buf << %Q` <tr bgcolor="#{color}">
|
11
|
+
<td>#{i}</td>
|
12
|
+
<td>#{escape((item).to_s)}</td>
|
13
|
+
</tr>\n`
|
14
|
+
end
|
15
|
+
_buf << %Q` </table>
|
16
|
+
</body>
|
17
|
+
</html>\n`
|
18
|
+
_buf.to_s
|
@@ -0,0 +1,27 @@
|
|
1
|
+
<html>
|
2
|
+
<body>
|
3
|
+
|
4
|
+
<?rb ## if variable '@header_part' is defined then print it, ?>
|
5
|
+
<?rb ## else print default header part. ?>
|
6
|
+
<div id="header">
|
7
|
+
<?rb unless captured_as(:header_part) ?>
|
8
|
+
<img src="img/logo.png" alt="logo" ?>
|
9
|
+
<?rb end ?>
|
10
|
+
</div>
|
11
|
+
|
12
|
+
<?rb ## main content part ?>
|
13
|
+
<div id="content">
|
14
|
+
<?rb _buf << @content_part ?>
|
15
|
+
</div>
|
16
|
+
|
17
|
+
<?rb ## if variable '@footer_part' is defined then print it, ?>
|
18
|
+
<?rb ## else print default footer part. ?>
|
19
|
+
<div id="footer">
|
20
|
+
<?rb unless captured_as(:footer_part) ?>
|
21
|
+
<hr />
|
22
|
+
<em>webmaster@example.com</em>
|
23
|
+
<?rb end ?>
|
24
|
+
</div>
|
25
|
+
|
26
|
+
</body>
|
27
|
+
</html>
|
@@ -0,0 +1,12 @@
|
|
1
|
+
<?rb ## '@_layout' variable is equivarent to '{% extends "foobar.html" %}' ?>
|
2
|
+
<?rb ## in Django template engine. ?>
|
3
|
+
<?rb @_layout = 'ex10-customlayout.rbhtml' ?>
|
4
|
+
|
5
|
+
<?rb ## main content part ?>
|
6
|
+
<?rb start_capture(:content_part) ?>
|
7
|
+
<ul>
|
8
|
+
<?rb for item in @items ?>
|
9
|
+
<li>${item}</li>
|
10
|
+
<?rb end ?>
|
11
|
+
</ul>
|
12
|
+
<?rb stop_capture() ?>
|
@@ -0,0 +1,11 @@
|
|
1
|
+
<?rb ## '@_layout' variable is equivarent to '{% extends "foobar.html" %}' ?>
|
2
|
+
<?rb ## in Django template engine. ?>
|
3
|
+
<?rb @_layout = 'ex10-baselayout.rbhtml' ?>
|
4
|
+
|
5
|
+
<?rb ## you can override header or footer by capturing. ?>
|
6
|
+
<?rb start_capture(:footer_part) ?>
|
7
|
+
<address style="text-align:right">
|
8
|
+
copyright© 2007 kuwata-lab all rights reserved<br />
|
9
|
+
<a href="webmaster@kuwata-lab.com">webmaster@kuwata-lab.com</a>
|
10
|
+
</address>
|
11
|
+
<?rb stop_capture() ?>
|
@@ -0,0 +1,25 @@
|
|
1
|
+
$ rbtenjin -c "@items=['AAA', 'BBB', 'CCC']" ex10-content.rbhtml
|
2
|
+
<html>
|
3
|
+
<body>
|
4
|
+
|
5
|
+
<div id="header">
|
6
|
+
<img src="img/logo.png" alt="logo" ?>
|
7
|
+
</div>
|
8
|
+
|
9
|
+
<div id="content">
|
10
|
+
<ul>
|
11
|
+
<li>AAA</li>
|
12
|
+
<li>BBB</li>
|
13
|
+
<li>CCC</li>
|
14
|
+
</ul>
|
15
|
+
</div>
|
16
|
+
|
17
|
+
<div id="footer">
|
18
|
+
<address style="text-align:right">
|
19
|
+
copyright© 2007 kuwata-lab all rights reserved<br />
|
20
|
+
<a href="webmaster@kuwata-lab.com">webmaster@kuwata-lab.com</a>
|
21
|
+
</address>
|
22
|
+
</div>
|
23
|
+
|
24
|
+
</body>
|
25
|
+
</html>
|
@@ -0,0 +1,28 @@
|
|
1
|
+
## create Engine object for each layout file
|
2
|
+
require 'tenjin'
|
3
|
+
engine1 = Tenjin::Engine.new(:layout=>'ex11-layout1.rbhtml')
|
4
|
+
engine2 = Tenjin::Engine.new(:layout=>'ex11-layout2.rbhtml')
|
5
|
+
|
6
|
+
## warm up
|
7
|
+
filename = 'ex11-content.rbhtml'
|
8
|
+
output1 = engine1.render(filename)
|
9
|
+
output2 = engine2.render(filename)
|
10
|
+
raise "*** output1 != output2" if output1 != output2
|
11
|
+
|
12
|
+
## do benchmark
|
13
|
+
require 'benchmark'
|
14
|
+
N = 10000
|
15
|
+
Benchmark.bm(20) do |job|
|
16
|
+
GC.start()
|
17
|
+
job.report('layout1') do
|
18
|
+
N.times do
|
19
|
+
output1 = engine1.render(filename)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
GC.start()
|
23
|
+
job.report('layout2') do
|
24
|
+
N.times do
|
25
|
+
output2 = engine2.render(filename)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|