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,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