erubis 2.0.1 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (145) hide show
  1. data/ChangeLog +150 -2
  2. data/LGPL +504 -0
  3. data/README.txt +14 -8
  4. data/benchmark/erubybench.rb +1 -1
  5. data/benchmark/erubybench.rhtml +3 -3
  6. data/bin/erubis +1 -1
  7. data/bin/notext +154 -0
  8. data/contrib/erubis +1036 -374
  9. data/contrib/inline-require +5 -3
  10. data/doc-api/classes/Erubis.html +43 -1
  11. data/doc-api/classes/Erubis/ArrayBufferEnhancer.html +14 -14
  12. data/doc-api/classes/Erubis/ArrayEnhancer.html +14 -14
  13. data/doc-api/classes/Erubis/Basic.html +112 -0
  14. data/doc-api/classes/Erubis/Basic/Converter.html +318 -0
  15. data/doc-api/classes/Erubis/Basic/Engine.html +130 -0
  16. data/doc-api/classes/Erubis/BiPatternEnhancer.html +14 -14
  17. data/doc-api/classes/Erubis/CGenerator.html +386 -0
  18. data/doc-api/classes/Erubis/Context.html +31 -32
  19. data/doc-api/classes/Erubis/Converter.html +231 -0
  20. data/doc-api/classes/Erubis/Ec.html +9 -283
  21. data/doc-api/classes/Erubis/Ejava.html +9 -274
  22. data/doc-api/classes/Erubis/Ejavascript.html +9 -298
  23. data/doc-api/classes/Erubis/Engine.html +68 -508
  24. data/doc-api/classes/Erubis/Eperl.html +9 -259
  25. data/doc-api/classes/Erubis/Ephp.html +9 -239
  26. data/doc-api/classes/Erubis/ErubisError.html +2 -2
  27. data/doc-api/classes/Erubis/Eruby.html +4 -187
  28. data/doc-api/classes/Erubis/EscapeEnhancer.html +9 -11
  29. data/doc-api/classes/Erubis/Escheme.html +9 -272
  30. data/doc-api/classes/Erubis/Evaluator.html +212 -0
  31. data/doc-api/classes/Erubis/Generator.html +410 -0
  32. data/doc-api/classes/Erubis/HeaderFooterEnhancer.html +16 -16
  33. data/doc-api/classes/Erubis/Helper.html +112 -0
  34. data/doc-api/classes/Erubis/Helper/CachedRailsTemplate.html +198 -0
  35. data/doc-api/classes/Erubis/Helper/RailsTemplate.html +366 -0
  36. data/doc-api/classes/Erubis/JavaGenerator.html +359 -0
  37. data/doc-api/classes/Erubis/JavascriptGenerator.html +381 -0
  38. data/doc-api/classes/Erubis/Main.html +27 -25
  39. data/doc-api/classes/Erubis/NoCodeEnhancer.html +249 -0
  40. data/doc-api/classes/Erubis/NoCodeEruby.html +120 -0
  41. data/doc-api/classes/Erubis/NoTextEnhancer.html +8 -8
  42. data/doc-api/classes/Erubis/NotSupportedError.html +119 -0
  43. data/doc-api/classes/Erubis/OptimizedEruby.html +22 -304
  44. data/doc-api/classes/Erubis/OptimizedGenerator.html +439 -0
  45. data/doc-api/classes/Erubis/OptimizedXmlEruby.html +7 -7
  46. data/doc-api/classes/Erubis/PI.html +124 -0
  47. data/doc-api/classes/Erubis/PI/Converter.html +318 -0
  48. data/doc-api/classes/Erubis/PI/Ec.html +166 -0
  49. data/doc-api/classes/Erubis/PI/Ejava.html +166 -0
  50. data/doc-api/classes/Erubis/PI/Ejavascript.html +166 -0
  51. data/doc-api/classes/Erubis/PI/Engine.html +122 -0
  52. data/doc-api/classes/Erubis/PI/Eperl.html +166 -0
  53. data/doc-api/classes/Erubis/PI/Ephp.html +166 -0
  54. data/doc-api/classes/Erubis/PI/Eruby.html +155 -0
  55. data/doc-api/classes/Erubis/PI/Escheme.html +166 -0
  56. data/doc-api/classes/Erubis/PI/TinyEruby.html +305 -0
  57. data/doc-api/classes/Erubis/PercentLineEnhancer.html +7 -7
  58. data/doc-api/classes/Erubis/PerlGenerator.html +344 -0
  59. data/doc-api/classes/Erubis/PhpGenerator.html +350 -0
  60. data/doc-api/classes/Erubis/PrintEnabledEnhancer.html +24 -24
  61. data/doc-api/classes/Erubis/PrintOutEnhancer.html +35 -35
  62. data/doc-api/classes/Erubis/RubyEvaluator.html +190 -0
  63. data/doc-api/classes/Erubis/RubyGenerator.html +327 -0
  64. data/doc-api/classes/Erubis/SchemeGenerator.html +382 -0
  65. data/doc-api/classes/Erubis/SimplifyEnhancer.html +17 -13
  66. data/doc-api/classes/Erubis/StdoutEnhancer.html +14 -14
  67. data/doc-api/classes/Erubis/StringBufferEnhancer.html +14 -14
  68. data/doc-api/classes/Erubis/TinyEruby.html +45 -40
  69. data/doc-api/classes/Erubis/XmlHelper.html +14 -14
  70. data/doc-api/created.rid +1 -1
  71. data/doc-api/files/__/README_txt.html +27 -9
  72. data/doc-api/files/erubis/context_rb.html +107 -0
  73. data/doc-api/files/erubis/converter_rb.html +114 -0
  74. data/doc-api/files/erubis/engine/ec_rb.html +2 -2
  75. data/doc-api/files/erubis/engine/ejava_rb.html +2 -2
  76. data/doc-api/files/erubis/engine/ejavascript_rb.html +2 -2
  77. data/doc-api/files/erubis/engine/enhanced_rb.html +2 -2
  78. data/doc-api/files/erubis/engine/eperl_rb.html +2 -2
  79. data/doc-api/files/erubis/engine/ephp_rb.html +2 -2
  80. data/doc-api/files/erubis/engine/eruby_rb.html +3 -2
  81. data/doc-api/files/erubis/engine/escheme_rb.html +2 -2
  82. data/doc-api/files/erubis/engine/optimized_rb.html +2 -2
  83. data/doc-api/files/erubis/engine_rb.html +6 -3
  84. data/doc-api/files/erubis/enhancer_rb.html +2 -9
  85. data/doc-api/files/erubis/error_rb.html +107 -0
  86. data/doc-api/files/erubis/evaluator_rb.html +115 -0
  87. data/doc-api/files/erubis/generator_rb.html +114 -0
  88. data/doc-api/files/erubis/helper/rails_rb.html +140 -0
  89. data/doc-api/files/erubis/helper_rb.html +1 -1
  90. data/doc-api/files/erubis/local-setting_rb.html +1 -1
  91. data/doc-api/files/erubis/main_rb.html +2 -2
  92. data/doc-api/files/erubis/tiny_rb.html +2 -2
  93. data/doc-api/files/erubis_rb.html +2 -2
  94. data/doc-api/fr_class_index.html +32 -0
  95. data/doc-api/fr_file_index.html +6 -0
  96. data/doc-api/fr_method_index.html +178 -136
  97. data/doc/users-guide.html +538 -199
  98. data/examples/{Makefile → basic/Makefile} +11 -11
  99. data/examples/basic/example.ec +42 -0
  100. data/examples/{example.ejava → basic/example.ejava} +5 -1
  101. data/examples/{example.ejavascript → basic/example.ejs} +0 -0
  102. data/examples/{example.eperl → basic/example.eperl} +2 -2
  103. data/examples/{example.ephp → basic/example.ephp} +0 -0
  104. data/examples/{example.eruby → basic/example.eruby} +0 -0
  105. data/examples/{example.escheme → basic/example.escheme} +0 -0
  106. data/examples/pi/Makefile +54 -0
  107. data/examples/pi/example.ec +42 -0
  108. data/examples/pi/example.ejava +45 -0
  109. data/examples/pi/example.ejs +16 -0
  110. data/examples/pi/example.eperl +16 -0
  111. data/examples/pi/example.ephp +17 -0
  112. data/examples/pi/example.eruby +15 -0
  113. data/examples/pi/example.escheme +26 -0
  114. data/lib/erubis.rb +15 -8
  115. data/lib/erubis/context.rb +54 -0
  116. data/lib/erubis/converter.rb +307 -0
  117. data/lib/erubis/engine.rb +57 -227
  118. data/lib/erubis/engine/ec.rb +31 -20
  119. data/lib/erubis/engine/ejava.rb +33 -21
  120. data/lib/erubis/engine/ejavascript.rb +30 -18
  121. data/lib/erubis/engine/enhanced.rb +7 -2
  122. data/lib/erubis/engine/eperl.rb +33 -19
  123. data/lib/erubis/engine/ephp.rb +32 -14
  124. data/lib/erubis/engine/eruby.rb +34 -7
  125. data/lib/erubis/engine/escheme.rb +34 -15
  126. data/lib/erubis/engine/optimized.rb +25 -11
  127. data/lib/erubis/enhancer.rb +53 -19
  128. data/lib/erubis/error.rb +24 -0
  129. data/lib/erubis/evaluator.rb +71 -0
  130. data/lib/erubis/generator.rb +83 -0
  131. data/lib/erubis/helper.rb +1 -1
  132. data/lib/erubis/helper/rails.rb +159 -0
  133. data/lib/erubis/local-setting.rb +1 -1
  134. data/lib/erubis/main.rb +87 -46
  135. data/lib/erubis/tiny.rb +81 -7
  136. data/test/assert-text-equal.rb +1 -1
  137. data/test/test-engines.rb +8 -9
  138. data/test/test-erubis.rb +196 -18
  139. data/test/{test-bin.rb → test-main.rb} +123 -21
  140. data/test/test-notext.rb +27 -0
  141. data/test/test.rb +5 -3
  142. data/test/testutil.rb +25 -36
  143. metadata +75 -13
  144. data/COPYING +0 -340
  145. data/examples/example.ec +0 -24
@@ -0,0 +1,83 @@
1
+ ##
2
+ ## $Rev: 32 $
3
+ ## $Release: 2.1.0 $
4
+ ## copyright(c) 2006 kuwata-lab all rights reserved.
5
+ ##
6
+
7
+ require 'abstract'
8
+
9
+ module Erubis
10
+
11
+
12
+ module Generator
13
+
14
+ def self.supported_properties() # :nodoc:
15
+ return [
16
+ [:escapefunc, nil, "escape function name"],
17
+ ]
18
+ end
19
+
20
+ attr_accessor :escapefunc
21
+
22
+ def init_generator(properties={})
23
+ @escapefunc = properties[:escapefunc]
24
+ end
25
+
26
+
27
+ ## (abstract) escape text string
28
+ ##
29
+ ## ex.
30
+ ## def escape_text(text)
31
+ ## return text.dump
32
+ ## # or return "'" + text.gsub(/['\\]/, '\\\\\&') + "'"
33
+ ## end
34
+ def escape_text(text)
35
+ not_implemented
36
+ end
37
+
38
+ ## return escaped expression code (ex. 'h(...)' or 'htmlspecialchars(...)')
39
+ def escaped_expr(code)
40
+ code.strip!
41
+ return "#{@escapefunc}(#{code})"
42
+ end
43
+
44
+ ## (abstract) add @preamble to src
45
+ def add_preamble(src)
46
+ not_implemented
47
+ end
48
+
49
+ ## (abstract) add text string to src
50
+ def add_text(src, text)
51
+ not_implemented
52
+ end
53
+
54
+ ## (abstract) add statement code to src
55
+ def add_stmt(src, code)
56
+ not_implemented
57
+ end
58
+
59
+ ## (abstract) add expression literal code to src. this is called by add_expr().
60
+ def add_expr_literal(src, code)
61
+ not_implemented
62
+ end
63
+
64
+ ## (abstract) add escaped expression code to src. this is called by add_expr().
65
+ def add_expr_escaped(src, code)
66
+ not_implemented
67
+ end
68
+
69
+ ## (abstract) add expression code to src for debug. this is called by add_expr().
70
+ def add_expr_debug(src, code)
71
+ not_implemented
72
+ end
73
+
74
+ ## (abstract) add @postamble to src
75
+ def add_postamble(src)
76
+ not_implemented
77
+ end
78
+
79
+
80
+ end
81
+
82
+
83
+ end
@@ -1,6 +1,6 @@
1
1
  ##
2
2
  ## $Rev: 21 $
3
- ## $Release: 2.0.1 $
3
+ ## $Release: 2.1.0 $
4
4
  ## copyright(c) 2006 kuwata-lab all rights reserved.
5
5
  ##
6
6
 
@@ -0,0 +1,159 @@
1
+ ###
2
+ ### $Rev: 38 $
3
+ ### $Release: 2.1.0 $
4
+ ### copyright(c) 2006 kuwata-lab all rights reserved.
5
+ ###
6
+ ### = How to use Erubis in Rails
7
+ ###
8
+ ### 1. add the folliwng code in your 'app/controllers/application.rb'.
9
+ ### --------------------
10
+ ### require 'erubis/helper/rails'
11
+ ### suffix = 'erubis'
12
+ ### ActionView::Base.register_template_handler(suffix, Erubis::Helper::RailsTemplate)
13
+ ### #Erubis::Helper::RailsTemplate.engine_class = Erubis::EscapedEruby ## if you want
14
+ ### #Erubis::Helper::RailsTemplate.default_class = { :escape=>true, :escapefunc='h' }
15
+ ### --------------------
16
+ ### 2. restart web server.
17
+ ### 3. change view template filename from 'file.rhtml' to 'file.erubis'.
18
+ ### (suffix '.rhtml' is not recommended because error page of Rails is
19
+ ### assumed to use ERB.)
20
+ ###
21
+
22
+
23
+ require 'erubis'
24
+
25
+
26
+ module Erubis
27
+
28
+ module Helper
29
+
30
+ class RailsTemplate
31
+
32
+
33
+ @@engine_class = Erubis::Eruby
34
+
35
+ def self.engine_class
36
+ @@engine_class
37
+ end
38
+
39
+ def self.engine_class=(klass)
40
+ @@engine_class = klass
41
+ @@engine_instance = klass.new
42
+ end
43
+
44
+ #cattr_accessor :engine_class
45
+
46
+
47
+ @@default_properties = { }
48
+
49
+ def self.default_properties
50
+ return @@default_properties
51
+ end
52
+
53
+ def self.default_properties=(properties)
54
+ @@default_properties = properties
55
+ end
56
+
57
+ #cattr_accessor :default_properties
58
+
59
+
60
+ def initialize(view)
61
+ @view = view
62
+ #@@engine_instance ||= @@engine_class.new(nil, @@default_properties)
63
+ end
64
+
65
+
66
+ def convert(template)
67
+ #code = @@engine_instance.convert(template)
68
+ #return code
69
+ engine = @@engine_class.new(nil, @@default_properties)
70
+ code = engine.convert(template)
71
+ return code
72
+ end
73
+
74
+
75
+ def render(template, assigns)
76
+ ## get ruby code
77
+ code = convert(template)
78
+
79
+ ## use @view as context object
80
+ @view.__send__(:evaluate_assigns) #or @view.instance_eval("evaluate_assigns()")
81
+ context = @view
82
+
83
+ ## evaluate ruby code with context object
84
+ if assigns && !assigns.empty?
85
+ return _evaluate_string(code, context, assigns)
86
+ else
87
+ return context.instance_eval(code)
88
+ end
89
+ end
90
+
91
+
92
+ protected
93
+
94
+
95
+ def _localvar_code(_localvars)
96
+ list = _localvars.collect { |_name| "#{_name} = _localvars[#{_name.inspect}]\n" }
97
+ code = list.join()
98
+ return code
99
+ end
100
+
101
+
102
+ def _evaluate_string(_code, _context, _localvars)
103
+ eval(_localvar_code(_localvars))
104
+ _context.instance_eval(_code)
105
+ end
106
+
107
+
108
+ end #class
109
+
110
+
111
+
112
+ class CachedRailsTemplate < RailsTemplate
113
+
114
+
115
+ @@cache_table = {}
116
+
117
+
118
+ def render(template, assigns)
119
+ ## template path without suffix
120
+ ## (how to get template path name with suffix? I can't find...)
121
+ c = @view.controller
122
+ template_basename = c.template_root + "/" + c.controller_name + "/" + c.action_name
123
+
124
+ ## cache template
125
+ proc_obj = @@cache_table[template_basename]
126
+ unless proc_obj
127
+ code = convert(template)
128
+ proc_obj = eval("proc do #{code} end")
129
+ @@cache_table[template_basename] = proc_obj
130
+ end
131
+
132
+ ## use @view as context object
133
+ @view.__send__(:evaluate_assigns)
134
+ #or @view.instance_eval("evaluate_assigns()")
135
+ context = @view
136
+
137
+ ## evaluate ruby code with context object
138
+ if assigns && !assigns.empty?
139
+ return _evaluate_proc(proc_obj, context, assigns)
140
+ else
141
+ return context.instance_eval(&proc_obj)
142
+ end
143
+ end
144
+
145
+
146
+ protected
147
+
148
+
149
+ def _evaluate_proc(_proc_obj, _context, _localvars)
150
+ eval(_localvar_code(_localvars))
151
+ _context.instance_eval(&_proc_obj)
152
+ end
153
+
154
+
155
+ end #class
156
+
157
+ end #module
158
+
159
+ end #module
@@ -1,6 +1,6 @@
1
1
  ##
2
2
  ## $Rev: 13 $
3
- ## $Release: 2.0.1 $
3
+ ## $Release: 2.1.0 $
4
4
  ## copyright(c) 2006 kuwata-lab all rights reserved.
5
5
  ##
6
6
 
@@ -1,6 +1,6 @@
1
1
  ###
2
- ### $Rev: 21 $
3
- ### $Release: 2.0.1 $
2
+ ### $Rev: 41 $
3
+ ### $Release: 2.1.0 $
4
4
  ### copyright(c) 2006 kuwata-lab all rights reserved.
5
5
  ###
6
6
 
@@ -112,15 +112,15 @@ module Erubis
112
112
 
113
113
  ## action
114
114
  action = opts.action
115
- action ||= 'compile' if opts.source
115
+ action ||= 'convert' if opts.source
116
116
 
117
117
  ## lang
118
118
  lang = opts.lang || 'ruby'
119
- action ||= 'compile' if opts.lang
119
+ action ||= 'convert' if opts.lang
120
120
 
121
121
  ## class name of Eruby
122
122
  classname = opts.class
123
- klass = get_classobj(classname, lang)
123
+ klass = get_classobj(classname, lang, properties[:pi])
124
124
 
125
125
  ## kanji code
126
126
  $KCODE = opts.kanji if opts.kanji
@@ -130,31 +130,33 @@ module Erubis
130
130
  context = load_yamlfiles(yamlfiles, opts)
131
131
 
132
132
  ## properties for engine
133
+ properties[:escape] = true if opts.escape && !properties.key?(:escape)
133
134
  properties[:pattern] = opts.pattern if opts.pattern
134
135
  properties[:trim] = false if opts.notrim
135
136
  properties[:preamble] = properties[:postamble] = false if opts.bodyonly
137
+ properties[:pi] = nil if properties[:pi] == true
136
138
 
137
139
  ## create engine and extend enhancers
138
140
  engine = klass.new(nil, properties)
139
141
  enhancers = get_enhancers(opts.enhancers)
140
- enhancers.push(Erubis::EscapeEnhancer) if opts.escape
142
+ #enhancers.push(Erubis::EscapeEnhancer) if opts.escape
141
143
  enhancers.each do |enhancer|
142
144
  engine.extend(enhancer)
143
145
  engine.bipattern = properties[:bipattern] if enhancer == Erubis::BiPatternEnhancer
144
146
  end
145
147
 
146
- ## compile and execute
148
+ ## convert and execute
147
149
  val = nil
148
150
  if filenames && !filenames.empty?
149
151
  filenames.each do |filename|
150
152
  test(?f, filename) or raise CommandOptionError.new("#{filename}: file not found.")
151
153
  engine.filename = filename
152
- engine.compile!(File.read(filename))
154
+ engine.convert!(File.read(filename))
153
155
  print val if val = do_action(action, engine, context, opts)
154
156
  end
155
157
  else
156
158
  engine.filename = '(stdin)'
157
- engine.compile!($stdin.read())
159
+ engine.convert!($stdin.read())
158
160
  print val if val = do_action(action, engine, context, opts)
159
161
  end
160
162
 
@@ -164,7 +166,7 @@ module Erubis
164
166
 
165
167
  def do_action(action, engine, context, opts)
166
168
  case action
167
- when 'compile'
169
+ when 'convert'
168
170
  s = engine.src
169
171
  when nil, 'exec', 'execute'
170
172
  s = opts.binding ? engine.result(context) : engine.evaluate(context)
@@ -176,42 +178,61 @@ module Erubis
176
178
 
177
179
  def usage
178
180
  command = File.basename($0)
179
- s = <<'END'
180
- erubis - embedded program compiler for multi-language
181
+ s = <<END
182
+ erubis - embedded program converter for multi-language
181
183
  Usage: #{command} [..options..] [file ...]
182
184
  -h, --help : help
183
185
  -v : version
184
- -x : compiled code
186
+ -x : converted code
185
187
  -T : don't trim spaces around '<% %>'
186
188
  -b : body only (no preamble nor postamble)
187
189
  -e : escape (equal to '--E Escape')
188
190
  -p pattern : embedded pattern (default '<% %>')
189
- -l lang : compile but no execute (ruby/php/c/java/scheme/perl/js)
190
- -E enhancer,... : enhancer name (Escape, PercentLine, BiPattern, ...)
191
+ -l lang : convert but no execute (ruby/php/c/java/scheme/perl/js)
192
+ -E e1,e2,... : enhancer names (Escape, PercentLine, BiPattern, ...)
191
193
  -I path : library include path
192
194
  -K kanji : kanji code (euc/sjis/utf8) (default none)
193
195
  -f file.yaml : YAML file for context values (read stdin if filename is '-')
194
196
  -t : expand tab character in YAML file
195
197
  -S : convert mapping key from string to symbol in YAML file
196
198
  -B : invoke 'result(binding)' instead of 'evaluate(context)'
199
+ --pi=name : parse '<?name ... ?>' instead of '<% ... %>'
197
200
 
198
201
  END
202
+ #'
199
203
  # -c class : class name (XmlEruby/PercentLineEruby/...) (default Eruby)
200
204
  # -r library : require library
201
- # -a : action (compile/execute)
205
+ # -a : action (convert/execute)
202
206
  return s
203
207
  end
204
208
 
209
+
210
+ def collect_supported_properties(erubis_klass)
211
+ list = []
212
+ erubis_klass.ancestors.each do |klass|
213
+ if klass.respond_to?(:supported_properties)
214
+ list.concat(klass.supported_properties)
215
+ end
216
+ end
217
+ return list
218
+ end
219
+
205
220
  def show_properties
206
221
  s = "supported properties:\n"
207
- %w[(common) ruby php c java scheme perl javascript].each do |lang|
208
- list = Erubis::Engine.supported_properties
209
- if lang != '(common)'
210
- klass = Erubis.const_get("E#{lang}")
211
- list = klass.supported_properties - list
212
- end
222
+ basic_props = collect_supported_properties(Erubis::Basic::Engine)
223
+ pi_props = collect_supported_properties(Erubis::PI::Engine)
224
+ list = []
225
+ common_props = basic_props & pi_props
226
+ list << ['(common)', common_props]
227
+ list << ['(basic)', basic_props - common_props]
228
+ list << ['(pi)', pi_props - common_props]
229
+ %w[ruby php c java scheme perl javascript].each do |lang|
230
+ klass = Erubis.const_get("E#{lang}")
231
+ list << [lang, collect_supported_properties(klass) - basic_props]
232
+ end
233
+ list.each do |lang, props|
213
234
  s << " * #{lang}\n"
214
- list.each do |name, default_val, desc|
235
+ props.each do |name, default_val, desc|
215
236
  s << (" --%-23s : %s\n" % ["#{name}=#{default_val.inspect}", desc])
216
237
  end
217
238
  end
@@ -233,7 +254,7 @@ END
233
254
  end
234
255
 
235
256
  def version
236
- release = ('$Release: 2.0.1 $' =~ /([.\d]+)/) && $1
257
+ release = ('$Release: 2.1.0 $' =~ /([.\d]+)/) && $1
237
258
  return release
238
259
  end
239
260
 
@@ -283,27 +304,42 @@ END
283
304
  return options, context
284
305
  end
285
306
 
286
- def untabify(text, width=8)
307
+
308
+ def untabify(str, width=8)
309
+ list = str.split(/\t/)
310
+ last = list.pop
287
311
  sb = ''
288
- text.scan(/(.*?)\t/m) do |s, |
289
- len = (n = s.rindex(?\n)) ? s.length - n - 1 : s.length
290
- sb << s << (" " * (width - len % width))
312
+ list.each do |s|
313
+ column = (n = s.rindex(?\n)) ? s.length - n - 1 : s.length
314
+ n = width - (column % width)
315
+ sb << s << (' ' * n)
291
316
  end
292
- return $' ? (sb << $') : text
317
+ sb << last
318
+ return sb
293
319
  end
294
-
295
- def get_classobj(classname, lang)
296
- unless classname
297
- classname = lang =~ /\Axml(.*)/ ? "EscapedE#{$1}" : "E#{lang}"
298
- end
320
+ #--
321
+ #def untabify(str, width=8)
322
+ # sb = ''
323
+ # str.scan(/(.*?)\t/m) do |s, |
324
+ # len = (n = s.rindex(?\n)) ? s.length - n - 1 : s.length
325
+ # sb << s << (" " * (width - len % width))
326
+ # end
327
+ # return $' ? (sb << $') : str
328
+ #end
329
+ #++
330
+
331
+
332
+ def get_classobj(classname, lang, pi)
333
+ classname ||= "E#{lang}"
334
+ base_module = pi ? Erubis::PI : Erubis
299
335
  begin
300
- klass = Erubis.const_get(classname)
336
+ klass = base_module.const_get(classname)
301
337
  rescue NameError
302
338
  klass = nil
303
339
  end
304
340
  unless klass
305
341
  if lang
306
- msg = "-l #{lang}: invalid language name (class Erubis::#{classname} not found)."
342
+ msg = "-l #{lang}: invalid language name (class #{base_module.name}::#{classname} not found)."
307
343
  else
308
344
  msg = "-c #{classname}: invalid class name."
309
345
  end
@@ -342,25 +378,30 @@ END
342
378
  unless ydoc.is_a?(Hash)
343
379
  raise CommandOptionError.new("#{yamlfile}: root object is not a mapping.")
344
380
  end
345
- convert_mapping_key_from_string_to_symbol(ydoc) if opts.intern
381
+ intern_hash_keys(ydoc) if opts.intern
346
382
  hash.update(ydoc)
347
383
  end
348
384
  context = hash
349
385
  return context
350
386
  end
351
387
 
352
- def convert_mapping_key_from_string_to_symbol(ydoc)
353
- if ydoc.is_a?(Hash)
354
- ydoc.each do |key, val|
355
- ydoc[key.intern] = ydoc.delete(key) if key.is_a?(String)
356
- convert_mapping_key_from_string_to_symbol(val)
388
+ def intern_hash_keys(obj, done={})
389
+ return if done.key?(obj.__id__)
390
+ case obj
391
+ when Hash
392
+ done[obj.__id__] = obj
393
+ obj.keys.each do |key|
394
+ obj[key.intern] = obj.delete(key) if key.is_a?(String)
395
+ end
396
+ obj.values.each do |val|
397
+ intern_hash_keys(val, done) if val.is_a?(Hash) || val.is_a?(Array)
357
398
  end
358
- elsif ydoc.is_a?(Array)
359
- ydoc.each do |val|
360
- convert_mapping_key_from_string_to_symbol(val)
399
+ when Array
400
+ done[obj.__id__] = obj
401
+ obj.each do |val|
402
+ intern_hash_keys(val, done) if val.is_a?(Hash) || val.is_a?(Array)
361
403
  end
362
404
  end
363
- return ydoc
364
405
  end
365
406
 
366
407
  end