ghazel-erubis 2.6.5.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (298) hide show
  1. data/CHANGES.txt +744 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.txt +102 -0
  4. data/benchmark/Makefile +6 -0
  5. data/benchmark/bench.rb +313 -0
  6. data/benchmark/bench_context.yaml +141 -0
  7. data/benchmark/templates/_footer.html +4 -0
  8. data/benchmark/templates/_header.html +52 -0
  9. data/benchmark/templates/bench_erb.rhtml +29 -0
  10. data/benchmark/templates/bench_erubis.rhtml +29 -0
  11. data/benchmark/templates/bench_eruby.rhtml +29 -0
  12. data/bin/erubis +10 -0
  13. data/contrib/erubis +3330 -0
  14. data/contrib/erubis-run.rb +132 -0
  15. data/contrib/inline-require +179 -0
  16. data/doc/docstyle.css +188 -0
  17. data/doc/users-guide.html +3285 -0
  18. data/doc-api/classes/ActionView/TemplateHandlers/ErubisHandler.html +209 -0
  19. data/doc-api/classes/ActionView.html +105 -0
  20. data/doc-api/classes/ERB.html +101 -0
  21. data/doc-api/classes/Erubis/ArrayBufferEnhancer.html +175 -0
  22. data/doc-api/classes/Erubis/ArrayBufferEruby.html +120 -0
  23. data/doc-api/classes/Erubis/ArrayEnhancer.html +174 -0
  24. data/doc-api/classes/Erubis/ArrayEruby.html +120 -0
  25. data/doc-api/classes/Erubis/Basic/Converter.html +327 -0
  26. data/doc-api/classes/Erubis/Basic/Engine.html +130 -0
  27. data/doc-api/classes/Erubis/Basic.html +112 -0
  28. data/doc-api/classes/Erubis/BiPatternEnhancer.html +215 -0
  29. data/doc-api/classes/Erubis/BiPatternEruby.html +120 -0
  30. data/doc-api/classes/Erubis/CGenerator.html +386 -0
  31. data/doc-api/classes/Erubis/CommandOptionError.html +113 -0
  32. data/doc-api/classes/Erubis/Context.html +344 -0
  33. data/doc-api/classes/Erubis/Converter.html +283 -0
  34. data/doc-api/classes/Erubis/DeleteIndentEnhancer.html +150 -0
  35. data/doc-api/classes/Erubis/DeleteIndentEruby.html +120 -0
  36. data/doc-api/classes/Erubis/Ec.html +126 -0
  37. data/doc-api/classes/Erubis/Ejava.html +126 -0
  38. data/doc-api/classes/Erubis/Ejavascript.html +126 -0
  39. data/doc-api/classes/Erubis/Engine.html +305 -0
  40. data/doc-api/classes/Erubis/Eperl.html +126 -0
  41. data/doc-api/classes/Erubis/Ephp.html +126 -0
  42. data/doc-api/classes/Erubis/ErboutEnhancer.html +175 -0
  43. data/doc-api/classes/Erubis/ErboutEruby.html +120 -0
  44. data/doc-api/classes/Erubis/ErubisError.html +117 -0
  45. data/doc-api/classes/Erubis/Eruby.html +132 -0
  46. data/doc-api/classes/Erubis/EscapeEnhancer.html +165 -0
  47. data/doc-api/classes/Erubis/EscapedEc.html +120 -0
  48. data/doc-api/classes/Erubis/EscapedEjava.html +120 -0
  49. data/doc-api/classes/Erubis/EscapedEjavascript.html +120 -0
  50. data/doc-api/classes/Erubis/EscapedEperl.html +120 -0
  51. data/doc-api/classes/Erubis/EscapedEphp.html +120 -0
  52. data/doc-api/classes/Erubis/EscapedEruby.html +127 -0
  53. data/doc-api/classes/Erubis/EscapedEscheme.html +120 -0
  54. data/doc-api/classes/Erubis/Escheme.html +126 -0
  55. data/doc-api/classes/Erubis/Evaluator.html +212 -0
  56. data/doc-api/classes/Erubis/FastEruby.html +131 -0
  57. data/doc-api/classes/Erubis/Generator.html +416 -0
  58. data/doc-api/classes/Erubis/HeaderFooterEnhancer.html +267 -0
  59. data/doc-api/classes/Erubis/HeaderFooterEruby.html +120 -0
  60. data/doc-api/classes/Erubis/Helpers/RailsFormHelper.html +787 -0
  61. data/doc-api/classes/Erubis/Helpers/RailsHelper/TemplateConverter.html +213 -0
  62. data/doc-api/classes/Erubis/Helpers/RailsHelper.html +349 -0
  63. data/doc-api/classes/Erubis/Helpers.html +116 -0
  64. data/doc-api/classes/Erubis/InterpolationEnhancer.html +306 -0
  65. data/doc-api/classes/Erubis/InterpolationEruby.html +120 -0
  66. data/doc-api/classes/Erubis/JavaGenerator.html +359 -0
  67. data/doc-api/classes/Erubis/JavascriptGenerator.html +386 -0
  68. data/doc-api/classes/Erubis/Main.html +341 -0
  69. data/doc-api/classes/Erubis/NoCodeEnhancer.html +249 -0
  70. data/doc-api/classes/Erubis/NoCodeEruby.html +120 -0
  71. data/doc-api/classes/Erubis/NoTextEnhancer.html +159 -0
  72. data/doc-api/classes/Erubis/NoTextEruby.html +120 -0
  73. data/doc-api/classes/Erubis/NotSupportedError.html +119 -0
  74. data/doc-api/classes/Erubis/OptimizedEruby.html +163 -0
  75. data/doc-api/classes/Erubis/OptimizedGenerator.html +439 -0
  76. data/doc-api/classes/Erubis/OptimizedXmlEruby.html +163 -0
  77. data/doc-api/classes/Erubis/PI/Converter.html +266 -0
  78. data/doc-api/classes/Erubis/PI/Ec.html +166 -0
  79. data/doc-api/classes/Erubis/PI/Ejava.html +166 -0
  80. data/doc-api/classes/Erubis/PI/Ejavascript.html +166 -0
  81. data/doc-api/classes/Erubis/PI/Engine.html +122 -0
  82. data/doc-api/classes/Erubis/PI/Eperl.html +166 -0
  83. data/doc-api/classes/Erubis/PI/Ephp.html +166 -0
  84. data/doc-api/classes/Erubis/PI/Eruby.html +155 -0
  85. data/doc-api/classes/Erubis/PI/Escheme.html +166 -0
  86. data/doc-api/classes/Erubis/PI/TinyEruby.html +293 -0
  87. data/doc-api/classes/Erubis/PI.html +124 -0
  88. data/doc-api/classes/Erubis/PercentLineEnhancer.html +179 -0
  89. data/doc-api/classes/Erubis/PercentLineEruby.html +120 -0
  90. data/doc-api/classes/Erubis/PerlGenerator.html +344 -0
  91. data/doc-api/classes/Erubis/PhpGenerator.html +350 -0
  92. data/doc-api/classes/Erubis/PreprocessingEruby.html +183 -0
  93. data/doc-api/classes/Erubis/PreprocessingHelper.html +212 -0
  94. data/doc-api/classes/Erubis/PrintEnabledEnhancer.html +212 -0
  95. data/doc-api/classes/Erubis/PrintEnabledEruby.html +120 -0
  96. data/doc-api/classes/Erubis/PrintOutEnhancer.html +244 -0
  97. data/doc-api/classes/Erubis/PrintOutEruby.html +120 -0
  98. data/doc-api/classes/Erubis/PrintOutSimplifiedEruby.html +121 -0
  99. data/doc-api/classes/Erubis/RubyEvaluator.html +227 -0
  100. data/doc-api/classes/Erubis/RubyGenerator.html +327 -0
  101. data/doc-api/classes/Erubis/SchemeGenerator.html +382 -0
  102. data/doc-api/classes/Erubis/SimplifiedEruby.html +120 -0
  103. data/doc-api/classes/Erubis/SimplifyEnhancer.html +191 -0
  104. data/doc-api/classes/Erubis/StdoutEnhancer.html +173 -0
  105. data/doc-api/classes/Erubis/StdoutEruby.html +120 -0
  106. data/doc-api/classes/Erubis/StdoutSimplifiedEruby.html +121 -0
  107. data/doc-api/classes/Erubis/StringBufferEnhancer.html +174 -0
  108. data/doc-api/classes/Erubis/StringBufferEruby.html +120 -0
  109. data/doc-api/classes/Erubis/StringIOEruby.html +120 -0
  110. data/doc-api/classes/Erubis/TinyEruby.html +298 -0
  111. data/doc-api/classes/Erubis/XmlEruby.html +130 -0
  112. data/doc-api/classes/Erubis/XmlHelper.html +255 -0
  113. data/doc-api/classes/Erubis.html +353 -0
  114. data/doc-api/created.rid +1 -0
  115. data/doc-api/files/README_txt.html +247 -0
  116. data/doc-api/files/erubis/context_rb.html +107 -0
  117. data/doc-api/files/erubis/converter_rb.html +114 -0
  118. data/doc-api/files/erubis/engine/ec_rb.html +115 -0
  119. data/doc-api/files/erubis/engine/ejava_rb.html +115 -0
  120. data/doc-api/files/erubis/engine/ejavascript_rb.html +115 -0
  121. data/doc-api/files/erubis/engine/enhanced_rb.html +115 -0
  122. data/doc-api/files/erubis/engine/eperl_rb.html +115 -0
  123. data/doc-api/files/erubis/engine/ephp_rb.html +115 -0
  124. data/doc-api/files/erubis/engine/eruby_rb.html +115 -0
  125. data/doc-api/files/erubis/engine/escheme_rb.html +115 -0
  126. data/doc-api/files/erubis/engine/optimized_rb.html +114 -0
  127. data/doc-api/files/erubis/engine_rb.html +117 -0
  128. data/doc-api/files/erubis/enhancer_rb.html +107 -0
  129. data/doc-api/files/erubis/error_rb.html +107 -0
  130. data/doc-api/files/erubis/evaluator_rb.html +115 -0
  131. data/doc-api/files/erubis/generator_rb.html +114 -0
  132. data/doc-api/files/erubis/helper_rb.html +107 -0
  133. data/doc-api/files/erubis/helpers/rails_form_helper_rb.html +107 -0
  134. data/doc-api/files/erubis/helpers/rails_helper_rb.html +116 -0
  135. data/doc-api/files/erubis/local-setting_rb.html +107 -0
  136. data/doc-api/files/erubis/main_rb.html +127 -0
  137. data/doc-api/files/erubis/preprocessing_rb.html +114 -0
  138. data/doc-api/files/erubis/tiny_rb.html +107 -0
  139. data/doc-api/files/erubis_rb.html +118 -0
  140. data/doc-api/fr_class_index.html +122 -0
  141. data/doc-api/fr_file_index.html +51 -0
  142. data/doc-api/fr_method_index.html +251 -0
  143. data/doc-api/index.html +24 -0
  144. data/doc-api/rdoc-style.css +208 -0
  145. data/examples/basic/Makefile +53 -0
  146. data/examples/basic/example.ec +42 -0
  147. data/examples/basic/example.ejava +45 -0
  148. data/examples/basic/example.ejs +16 -0
  149. data/examples/basic/example.eperl +16 -0
  150. data/examples/basic/example.ephp +17 -0
  151. data/examples/basic/example.eruby +15 -0
  152. data/examples/basic/example.escheme +26 -0
  153. data/examples/pi/Makefile +54 -0
  154. data/examples/pi/example.ec +42 -0
  155. data/examples/pi/example.ejava +45 -0
  156. data/examples/pi/example.ejs +16 -0
  157. data/examples/pi/example.eperl +16 -0
  158. data/examples/pi/example.ephp +17 -0
  159. data/examples/pi/example.eruby +15 -0
  160. data/examples/pi/example.escheme +26 -0
  161. data/lib/erubis/context.rb +83 -0
  162. data/lib/erubis/converter.rb +357 -0
  163. data/lib/erubis/engine/ec.rb +117 -0
  164. data/lib/erubis/engine/ejava.rb +110 -0
  165. data/lib/erubis/engine/ejavascript.rb +119 -0
  166. data/lib/erubis/engine/enhanced.rb +121 -0
  167. data/lib/erubis/engine/eperl.rb +95 -0
  168. data/lib/erubis/engine/ephp.rb +99 -0
  169. data/lib/erubis/engine/eruby.rb +124 -0
  170. data/lib/erubis/engine/escheme.rb +114 -0
  171. data/lib/erubis/engine/optimized.rb +127 -0
  172. data/lib/erubis/engine.rb +120 -0
  173. data/lib/erubis/enhancer.rb +680 -0
  174. data/lib/erubis/error.rb +23 -0
  175. data/lib/erubis/evaluator.rb +88 -0
  176. data/lib/erubis/generator.rb +85 -0
  177. data/lib/erubis/helper.rb +47 -0
  178. data/lib/erubis/helpers/rails_form_helper.rb +197 -0
  179. data/lib/erubis/helpers/rails_helper.rb +353 -0
  180. data/lib/erubis/local-setting.rb +9 -0
  181. data/lib/erubis/main.rb +489 -0
  182. data/lib/erubis/preprocessing.rb +58 -0
  183. data/lib/erubis/tiny.rb +144 -0
  184. data/lib/erubis.rb +72 -0
  185. data/setup.rb +1331 -0
  186. data/test/assert-text-equal.rb +44 -0
  187. data/test/data/users-guide/Example.ejava +55 -0
  188. data/test/data/users-guide/array_example.result +9 -0
  189. data/test/data/users-guide/arraybuffer_example.result +9 -0
  190. data/test/data/users-guide/bipattern-example.rhtml +4 -0
  191. data/test/data/users-guide/bipattern_example.result +6 -0
  192. data/test/data/users-guide/context.rb +6 -0
  193. data/test/data/users-guide/context.yaml +8 -0
  194. data/test/data/users-guide/def_method.rb +14 -0
  195. data/test/data/users-guide/def_method.result +3 -0
  196. data/test/data/users-guide/escape_example.result +9 -0
  197. data/test/data/users-guide/example.ec +27 -0
  198. data/test/data/users-guide/example.ejs +20 -0
  199. data/test/data/users-guide/example.eperl +18 -0
  200. data/test/data/users-guide/example.ephp +18 -0
  201. data/test/data/users-guide/example.eruby +6 -0
  202. data/test/data/users-guide/example.escheme +28 -0
  203. data/test/data/users-guide/example1.eruby +6 -0
  204. data/test/data/users-guide/example1.rb +17 -0
  205. data/test/data/users-guide/example1.result +16 -0
  206. data/test/data/users-guide/example10.rb +4 -0
  207. data/test/data/users-guide/example10.result +17 -0
  208. data/test/data/users-guide/example10.xhtml +14 -0
  209. data/test/data/users-guide/example10_x.result +17 -0
  210. data/test/data/users-guide/example11.php +20 -0
  211. data/test/data/users-guide/example11.result +23 -0
  212. data/test/data/users-guide/example11.rhtml +21 -0
  213. data/test/data/users-guide/example11_C.result +10 -0
  214. data/test/data/users-guide/example11_N.result +16 -0
  215. data/test/data/users-guide/example11_U.result +16 -0
  216. data/test/data/users-guide/example11_php.result +15 -0
  217. data/test/data/users-guide/example1_x.result +9 -0
  218. data/test/data/users-guide/example2.eruby +7 -0
  219. data/test/data/users-guide/example2.rb +10 -0
  220. data/test/data/users-guide/example2.result +27 -0
  221. data/test/data/users-guide/example2_trim.result +10 -0
  222. data/test/data/users-guide/example2_x.result +10 -0
  223. data/test/data/users-guide/example3.eruby +6 -0
  224. data/test/data/users-guide/example3.rb +10 -0
  225. data/test/data/users-guide/example31.result +22 -0
  226. data/test/data/users-guide/example32.result +4 -0
  227. data/test/data/users-guide/example3_e.result +8 -0
  228. data/test/data/users-guide/example4.eruby +3 -0
  229. data/test/data/users-guide/example4.rb +11 -0
  230. data/test/data/users-guide/example4.result +10 -0
  231. data/test/data/users-guide/example4_x.result +5 -0
  232. data/test/data/users-guide/example5.eruby +6 -0
  233. data/test/data/users-guide/example5.rb +16 -0
  234. data/test/data/users-guide/example5.result +7 -0
  235. data/test/data/users-guide/example6.rb +12 -0
  236. data/test/data/users-guide/example6.result +7 -0
  237. data/test/data/users-guide/example7.eruby +8 -0
  238. data/test/data/users-guide/example71.result +13 -0
  239. data/test/data/users-guide/example72.result +13 -0
  240. data/test/data/users-guide/example8.eruby +6 -0
  241. data/test/data/users-guide/example8_ruby.result +7 -0
  242. data/test/data/users-guide/example8_yaml.result +7 -0
  243. data/test/data/users-guide/example9.eruby +3 -0
  244. data/test/data/users-guide/example9.rb +8 -0
  245. data/test/data/users-guide/example9.result +9 -0
  246. data/test/data/users-guide/example91.result +5 -0
  247. data/test/data/users-guide/example92.result +4 -0
  248. data/test/data/users-guide/example_c.result +29 -0
  249. data/test/data/users-guide/example_java.result +56 -0
  250. data/test/data/users-guide/example_js.result +22 -0
  251. data/test/data/users-guide/example_perl.result +20 -0
  252. data/test/data/users-guide/example_php.result +19 -0
  253. data/test/data/users-guide/example_scheme.result +30 -0
  254. data/test/data/users-guide/example_scheme_display.result +29 -0
  255. data/test/data/users-guide/fasteruby.rb +11 -0
  256. data/test/data/users-guide/fasteruby.result +38 -0
  257. data/test/data/users-guide/fasteruby.rhtml +15 -0
  258. data/test/data/users-guide/headerfooter-example.eruby +9 -0
  259. data/test/data/users-guide/headerfooter-example2.rb +8 -0
  260. data/test/data/users-guide/headerfooter-example2.rhtml +10 -0
  261. data/test/data/users-guide/headerfooter_example.result +11 -0
  262. data/test/data/users-guide/headerfooter_example2.result +13 -0
  263. data/test/data/users-guide/interpolation_example.result +9 -0
  264. data/test/data/users-guide/main_program1.rb +8 -0
  265. data/test/data/users-guide/main_program1.result +6 -0
  266. data/test/data/users-guide/main_program2.rb +8 -0
  267. data/test/data/users-guide/main_program2.result +6 -0
  268. data/test/data/users-guide/nocode-example.eruby +14 -0
  269. data/test/data/users-guide/nocode-php.result +20 -0
  270. data/test/data/users-guide/nocode_example.result +15 -0
  271. data/test/data/users-guide/normal-eruby-test.eruby +9 -0
  272. data/test/data/users-guide/normal_eruby_test.result +11 -0
  273. data/test/data/users-guide/notext-example.eruby +14 -0
  274. data/test/data/users-guide/notext-example.php +19 -0
  275. data/test/data/users-guide/notext-php.result +20 -0
  276. data/test/data/users-guide/notext_example.result +16 -0
  277. data/test/data/users-guide/percentline-example.rhtml +4 -0
  278. data/test/data/users-guide/percentline_example.result +7 -0
  279. data/test/data/users-guide/printenable_example.result +4 -0
  280. data/test/data/users-guide/printenabled-example.eruby +3 -0
  281. data/test/data/users-guide/printenabled-example.rb +8 -0
  282. data/test/data/users-guide/printstatement_example.result +8 -0
  283. data/test/data/users-guide/simplify_example.result +9 -0
  284. data/test/data/users-guide/stderr.log +3 -0
  285. data/test/data/users-guide/stdout_exmple.result +9 -0
  286. data/test/data/users-guide/stringbuffer_example.result +9 -0
  287. data/test/data/users-guide/tail_260.result +4 -0
  288. data/test/data/users-guide/tailnewline.rhtml +3 -0
  289. data/test/data/users-guide/template1.rhtml +4 -0
  290. data/test/data/users-guide/template2.rhtml +4 -0
  291. data/test/test-engines.rb +369 -0
  292. data/test/test-enhancers.rb +570 -0
  293. data/test/test-erubis.rb +883 -0
  294. data/test/test-main.rb +721 -0
  295. data/test/test-users-guide.rb +57 -0
  296. data/test/test.rb +29 -0
  297. data/test/testutil.rb +96 -0
  298. metadata +360 -0
@@ -0,0 +1,883 @@
1
+ ##
2
+ ## $Release: 2.6.5 $
3
+ ## copyright(c) 2006-2009 kuwata-lab.com all rights reserved.
4
+ ##
5
+
6
+ require "#{File.dirname(__FILE__)}/test.rb"
7
+
8
+ require 'stringio'
9
+
10
+ require 'erubis'
11
+ require 'erubis/engine/enhanced'
12
+ require 'erubis/engine/optimized'
13
+ require 'erubis/tiny'
14
+
15
+
16
+ class ErubisTest < Test::Unit::TestCase
17
+
18
+ testdata_list = load_yaml_datafile(__FILE__)
19
+ define_testmethods(testdata_list)
20
+
21
+
22
+ def _test()
23
+ @src.gsub!(/\^/, ' ')
24
+ @output.gsub!(/\^/, ' ') if @output.is_a?(String)
25
+ if @class
26
+ k = Erubis
27
+ @class.split('::').each do |name| k = k.const_get(name) end
28
+ @klass = k
29
+ else
30
+ @klass = Erubis::Eruby
31
+ end
32
+ @options ||= {}
33
+ @chomp.each do |target|
34
+ case target
35
+ when 'src' ; @src.chomp!
36
+ when 'input' ; @input.chomp!
37
+ when 'expected' ; @expected.chomp!
38
+ else
39
+ raise "#{@name}: invalid chomp value: #{@chomp.inspect}"
40
+ end
41
+ end if @chomp
42
+
43
+ if @testopt == 'load_file'
44
+ filename = "tmp.#{@name}.eruby"
45
+ begin
46
+ File.open(filename, 'w') { |f| f.write(@input) }
47
+ eruby = @klass.load_file(filename, @options)
48
+ ensure
49
+ cachename = filename + '.cache'
50
+ File.unlink(cachename) if test(?f, cachename)
51
+ File.unlink(filename) if test(?f, filename)
52
+ end
53
+ else
54
+ if @klass == Erubis::TinyEruby
55
+ eruby = @klass.new(@input)
56
+ else
57
+ eruby = @klass.new(@input, @options)
58
+ end
59
+ end
60
+ assert_text_equal(@src, eruby.src)
61
+
62
+ return if @testopt == 'skip_output'
63
+
64
+ list = ['<aaa>', 'b&b', '"ccc"']
65
+ context = @testopt == 'context' ? Erubis::Context.new : {}
66
+ context[:list] = list
67
+
68
+ case @testopt
69
+ when /\Aeval\(/
70
+ eval eruby.src
71
+ actual = eval @testopt
72
+ assert_text_equal(@output, actual)
73
+ when 'stdout', 'print'
74
+ begin
75
+ orig = $stdout
76
+ $stdout = stringio = StringIO.new
77
+ #actual = eruby.evaluate(context)
78
+ actual = eruby.result(context)
79
+ ensure
80
+ $stdout = orig
81
+ end
82
+ if @testopt == 'stdout'
83
+ assert_equal("", actual)
84
+ else
85
+ assert_nil(actual)
86
+ end
87
+ assert_text_equal(@output, stringio.string)
88
+ when 'evaluate', 'context'
89
+ actual = eruby.evaluate(context)
90
+ assert_text_equal(@output, actual)
91
+ when 'binding'
92
+ actual = eruby.result(binding())
93
+ assert_text_equal(@output, actual)
94
+ else
95
+ actual = eruby.result(context)
96
+ assert_text_equal(@output, actual)
97
+ end
98
+ end
99
+
100
+
101
+ def test_load_file_cache1
102
+ @input = <<END
103
+ <ul>
104
+ <% for item in @list %>
105
+ <li><%= item %></li>
106
+ <% end %>
107
+ </ul>
108
+ END
109
+ @src = <<END
110
+ _buf = ''; _buf << '<ul>
111
+ '; for item in @list
112
+ _buf << ' <li>'; _buf << ( item ).to_s; _buf << '</li>
113
+ '; end
114
+ _buf << '</ul>
115
+ ';
116
+ _buf.to_s
117
+ END
118
+ @klass = Erubis::Eruby
119
+ filename = 'tmp.load_file_timestamp1'
120
+ cachename = filename + '.cache'
121
+ begin
122
+ File.open(filename, 'w') { |f| f.write(@input) }
123
+ assert_block() { !test(?f, cachename) }
124
+ engine = @klass.load_file(filename)
125
+ assert_block() { test(?f, cachename) }
126
+ assert_block() { File.mtime(filename) <= File.mtime(cachename) }
127
+ assert_text_equal(@src, engine.src)
128
+ #
129
+ input2 = @input.gsub(/ul>/, 'ol>')
130
+ src2 = @src.gsub(/ul>/, 'ol>')
131
+ mtime = File.mtime(filename)
132
+ File.open(filename, 'w') { |f| f.write(input2) }
133
+ t1 = Time.now()
134
+ sleep(1)
135
+ t2 = Time.now()
136
+ File.utime(t1, t1, filename)
137
+ File.utime(t2, t2, cachename)
138
+ assert_block('cache should be newer') { File.mtime(filename) < File.mtime(cachename) }
139
+ engine = @klass.load_file(filename)
140
+ assert_block('cache should be newer') { File.mtime(filename) < File.mtime(cachename) }
141
+ assert_text_equal(@src, engine.src)
142
+ #
143
+ File.utime(t2, t2, filename)
144
+ File.utime(t1, t1, cachename)
145
+ assert_block('cache should be older') { File.mtime(filename) > File.mtime(cachename) }
146
+ engine = @klass.load_file(filename)
147
+ assert_block('cache should be newer') { File.mtime(filename) <= File.mtime(cachename) }
148
+ assert_text_equal(src2, engine.src)
149
+ ensure
150
+ File.unlink(cachename) if File.file?(cachename)
151
+ File.unlink(filename) if File.file?(filename)
152
+ end
153
+ end
154
+
155
+
156
+ class Dummy
157
+ end
158
+
159
+ def _class_has_instance_method(klass, method)
160
+ return klass.instance_methods.collect{|m| m.to_s}.include?(method.to_s)
161
+ end
162
+
163
+ def test_def_method1
164
+ s = "<%for i in list%>i=<%=i%>\n<%end%>"
165
+ eruby = Erubis::Eruby.new(s)
166
+ assert(! _class_has_instance_method(Dummy, 'render'))
167
+ eruby.def_method(Dummy, 'render(list)', 'foo.rhtml')
168
+ assert(_class_has_instance_method(Dummy, 'render'))
169
+ actual = Dummy.new().render(%w[1 2 3])
170
+ assert_equal("i=1\ni=2\ni=3\n", actual)
171
+ end
172
+
173
+ def test_def_method2
174
+ s = "<%for i in list%>i=<%=i%>\n<%end%>"
175
+ eruby = Erubis::Eruby.new(s)
176
+ assert(! (eruby.respond_to? :render))
177
+ eruby.def_method(eruby, 'render(list)', 'foo.rhtml')
178
+ assert eruby.respond_to?(:render)
179
+ actual = eruby.render([1, 2, 3])
180
+ assert_equal("i=1\ni=2\ni=3\n", actual)
181
+ assert(! _class_has_instance_method(eruby.class, 'render'))
182
+ end
183
+
184
+ def test_evaluate_creates_proc
185
+ s = "hello <%= @name %>"
186
+ eruby = Erubis::Eruby.new(s)
187
+ assert_nil(eruby.instance_variable_get('@_proc'))
188
+ actual1 = eruby.evaluate(:name=>'world')
189
+ assert_not_nil(eruby.instance_variable_get('@_proc'))
190
+ assert_instance_of(Proc, eruby.instance_variable_get('@_proc'))
191
+ actual2 = eruby.evaluate(:name=>'world')
192
+ assert_equal(actual1, actual2)
193
+ # convert() must clear @_proc
194
+ eruby.convert(s)
195
+ assert_nil(eruby.instance_variable_get('@_proc'))
196
+ end
197
+
198
+ #def test_toplevel_binding
199
+ # s = "locals = <%= local_variables().inspect %>\n<% x = 50 %>\n"
200
+ # eruby = Erubis::Eruby.new(s)
201
+ # _x = eval 'x', TOPLEVEL_BINDING
202
+ # _y = eval 'y', TOPLEVEL_BINDING
203
+ # actual = eruby.evaluate(:x=>_x, :y=>_y)
204
+ # _x = eval 'x', TOPLEVEL_BINDING
205
+ # _y = eval 'y', TOPLEVEL_BINDING
206
+ # puts "*** actual=#{actual.inspect}, x=#{_x.inspect}, y=#{_y.inspect}"
207
+ #end
208
+
209
+ self.post_definition()
210
+
211
+ end
212
+
213
+ x = 10
214
+ y = 20
215
+
216
+
217
+ __END__
218
+ - name: basic1
219
+ input: &basic1_input|
220
+ <ul>
221
+ <% for item in list %>
222
+ <li><%= item %></li>
223
+ <% end %>
224
+ </ul>
225
+ src: &basic1_src|
226
+ _buf = ''; _buf << '<ul>
227
+ '; for item in list
228
+ _buf << ' <li>'; _buf << ( item ).to_s; _buf << '</li>
229
+ '; end
230
+ _buf << '</ul>
231
+ ';
232
+ _buf.to_s
233
+ output: &basic1_output|
234
+ <ul>
235
+ <li><aaa></li>
236
+ <li>b&b</li>
237
+ <li>"ccc"</li>
238
+ </ul>
239
+
240
+ ##
241
+ - name: basic2
242
+ input: |
243
+ <ul>
244
+ <% i = 0
245
+ for item in list
246
+ i += 1
247
+ %>
248
+ <li><%= item %></li>
249
+ <% end %>
250
+ </ul>
251
+ src: |
252
+ _buf = ''; _buf << '<ul>
253
+ '; i = 0
254
+ for item in list
255
+ i += 1
256
+ ^^^
257
+ _buf << ' <li>'; _buf << ( item ).to_s; _buf << '</li>
258
+ '; end
259
+ _buf << '</ul>
260
+ ';
261
+ _buf.to_s
262
+ output: *basic1_output
263
+ # <ul>
264
+ # <li><aaa></li>
265
+ # <li>b&b</li>
266
+ # <li>"ccc"</li>
267
+ # </ul>
268
+
269
+ ##
270
+ - name: basic3
271
+ input: |
272
+ <ul><% i = 0
273
+ for item in list
274
+ i += 1 %><li><%= item %></li><% end %>
275
+ </ul>
276
+ src: |
277
+ _buf = ''; _buf << '<ul>'; i = 0
278
+ for item in list
279
+ i += 1 ; _buf << '<li>'; _buf << ( item ).to_s; _buf << '</li>'; end ; _buf << '
280
+ '; _buf << '</ul>
281
+ ';
282
+ _buf.to_s
283
+ output: |
284
+ <ul><li><aaa></li><li>b&b</li><li>"ccc"</li>
285
+ </ul>
286
+
287
+ ##
288
+ - name: context1
289
+ testopt: context
290
+ input: |
291
+ <ul>
292
+ <% for item in @list %>
293
+ <li><%= item %></li>
294
+ <% end %>
295
+ </ul>
296
+ src: |
297
+ _buf = ''; _buf << '<ul>
298
+ '; for item in @list
299
+ _buf << ' <li>'; _buf << ( item ).to_s; _buf << '</li>
300
+ '; end
301
+ _buf << '</ul>
302
+ ';
303
+ _buf.to_s
304
+ output: *basic1_output
305
+
306
+ ##
307
+ - name: ignore1
308
+ input: |
309
+ <ul>
310
+ <%# i = 0 %>
311
+ <% for item in list %>
312
+ <%#
313
+ i += 1
314
+ color = i % 2 == 0 ? '#FFCCCC' : '#CCCCFF'
315
+ %>
316
+ <li> <%#= i %> : <%= item %> </li>
317
+ <% end %>
318
+ </ul>
319
+ src: |
320
+ _buf = ''; _buf << '<ul>
321
+ ';
322
+ for item in list
323
+
324
+
325
+
326
+
327
+ _buf << ' <li> ';; _buf << ' : '; _buf << ( item ).to_s; _buf << ' </li>
328
+ '; end
329
+ _buf << '</ul>
330
+ ';
331
+ _buf.to_s
332
+ output: |
333
+ <ul>
334
+ <li> : <aaa> </li>
335
+ <li> : b&b </li>
336
+ <li> : "ccc" </li>
337
+ </ul>
338
+
339
+ ##
340
+ - name: quotation1
341
+ desc: single quotation and backslash
342
+ class: Eruby
343
+ input: &quotation1_input|
344
+ a = "'"
345
+ b = "\""
346
+ c = '\''
347
+ src: |
348
+ _buf = ''; _buf << 'a = "\'"
349
+ b = "\\""
350
+ c = \'\\\'\'
351
+ ';
352
+ _buf.to_s
353
+ output: *quotation1_input
354
+
355
+ ##
356
+ - name: minus1
357
+ desc: '<%- -%>'
358
+ class: Eruby
359
+ input: |
360
+ <ul>
361
+ <%- for item in list -%>
362
+ <li><%= item -%></li>
363
+ <% end -%>
364
+ </ul>
365
+ src: *basic1_src
366
+ output: *basic1_output
367
+
368
+ ##
369
+ - name: pattern1
370
+ options:
371
+ :pattern : '\[@ @\]'
372
+ input: |
373
+ <ul>
374
+ [@ for item in list @]
375
+ <li>[@= item @]</li>
376
+ [@ end @]
377
+ </ul>
378
+ src: |
379
+ _buf = ''; _buf << '<ul>
380
+ '; for item in list
381
+ _buf << ' <li>'; _buf << ( item ).to_s; _buf << '</li>
382
+ '; end
383
+ _buf << '</ul>
384
+ ';
385
+ _buf.to_s
386
+ output: *basic1_output
387
+ # <ul>
388
+ # <li><aaa></li>
389
+ # <li>b&b</li>
390
+ # <li>"ccc"</li>
391
+ # </ul>
392
+
393
+ ##
394
+ - name: pattern2
395
+ options:
396
+ :pattern : '<(?:!--)?% %(?:--)?>'
397
+ input: |
398
+ <ul>
399
+ <!--% for item in list %-->
400
+ <li><%= item %></li>
401
+ <!--% end %-->
402
+ </ul>
403
+ src: |
404
+ _buf = ''; _buf << '<ul>
405
+ '; for item in list
406
+ _buf << ' <li>'; _buf << ( item ).to_s; _buf << '</li>
407
+ '; end
408
+ _buf << '</ul>
409
+ ';
410
+ _buf.to_s
411
+ output: *basic1_output
412
+ # <ul>
413
+ # <li><aaa></li>
414
+ # <li>b&b</li>
415
+ # <li>"ccc"</li>
416
+ # </ul>
417
+
418
+ ##
419
+ - name: trim1
420
+ options:
421
+ :trim : false
422
+ input: *basic1_input
423
+ # <ul>
424
+ # <% for item in list %>
425
+ # <li><%= item %></li>
426
+ # <% end %>
427
+ # </ul>
428
+ src: |
429
+ _buf = ''; _buf << '<ul>
430
+ '; _buf << ' '; for item in list ; _buf << '
431
+ '; _buf << ' <li>'; _buf << ( item ).to_s; _buf << '</li>
432
+ '; _buf << ' '; end ; _buf << '
433
+ '; _buf << '</ul>
434
+ ';
435
+ _buf.to_s
436
+ output: |
437
+ <ul>
438
+ ^
439
+ <li><aaa></li>
440
+ ^
441
+ <li>b&b</li>
442
+ ^
443
+ <li>"ccc"</li>
444
+ ^
445
+ </ul>
446
+
447
+ ##
448
+ - name: bodyonly1
449
+ testopt: skip_output
450
+ options: { :preamble: no, :postamble: no }
451
+ input: *basic1_input
452
+ src: |4
453
+ _buf << '<ul>
454
+ '; for item in list
455
+ _buf << ' <li>'; _buf << ( item ).to_s; _buf << '</li>
456
+ '; end
457
+ _buf << '</ul>
458
+ ';
459
+ chomp: [src]
460
+ expected: null
461
+
462
+ ##
463
+ - name: loadfile1
464
+ testopt: load_file
465
+ #input: |
466
+ # <ul>
467
+ # <% for item in list %>
468
+ # <li><%= item %></li>
469
+ # <% end %>
470
+ # </ul>
471
+ input:
472
+ "<ul>\r\n <% for item in list %>\r\n <li><%= item %></li>\r\n <% end %>\r\n</ul>\r\n"
473
+ #src: |
474
+ # _buf = ''; _buf << "<ul>\n"
475
+ # for item in list
476
+ # _buf << " <li>"; _buf << ( item ).to_s; _buf << "</li>\n"
477
+ # end
478
+ # _buf << "</ul>\n"
479
+ # _buf
480
+ src:
481
+ "_buf = ''; _buf << '<ul>\r\n'; for item in list \r\n _buf << ' <li>'; _buf << ( item ).to_s; _buf << '</li>\r\n'; end \r\n _buf << '</ul>\r\n';\n_buf.to_s\n"
482
+ #output: |
483
+ # <ul>
484
+ # <li><aaa></li>
485
+ # <li>b&b</li>
486
+ # <li>"ccc"</li>
487
+ # </ul>
488
+ output:
489
+ "<ul>\n <li><aaa></li>\n <li>b&b</li>\n <li>\"ccc\"</li>\n</ul>\n"
490
+ # "<ul>\r\n <li><aaa></li>\r\n <li>b&b</li>\r\n <li>\"ccc\"</li>\r\n</ul>\r\n"
491
+
492
+ ##
493
+ - name: nomatch1
494
+ desc: bug
495
+ input: &nomatch1|
496
+ <ul>
497
+ <li>foo</li>
498
+ </ul>
499
+ src: |
500
+ _buf = ''; _buf << '<ul>
501
+ <li>foo</li>
502
+ </ul>
503
+ ';
504
+ _buf.to_s
505
+ output: *nomatch1
506
+
507
+ ##
508
+ - name: escape1
509
+ options: { :escape: true }
510
+ input: |
511
+ <% str = '<>&"' %>
512
+ <%= str %>
513
+ <%== str %>
514
+ src: |
515
+ _buf = ''; str = '<>&"'
516
+ _buf << Erubis::XmlHelper.escape_xml( str ); _buf << '
517
+ '; _buf << ( str ).to_s; _buf << '
518
+ ';
519
+ _buf.to_s
520
+ output: |
521
+ &lt;&gt;&amp;&quot;
522
+ <>&"
523
+
524
+ ##
525
+ - name: tailch1
526
+ options:
527
+ input: |
528
+ <p>
529
+ <% str = '<>&"' %>
530
+ <%= str %>
531
+ <%= str =%>
532
+ <%= str -%>
533
+ </p>
534
+ src: |
535
+ _buf = ''; _buf << '<p>
536
+ '; str = '<>&"'
537
+ _buf << ' '; _buf << ( str ).to_s; _buf << '
538
+ '; _buf << ' '; _buf << ( str ).to_s; _buf << ' '; _buf << ( str ).to_s; _buf << '</p>
539
+ ';
540
+ _buf.to_s
541
+ output: |
542
+ <p>
543
+ <>&"
544
+ <>&" <>&"</p>
545
+
546
+ ##
547
+ - name: doublepercent1
548
+ options:
549
+ input: |
550
+ <% x1 = 10 %>
551
+ <%% x2 = 20 %>
552
+ <%= x1 %>
553
+ <%%= x2 %>
554
+ src: |
555
+ _buf = ''; x1 = 10
556
+ _buf << '<% x2 = 20 %>
557
+ '; _buf << ( x1 ).to_s; _buf << '
558
+ '; _buf << '<%= x2 %>
559
+ ';
560
+ _buf.to_s
561
+ output: |
562
+ <% x2 = 20 %>
563
+ 10
564
+ <%= x2 %>
565
+
566
+ ##
567
+ - name: optimized1
568
+ class: OptimizedEruby
569
+ input: &optimized1_input|
570
+ <table>
571
+ <% for item in list %>
572
+ <tr>
573
+ <td><%= item %></td>
574
+ <td><%== item %></td>
575
+ </tr>
576
+ <% end %>
577
+ </table>
578
+ <ul><% for item in list %><li><%= item %></li><% end %></ul>
579
+ src: |
580
+ _buf = '<table>
581
+ '; for item in list
582
+ _buf << ' <tr>
583
+ <td>' << ( item ).to_s << '</td>
584
+ <td>' << Erubis::XmlHelper.escape_xml( item ) << '</td>
585
+ </tr>
586
+ '; end
587
+ _buf << '</table>
588
+ <ul>'; for item in list ; _buf << '<li>' << ( item ).to_s << '</li>'; end ; _buf << '</ul>
589
+ '
590
+ _buf
591
+ output: |
592
+ <table>
593
+ <tr>
594
+ <td><aaa></td>
595
+ <td>&lt;aaa&gt;</td>
596
+ </tr>
597
+ <tr>
598
+ <td>b&b</td>
599
+ <td>b&amp;b</td>
600
+ </tr>
601
+ <tr>
602
+ <td>"ccc"</td>
603
+ <td>&quot;ccc&quot;</td>
604
+ </tr>
605
+ </table>
606
+ <ul><li><aaa></li><li>b&b</li><li>"ccc"</li></ul>
607
+
608
+ ##
609
+ - name: optimized2
610
+ class: OptimizedXmlEruby
611
+ input: *optimized1_input
612
+ # <table>
613
+ # <% for item in list %>
614
+ # <tr>
615
+ # <td><%= item %></td>
616
+ # <td><%== item %></td>
617
+ # </tr>
618
+ # <% end %>
619
+ # </table>
620
+ # <ul><% for item in list %><li><%= item %></li><% end %></ul>
621
+ src: |
622
+ _buf = '<table>
623
+ '; for item in list
624
+ _buf << ' <tr>
625
+ <td>' << Erubis::XmlHelper.escape_xml( item ) << '</td>
626
+ <td>' << ( item ).to_s << '</td>
627
+ </tr>
628
+ '; end
629
+ _buf << '</table>
630
+ <ul>'; for item in list ; _buf << '<li>' << Erubis::XmlHelper.escape_xml( item ) << '</li>'; end ; _buf << '</ul>
631
+ '
632
+ _buf
633
+ output: |
634
+ <table>
635
+ <tr>
636
+ <td>&lt;aaa&gt;</td>
637
+ <td><aaa></td>
638
+ </tr>
639
+ <tr>
640
+ <td>b&amp;b</td>
641
+ <td>b&b</td>
642
+ </tr>
643
+ <tr>
644
+ <td>&quot;ccc&quot;</td>
645
+ <td>"ccc"</td>
646
+ </tr>
647
+ </table>
648
+ <ul><li>&lt;aaa&gt;</li><li>b&amp;b</li><li>&quot;ccc&quot;</li></ul>
649
+
650
+ ##
651
+ - name: optimized3
652
+ desc: bug
653
+ class: OptimizedEruby
654
+ input: |
655
+ user = <%= "Foo" %>
656
+ <% for item in list %>
657
+ <%= item %>
658
+ <% end %>
659
+ src: |
660
+ _buf = 'user = '; _buf << ( "Foo" ).to_s << '
661
+ '; for item in list
662
+ _buf << ' ' << ( item ).to_s << '
663
+ '; end
664
+
665
+ _buf
666
+ output: |
667
+ user = Foo
668
+ <aaa>
669
+ b&b
670
+ "ccc"
671
+
672
+ ##
673
+ - name: optimized4
674
+ desc: single quotation and backslash
675
+ class: OptimizedEruby
676
+ input: &optimized4_input|
677
+ a = "'"
678
+ b = "\""
679
+ c = '\''
680
+ src: |
681
+ _buf = 'a = "\'"
682
+ b = "\\""
683
+ c = \'\\\'\'
684
+ ';
685
+ _buf
686
+ output: *optimized4_input
687
+
688
+ ##
689
+ - name: tiny1
690
+ class: TinyEruby
691
+ testopt: binding
692
+ input: |
693
+ <ul>
694
+ <% for item in list %>
695
+ <li><%= item %></li>
696
+ <% end %>
697
+ </ul>
698
+ src: |
699
+ _buf = ''; _buf << '<ul>
700
+ '; for item in list ; _buf << '
701
+ <li>'; _buf << ( item ).to_s; _buf << '</li>
702
+ '; end ; _buf << '
703
+ </ul>
704
+ ';
705
+ _buf.to_s
706
+ output: |
707
+ <ul>
708
+ ^
709
+ <li><aaa></li>
710
+ ^
711
+ <li>b&b</li>
712
+ ^
713
+ <li>"ccc"</li>
714
+ ^
715
+ </ul>
716
+
717
+ ##
718
+ - name: tiny2
719
+ class: TinyEruby
720
+ testopt: evaluate
721
+ input: |
722
+ <ul>
723
+ <% for item in @list %>
724
+ <li><%= item %></li>
725
+ <% end %>
726
+ </ul>
727
+ src: |
728
+ _buf = ''; _buf << '<ul>
729
+ '; for item in @list ; _buf << '
730
+ <li>'; _buf << ( item ).to_s; _buf << '</li>
731
+ '; end ; _buf << '
732
+ </ul>
733
+ ';
734
+ _buf.to_s
735
+ output: |
736
+ <ul>
737
+ ^
738
+ <li><aaa></li>
739
+ ^
740
+ <li>b&b</li>
741
+ ^
742
+ <li>"ccc"</li>
743
+ ^
744
+ </ul>
745
+
746
+ ##
747
+ - name: pi1
748
+ class: PI::Eruby
749
+ testopt: evaluate
750
+ input: &input_pi1|
751
+ <ul>
752
+ <?rb for item in @list ?>
753
+ <li>@{item}@ / @!{item}@</li>
754
+ <li><%= item %> / <%== item %></li>
755
+ <?rb end ?>
756
+ </ul>
757
+ src: &src_pi1|
758
+ _buf = ''; _buf << '<ul>
759
+ '; for item in @list
760
+ _buf << ' <li>'; _buf << Erubis::XmlHelper.escape_xml(item); _buf << ' / '; _buf << (item).to_s; _buf << '</li>
761
+ <li>'; _buf << ( item ).to_s; _buf << ' / '; _buf << Erubis::XmlHelper.escape_xml( item ); _buf << '</li>
762
+ '; end
763
+ _buf << '</ul>
764
+ ';
765
+ _buf.to_s
766
+ output: &output_pi1|
767
+ <ul>
768
+ <li>&lt;aaa&gt; / <aaa></li>
769
+ <li><aaa> / &lt;aaa&gt;</li>
770
+ <li>b&amp;b / b&b</li>
771
+ <li>b&b / b&amp;b</li>
772
+ <li>&quot;ccc&quot; / "ccc"</li>
773
+ <li>"ccc" / &quot;ccc&quot;</li>
774
+ </ul>
775
+
776
+ ##
777
+ - name: pi2
778
+ class: PI::Eruby
779
+ options: { :escape: false }
780
+ testopt: evaluate
781
+ input: *input_pi1
782
+ src: |
783
+ _buf = ''; _buf << '<ul>
784
+ '; for item in @list
785
+ _buf << ' <li>'; _buf << (item).to_s; _buf << ' / '; _buf << Erubis::XmlHelper.escape_xml(item); _buf << '</li>
786
+ <li>'; _buf << Erubis::XmlHelper.escape_xml( item ); _buf << ' / '; _buf << ( item ).to_s; _buf << '</li>
787
+ '; end
788
+ _buf << '</ul>
789
+ ';
790
+ _buf.to_s
791
+ output: |
792
+ <ul>
793
+ <li><aaa> / &lt;aaa&gt;</li>
794
+ <li>&lt;aaa&gt; / <aaa></li>
795
+ <li>b&b / b&amp;b</li>
796
+ <li>b&amp;b / b&b</li>
797
+ <li>"ccc" / &quot;ccc&quot;</li>
798
+ <li>&quot;ccc&quot; / "ccc"</li>
799
+ </ul>
800
+
801
+ ##
802
+ - name: pi3
803
+ class: PI::Eruby
804
+ options: { :pi: hoge, :embchar: '$' }
805
+ testopt: evaluate
806
+ input: |
807
+ <ul>
808
+ <?hoge for item in @list ?>
809
+ <li>${item}$ / $!{item}$</li>
810
+ <li><%= item %> / <%== item %></li>
811
+ <?hoge end ?>
812
+ </ul>
813
+ src: *src_pi1
814
+ output: *output_pi1
815
+
816
+ - name: pi4
817
+ class: PI::Eruby
818
+ testopt: evaluate
819
+ input: |
820
+ <?rb-header
821
+ def show(list)
822
+ ?>
823
+ <ul>
824
+ <?rb for item in list ?>
825
+ <?rb-value item ?>
826
+ <?rb end ?>
827
+ <?rb-comment
828
+ # comment
829
+ # comment
830
+ ?>
831
+ </ul>
832
+ <?rb-footer
833
+ end
834
+ show(@list) ?>
835
+
836
+ src: |4
837
+
838
+ def show(list)
839
+
840
+ _buf = ''; _buf << '<ul>
841
+ '; for item in list
842
+ _buf << ( item
843
+ ).to_s; end
844
+
845
+
846
+
847
+
848
+ _buf << '</ul>
849
+ ';
850
+ _buf.to_s
851
+
852
+ end
853
+ show(@list)
854
+
855
+ output: |
856
+ <ul>
857
+ <aaa>b&b"ccc"</ul>
858
+
859
+
860
+ - name: pitiny1
861
+ class: PI::TinyEruby
862
+ testopt: evaluate
863
+ input: |
864
+ <ul>
865
+ <?rb for item in @list ?>
866
+ <li>@{item}@ / @!{item}@</li>
867
+ <?rb end ?>
868
+ </ul>
869
+ src: |
870
+ _buf = ''; _buf << '<ul>
871
+ '; for item in @list
872
+ _buf << ' <li>'; _buf << Erubis::XmlHelper.escape_xml(item); _buf << ' / '; _buf << (item).to_s; _buf << '</li>
873
+ '; end
874
+ _buf << '</ul>
875
+ ';
876
+ _buf.to_s
877
+ output: |
878
+ <ul>
879
+ <li>&lt;aaa&gt; / <aaa></li>
880
+ <li>b&amp;b / b&b</li>
881
+ <li>&quot;ccc&quot; / "ccc"</li>
882
+ </ul>
883
+