tenjin 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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/MIT-LICENSE
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
copyright(c) 2007 kuwata-lab all rights reserved.
|
|
2
|
+
|
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
|
4
|
+
a copy of this software and associated documentation files (the
|
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
|
9
|
+
the following conditions:
|
|
10
|
+
|
|
11
|
+
The above copyright notice and this permission notice shall be
|
|
12
|
+
included in all copies or substantial portions of the Software.
|
|
13
|
+
|
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.txt
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
= README
|
|
2
|
+
|
|
3
|
+
release:: 0.6.0
|
|
4
|
+
copyright:: copyright(c) 2007 kuwata-lab all rights reserved.
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
== About
|
|
8
|
+
|
|
9
|
+
rbTenjin is a very fast and full-featured template engine based on embedded Ruby.
|
|
10
|
+
You can embed Ruby statements and expressions into your text file.
|
|
11
|
+
rbTenjin converts it into Ruby program and evaluate it.
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
== Features
|
|
15
|
+
|
|
16
|
+
* Very fast (twice faster than eruby and three times faster than ERB)
|
|
17
|
+
* Lightweight (only one file which contains about 1000 lines)
|
|
18
|
+
* Not break HTML design because it uses XML Processing
|
|
19
|
+
Instructions (PI) as embedded notation for Python statements.
|
|
20
|
+
* Secure because it supports escaping expression value by default.
|
|
21
|
+
* Auto caching of converted Python code.
|
|
22
|
+
* Nestable layout template
|
|
23
|
+
* Inlucde other templates
|
|
24
|
+
* Capture part of template
|
|
25
|
+
* Load YAML file as context data
|
|
26
|
+
* Preprocessing support
|
|
27
|
+
|
|
28
|
+
See doc/*.html for details.
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
== Installation
|
|
32
|
+
|
|
33
|
+
* If you have installed RubyGems, just type <tt>gem install tenjin</tt>.
|
|
34
|
+
|
|
35
|
+
$ sudo gem install tenjin
|
|
36
|
+
|
|
37
|
+
* Else download rbtenjin-X.X.X.tar.bz2 and just copy 'lib/tenjin.rb' and
|
|
38
|
+
'bin/rbtenjin' into proper directory.
|
|
39
|
+
|
|
40
|
+
$ tar xjf rbtenjin-X.X.X.tar.bz2
|
|
41
|
+
$ cd rbtenjin-X.X.X/
|
|
42
|
+
$ sudo copy lib/tenjin.rb /usr/local/lib/ruby/1.8/site_ruby/1.8/
|
|
43
|
+
$ sudo copy bin/rbtenjin /usr/local/bin/
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
== Attention
|
|
47
|
+
|
|
48
|
+
rbTenjin is beta released. It means that API or specification may change
|
|
49
|
+
in the future.
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
== License
|
|
53
|
+
|
|
54
|
+
MIT License
|
data/benchmark/bench.rb
ADDED
|
@@ -0,0 +1,502 @@
|
|
|
1
|
+
## parse options
|
|
2
|
+
require 'optparse'
|
|
3
|
+
optparser = OptionParser.new()
|
|
4
|
+
options = {}
|
|
5
|
+
['-h', '-p', '-n N', '-e', '-q', '-A', '-f file', '-m mode', '-x exclude'].each do |opt|
|
|
6
|
+
optparser.on(opt) { |val| options[opt[1].chr] = val }
|
|
7
|
+
end
|
|
8
|
+
begin
|
|
9
|
+
filenames = optparser.parse!(ARGV)
|
|
10
|
+
rescue => ex
|
|
11
|
+
command = File.basename($0)
|
|
12
|
+
$stderr.puts "#{command}: #{ex.to_s}"
|
|
13
|
+
exit(1)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
## defaults
|
|
18
|
+
ntimes = 1000
|
|
19
|
+
mode = 'class' # 'class' or 'hash'
|
|
20
|
+
escape = options['e']
|
|
21
|
+
targets = %w[eruby eruby-cache erb erb-cache erb-reuse erb-defmethod erubis erubis-cache erubis-reuse tenjin tenjin-nocache tenjin-reuse]
|
|
22
|
+
#targets_all = targets + %w[tenjin-tmpl tenjin-defun tenjin-defun-reuse] + %w[eruby-convert erb-convert erubis-convert tenjin-convert]
|
|
23
|
+
targets_all = targets + %w[tenjin-arrbuf tenjin-arrbuf-nocache tenjin-arrbuf-reuse]
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
## help
|
|
27
|
+
if options['h']
|
|
28
|
+
command = File.basename($0)
|
|
29
|
+
puts "Usage: ruby %s [-h] [-n N] [targets] " % command
|
|
30
|
+
puts " -h : help"
|
|
31
|
+
#puts " -p : print output"
|
|
32
|
+
puts " -n N : loop N times (default %d)" % ntimes
|
|
33
|
+
puts " -f file : context data file"
|
|
34
|
+
puts " -x exclude : excluded target name"
|
|
35
|
+
puts " -q : quiet mode"
|
|
36
|
+
puts " -m mode : 'class' or 'hash' (default '%s')" % mode
|
|
37
|
+
puts " -e : escape html"
|
|
38
|
+
exit(0)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
## set parameters
|
|
43
|
+
ntimes = options.fetch('n', ntimes).to_i
|
|
44
|
+
mode = options.fetch('m', mode)
|
|
45
|
+
$quiet = options['q']
|
|
46
|
+
datafile = options['f']
|
|
47
|
+
unless datafile
|
|
48
|
+
if mode == 'class'
|
|
49
|
+
datafile = 'bench_context.rb'
|
|
50
|
+
elsif mode == 'hash'
|
|
51
|
+
datafile = 'bench_context.yaml'
|
|
52
|
+
else
|
|
53
|
+
assert unreachable
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
if options['A']
|
|
57
|
+
targets = targets_all
|
|
58
|
+
elsif filenames && !filenames.empty?
|
|
59
|
+
if filenames[0] =~ /^\/.*\/$/
|
|
60
|
+
regexp = eval filenames[0]
|
|
61
|
+
targets = targets_all.select { |t| t =~ regexp }
|
|
62
|
+
else
|
|
63
|
+
targets = filenames
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
exclude = options['x']
|
|
67
|
+
targets.delete(exclude) if exclude
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
## require libraries
|
|
71
|
+
require 'erb'
|
|
72
|
+
require 'tenjin'
|
|
73
|
+
begin
|
|
74
|
+
require 'eruby'
|
|
75
|
+
rescue LoadError
|
|
76
|
+
ERuby = nil
|
|
77
|
+
end
|
|
78
|
+
begin
|
|
79
|
+
require 'erubis'
|
|
80
|
+
rescue LoadError
|
|
81
|
+
Erubis = nil
|
|
82
|
+
end
|
|
83
|
+
require 'cgi'
|
|
84
|
+
include ERB::Util
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
## context data
|
|
88
|
+
if datafile =~ /\.rb$/
|
|
89
|
+
context = Tenjin::Context.new
|
|
90
|
+
context.instance_eval(File.read(datafile), datafile)
|
|
91
|
+
elsif datafile =~ /\.ya?ml$/
|
|
92
|
+
require 'yaml'
|
|
93
|
+
ydoc = YAML.load_file(datafile)
|
|
94
|
+
context = Tenjin::Context.new(ydoc)
|
|
95
|
+
end
|
|
96
|
+
if escape
|
|
97
|
+
context[:list].each do |item|
|
|
98
|
+
if item.name =~ / /
|
|
99
|
+
item.name = "<#{item.name.gsub(/ /, '&')}>"
|
|
100
|
+
else
|
|
101
|
+
item.name = "\"#{item.name}\""
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
s = ''
|
|
106
|
+
context.instance_variables.each do |varname|
|
|
107
|
+
name = varname[1..-1]
|
|
108
|
+
s << "#{name} = context[#{name.inspect}]\n"
|
|
109
|
+
end
|
|
110
|
+
bindobj = nil
|
|
111
|
+
s << "bindobj = binding()\n"
|
|
112
|
+
eval s
|
|
113
|
+
#eval "puts '** title='+title\n" # error on 1.9
|
|
114
|
+
#eval "puts '** title='+title\n", bindobj # ok
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
## helper methods
|
|
118
|
+
def msg(message)
|
|
119
|
+
unless $quiet
|
|
120
|
+
$stdout.write(message)
|
|
121
|
+
$stdout.flush()
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
def defun_code(rbcode)
|
|
127
|
+
return <<-END
|
|
128
|
+
def tmpl_tenjin_view()
|
|
129
|
+
_buf = ''
|
|
130
|
+
_tmpl_tenjin_view(_buf)
|
|
131
|
+
return _buf
|
|
132
|
+
end
|
|
133
|
+
def _tmpl_tenjin_view(_buf)
|
|
134
|
+
#{rbcode}
|
|
135
|
+
end
|
|
136
|
+
END
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
def read_and_convert(filename, &block)
|
|
141
|
+
cachename = filename + '.cache'
|
|
142
|
+
if !test(?f, cachename) || File.mtime(cachename) < File.mtime(filename)
|
|
143
|
+
rbcode = yield(filename)
|
|
144
|
+
File.open(cachename, 'w') { |f| f.write(rbcode) }
|
|
145
|
+
else
|
|
146
|
+
rbcode = File.read(cachename)
|
|
147
|
+
end
|
|
148
|
+
return rbcode
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
## preparation
|
|
153
|
+
#msg('----- start benchmark preparations.\n')
|
|
154
|
+
#msg('----- end benchmark preparations.\n\n')
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
## generate templates
|
|
158
|
+
template_filenames = [
|
|
159
|
+
tmpl_eruby = 'bench_eruby.rhtml',
|
|
160
|
+
tmpl_erb = 'bench_erb.rhtml',
|
|
161
|
+
tmpl_erubis = 'bench_erubis.rhtml',
|
|
162
|
+
tmpl_tenjin = 'bench_tenjin.rbhtml',
|
|
163
|
+
tmpl_tenjin2 = 'bench_tenjin2.rbhtml',
|
|
164
|
+
]
|
|
165
|
+
header = File.read("templates/_header.html")
|
|
166
|
+
footer = File.read("templates/_footer.html")
|
|
167
|
+
template_filenames.uniq.each do |fname|
|
|
168
|
+
begin
|
|
169
|
+
body = File.read("templates/#{fname}")
|
|
170
|
+
rescue
|
|
171
|
+
if fname =~ /tenjin/
|
|
172
|
+
body = File.read("templates/#{tmpl_tenjin}")
|
|
173
|
+
else
|
|
174
|
+
body = File.read("templates/#{tmpl_eruby}")
|
|
175
|
+
body = body.gsub(/list/, '@list') if fname =~ /erubis/
|
|
176
|
+
end
|
|
177
|
+
end
|
|
178
|
+
## item['key'] ==> item.key
|
|
179
|
+
if mode == 'class'
|
|
180
|
+
body.gsub!(/(\w+)\['(\w+)'\]/, '\1.\2')
|
|
181
|
+
end
|
|
182
|
+
## escape
|
|
183
|
+
if escape
|
|
184
|
+
case fname
|
|
185
|
+
when /_eruby/
|
|
186
|
+
body.gsub!(/<%= (.*?) %>/, '<%= CGI.escapeHTML((\1).to_s) %>')
|
|
187
|
+
when /_erb/
|
|
188
|
+
body.gsub!(/<%= (.*?) %>/, '<%=h \1 %>')
|
|
189
|
+
when /_erubis/
|
|
190
|
+
body.gsub!(/<%= (.*?) %>/, '<%== \1 %>')
|
|
191
|
+
when /_tenjin/
|
|
192
|
+
body.gsub!(/\#\{(.*?)\}/, '${\1}')
|
|
193
|
+
end
|
|
194
|
+
end
|
|
195
|
+
#
|
|
196
|
+
s = header + body + footer
|
|
197
|
+
File.open(fname, 'w') { |f| f.write(s) }
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
## change benchmark library to use $stderr instead of $stdout
|
|
203
|
+
require 'benchmark'
|
|
204
|
+
module Benchmark
|
|
205
|
+
class Report
|
|
206
|
+
def print(*args)
|
|
207
|
+
$stderr.print(*args)
|
|
208
|
+
end
|
|
209
|
+
end
|
|
210
|
+
module_function
|
|
211
|
+
def print(*args)
|
|
212
|
+
$stderr.print(*args)
|
|
213
|
+
end
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
## open /dev/null
|
|
218
|
+
$stdout = File.open('/dev/null', 'w')
|
|
219
|
+
at_exit do
|
|
220
|
+
$stdout.close()
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
|
|
224
|
+
##
|
|
225
|
+
def delete_caches()
|
|
226
|
+
Dir.glob('*.cache').each { |fname| File.unlink(fname) }
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
|
|
230
|
+
## do benchmark
|
|
231
|
+
if options['p']
|
|
232
|
+
ntimes = 1
|
|
233
|
+
end
|
|
234
|
+
output = nil
|
|
235
|
+
Benchmark.bm(20) do |job|
|
|
236
|
+
|
|
237
|
+
for target in targets
|
|
238
|
+
delete_caches()
|
|
239
|
+
GC.start()
|
|
240
|
+
case target
|
|
241
|
+
|
|
242
|
+
when 'eruby'
|
|
243
|
+
job.report(target) do
|
|
244
|
+
ntimes.times do
|
|
245
|
+
ERuby.import(tmpl_eruby)
|
|
246
|
+
end
|
|
247
|
+
end if ERuby
|
|
248
|
+
|
|
249
|
+
when 'eruby-cache'
|
|
250
|
+
job.report(target) do
|
|
251
|
+
ntimes.times do
|
|
252
|
+
rbcode = read_and_convert(tmpl_eruby) do |fname|
|
|
253
|
+
ERuby::Compiler.new.compile_string(File.read(fname))
|
|
254
|
+
end
|
|
255
|
+
eval rbcode, bindobj
|
|
256
|
+
end
|
|
257
|
+
end if ERuby
|
|
258
|
+
|
|
259
|
+
when 'eruby-convert'
|
|
260
|
+
s = File.read(tmpl_eruby)
|
|
261
|
+
job.report(target) do
|
|
262
|
+
ntimes.times do
|
|
263
|
+
compiler = ERuby::Compiler.new
|
|
264
|
+
output = compiler.compile_string(s)
|
|
265
|
+
end
|
|
266
|
+
end if ERuby
|
|
267
|
+
|
|
268
|
+
when 'erb'
|
|
269
|
+
job.report(target) do
|
|
270
|
+
ntimes.times do
|
|
271
|
+
erb = ERB.new(File.read(tmpl_erb))
|
|
272
|
+
output = erb.result(bindobj)
|
|
273
|
+
print output
|
|
274
|
+
end
|
|
275
|
+
end if ERB
|
|
276
|
+
|
|
277
|
+
when 'erb-cache'
|
|
278
|
+
job.report(target) do
|
|
279
|
+
ntimes.times do
|
|
280
|
+
rbcode = read_and_convert(tmpl_erb) do |fname|
|
|
281
|
+
ERB.new(File.read(fname)).src
|
|
282
|
+
end
|
|
283
|
+
output = eval rbcode, bindobj
|
|
284
|
+
print output
|
|
285
|
+
end
|
|
286
|
+
end if ERB
|
|
287
|
+
|
|
288
|
+
when 'erb-reuse'
|
|
289
|
+
job.report(target) do
|
|
290
|
+
erb = ERB.new(File.read(tmpl_erb))
|
|
291
|
+
ntimes.times do
|
|
292
|
+
output = erb.result(bindobj)
|
|
293
|
+
print output
|
|
294
|
+
end
|
|
295
|
+
end if ERB
|
|
296
|
+
|
|
297
|
+
when 'erb-defmethod'
|
|
298
|
+
job.report(target) do
|
|
299
|
+
erb = ERB.new(File.read(tmpl_erb))
|
|
300
|
+
class Dummy; end
|
|
301
|
+
erb.def_method(Dummy, 'render(list)')
|
|
302
|
+
dummy = Dummy.new
|
|
303
|
+
ntimes.times do
|
|
304
|
+
output = dummy.render(context[:list])
|
|
305
|
+
print output
|
|
306
|
+
end
|
|
307
|
+
end if ERB
|
|
308
|
+
|
|
309
|
+
when 'erb-convert'
|
|
310
|
+
s = File.read(tmpl_erb)
|
|
311
|
+
job.report(target) do
|
|
312
|
+
ntimes.times do
|
|
313
|
+
erb = ERB.new(s)
|
|
314
|
+
output = erb.src
|
|
315
|
+
end
|
|
316
|
+
end if ERB
|
|
317
|
+
|
|
318
|
+
when 'erubis'
|
|
319
|
+
job.report(target) do
|
|
320
|
+
ntimes.times do
|
|
321
|
+
eruby = Erubis::Eruby.new(File.read(tmpl_erubis))
|
|
322
|
+
#output = eruby.result(bindobj)
|
|
323
|
+
output = eruby.evaluate(context)
|
|
324
|
+
print output
|
|
325
|
+
end
|
|
326
|
+
end if Erubis
|
|
327
|
+
|
|
328
|
+
when 'erubis-cache'
|
|
329
|
+
job.report(target) do
|
|
330
|
+
ntimes.times do
|
|
331
|
+
erubis = Erubis::Eruby.load_file(tmpl_erubis)
|
|
332
|
+
#output = erubis.result(bindobj)
|
|
333
|
+
output = erubis.evaluate(context)
|
|
334
|
+
print output
|
|
335
|
+
end
|
|
336
|
+
end if Erubis
|
|
337
|
+
|
|
338
|
+
when 'erubis-reuse'
|
|
339
|
+
job.report(target) do
|
|
340
|
+
erubis = Erubis::Eruby.new(File.read(tmpl_erubis))
|
|
341
|
+
ntimes.times do
|
|
342
|
+
#output = erubis.result(bindobj)
|
|
343
|
+
output = erubis.evaluate(context)
|
|
344
|
+
print output
|
|
345
|
+
end
|
|
346
|
+
end if Erubis
|
|
347
|
+
|
|
348
|
+
when 'erubis-convert'
|
|
349
|
+
s = File.read(tmpl_erubis)
|
|
350
|
+
job.report(target) do
|
|
351
|
+
ntimes.times do
|
|
352
|
+
erubis = Erubis::Eruby.new()
|
|
353
|
+
output = erubis.convert(s)
|
|
354
|
+
end
|
|
355
|
+
end if Erubis
|
|
356
|
+
|
|
357
|
+
when 'tenjin-tmpl'
|
|
358
|
+
job.report(target) do
|
|
359
|
+
ntimes.times do
|
|
360
|
+
template = Tenjin::Template.new(tmpl_tenjin)
|
|
361
|
+
output = template.render(context)
|
|
362
|
+
print output
|
|
363
|
+
end
|
|
364
|
+
end if Tenjin
|
|
365
|
+
|
|
366
|
+
when 'tenjin-tmpl-reuse'
|
|
367
|
+
job.report(target) do
|
|
368
|
+
template = Tenjin::Template.new(tmpl_tenjin)
|
|
369
|
+
ntimes.times do
|
|
370
|
+
output = template.render(context)
|
|
371
|
+
print output
|
|
372
|
+
end
|
|
373
|
+
end if Tenjin
|
|
374
|
+
|
|
375
|
+
when 'tenjin'
|
|
376
|
+
job.report(target) do
|
|
377
|
+
ntimes.times do
|
|
378
|
+
engine = Tenjin::Engine.new(:cache=>true)
|
|
379
|
+
output = engine.render(tmpl_tenjin, context)
|
|
380
|
+
print output
|
|
381
|
+
end
|
|
382
|
+
end if Tenjin
|
|
383
|
+
|
|
384
|
+
when 'tenjin-nocache'
|
|
385
|
+
job.report(target) do
|
|
386
|
+
ntimes.times do
|
|
387
|
+
engine = Tenjin::Engine.new(:cache=>false)
|
|
388
|
+
output = engine.render(tmpl_tenjin, context)
|
|
389
|
+
print output
|
|
390
|
+
end
|
|
391
|
+
end if Tenjin
|
|
392
|
+
|
|
393
|
+
when 'tenjin-reuse'
|
|
394
|
+
job.report(target) do
|
|
395
|
+
engine = Tenjin::Engine.new()
|
|
396
|
+
ntimes.times do
|
|
397
|
+
output = engine.render(tmpl_tenjin, context)
|
|
398
|
+
print output
|
|
399
|
+
end
|
|
400
|
+
end if Tenjin
|
|
401
|
+
|
|
402
|
+
when 'tenjin-convert'
|
|
403
|
+
s = File.read(tmpl_tenjin)
|
|
404
|
+
job.report(target) do
|
|
405
|
+
ntimes.times do
|
|
406
|
+
tenjin = Tenjin::Template.new(:preamble=>true, :postamble=>true)
|
|
407
|
+
output = tenjin.convert(s)
|
|
408
|
+
end
|
|
409
|
+
end if Erubis
|
|
410
|
+
|
|
411
|
+
when 'tenjin-defun'
|
|
412
|
+
job.report(target) do
|
|
413
|
+
template = Tenjin::Template.new(tmpl_tenjin)
|
|
414
|
+
defun = defun_code(template.rbcode)
|
|
415
|
+
ntimes.times do
|
|
416
|
+
context.instance_eval(defun)
|
|
417
|
+
output = context.tmpl_tenjin_view()
|
|
418
|
+
print output
|
|
419
|
+
end
|
|
420
|
+
end if Tenjin
|
|
421
|
+
|
|
422
|
+
when 'tenjin-defun-reuse'
|
|
423
|
+
job.report(target) do
|
|
424
|
+
template = Tenjin::Template.new(tmpl_tenjin)
|
|
425
|
+
defun = defun_code(template.rbcode)
|
|
426
|
+
context.instance_eval(defun)
|
|
427
|
+
ntimes.times do
|
|
428
|
+
output = context.tmpl_tenjin_view()
|
|
429
|
+
print output
|
|
430
|
+
end
|
|
431
|
+
end if Tenjin
|
|
432
|
+
|
|
433
|
+
##
|
|
434
|
+
|
|
435
|
+
when 'tenjin-arrbuftmpl'
|
|
436
|
+
job.report(target) do
|
|
437
|
+
ntimes.times do
|
|
438
|
+
template = Tenjin::ArrayBufferTemplate.new(tmpl_tenjin2)
|
|
439
|
+
output = template.render(context)
|
|
440
|
+
print output
|
|
441
|
+
end
|
|
442
|
+
end if Tenjin::ArrayBufferTemplate
|
|
443
|
+
|
|
444
|
+
when 'tenjin-arrbuftmpl-reuse'
|
|
445
|
+
job.report(target) do
|
|
446
|
+
template = Tenjin::ArrayBufferTemplate.new(tmpl_tenjin2)
|
|
447
|
+
ntimes.times do
|
|
448
|
+
output = template.render(context)
|
|
449
|
+
print output
|
|
450
|
+
end
|
|
451
|
+
end if Tenjin::ArrayBufferTemplate
|
|
452
|
+
|
|
453
|
+
when 'tenjin-arrbuf'
|
|
454
|
+
job.report(target) do
|
|
455
|
+
ntimes.times do
|
|
456
|
+
engine = Tenjin::Engine.new(:cache=>true, :templateclass=>Tenjin::ArrayBufferTemplate)
|
|
457
|
+
output = engine.render(tmpl_tenjin2, context)
|
|
458
|
+
print output
|
|
459
|
+
end
|
|
460
|
+
end if Tenjin::ArrayBufferTemplate
|
|
461
|
+
|
|
462
|
+
when 'tenjin-arrbuf-nocache'
|
|
463
|
+
job.report(target) do
|
|
464
|
+
ntimes.times do
|
|
465
|
+
engine = Tenjin::Engine.new(:cache=>false, :templateclass=>Tenjin::ArrayBufferTemplate)
|
|
466
|
+
output = engine.render(tmpl_tenjin2, context)
|
|
467
|
+
print output
|
|
468
|
+
end
|
|
469
|
+
end if Tenjin::ArrayBufferTemplate
|
|
470
|
+
|
|
471
|
+
when 'tenjin-arrbuf-reuse'
|
|
472
|
+
job.report(target) do
|
|
473
|
+
engine = Tenjin::Engine.new(:templateclass=>Tenjin::ArrayBufferTemplate)
|
|
474
|
+
ntimes.times do
|
|
475
|
+
output = engine.render(tmpl_tenjin2, context)
|
|
476
|
+
print output
|
|
477
|
+
end
|
|
478
|
+
end if Tenjin::ArrayBufferTemplate
|
|
479
|
+
|
|
480
|
+
when 'tenjin-arrbuf-convert'
|
|
481
|
+
s = File.read(tmpl_tenjin2)
|
|
482
|
+
job.report(target) do
|
|
483
|
+
ntimes.times do
|
|
484
|
+
tenjin = Tenjin::ArrayBufferTemplate.new(:preamble=>true, :postamble=>true)
|
|
485
|
+
output = tenjin.convert(s)
|
|
486
|
+
end
|
|
487
|
+
end if Erubis
|
|
488
|
+
|
|
489
|
+
else
|
|
490
|
+
$stderr.puts("*** %s: invalid target.\n" % target)
|
|
491
|
+
exit(1)
|
|
492
|
+
end
|
|
493
|
+
|
|
494
|
+
if options['p']
|
|
495
|
+
File.open('%s.result' % target, 'w') { |f| f.write(output) } unless target =~ /^eruby/ && target !~ /-convert$/
|
|
496
|
+
puts 'created: %s.result' % target
|
|
497
|
+
#next
|
|
498
|
+
end
|
|
499
|
+
|
|
500
|
+
end
|
|
501
|
+
|
|
502
|
+
end
|