ghazel-erubis 2.6.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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,489 @@
1
+ ###
2
+ ### $Release: 2.6.5 $
3
+ ### copyright(c) 2006-2009 kuwata-lab.com all rights reserved.
4
+ ###
5
+
6
+ require 'yaml'
7
+ require 'erubis'
8
+ require 'erubis/tiny'
9
+ require 'erubis/engine/enhanced'
10
+ require 'erubis/engine/optimized'
11
+ require 'erubis/engine/eruby'
12
+ require 'erubis/engine/ephp'
13
+ require 'erubis/engine/ec'
14
+ require 'erubis/engine/ejava'
15
+ require 'erubis/engine/escheme'
16
+ require 'erubis/engine/eperl'
17
+ require 'erubis/engine/ejavascript'
18
+
19
+
20
+ module Erubis
21
+
22
+
23
+ Ejs = Ejavascript
24
+ EscapedEjs = EscapedEjavascript
25
+
26
+
27
+ class CommandOptionError < ErubisError
28
+ end
29
+
30
+
31
+ ##
32
+ ## main class of command
33
+ ##
34
+ ## ex.
35
+ ## Main.main(ARGV)
36
+ ##
37
+ class Main
38
+
39
+ def self.main(argv=ARGV)
40
+ status = 0
41
+ begin
42
+ Main.new.execute(ARGV)
43
+ rescue CommandOptionError => ex
44
+ $stderr.puts ex.message
45
+ status = 1
46
+ end
47
+ exit(status)
48
+ end
49
+
50
+ def initialize
51
+ @single_options = "hvxztTSbeBXNUC"
52
+ @arg_options = "pcrfKIlaE" #C
53
+ @option_names = {
54
+ 'h' => :help,
55
+ 'v' => :version,
56
+ 'x' => :source,
57
+ 'z' => :syntax,
58
+ 'T' => :unexpand,
59
+ 't' => :untabify, # obsolete
60
+ 'S' => :intern,
61
+ 'b' => :bodyonly,
62
+ 'B' => :binding,
63
+ 'p' => :pattern,
64
+ 'c' => :context,
65
+ #'C' => :class,
66
+ 'e' => :escape,
67
+ 'r' => :requires,
68
+ 'f' => :datafiles,
69
+ 'K' => :kanji,
70
+ 'I' => :includes,
71
+ 'l' => :lang,
72
+ 'a' => :action,
73
+ 'E' => :enhancers,
74
+ 'X' => :notext,
75
+ 'N' => :linenum,
76
+ 'U' => :unique,
77
+ 'C' => :compact,
78
+ }
79
+ assert unless @single_options.length + @arg_options.length == @option_names.length
80
+ (@single_options + @arg_options).each_byte do |ch|
81
+ assert unless @option_names.key?(ch.chr)
82
+ end
83
+ end
84
+
85
+
86
+ def execute(argv=ARGV)
87
+ ## parse command-line options
88
+ options, properties = parse_argv(argv, @single_options, @arg_options)
89
+ filenames = argv
90
+ options['h'] = true if properties[:help]
91
+ opts = Object.new
92
+ arr = @option_names.collect {|ch, name| "def #{name}; @#{name}; end\n" }
93
+ opts.instance_eval arr.join
94
+ options.each do |ch, val|
95
+ name = @option_names[ch]
96
+ opts.instance_variable_set("@#{name}", val)
97
+ end
98
+
99
+ ## help, version, enhancer list
100
+ if opts.help || opts.version
101
+ puts version() if opts.version
102
+ puts usage() if opts.help
103
+ puts show_properties() if opts.help
104
+ puts show_enhancers() if opts.help
105
+ return
106
+ end
107
+
108
+ ## include path
109
+ opts.includes.split(/,/).each do |path|
110
+ $: << path
111
+ end if opts.includes
112
+
113
+ ## require library
114
+ opts.requires.split(/,/).each do |library|
115
+ require library
116
+ end if opts.requires
117
+
118
+ ## action
119
+ action = opts.action
120
+ action ||= 'syntax' if opts.syntax
121
+ action ||= 'convert' if opts.source || opts.notext
122
+
123
+ ## lang
124
+ lang = opts.lang || 'ruby'
125
+ action ||= 'convert' if opts.lang
126
+
127
+ ## class name of Eruby
128
+ #classname = opts.class
129
+ classname = nil
130
+ klass = get_classobj(classname, lang, properties[:pi])
131
+
132
+ ## kanji code
133
+ $KCODE = opts.kanji if opts.kanji
134
+
135
+ ## read context values from yaml file
136
+ datafiles = opts.datafiles
137
+ context = load_datafiles(datafiles, opts)
138
+
139
+ ## parse context data
140
+ if opts.context
141
+ context = parse_context_data(opts.context, opts)
142
+ end
143
+
144
+ ## properties for engine
145
+ properties[:escape] = true if opts.escape && !properties.key?(:escape)
146
+ properties[:pattern] = opts.pattern if opts.pattern
147
+ #properties[:trim] = false if opts.notrim
148
+ properties[:preamble] = properties[:postamble] = false if opts.bodyonly
149
+ properties[:pi] = nil if properties[:pi] == true
150
+
151
+ ## create engine and extend enhancers
152
+ engine = klass.new(nil, properties)
153
+ enhancers = get_enhancers(opts.enhancers)
154
+ #enhancers.push(Erubis::EscapeEnhancer) if opts.escape
155
+ enhancers.each do |enhancer|
156
+ engine.extend(enhancer)
157
+ engine.bipattern = properties[:bipattern] if enhancer == Erubis::BiPatternEnhancer
158
+ end
159
+
160
+ ## no-text
161
+ engine.extend(Erubis::NoTextEnhancer) if opts.notext
162
+
163
+ ## convert and execute
164
+ val = nil
165
+ msg = "Syntax OK\n"
166
+ if filenames && !filenames.empty?
167
+ filenames.each do |filename|
168
+ File.file?(filename) or
169
+ raise CommandOptionError.new("#{filename}: file not found.")
170
+ engine.filename = filename
171
+ engine.convert!(File.read(filename))
172
+ val = do_action(action, engine, context, filename, opts)
173
+ msg = nil if val
174
+ end
175
+ else
176
+ engine.filename = filename = '(stdin)'
177
+ engine.convert!($stdin.read())
178
+ val = do_action(action, engine, context, filename, opts)
179
+ msg = nil if val
180
+ end
181
+ print msg if action == 'syntax' && msg
182
+
183
+ end
184
+
185
+ private
186
+
187
+ def do_action(action, engine, context, filename, opts)
188
+ case action
189
+ when 'convert'
190
+ s = manipulate_src(engine.src, opts)
191
+ when nil, 'exec', 'execute'
192
+ s = opts.binding ? engine.result(context.to_hash) : engine.evaluate(context)
193
+ when 'syntax'
194
+ s = check_syntax(filename, engine.src)
195
+ else
196
+ raise "*** internal error"
197
+ end
198
+ print s if s
199
+ return s
200
+ end
201
+
202
+ def manipulate_src(source, opts)
203
+ flag_linenum = opts.linenum
204
+ flag_unique = opts.unique
205
+ flag_compact = opts.compact
206
+ if flag_linenum
207
+ n = 0
208
+ source.gsub!(/^/) { n += 1; "%5d: " % n }
209
+ source.gsub!(/^ *\d+:\s+?\n/, '') if flag_compact
210
+ source.gsub!(/(^ *\d+:\s+?\n)+/, "\n") if flag_unique
211
+ else
212
+ source.gsub!(/^\s*?\n/, '') if flag_compact
213
+ source.gsub!(/(^\s*?\n)+/, "\n") if flag_unique
214
+ end
215
+ return source
216
+ end
217
+
218
+ def usage(command=nil)
219
+ command ||= File.basename($0)
220
+ buf = []
221
+ buf << "erubis - embedded program converter for multi-language"
222
+ buf << "Usage: #{command} [..options..] [file ...]"
223
+ buf << " -h, --help : help"
224
+ buf << " -v : version"
225
+ buf << " -x : show converted code"
226
+ buf << " -X : show converted code, only ruby code and no text part"
227
+ buf << " -N : numbering: add line numbers (for '-x/-X')"
228
+ buf << " -U : unique: compress empty lines to a line (for '-x/-X')"
229
+ buf << " -C : compact: remove empty lines (for '-x/-X')"
230
+ buf << " -b : body only: no preamble nor postamble (for '-x/-X')"
231
+ buf << " -z : syntax checking"
232
+ buf << " -e : escape (equal to '--E Escape')"
233
+ buf << " -p pattern : embedded pattern (default '<% %>')"
234
+ buf << " -l lang : convert but no execute (ruby/php/c/java/scheme/perl/js)"
235
+ buf << " -E e1,e2,... : enhancer names (Escape, PercentLine, BiPattern, ...)"
236
+ buf << " -I path : library include path"
237
+ buf << " -K kanji : kanji code (euc/sjis/utf8) (default none)"
238
+ buf << " -c context : context data string (yaml inline style or ruby code)"
239
+ buf << " -f datafile : context data file ('*.yaml', '*.yml', or '*.rb')"
240
+ #buf << " -t : expand tab characters in YAML file"
241
+ buf << " -T : don't expand tab characters in YAML file"
242
+ buf << " -S : convert mapping key from string to symbol in YAML file"
243
+ buf << " -B : invoke 'result(binding)' instead of 'evaluate(context)'"
244
+ buf << " --pi=name : parse '<?name ... ?>' instead of '<% ... %>'"
245
+ #'
246
+ # -T : don't trim spaces around '<% %>'
247
+ # -c class : class name (XmlEruby/PercentLineEruby/...) (default Eruby)
248
+ # -r library : require library
249
+ # -a : action (convert/execute)
250
+ return buf.join("\n")
251
+ end
252
+
253
+ def collect_supported_properties(erubis_klass)
254
+ list = []
255
+ erubis_klass.ancestors.each do |klass|
256
+ if klass.respond_to?(:supported_properties)
257
+ list.concat(klass.supported_properties)
258
+ end
259
+ end
260
+ return list
261
+ end
262
+
263
+ def show_properties
264
+ s = "supported properties:\n"
265
+ basic_props = collect_supported_properties(Erubis::Basic::Engine)
266
+ pi_props = collect_supported_properties(Erubis::PI::Engine)
267
+ list = []
268
+ common_props = basic_props & pi_props
269
+ list << ['(common)', common_props]
270
+ list << ['(basic)', basic_props - common_props]
271
+ list << ['(pi)', pi_props - common_props]
272
+ %w[ruby php c java scheme perl javascript].each do |lang|
273
+ klass = Erubis.const_get("E#{lang}")
274
+ list << [lang, collect_supported_properties(klass) - basic_props]
275
+ end
276
+ list.each do |lang, props|
277
+ s << " * #{lang}\n"
278
+ props.each do |name, default_val, desc|
279
+ s << (" --%-23s : %s\n" % ["#{name}=#{default_val.inspect}", desc])
280
+ end
281
+ end
282
+ s << "\n"
283
+ return s
284
+ end
285
+
286
+ def show_enhancers
287
+ dict = {}
288
+ ObjectSpace.each_object(Module) do |mod|
289
+ dict[$1] = mod if mod.name =~ /\AErubis::(.*)Enhancer\z/
290
+ end
291
+ s = "enhancers:\n"
292
+ dict.sort_by {|name, mod| name }.each do |name, mod|
293
+ s << (" %-13s : %s\n" % [name, mod.desc])
294
+ end
295
+ return s
296
+ end
297
+
298
+ def version
299
+ return Erubis::VERSION
300
+ end
301
+
302
+ def parse_argv(argv, arg_none='', arg_required='', arg_optional='')
303
+ options = {}
304
+ context = {}
305
+ while argv[0] && argv[0][0] == ?-
306
+ optstr = argv.shift
307
+ optstr = optstr[1, optstr.length-1]
308
+ #
309
+ if optstr[0] == ?- # context
310
+ optstr =~ /\A\-([-\w]+)(?:=(.*))?/ or
311
+ raise CommandOptionError.new("-#{optstr}: invalid context value.")
312
+ name, value = $1, $2
313
+ name = name.gsub(/-/, '_').intern
314
+ #value = value.nil? ? true : YAML.load(value) # error, why?
315
+ value = value.nil? ? true : YAML.load("---\n#{value}\n")
316
+ context[name] = value
317
+ #
318
+ else # options
319
+ while optstr && !optstr.empty?
320
+ optchar = optstr[0].chr
321
+ optstr = optstr[1..-1]
322
+ if arg_none.include?(optchar)
323
+ options[optchar] = true
324
+ elsif arg_required.include?(optchar)
325
+ arg = optstr.empty? ? argv.shift : optstr or
326
+ raise CommandOptionError.new("-#{optchar}: #{@option_names[optchar]} required.")
327
+ options[optchar] = arg
328
+ optstr = nil
329
+ elsif arg_optional.include?(optchar)
330
+ arg = optstr.empty? ? true : optstr
331
+ options[optchar] = arg
332
+ optstr = nil
333
+ else
334
+ raise CommandOptionError.new("-#{optchar}: unknown option.")
335
+ end
336
+ end
337
+ end
338
+ #
339
+ end # end of while
340
+
341
+ return options, context
342
+ end
343
+
344
+
345
+ def untabify(str, width=8)
346
+ list = str.split(/\t/)
347
+ last = list.pop
348
+ sb = ''
349
+ list.each do |s|
350
+ column = (n = s.rindex(?\n)) ? s.length - n - 1 : s.length
351
+ n = width - (column % width)
352
+ sb << s << (' ' * n)
353
+ end
354
+ sb << last
355
+ return sb
356
+ end
357
+ #--
358
+ #def untabify(str, width=8)
359
+ # sb = ''
360
+ # str.scan(/(.*?)\t/m) do |s, |
361
+ # len = (n = s.rindex(?\n)) ? s.length - n - 1 : s.length
362
+ # sb << s << (" " * (width - len % width))
363
+ # end
364
+ # return $' ? (sb << $') : str
365
+ #end
366
+ #++
367
+
368
+
369
+ def get_classobj(classname, lang, pi)
370
+ classname ||= "E#{lang}"
371
+ base_module = pi ? Erubis::PI : Erubis
372
+ begin
373
+ klass = base_module.const_get(classname)
374
+ rescue NameError
375
+ klass = nil
376
+ end
377
+ unless klass
378
+ if lang
379
+ msg = "-l #{lang}: invalid language name (class #{base_module.name}::#{classname} not found)."
380
+ else
381
+ msg = "-c #{classname}: invalid class name."
382
+ end
383
+ raise CommandOptionError.new(msg)
384
+ end
385
+ return klass
386
+ end
387
+
388
+ def get_enhancers(enhancer_names)
389
+ return [] unless enhancer_names
390
+ enhancers = []
391
+ shortname = nil
392
+ begin
393
+ enhancer_names.split(/,/).each do |name|
394
+ shortname = name
395
+ enhancers << Erubis.const_get("#{shortname}Enhancer")
396
+ end
397
+ rescue NameError
398
+ raise CommandOptionError.new("#{shortname}: no such Enhancer (try '-h' to show all enhancers).")
399
+ end
400
+ return enhancers
401
+ end
402
+
403
+ def load_datafiles(filenames, opts)
404
+ context = Erubis::Context.new
405
+ return context unless filenames
406
+ filenames.split(/,/).each do |filename|
407
+ filename.strip!
408
+ test(?f, filename) or raise CommandOptionError.new("#{filename}: file not found.")
409
+ if filename =~ /\.ya?ml$/
410
+ if opts.unexpand
411
+ ydoc = YAML.load_file(filename)
412
+ else
413
+ ydoc = YAML.load(untabify(File.read(filename)))
414
+ end
415
+ ydoc.is_a?(Hash) or raise CommandOptionError.new("#{filename}: root object is not a mapping.")
416
+ intern_hash_keys(ydoc) if opts.intern
417
+ context.update(ydoc)
418
+ elsif filename =~ /\.rb$/
419
+ str = File.read(filename)
420
+ context2 = Erubis::Context.new
421
+ _instance_eval(context2, str)
422
+ context.update(context2)
423
+ else
424
+ CommandOptionError.new("#{filename}: '*.yaml', '*.yml', or '*.rb' required.")
425
+ end
426
+ end
427
+ return context
428
+ end
429
+
430
+ def _instance_eval(_context, _str)
431
+ _context.instance_eval(_str)
432
+ end
433
+
434
+ def parse_context_data(context_str, opts)
435
+ if context_str[0] == ?{
436
+ require 'yaml'
437
+ ydoc = YAML.load(context_str)
438
+ unless ydoc.is_a?(Hash)
439
+ raise CommandOptionError.new("-c: root object is not a mapping.")
440
+ end
441
+ intern_hash_keys(ydoc) if opts.intern
442
+ return ydoc
443
+ else
444
+ context = Erubis::Context.new
445
+ context.instance_eval(context_str, '-c')
446
+ return context
447
+ end
448
+ end
449
+
450
+ def intern_hash_keys(obj, done={})
451
+ return if done.key?(obj.__id__)
452
+ case obj
453
+ when Hash
454
+ done[obj.__id__] = obj
455
+ obj.keys.each do |key|
456
+ obj[key.intern] = obj.delete(key) if key.is_a?(String)
457
+ end
458
+ obj.values.each do |val|
459
+ intern_hash_keys(val, done) if val.is_a?(Hash) || val.is_a?(Array)
460
+ end
461
+ when Array
462
+ done[obj.__id__] = obj
463
+ obj.each do |val|
464
+ intern_hash_keys(val, done) if val.is_a?(Hash) || val.is_a?(Array)
465
+ end
466
+ end
467
+ end
468
+
469
+ def check_syntax(filename, src)
470
+ require 'open3'
471
+ #command = (ENV['_'] || 'ruby') + ' -wc' # ENV['_'] stores command name
472
+ bin = ENV['_'] && File.basename(ENV['_']) =~ /^ruby/ ? ENV['_'] : 'ruby'
473
+ command = bin + ' -wc'
474
+ stdin, stdout, stderr = Open3.popen3(command)
475
+ stdin.write(src)
476
+ stdin.close
477
+ result = stdout.read()
478
+ stdout.close()
479
+ errmsg = stderr.read()
480
+ stderr.close()
481
+ return nil unless errmsg && !errmsg.empty?
482
+ errmsg =~ /\A-:(\d+): /
483
+ linenum, message = $1, $'
484
+ return "#{filename}:#{linenum}: #{message}"
485
+ end
486
+
487
+ end
488
+
489
+ end
@@ -0,0 +1,58 @@
1
+ ###
2
+ ### $Release: 2.6.5 $
3
+ ### copyright(c) 2006-2009 kuwata-lab.com all rights reserved.
4
+ ###
5
+
6
+ require 'cgi'
7
+
8
+
9
+ module Erubis
10
+
11
+
12
+ ##
13
+ ## for preprocessing
14
+ ##
15
+ class PreprocessingEruby < Erubis::Eruby
16
+
17
+ def initialize(input, params={})
18
+ params = params.dup
19
+ params[:pattern] ||= '\[% %\]' # use '[%= %]' instead of '<%= %>'
20
+ #params[:escape] = true # transport '[%= %]' and '[%== %]'
21
+ super
22
+ end
23
+
24
+ def add_expr_escaped(src, code)
25
+ add_expr_literal(src, "_decode((#{code}))")
26
+ end
27
+
28
+ end
29
+
30
+
31
+ ##
32
+ ## helper methods for preprocessing
33
+ ##
34
+ module PreprocessingHelper
35
+
36
+ module_function
37
+
38
+ def _p(arg)
39
+ return "<%=#{arg}%>"
40
+ end
41
+
42
+ def _P(arg)
43
+ return "<%=h(#{arg})%>"
44
+ end
45
+
46
+ alias _? _p
47
+
48
+ def _decode(arg)
49
+ arg = arg.to_s
50
+ arg.gsub!(/%3C%25(?:=|%3D)(.*?)%25%3E/) { "<%=#{CGI.unescape($1)}%>" }
51
+ arg.gsub!(/&lt;%=(.*?)%&gt;/) { "<%=#{CGI.unescapeHTML($1)}%>" }
52
+ return arg
53
+ end
54
+
55
+ end
56
+
57
+
58
+ end
@@ -0,0 +1,144 @@
1
+ ##
2
+ ## $Release: 2.6.5 $
3
+ ## copyright(c) 2006-2009 kuwata-lab.com all rights reserved.
4
+ ##
5
+
6
+ module Erubis
7
+
8
+ ##
9
+ ## tiny and the simplest implementation of eRuby
10
+ ##
11
+ ## ex.
12
+ ## eruby = TinyEruby.new(File.read('example.rhtml'))
13
+ ## print eruby.src # print ruby code
14
+ ## print eruby.result(binding()) # eval ruby code with Binding object
15
+ ## print eruby.evalute(context) # eval ruby code with context object
16
+ ##
17
+ class TinyEruby
18
+
19
+ def initialize(input=nil)
20
+ @src = convert(input) if input
21
+ end
22
+ attr_reader :src
23
+
24
+ EMBEDDED_PATTERN = /<%(=+|\#)?(.*?)-?%>/m
25
+
26
+ def convert(input)
27
+ src = "_buf = '';" # preamble
28
+ pos = 0
29
+ input.scan(EMBEDDED_PATTERN) do |indicator, code|
30
+ m = Regexp.last_match
31
+ text = input[pos...m.begin(0)]
32
+ pos = m.end(0)
33
+ #src << " _buf << '" << escape_text(text) << "';"
34
+ text.gsub!(/['\\]/, '\\\\\&')
35
+ src << " _buf << '" << text << "';" unless text.empty?
36
+ if !indicator # <% %>
37
+ src << code << ";"
38
+ elsif indicator == '#' # <%# %>
39
+ src << ("\n" * code.count("\n"))
40
+ else # <%= %>
41
+ src << " _buf << (" << code << ").to_s;"
42
+ end
43
+ end
44
+ #rest = $' || input # ruby1.8
45
+ rest = pos == 0 ? input : input[pos..-1] # ruby1.9
46
+ #src << " _buf << '" << escape_text(rest) << "';"
47
+ rest.gsub!(/['\\]/, '\\\\\&')
48
+ src << " _buf << '" << rest << "';" unless rest.empty?
49
+ src << "\n_buf.to_s\n" # postamble
50
+ return src
51
+ end
52
+
53
+ #def escape_text(text)
54
+ # return text.gsub!(/['\\]/, '\\\\\&') || text
55
+ #end
56
+
57
+ def result(_binding=TOPLEVEL_BINDING)
58
+ eval @src, _binding
59
+ end
60
+
61
+ def evaluate(_context=Object.new)
62
+ if _context.is_a?(Hash)
63
+ _obj = Object.new
64
+ _context.each do |k, v| _obj.instance_variable_set("@#{k}", v) end
65
+ _context = _obj
66
+ end
67
+ _context.instance_eval @src
68
+ end
69
+
70
+ end
71
+
72
+
73
+
74
+ module PI
75
+ end
76
+
77
+ class PI::TinyEruby
78
+
79
+ def initialize(input=nil, options={})
80
+ @escape = options[:escape] || 'Erubis::XmlHelper.escape_xml'
81
+ @src = convert(input) if input
82
+ end
83
+
84
+ attr_reader :src
85
+
86
+ EMBEDDED_PATTERN = /(^[ \t]*)?<\?rb(\s.*?)\?>([ \t]*\r?\n)?|@(!+)?\{(.*?)\}@/m
87
+
88
+ def convert(input)
89
+ src = "_buf = '';" # preamble
90
+ pos = 0
91
+ input.scan(EMBEDDED_PATTERN) do |lspace, stmt, rspace, indicator, expr|
92
+ match = Regexp.last_match
93
+ len = match.begin(0) - pos
94
+ text = input[pos, len]
95
+ pos = match.end(0)
96
+ #src << " _buf << '" << escape_text(text) << "';"
97
+ text.gsub!(/['\\]/, '\\\\\&')
98
+ src << " _buf << '" << text << "';" unless text.empty?
99
+ if stmt # <?rb ... ?>
100
+ if lspace && rspace
101
+ src << "#{lspace}#{stmt}#{rspace}"
102
+ else
103
+ src << " _buf << '" << lspace << "';" if lspace
104
+ src << stmt << ";"
105
+ src << " _buf << '" << rspace << "';" if rspace
106
+ end
107
+ else # ${...}, $!{...}
108
+ if !indicator
109
+ src << " _buf << " << @escape << "(" << expr << ");"
110
+ elsif indicator == '!'
111
+ src << " _buf << (" << expr << ").to_s;"
112
+ end
113
+ end
114
+ end
115
+ #rest = $' || input # ruby1.8
116
+ rest = pos == 0 ? input : input[pos..-1] # ruby1.9
117
+ #src << " _buf << '" << escape_text(rest) << "';"
118
+ rest.gsub!(/['\\]/, '\\\\\&')
119
+ src << " _buf << '" << rest << "';" unless rest.empty?
120
+ src << "\n_buf.to_s\n" # postamble
121
+ return src
122
+ end
123
+
124
+ #def escape_text(text)
125
+ # return text.gsub!(/['\\]/, '\\\\\&') || text
126
+ #end
127
+
128
+ def result(_binding=TOPLEVEL_BINDING)
129
+ eval @src, _binding
130
+ end
131
+
132
+ def evaluate(_context=Object.new)
133
+ if _context.is_a?(Hash)
134
+ _obj = Object.new
135
+ _context.each do |k, v| _obj.instance_variable_set("@#{k}", v) end
136
+ _context = _obj
137
+ end
138
+ _context.instance_eval @src
139
+ end
140
+
141
+ end
142
+
143
+
144
+ end