erubis 2.2.0 → 2.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (220) hide show
  1. data/CHANGES +120 -3
  2. data/README.txt +1 -1
  3. data/benchmark/Makefile +6 -0
  4. data/benchmark/bench.rb +306 -0
  5. data/benchmark/{erubybench.yaml → bench_context.yaml} +20 -20
  6. data/benchmark/templates/_footer.html +4 -0
  7. data/benchmark/{erubybench.rhtml → templates/_header.html} +1 -34
  8. data/benchmark/templates/bench_erb.rhtml +29 -0
  9. data/benchmark/templates/bench_erubis.rhtml +29 -0
  10. data/benchmark/templates/bench_eruby.rhtml +29 -0
  11. data/bin/erubis +2 -2
  12. data/contrib/erubis +3 -3114
  13. data/contrib/erubis-run.rb +132 -0
  14. data/contrib/inline-require +1 -1
  15. data/doc-api/classes/{ERB.html → ActionView/Base/ERB.html} +3 -3
  16. data/doc-api/classes/Erubis.html +8 -1
  17. data/doc-api/classes/Erubis/ArrayEnhancer.html +12 -12
  18. data/doc-api/classes/Erubis/Basic/Converter.html +24 -24
  19. data/doc-api/classes/Erubis/BiPatternEnhancer.html +14 -14
  20. data/doc-api/classes/Erubis/CGenerator.html +60 -60
  21. data/doc-api/classes/Erubis/Context.html +42 -42
  22. data/doc-api/classes/Erubis/Converter.html +27 -27
  23. data/doc-api/classes/Erubis/DeleteIndentEnhancer.html +150 -0
  24. data/doc-api/classes/Erubis/DeleteIndentEruby.html +120 -0
  25. data/doc-api/classes/Erubis/Engine.html +31 -31
  26. data/doc-api/classes/Erubis/ErboutEnhancer.html +175 -0
  27. data/doc-api/classes/Erubis/ErboutEruby.html +120 -0
  28. data/doc-api/classes/Erubis/Eruby.html +5 -0
  29. data/doc-api/classes/Erubis/EscapeEnhancer.html +6 -6
  30. data/doc-api/classes/Erubis/Evaluator.html +19 -19
  31. data/doc-api/classes/Erubis/FastEruby.html +131 -0
  32. data/doc-api/classes/Erubis/HeaderFooterEnhancer.html +14 -14
  33. data/doc-api/classes/Erubis/Helpers/RailsHelper.html +49 -45
  34. data/doc-api/classes/Erubis/InterpolationEnhancer.html +304 -0
  35. data/doc-api/classes/Erubis/InterpolationEruby.html +120 -0
  36. data/doc-api/classes/Erubis/JavaGenerator.html +54 -54
  37. data/doc-api/classes/Erubis/JavascriptGenerator.html +60 -60
  38. data/doc-api/classes/Erubis/Main.html +35 -27
  39. data/doc-api/classes/Erubis/NoCodeEnhancer.html +5 -5
  40. data/doc-api/classes/Erubis/NoTextEnhancer.html +7 -7
  41. data/doc-api/classes/Erubis/OptimizedEruby.html +6 -6
  42. data/doc-api/classes/Erubis/OptimizedGenerator.html +72 -72
  43. data/doc-api/classes/Erubis/OptimizedXmlEruby.html +6 -6
  44. data/doc-api/classes/Erubis/PI/Converter.html +18 -18
  45. data/doc-api/classes/Erubis/PI/Ec.html +6 -6
  46. data/doc-api/classes/Erubis/PI/Ejava.html +6 -6
  47. data/doc-api/classes/Erubis/PI/Ejavascript.html +6 -6
  48. data/doc-api/classes/Erubis/PI/Eperl.html +6 -6
  49. data/doc-api/classes/Erubis/PI/Ephp.html +6 -6
  50. data/doc-api/classes/Erubis/PI/Eruby.html +7 -7
  51. data/doc-api/classes/Erubis/PI/Escheme.html +6 -6
  52. data/doc-api/classes/Erubis/PI/TinyEruby.html +24 -24
  53. data/doc-api/classes/Erubis/PercentLineEnhancer.html +8 -8
  54. data/doc-api/classes/Erubis/PerlGenerator.html +54 -54
  55. data/doc-api/classes/Erubis/PhpGenerator.html +54 -54
  56. data/doc-api/classes/Erubis/PrintEnabledEnhancer.html +20 -20
  57. data/doc-api/classes/Erubis/PrintOutEnhancer.html +30 -30
  58. data/doc-api/classes/Erubis/RubyEvaluator.html +12 -12
  59. data/doc-api/classes/Erubis/RubyGenerator.html +48 -48
  60. data/doc-api/classes/Erubis/SchemeGenerator.html +60 -60
  61. data/doc-api/classes/Erubis/SimplifyEnhancer.html +8 -8
  62. data/doc-api/classes/Erubis/StdoutEnhancer.html +12 -12
  63. data/doc-api/classes/Erubis/StringBufferEnhancer.html +12 -12
  64. data/doc-api/classes/Erubis/TinyEruby.html +24 -24
  65. data/doc-api/classes/Erubis/XmlHelper.html +14 -14
  66. data/doc-api/created.rid +1 -1
  67. data/doc-api/files/README_txt.html +4 -4
  68. data/doc-api/files/erubis/context_rb.html +2 -2
  69. data/doc-api/files/erubis/converter_rb.html +2 -2
  70. data/doc-api/files/erubis/engine/ec_rb.html +2 -2
  71. data/doc-api/files/erubis/engine/ejava_rb.html +2 -2
  72. data/doc-api/files/erubis/engine/ejavascript_rb.html +2 -2
  73. data/doc-api/files/erubis/engine/enhanced_rb.html +2 -2
  74. data/doc-api/files/erubis/engine/eperl_rb.html +2 -2
  75. data/doc-api/files/erubis/engine/ephp_rb.html +2 -2
  76. data/doc-api/files/erubis/engine/eruby_rb.html +2 -2
  77. data/doc-api/files/erubis/engine/escheme_rb.html +2 -2
  78. data/doc-api/files/erubis/engine/optimized_rb.html +2 -2
  79. data/doc-api/files/erubis/engine_rb.html +2 -2
  80. data/doc-api/files/erubis/enhancer_rb.html +2 -2
  81. data/doc-api/files/erubis/error_rb.html +2 -2
  82. data/doc-api/files/erubis/evaluator_rb.html +2 -2
  83. data/doc-api/files/erubis/generator_rb.html +2 -2
  84. data/doc-api/files/erubis/helper_rb.html +2 -2
  85. data/doc-api/files/erubis/helpers/rails_helper_rb.html +2 -2
  86. data/doc-api/files/erubis/local-setting_rb.html +2 -2
  87. data/doc-api/files/erubis/main_rb.html +2 -2
  88. data/doc-api/files/erubis/tiny_rb.html +2 -2
  89. data/doc-api/files/erubis_rb.html +1 -1
  90. data/doc-api/fr_class_index.html +8 -1
  91. data/doc-api/fr_method_index.html +166 -158
  92. data/doc/users-guide.html +623 -215
  93. data/lib/erubis.rb +2 -2
  94. data/lib/erubis/context.rb +2 -2
  95. data/lib/erubis/converter.rb +2 -2
  96. data/lib/erubis/engine.rb +3 -3
  97. data/lib/erubis/engine/ec.rb +2 -2
  98. data/lib/erubis/engine/ejava.rb +2 -2
  99. data/lib/erubis/engine/ejavascript.rb +2 -2
  100. data/lib/erubis/engine/enhanced.rb +17 -2
  101. data/lib/erubis/engine/eperl.rb +2 -2
  102. data/lib/erubis/engine/ephp.rb +2 -2
  103. data/lib/erubis/engine/eruby.rb +10 -2
  104. data/lib/erubis/engine/escheme.rb +2 -2
  105. data/lib/erubis/engine/optimized.rb +2 -2
  106. data/lib/erubis/enhancer.rb +134 -25
  107. data/lib/erubis/error.rb +2 -2
  108. data/lib/erubis/evaluator.rb +2 -2
  109. data/lib/erubis/generator.rb +2 -2
  110. data/lib/erubis/helper.rb +2 -2
  111. data/lib/erubis/helpers/rails_helper.rb +19 -75
  112. data/lib/erubis/local-setting.rb +2 -2
  113. data/lib/erubis/main.rb +63 -36
  114. data/lib/erubis/tiny.rb +2 -2
  115. data/test/assert-text-equal.rb +2 -2
  116. data/test/data/users-guide/Example.ejava +55 -0
  117. data/test/data/users-guide/array_example.result +9 -0
  118. data/test/data/users-guide/arraybuffer_example.result +9 -0
  119. data/test/data/users-guide/bipattern-example.rhtml +4 -0
  120. data/test/data/users-guide/bipattern_example.result +6 -0
  121. data/test/data/users-guide/context.rb +6 -0
  122. data/test/data/users-guide/context.yaml +8 -0
  123. data/test/data/users-guide/escape_example.result +9 -0
  124. data/test/data/users-guide/example.ec +27 -0
  125. data/test/data/users-guide/example.ejs +20 -0
  126. data/test/data/users-guide/example.eperl +18 -0
  127. data/test/data/users-guide/example.ephp +18 -0
  128. data/test/data/users-guide/example.eruby +6 -0
  129. data/test/data/users-guide/example.escheme +28 -0
  130. data/test/data/users-guide/example1.eruby +6 -0
  131. data/test/data/users-guide/example1.rb +16 -0
  132. data/test/data/users-guide/example1.result +16 -0
  133. data/test/data/users-guide/example10.rb +4 -0
  134. data/test/data/users-guide/example10.result +17 -0
  135. data/test/data/users-guide/example10.xhtml +14 -0
  136. data/test/data/users-guide/example10_x.result +17 -0
  137. data/test/data/users-guide/example11.php +20 -0
  138. data/test/data/users-guide/example11.result +23 -0
  139. data/test/data/users-guide/example11.rhtml +21 -0
  140. data/test/data/users-guide/example11_C.result +10 -0
  141. data/test/data/users-guide/example11_N.result +16 -0
  142. data/test/data/users-guide/example11_U.result +16 -0
  143. data/test/data/users-guide/example11_php.result +15 -0
  144. data/test/data/users-guide/example1_x.result +9 -0
  145. data/test/data/users-guide/example2.eruby +7 -0
  146. data/test/data/users-guide/example2.rb +10 -0
  147. data/test/data/users-guide/example2.result +27 -0
  148. data/test/data/users-guide/example2_trim.result +10 -0
  149. data/test/data/users-guide/example2_x.result +10 -0
  150. data/test/data/users-guide/example3.eruby +6 -0
  151. data/test/data/users-guide/example3.rb +10 -0
  152. data/test/data/users-guide/example31.result +22 -0
  153. data/test/data/users-guide/example32.result +4 -0
  154. data/test/data/users-guide/example3_e.result +8 -0
  155. data/test/data/users-guide/example4.eruby +3 -0
  156. data/test/data/users-guide/example4.rb +11 -0
  157. data/test/data/users-guide/example4.result +10 -0
  158. data/test/data/users-guide/example4_x.result +5 -0
  159. data/test/data/users-guide/example5.eruby +6 -0
  160. data/test/data/users-guide/example5.rb +16 -0
  161. data/test/data/users-guide/example5.result +7 -0
  162. data/test/data/users-guide/example6.rb +12 -0
  163. data/test/data/users-guide/example6.result +7 -0
  164. data/test/data/users-guide/example7.eruby +8 -0
  165. data/test/data/users-guide/example71.result +13 -0
  166. data/test/data/users-guide/example72.result +13 -0
  167. data/test/data/users-guide/example8.eruby +6 -0
  168. data/test/data/users-guide/example8_ruby.result +7 -0
  169. data/test/data/users-guide/example8_yaml.result +7 -0
  170. data/test/data/users-guide/example9.eruby +3 -0
  171. data/test/data/users-guide/example9.rb +8 -0
  172. data/test/data/users-guide/example9.result +9 -0
  173. data/test/data/users-guide/example91.result +5 -0
  174. data/test/data/users-guide/example92.result +4 -0
  175. data/test/data/users-guide/example_c.result +29 -0
  176. data/test/data/users-guide/example_java.result +56 -0
  177. data/test/data/users-guide/example_js.result +22 -0
  178. data/test/data/users-guide/example_perl.result +20 -0
  179. data/test/data/users-guide/example_php.result +19 -0
  180. data/test/data/users-guide/example_scheme.result +30 -0
  181. data/test/data/users-guide/example_scheme_display.result +29 -0
  182. data/test/data/users-guide/fasteruby.rb +11 -0
  183. data/test/data/users-guide/fasteruby.result +38 -0
  184. data/test/data/users-guide/fasteruby.rhtml +15 -0
  185. data/test/data/users-guide/headerfooter-example.eruby +9 -0
  186. data/test/data/users-guide/headerfooter-example2.rb +8 -0
  187. data/test/data/users-guide/headerfooter-example2.rhtml +10 -0
  188. data/test/data/users-guide/headerfooter_example.result +11 -0
  189. data/test/data/users-guide/headerfooter_example2.result +13 -0
  190. data/test/data/users-guide/interpolation_example.result +9 -0
  191. data/test/data/users-guide/nocode-example.eruby +14 -0
  192. data/test/data/users-guide/nocode-php.result +20 -0
  193. data/test/data/users-guide/nocode_example.result +15 -0
  194. data/test/data/users-guide/normal-eruby-test.eruby +9 -0
  195. data/test/data/users-guide/normal_eruby_test.result +11 -0
  196. data/test/data/users-guide/notext-example.eruby +14 -0
  197. data/test/data/users-guide/notext-example.php +19 -0
  198. data/test/data/users-guide/notext-php.result +20 -0
  199. data/test/data/users-guide/notext_example.result +16 -0
  200. data/test/data/users-guide/percentline-example.rhtml +4 -0
  201. data/test/data/users-guide/percentline_example.result +7 -0
  202. data/test/data/users-guide/printenable_example.result +4 -0
  203. data/test/data/users-guide/printenabled-example.eruby +3 -0
  204. data/test/data/users-guide/printenabled-example.rb +8 -0
  205. data/test/data/users-guide/printstatement_example.result +8 -0
  206. data/test/data/users-guide/simplify_example.result +9 -0
  207. data/test/data/users-guide/stdout_exmple.result +9 -0
  208. data/test/data/users-guide/stringbuffer_example.result +9 -0
  209. data/test/test-engines.rb +2 -2
  210. data/test/test-enhancers.rb +569 -0
  211. data/test/test-erubis.rb +3 -380
  212. data/test/test-main.rb +39 -15
  213. data/test/test-users-guide.rb +56 -0
  214. data/test/test.rb +4 -3
  215. data/test/testutil.rb +2 -2
  216. metadata +166 -57
  217. data/benchmark/erubybench-lib.rb +0 -189
  218. data/benchmark/erubybench.rb +0 -600
  219. data/bin/notext +0 -154
  220. data/test/test-notext.rb +0 -27
data/CHANGES CHANGED
@@ -1,8 +1,125 @@
1
- # $Rev: 65 $
2
- # $Release: 2.2.0 $
1
+ # $Rev: 78 $
2
+ # $Release: 2.3.0 $
3
3
  # copyright(c) 2006-2007 kuwata-lab all rights reserved.
4
4
 
5
5
 
6
+ #
7
+ - release: 2.3.0
8
+ date:
9
+ enhancements:
10
+ - |
11
+ New class 'Erubis::FastEruby' is added.
12
+ It is a subclass of Erubis::Eruby and includes InterpolationEnhancer.
13
+ Erubis::FastEruby is compatible with and faster than Erubis::Eruby.
14
+
15
+ - |
16
+ New enhancer 'InterpolationEnhancer' is added.
17
+ This enhancer uses expression interpolation to eliminate method call
18
+ of String#<<. In the result, this enhancer makes Eruby a little faster.
19
+
20
+ --------------------
21
+ ## Assume that input is '<a href="<%=url%>"><%=name%></a>'.
22
+ ## Eruby convert input into the following code. String#<< is called 5 times.
23
+ _buf << '<a href="'; _buf << (url).to_s; _buf << '">'; _buf << (name).to_s; _buf << '</a>';
24
+
25
+ ## When InterpolationEnhancer is used, String#<< is called only once.
26
+ _buf << %Q`<a href="#{url}">#{name}</a>`;
27
+ --------------------
28
+
29
+ - |
30
+ New enhancer 'ErboutEnhancer' is added.
31
+ ErboutEnhancer set '_erbout' as well as '_buf' to be compatible with ERB.
32
+
33
+ ex.
34
+ ====================
35
+ $ cat ex.rhtml
36
+ <p>Hello</p>
37
+ $ erubis -x ex.rhtml
38
+ _buf = ''; _buf << '<p>Hello</p>
39
+ ';
40
+ _buf.to_s
41
+ $ erubis -xE Erbout ex.rhtml
42
+ _erbout = _buf = ''; _buf << '<p>Hello</p>
43
+ ';
44
+ _buf.to_s
45
+ ====================
46
+
47
+ - |
48
+ [experimental]
49
+ New enhancer 'DeleteIndentEnhancer' is added.
50
+ This enhancer deletes indentation of HTML file.
51
+
52
+ ex.
53
+ ====================
54
+ $ cat ex.rhtml
55
+ <div>
56
+ <ul>
57
+ <% for item in ['AAA', 'BBB', 'CCC'] %>
58
+ <li><%= item %></li>
59
+ <% end %>
60
+ </ul>
61
+ </div>
62
+ $ erubis ex.rhtml
63
+ <div>
64
+ <ul>
65
+ <li>AAA</li>
66
+ <li>BBB</li>
67
+ <li>CCC</li>
68
+ </ul>
69
+ </div>
70
+ $ erubis -E DeleteIndent ex.rhtml
71
+ <div>
72
+ <ul>
73
+ <li>AAA</li>
74
+ <li>BBB</li>
75
+ <li>CCC</li>
76
+ </ul>
77
+ </div>
78
+ ====================
79
+
80
+ - |
81
+ Mod_ruby is supported (very thanks to Andrew R Jackson!).
82
+ See users-guide and 'contrib/erubis-run.rb' for details.
83
+
84
+ - |
85
+ New command-line option '-X', '-N', '-U', and '-C' are added.
86
+ These are intended to be a replacement of 'notext' command.
87
+ '-X' shows only ruby statements and expressions.
88
+ '-N' adds line numbers.
89
+ '-U' compress empty lines into a line.
90
+ '-C' removes empty lines.
91
+
92
+
93
+ changes:
94
+
95
+ - |
96
+ 'helpers/rails_helper.rb' is changed to use ErboutEnhancer.
97
+ The following is an examle to use Erubis with Ruby on Rails.
98
+
99
+ File 'config/environment.rb':
100
+ ----------------------------------------
101
+ require 'erubis/helpers/rails_helper'
102
+ #Erubis::Helpers::RailsHelper.engine_class = Erubis::Eruby # or Erubis::FastEruby
103
+ #Erubis::Helpers::RailsHelper.init_properties = {}
104
+ #Erubis::Helpers::RailsHelper.show_src = false # set true for debugging
105
+ ----------------------------------------
106
+
107
+ - |
108
+ Command 'notext' has been removed. Use '-X', '-N', '-U', and '-C'
109
+ instead.
110
+
111
+ - |
112
+ Tab characters in YAML file are expaneded automatically.
113
+ If you want not to expand tab characters, add command-line optio '-T'.
114
+
115
+ - |
116
+ Benchmark scripts (benchmark/bench.*) are rewrited.
117
+
118
+ - |
119
+ Users-guide (doc/users-guide.html) is updated.
120
+
121
+
122
+
6
123
  #
7
124
  - release: 2.2.0
8
125
  date: 2007-02-11
@@ -78,7 +195,7 @@
78
195
  $ erubis -c '{title: Example, list: [AAA, BBB, CCC]}' example.rhtml
79
196
  ====================
80
197
 
81
- ex. YAML inline style
198
+ ex. Ruby style
82
199
  ====================
83
200
  $ erubis -c '@title="Example"; @list=%w[AAA BBB CCC]' example.rhtml
84
201
  ====================
data/README.txt CHANGED
@@ -1,6 +1,6 @@
1
1
  = README
2
2
 
3
- release:: $Release: 2.2.0 $
3
+ release:: 2.3.0
4
4
  copyright:: copyright(c) 2006-2007 kuwata-lab all rights reserved.
5
5
 
6
6
 
@@ -0,0 +1,6 @@
1
+
2
+ bench:
3
+ ruby bench.rb -n 10000
4
+
5
+ clean:
6
+ rm -rf bench_*.rhtml*
@@ -0,0 +1,306 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ ###
4
+ ### $Rev: 77 $
5
+ ### $Release: 2.3.0 $
6
+ ### copyright(c) 2006-2007 kuwata-lab all rights reserved.
7
+ ###
8
+
9
+ require 'erb'
10
+ require 'erubis'
11
+ require 'erubis/tiny'
12
+ require 'erubis/engine/enhanced'
13
+ require 'yaml'
14
+ require 'cgi'
15
+ include ERB::Util
16
+
17
+ begin
18
+ require 'eruby'
19
+ rescue LoadError
20
+ ERuby = nil
21
+ end
22
+
23
+ def File.write(filename, content)
24
+ File.open(filename, 'w') { |f| f.write(content) }
25
+ end
26
+
27
+
28
+ ## change benchmark library to use $stderr instead of $stdout
29
+ require 'benchmark'
30
+ module Benchmark
31
+ class Report
32
+ def print(*args)
33
+ $stderr.print(*args)
34
+ end
35
+ end
36
+ module_function
37
+ def print(*args)
38
+ $stderr.print(*args)
39
+ end
40
+ end
41
+
42
+
43
+ class BenchmarkApplication
44
+
45
+ TARGETS = %w[eruby
46
+ ERB ERB(cached)
47
+ Erubis::Eruby Erubis::Eruby(cached)
48
+ Erubis::FastEruby Erubis::FastEruby(cached)
49
+ Erubis::TinyEruby
50
+ Erubis::ArrayBufferEruby
51
+ Erubis::PrintOutEruby
52
+ Erubis::StdoutEruby
53
+ ]
54
+
55
+ def initialize(ntimes, context, targets=nil, params={})
56
+ @ntimes = ntimes
57
+ @context = context
58
+ @targets = targets && !targets.empty? ? targets : TARGETS.dup
59
+ @testmode = params[:testmode] || 'execute'
60
+ @erubyfile = params[:erubyfile] || 'erubybench.rhtml'
61
+ @printout = params[:printout] || false
62
+ end
63
+
64
+ attr_accessor :ntimes, :targets
65
+ attr_accessor :testmode, :erubyfile, :contextfile, :printout
66
+
67
+ def context2code(context, varname='context')
68
+ s = ''
69
+ context.each { |k, | s << "#{k} = #{varname}[#{k.inspect}]; " }
70
+ return s
71
+ end
72
+
73
+ def perform_benchmark
74
+ width = 30
75
+ $stderr.puts "*** ntimes=#{@ntimes}, testmode=#{@testmode}"
76
+ Benchmark.bm(width) do |job|
77
+ for target in @targets do
78
+ method = "#{@testmode}_#{target.gsub(/::|-|\(/, '_').gsub(/\)/, '').downcase}"
79
+ #$stderr.puts "*** debug: method=#{method.inspect}"
80
+ next unless self.respond_to?(method)
81
+ filename = "bench_#{(target =~ /^(\w+)/) && $1.downcase}.rhtml"
82
+ title = target
83
+ output = nil
84
+ job.report(title) do
85
+ output = self.__send__(method, filename, @context)
86
+ end
87
+ File.write("output.#{target.gsub(/[^\w]/,'')}", output) if @printout && output && !output.empty?
88
+ end
89
+ end
90
+ end
91
+
92
+ ##
93
+
94
+ def execute_eruby(filename, context)
95
+ return unless ERuby
96
+ eval context2code(context)
97
+ @ntimes.times do
98
+ ERuby.import(filename)
99
+ end
100
+ return nil
101
+ end
102
+
103
+ def execute_erb(filename, context)
104
+ eval context2code(context)
105
+ output = nil
106
+ @ntimes.times do
107
+ eruby = ERB.new(File.read(filename))
108
+ output = eruby.result(binding())
109
+ print output
110
+ end
111
+ return output
112
+ end
113
+
114
+ def execute_erb_cached(filename, context)
115
+ eval context2code(context)
116
+ output = nil
117
+ cachefile = filename + '.cache'
118
+ File.unlink(cachefile) if test(?f, cachefile)
119
+ @ntimes.times do
120
+ if !test(?f, cachefile) || File.mtime(filename) > File.mtime(cachefile)
121
+ eruby = ERB.new(File.read(filename))
122
+ File.write(cachefile, eruby.src)
123
+ else
124
+ eruby = ERB.new('')
125
+ #eruby.src = File.read(cachefile)
126
+ eruby.instance_variable_set("@src", File.read(cachefile))
127
+ end
128
+ output = eruby.result(binding())
129
+ print output
130
+ end
131
+ return output
132
+ end
133
+
134
+ ## no cached
135
+ for klass in %w[Eruby FastEruby TinyEruby ArrayBufferEruby PrintOutEruby StdoutEruby] do
136
+ s = <<-END
137
+ def execute_erubis_#{klass.downcase}(filename, context)
138
+ eval context2code(context)
139
+ output = nil
140
+ @ntimes.times do
141
+ eruby = Erubis::#{klass}.new(File.read(filename))
142
+ output = eruby.result(binding())
143
+ print output
144
+ end
145
+ return output
146
+ end
147
+ END
148
+ eval s
149
+ end
150
+
151
+ ## cached
152
+ for klass in %w[Eruby FastEruby] do
153
+ s = <<-END
154
+ def execute_erubis_#{klass.downcase}_cached(filename, context)
155
+ eval context2code(context)
156
+ cachefile = filename + '.cache'
157
+ File.unlink(cachefile) if test(?f, cachefile)
158
+ output = nil
159
+ @ntimes.times do
160
+ eruby = Erubis::#{klass}.load_file(filename)
161
+ output = eruby.result(binding())
162
+ print output
163
+ end
164
+ savefile = cachefile.sub(/\\.cache$/, '.#{klass.downcase}.cache')
165
+ File.rename(cachefile, savefile)
166
+ return output
167
+ end
168
+ END
169
+ eval s
170
+ end
171
+
172
+ ##
173
+
174
+ def convert_eruby(filename, context)
175
+ return unless ERuby
176
+ eval context2code(context)
177
+ output = nil
178
+ @ntimes.times do
179
+ output = ERuby::Compiler.new.compile_string(File.read(filename))
180
+ end
181
+ return output
182
+ end
183
+
184
+ def convert_erb(filename, context)
185
+ eval context2code(context)
186
+ output = nil
187
+ @ntimes.times do
188
+ eruby = ERB.new(File.read(filename))
189
+ output = eruby.src
190
+ end
191
+ return output
192
+ end
193
+
194
+ for klass in %w[Eruby FastEruby TinyEruby]
195
+ s = <<-END
196
+ def convert_erubis_#{klass.downcase}(filename, context)
197
+ eval context2code(context)
198
+ output = nil
199
+ @ntimes.times do
200
+ eruby = Erubis::#{klass}.new(File.read(filename))
201
+ output = eruby.src
202
+ end
203
+ return output
204
+ end
205
+ END
206
+ eval s
207
+ end
208
+
209
+ end
210
+
211
+
212
+ require 'optparse'
213
+
214
+ class MainApplication
215
+
216
+ def parse_argv(argv=ARGV)
217
+ optparser = OptionParser.new
218
+ options = {}
219
+ ['-h', '-n N', '-t erubyfile', '-f contextfile', '-A', '-e',
220
+ '-x exclude', '-m testmode', '-X', '-p', '-D'].each do |opt|
221
+ optparser.on(opt) { |val| options[opt[1].chr] = val }
222
+ end
223
+ begin
224
+ targets = optparser.parse!(argv)
225
+ rescue => ex
226
+ $stderr.puts "#{@script}: #{ex.to_s}"
227
+ exit(1)
228
+ end
229
+ return options, targets
230
+ end
231
+
232
+ def execute
233
+ @script = File.basename($0)
234
+ ntimes = 1000
235
+ targets = BenchmarkApplication::TARGETS.dup
236
+ testmode = 'execute'
237
+ contextfile = 'bench_context.yaml'
238
+ #
239
+ options, args = parse_argv(ARGV)
240
+ ntimes = options['n'].to_i if options['n']
241
+ targets = args if args && !args.empty?
242
+ targets = targets - options['x'].split(/,/) if options['x']
243
+ testmode = options['m'] if options['m']
244
+ contextfile = options['f'] if options['f']
245
+ erubyfile = options['t'] if options['t']
246
+ #
247
+ if options['h']
248
+ $stderr.puts "Usage: ruby #{@script} [..options..] [..targets..]"
249
+ $stderr.puts " -h : help"
250
+ $stderr.puts " -n N : loop N times"
251
+ $stderr.puts " -f datafile : context data filename (*.yaml)"
252
+ $stderr.puts " -x exclude : exclude target name"
253
+ $stdout.puts " -m testmode : 'execute' or 'convert' (default 'execute')"
254
+ $stderr.puts " -p : print output to file (filename: 'output.TARGETNAME')"
255
+ return
256
+ end
257
+ #
258
+ #if ! options['t']
259
+ for item in %w[eruby erb erubis]
260
+ fname = "bench_#{item}.rhtml"
261
+ header = File.read("templates/_header.html")
262
+ #body = File.read("templates/#{erubyfile}")
263
+ body = File.read("templates/#{fname}")
264
+ footer = File.read("templates/_footer.html")
265
+ content = header + body + footer
266
+ File.write(fname, content)
267
+ end
268
+ #
269
+ if options['e'] # escape
270
+ tuples = [
271
+ [ 'bench_eruby.rhtml', '<%= CGI.escapeHTML((\1).to_s) %>' ],
272
+ [ 'bench_erb.rhtml', '<%=h \1 %>' ],
273
+ [ 'bench_erubis.rhtml', '<%== \1 %>' ],
274
+ ]
275
+ for fname, replace in tuples
276
+ content = File.read(fname).gsub(/<%= ?(.*?) ?%>/, replace)
277
+ File.write(fname, content)
278
+ end
279
+ targets.delete('Erubis::TinyEruby') ## because TinyEruby doesn't support '<%== =>'
280
+ end
281
+ #
282
+ context = YAML.load_file(contextfile)
283
+ #
284
+ params = {
285
+ :printout=>options['p'],
286
+ :testmode=>testmode,
287
+ }
288
+ app = BenchmarkApplication.new(ntimes, context, targets, params)
289
+ app.perform_benchmark()
290
+ end
291
+
292
+ end
293
+
294
+
295
+ if __FILE__ == $0
296
+
297
+ ## open /dev/null
298
+ $stdout = File.open('/dev/null', 'w')
299
+ at_exit do
300
+ $stdout.close()
301
+ end
302
+
303
+ ## start benchmark
304
+ MainApplication.new().execute()
305
+
306
+ end