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,357 @@
1
+ ##
2
+ ## $Release: 2.6.5 $
3
+ ## copyright(c) 2006-2009 kuwata-lab.com all rights reserved.
4
+ ##
5
+
6
+ require 'abstract'
7
+
8
+ module Erubis
9
+
10
+
11
+ ##
12
+ ## convert
13
+ ##
14
+ module Converter
15
+
16
+ attr_accessor :preamble, :postamble, :escape
17
+
18
+ def self.supported_properties # :nodoc:
19
+ return [
20
+ [:preamble, nil, "preamble (no preamble when false)"],
21
+ [:postamble, nil, "postamble (no postamble when false)"],
22
+ [:escape, nil, "escape expression or not in default"],
23
+ ]
24
+ end
25
+
26
+ def init_converter(properties={})
27
+ @preamble = properties[:preamble]
28
+ @postamble = properties[:postamble]
29
+ @escape = properties[:escape]
30
+ end
31
+
32
+ ## convert input string into target language
33
+ def convert(input)
34
+ codebuf = "" # or []
35
+ @preamble.nil? ? add_preamble(codebuf) : (@preamble && (codebuf << @preamble))
36
+ convert_input(codebuf, input)
37
+ @postamble.nil? ? add_postamble(codebuf) : (@postamble && (codebuf << @postamble))
38
+ @_proc = nil # clear cached proc object
39
+ return codebuf # or codebuf.join()
40
+ end
41
+
42
+ protected
43
+
44
+ ##
45
+ ## detect spaces at beginning of line
46
+ ##
47
+ def detect_spaces_at_bol(text, is_bol)
48
+ lspace = nil
49
+ if text.empty?
50
+ lspace = "" if is_bol
51
+ elsif text[-1] == ?\n
52
+ lspace = ""
53
+ else
54
+ rindex = text.rindex(?\n)
55
+ if rindex
56
+ s = text[rindex+1..-1]
57
+ if s =~ /\A[ \t]*\z/
58
+ lspace = s
59
+ #text = text[0..rindex]
60
+ text[rindex+1..-1] = ''
61
+ end
62
+ else
63
+ if is_bol && text =~ /\A[ \t]*\z/
64
+ #lspace = text
65
+ #text = nil
66
+ lspace = text.dup
67
+ text[0..-1] = ''
68
+ end
69
+ end
70
+ end
71
+ return lspace
72
+ end
73
+
74
+ ##
75
+ ## (abstract) convert input to code
76
+ ##
77
+ def convert_input(codebuf, input)
78
+ not_implemented
79
+ end
80
+
81
+ end
82
+
83
+
84
+ module Basic
85
+ end
86
+
87
+
88
+ ##
89
+ ## basic converter which supports '<% ... %>' notation.
90
+ ##
91
+ module Basic::Converter
92
+ include Erubis::Converter
93
+
94
+ def self.supported_properties # :nodoc:
95
+ return [
96
+ [:pattern, '<% %>', "embed pattern"],
97
+ [:trim, true, "trim spaces around <% ... %>"],
98
+ ]
99
+ end
100
+
101
+ attr_accessor :pattern, :trim
102
+
103
+ def init_converter(properties={})
104
+ super(properties)
105
+ @pattern = properties[:pattern]
106
+ @trim = properties[:trim] != false
107
+ end
108
+
109
+ protected
110
+
111
+ ## return regexp of pattern to parse eRuby script
112
+ def pattern_regexp(pattern)
113
+ @prefix, @postfix = pattern.split() # '<% %>' => '<%', '%>'
114
+ #return /(.*?)(^[ \t]*)?#{@prefix}(=+|\#)?(.*?)-?#{@postfix}([ \t]*\r?\n)?/m
115
+ #return /(^[ \t]*)?#{@prefix}(=+|\#)?(.*?)-?#{@postfix}([ \t]*\r?\n)?/m
116
+ return /#{@prefix}(=+|-|\#|%)?(.*?)([-=])?#{@postfix}([ \t]*\r?\n)?/m
117
+ end
118
+ module_function :pattern_regexp
119
+
120
+ #DEFAULT_REGEXP = /(.*?)(^[ \t]*)?<%(=+|\#)?(.*?)-?%>([ \t]*\r?\n)?/m
121
+ #DEFAULT_REGEXP = /(^[ \t]*)?<%(=+|\#)?(.*?)-?%>([ \t]*\r?\n)?/m
122
+ #DEFAULT_REGEXP = /<%(=+|\#)?(.*?)-?%>([ \t]*\r?\n)?/m
123
+ DEFAULT_REGEXP = pattern_regexp('<% %>')
124
+
125
+ public
126
+
127
+ def convert_input(src, input)
128
+ pat = @pattern
129
+ regexp = pat.nil? || pat == '<% %>' ? DEFAULT_REGEXP : pattern_regexp(pat)
130
+ pos = 0
131
+ is_bol = true # is beginning of line
132
+ input.scan(regexp) do |indicator, code, tailch, rspace|
133
+ match = Regexp.last_match()
134
+ len = match.begin(0) - pos
135
+ text = input[pos, len]
136
+ pos = match.end(0)
137
+ ch = indicator ? indicator[0] : nil
138
+ lspace = ch == ?= ? nil : detect_spaces_at_bol(text, is_bol)
139
+ is_bol = rspace ? true : false
140
+ add_text(src, text) if text && !text.empty?
141
+ ## * when '<%= %>', do nothing
142
+ ## * when '<% %>' or '<%# %>', delete spaces iff only spaces are around '<% %>'
143
+ if ch == ?= # <%= %>
144
+ rspace = nil if tailch && !tailch.empty?
145
+ add_text(src, lspace) if lspace
146
+ add_expr(src, code, indicator)
147
+ add_text(src, rspace) if rspace
148
+ elsif ch == ?\# # <%# %>
149
+ n = code.count("\n") + (rspace ? 1 : 0)
150
+ if @trim && lspace && rspace
151
+ add_stmt(src, "\n" * n)
152
+ else
153
+ add_text(src, lspace) if lspace
154
+ add_stmt(src, "\n" * n)
155
+ add_text(src, rspace) if rspace
156
+ end
157
+ elsif ch == ?% # <%% %>
158
+ s = "#{lspace}#{@prefix||='<%'}#{code}#{tailch}#{@postfix||='%>'}#{rspace}"
159
+ add_text(src, s)
160
+ else # <% %>
161
+ if @trim && lspace && rspace
162
+ add_stmt(src, "#{lspace}#{code}#{rspace}")
163
+ else
164
+ add_text(src, lspace) if lspace
165
+ add_stmt(src, code)
166
+ add_text(src, rspace) if rspace
167
+ end
168
+ end
169
+ end
170
+ #rest = $' || input # ruby1.8
171
+ rest = pos == 0 ? input : input[pos..-1] # ruby1.9
172
+ add_text(src, rest)
173
+ end
174
+
175
+ ## add expression code to src
176
+ def add_expr(src, code, indicator)
177
+ case indicator
178
+ when '='
179
+ @escape ? add_expr_escaped(src, code) : add_expr_literal(src, code)
180
+ when '=='
181
+ @escape ? add_expr_literal(src, code) : add_expr_escaped(src, code)
182
+ when '==='
183
+ add_expr_debug(src, code)
184
+ end
185
+ end
186
+
187
+ end
188
+
189
+
190
+ module PI
191
+ end
192
+
193
+ ##
194
+ ## Processing Instructions (PI) converter for XML.
195
+ ## this class converts '<?rb ... ?>' and '${...}' notation.
196
+ ##
197
+ module PI::Converter
198
+ include Erubis::Converter
199
+
200
+ def self.desc # :nodoc:
201
+ "use processing instructions (PI) instead of '<% %>'"
202
+ end
203
+
204
+ def self.supported_properties # :nodoc:
205
+ return [
206
+ [:trim, true, "trim spaces around <% ... %>"],
207
+ [:pi, 'rb', "PI (Processing Instrunctions) name"],
208
+ [:embchar, '@', "char for embedded expression pattern('@{...}@')"],
209
+ [:pattern, '<% %>', "embed pattern"],
210
+ ]
211
+ end
212
+
213
+ attr_accessor :pi, :prefix
214
+
215
+ def init_converter(properties={})
216
+ super(properties)
217
+ @trim = properties.fetch(:trim, true)
218
+ @pi = properties[:pi] if properties[:pi]
219
+ @embchar = properties[:embchar] || '@'
220
+ @pattern = properties[:pattern]
221
+ @pattern = '<% %>' if @pattern.nil? #|| @pattern == true
222
+ end
223
+
224
+ def convert(input)
225
+ code = super(input)
226
+ return @header || @footer ? "#{@header}#{code}#{@footer}" : code
227
+ end
228
+
229
+ protected
230
+
231
+ def convert_input(codebuf, input)
232
+ unless @regexp
233
+ @pi ||= 'e'
234
+ ch = Regexp.escape(@embchar)
235
+ if @pattern
236
+ left, right = @pattern.split(' ')
237
+ @regexp = /<\?#{@pi}(?:-(\w+))?(\s.*?)\?>([ \t]*\r?\n)?|#{ch}(!*)?\{(.*?)\}#{ch}|#{left}(=+)(.*?)#{right}/m
238
+ else
239
+ @regexp = /<\?#{@pi}(?:-(\w+))?(\s.*?)\?>([ \t]*\r?\n)?|#{ch}(!*)?\{(.*?)\}#{ch}/m
240
+ end
241
+ end
242
+ #
243
+ is_bol = true
244
+ pos = 0
245
+ input.scan(@regexp) do |pi_arg, stmt, rspace,
246
+ indicator1, expr1, indicator2, expr2|
247
+ match = Regexp.last_match
248
+ len = match.begin(0) - pos
249
+ text = input[pos, len]
250
+ pos = match.end(0)
251
+ lspace = stmt ? detect_spaces_at_bol(text, is_bol) : nil
252
+ is_bol = stmt && rspace ? true : false
253
+ add_text(codebuf, text) # unless text.empty?
254
+ #
255
+ if stmt
256
+ if @trim && lspace && rspace
257
+ add_pi_stmt(codebuf, "#{lspace}#{stmt}#{rspace}", pi_arg)
258
+ else
259
+ add_text(codebuf, lspace) if lspace
260
+ add_pi_stmt(codebuf, stmt, pi_arg)
261
+ add_text(codebuf, rspace) if rspace
262
+ end
263
+ else
264
+ add_pi_expr(codebuf, expr1 || expr2, indicator1 || indicator2)
265
+ end
266
+ end
267
+ #rest = $' || input # ruby1.8
268
+ rest = pos == 0 ? input : input[pos..-1] # ruby1.9
269
+ add_text(codebuf, rest)
270
+ end
271
+
272
+ #--
273
+ #def convert_input(codebuf, input)
274
+ # parse_stmts(codebuf, input)
275
+ # #parse_stmts2(codebuf, input)
276
+ #end
277
+ #
278
+ #def parse_stmts(codebuf, input)
279
+ # #regexp = pattern_regexp(@pattern)
280
+ # @pi ||= 'e'
281
+ # @stmt_pattern ||= /<\?#{@pi}(?:-(\w+))?(\s.*?)\?>([ \t]*\r?\n)?/m
282
+ # is_bol = true
283
+ # pos = 0
284
+ # input.scan(@stmt_pattern) do |pi_arg, code, rspace|
285
+ # match = Regexp.last_match
286
+ # len = match.begin(0) - pos
287
+ # text = input[pos, len]
288
+ # pos = match.end(0)
289
+ # lspace = detect_spaces_at_bol(text, is_bol)
290
+ # is_bol = rspace ? true : false
291
+ # parse_exprs(codebuf, text) # unless text.empty?
292
+ # if @trim && lspace && rspace
293
+ # add_pi_stmt(codebuf, "#{lspace}#{code}#{rspace}", pi_arg)
294
+ # else
295
+ # add_text(codebuf, lspace)
296
+ # add_pi_stmt(codebuf, code, pi_arg)
297
+ # add_text(codebuf, rspace)
298
+ # end
299
+ # end
300
+ # rest = $' || input
301
+ # parse_exprs(codebuf, rest)
302
+ #end
303
+ #
304
+ #def parse_exprs(codebuf, input)
305
+ # unless @expr_pattern
306
+ # ch = Regexp.escape(@embchar)
307
+ # if @pattern
308
+ # left, right = @pattern.split(' ')
309
+ # @expr_pattern = /#{ch}(!*)?\{(.*?)\}#{ch}|#{left}(=+)(.*?)#{right}/
310
+ # else
311
+ # @expr_pattern = /#{ch}(!*)?\{(.*?)\}#{ch}/
312
+ # end
313
+ # end
314
+ # pos = 0
315
+ # input.scan(@expr_pattern) do |indicator1, code1, indicator2, code2|
316
+ # indicator = indicator1 || indicator2
317
+ # code = code1 || code2
318
+ # match = Regexp.last_match
319
+ # len = match.begin(0) - pos
320
+ # text = input[pos, len]
321
+ # pos = match.end(0)
322
+ # add_text(codebuf, text) # unless text.empty?
323
+ # add_pi_expr(codebuf, code, indicator)
324
+ # end
325
+ # rest = $' || input
326
+ # add_text(codebuf, rest)
327
+ #end
328
+ #++
329
+
330
+ def add_pi_stmt(codebuf, code, pi_arg) # :nodoc:
331
+ case pi_arg
332
+ when nil ; add_stmt(codebuf, code)
333
+ when 'header' ; @header = code
334
+ when 'footer' ; @footer = code
335
+ when 'comment'; add_stmt(codebuf, "\n" * code.count("\n"))
336
+ when 'value' ; add_expr_literal(codebuf, code)
337
+ else ; add_stmt(codebuf, code)
338
+ end
339
+ end
340
+
341
+ def add_pi_expr(codebuf, code, indicator) # :nodoc:
342
+ case indicator
343
+ when nil, '', '==' # @{...}@ or <%== ... %>
344
+ @escape == false ? add_expr_literal(codebuf, code) : add_expr_escaped(codebuf, code)
345
+ when '!', '=' # @!{...}@ or <%= ... %>
346
+ @escape == false ? add_expr_escaped(codebuf, code) : add_expr_literal(codebuf, code)
347
+ when '!!', '===' # @!!{...}@ or <%=== ... %>
348
+ add_expr_debug(codebuf, code)
349
+ else
350
+ # ignore
351
+ end
352
+ end
353
+
354
+ end
355
+
356
+
357
+ end
@@ -0,0 +1,117 @@
1
+ ##
2
+ ## $Release: 2.6.5 $
3
+ ## copyright(c) 2006-2009 kuwata-lab.com all rights reserved.
4
+ ##
5
+
6
+ require 'erubis/engine'
7
+ require 'erubis/enhancer'
8
+
9
+
10
+ module Erubis
11
+
12
+
13
+ module CGenerator
14
+ include Generator
15
+
16
+ def self.supported_properties() # :nodoc:
17
+ return [
18
+ [:indent, '', "indent spaces (ex. ' ')"],
19
+ [:out, 'stdout', "output file pointer name"],
20
+ ]
21
+ end
22
+
23
+ def init_generator(properties={})
24
+ super
25
+ @escapefunc ||= "escape"
26
+ @indent = properties[:indent] || ''
27
+ @out = properties[:out] || 'stdout'
28
+ end
29
+
30
+ def add_preamble(src)
31
+ src << "#line 1 \"#{self.filename}\"\n" if self.filename
32
+ end
33
+
34
+ def escape_text(text)
35
+ @@table_ ||= { "\r"=>"\\r", "\n"=>"\\n", "\t"=>"\\t", '"'=>'\\"', "\\"=>"\\\\" }
36
+ text.gsub!(/[\r\n\t"\\]/) { |m| @@table_[m] }
37
+ return text
38
+ end
39
+
40
+ def escaped_expr(code)
41
+ return "#{@escapefunc}(#{code.strip}, #{@out})"
42
+ end
43
+
44
+ def add_text(src, text)
45
+ return if text.empty?
46
+ src << (src.empty? || src[-1] == ?\n ? @indent : ' ')
47
+ src << "fputs("
48
+ i = 0
49
+ text.each_line do |line|
50
+ src << "\n" << @indent << ' ' if i > 0
51
+ i += 1
52
+ src << '"' << escape_text(line) << '"'
53
+ end
54
+ src << ", #{@out});" #<< (text[-1] == ?\n ? "\n" : "")
55
+ src << "\n" if text[-1] == ?\n
56
+ end
57
+
58
+ def add_stmt(src, code)
59
+ src << code
60
+ end
61
+
62
+ def add_expr_literal(src, code)
63
+ src << @indent if src.empty? || src[-1] == ?\n
64
+ src << " fprintf(#{@out}, " << code.strip << ');'
65
+ end
66
+
67
+ def add_expr_escaped(src, code)
68
+ src << @indent if src.empty? || src[-1] == ?\n
69
+ src << ' ' << escaped_expr(code) << ';'
70
+ end
71
+
72
+ def add_expr_debug(src, code)
73
+ code.strip!
74
+ s = nil
75
+ if code =~ /\A\".*?\"\s*,\s*(.*)/
76
+ s = $1.gsub(/[%"]/, '\\\1') + '='
77
+ end
78
+ src << @indent if src.empty? || src[-1] == ?\n
79
+ src << " fprintf(stderr, \"*** debug: #{s}\" #{code});"
80
+ end
81
+
82
+ def add_postamble(src)
83
+ # empty
84
+ end
85
+
86
+ end
87
+
88
+
89
+ ##
90
+ ## engine for C
91
+ ##
92
+ class Ec < Basic::Engine
93
+ include CGenerator
94
+ end
95
+
96
+
97
+ class EscapedEc < Ec
98
+ include EscapeEnhancer
99
+ end
100
+
101
+
102
+ #class XmlEc < Ec
103
+ # include EscapeEnhancer
104
+ #end
105
+
106
+ class PI::Ec < PI::Engine
107
+ include CGenerator
108
+
109
+ def init_converter(properties={})
110
+ @pi = 'c'
111
+ super(properties)
112
+ end
113
+
114
+ end
115
+
116
+
117
+ end
@@ -0,0 +1,110 @@
1
+ ##
2
+ ## $Release: 2.6.5 $
3
+ ## copyright(c) 2006-2009 kuwata-lab.com all rights reserved.
4
+ ##
5
+
6
+ require 'erubis/engine'
7
+ require 'erubis/enhancer'
8
+
9
+
10
+ module Erubis
11
+
12
+
13
+ module JavaGenerator
14
+ include Generator
15
+
16
+ def self.supported_properties() # :nodoc:
17
+ return [
18
+ [:indent, '', "indent spaces (ex. ' ')"],
19
+ [:buf, '_buf', "output buffer name"],
20
+ [:bufclass, 'StringBuffer', "output buffer class (ex. 'StringBuilder')"],
21
+ ]
22
+ end
23
+
24
+ def init_generator(properties={})
25
+ super
26
+ @escapefunc ||= 'escape'
27
+ @indent = properties[:indent] || ''
28
+ @buf = properties[:buf] || '_buf'
29
+ @bufclass = properties[:bufclass] || 'StringBuffer'
30
+ end
31
+
32
+ def add_preamble(src)
33
+ src << "#{@indent}#{@bufclass} #{@buf} = new #{@bufclass}();"
34
+ end
35
+
36
+ def escape_text(text)
37
+ @@table_ ||= { "\r"=>"\\r", "\n"=>"\\n", "\t"=>"\\t", '"'=>'\\"', "\\"=>"\\\\" }
38
+ return text.gsub!(/[\r\n\t"\\]/) { |m| @@table_[m] } || text
39
+ end
40
+
41
+ def add_text(src, text)
42
+ return if text.empty?
43
+ src << (src.empty? || src[-1] == ?\n ? @indent : ' ')
44
+ src << @buf << ".append("
45
+ i = 0
46
+ text.each_line do |line|
47
+ src << "\n" << @indent << ' + ' if i > 0
48
+ i += 1
49
+ src << '"' << escape_text(line) << '"'
50
+ end
51
+ src << ");" << (text[-1] == ?\n ? "\n" : "")
52
+ end
53
+
54
+ def add_stmt(src, code)
55
+ src << code
56
+ end
57
+
58
+ def add_expr_literal(src, code)
59
+ src << @indent if src.empty? || src[-1] == ?\n
60
+ code.strip!
61
+ src << " #{@buf}.append(#{code});"
62
+ end
63
+
64
+ def add_expr_escaped(src, code)
65
+ add_expr_literal(src, escaped_expr(code))
66
+ end
67
+
68
+ def add_expr_debug(src, code)
69
+ code.strip!
70
+ src << @indent if src.empty? || src[-1] == ?\n
71
+ src << " System.err.println(\"*** debug: #{code}=\"+(#{code}));"
72
+ end
73
+
74
+ def add_postamble(src)
75
+ src << "\n" if src[-1] == ?;
76
+ src << @indent << "return " << @buf << ".toString();\n"
77
+ #src << @indent << "System.out.print(" << @buf << ".toString());\n"
78
+ end
79
+
80
+ end
81
+
82
+
83
+ ##
84
+ ## engine for Java
85
+ ##
86
+ class Ejava < Basic::Engine
87
+ include JavaGenerator
88
+ end
89
+
90
+
91
+ class EscapedEjava < Ejava
92
+ include EscapeEnhancer
93
+ end
94
+
95
+
96
+ #class XmlEjava < Ejava
97
+ # include EscapeEnhancer
98
+ #end
99
+
100
+ class PI::Ejava < PI::Engine
101
+ include JavaGenerator
102
+
103
+ def init_converter(properties={})
104
+ @pi = 'java'
105
+ super(properties)
106
+ end
107
+
108
+ end
109
+
110
+ end
@@ -0,0 +1,119 @@
1
+ ##
2
+ ## $Release: 2.6.5 $
3
+ ## copyright(c) 2006-2009 kuwata-lab.com all rights reserved.
4
+ ##
5
+
6
+ require 'erubis/engine'
7
+ require 'erubis/enhancer'
8
+
9
+
10
+ module Erubis
11
+
12
+
13
+ module JavascriptGenerator
14
+ include Generator
15
+
16
+ def self.supported_properties() # :nodoc:
17
+ list = []
18
+ #list << [:indent, '', "indent spaces (ex. ' ')"]
19
+ #list << [:buf, '_buf', "output buffer name"]
20
+ list << [:docwrite, true, "use 'document.write()' when true"]
21
+ return list
22
+ end
23
+
24
+ def init_generator(properties={})
25
+ super
26
+ @escapefunc ||= 'escape'
27
+ @indent = properties[:indent] || ''
28
+ @buf = properties[:out] || '_buf'
29
+ @docwrite = properties[:docwrite] != false # '!= false' will be removed in the next release
30
+ end
31
+
32
+ def add_preamble(src)
33
+ src << "#{@indent}var #{@buf} = [];"
34
+ end
35
+
36
+ def escape_text(text)
37
+ @@table_ ||= { "\r"=>"\\r", "\n"=>"\\n\\\n", "\t"=>"\\t", '"'=>'\\"', "\\"=>"\\\\" }
38
+ return text.gsub!(/[\r\n\t"\\]/) { |m| @@table_[m] } || text
39
+ end
40
+
41
+ def add_indent(src, indent)
42
+ src << (src.empty? || src[-1] == ?\n ? indent : ' ')
43
+ end
44
+
45
+ def add_text(src, text)
46
+ return if text.empty?
47
+ add_indent(src, @indent)
48
+ src << @buf << '.push("'
49
+ s = escape_text(text)
50
+ if s[-1] == ?\n
51
+ s[-2, 2] = ''
52
+ src << s << "\");\n"
53
+ else
54
+ src << s << "\");"
55
+ end
56
+ end
57
+
58
+ def add_stmt(src, code)
59
+ src << code
60
+ end
61
+
62
+ def add_expr_literal(src, code)
63
+ add_indent(src, @indent)
64
+ code.strip!
65
+ src << "#{@buf}.push(#{code});"
66
+ end
67
+
68
+ def add_expr_escaped(src, code)
69
+ add_expr_literal(src, escaped_expr(code))
70
+ end
71
+
72
+ def add_expr_debug(src, code)
73
+ add_indent(src, @indent)
74
+ code.strip!
75
+ src << "alert(\"*** debug: #{code}=\"+(#{code}));"
76
+ end
77
+
78
+ def add_postamble(src)
79
+ src << "\n" if src[-1] == ?;
80
+ if @docwrite
81
+ src << @indent << 'document.write(' << @buf << ".join(\"\"));\n"
82
+ else
83
+ src << @indent << @buf << ".join(\"\");\n"
84
+ end
85
+ end
86
+
87
+ end
88
+
89
+
90
+ ##
91
+ ## engine for JavaScript
92
+ ##
93
+ class Ejavascript < Basic::Engine
94
+ include JavascriptGenerator
95
+ end
96
+
97
+
98
+ class EscapedEjavascript < Ejavascript
99
+ include EscapeEnhancer
100
+ end
101
+
102
+
103
+ #class XmlEjavascript < Ejavascript
104
+ # include EscapeEnhancer
105
+ #end
106
+
107
+
108
+ class PI::Ejavascript < PI::Engine
109
+ include JavascriptGenerator
110
+
111
+ def init_converter(properties={})
112
+ @pi = 'js'
113
+ super(properties)
114
+ end
115
+
116
+ end
117
+
118
+
119
+ end