erubis 1.1.0 → 2.0.0
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.
- data/ChangeLog +45 -18
- data/README.txt +80 -0
- data/benchmark/erubybench-lib.rb +189 -0
- data/benchmark/erubybench.rb +364 -0
- data/benchmark/erubybench.rhtml +61 -0
- data/benchmark/erubybench.yaml +61 -0
- data/bin/erubis +4 -180
- data/contrib/erubis +2297 -0
- data/contrib/inline-require +151 -0
- data/doc-api/classes/Erubis.html +236 -0
- data/doc-api/classes/Erubis/ArrayBufferEnhancer.html +175 -0
- data/doc-api/classes/Erubis/ArrayBufferEruby.html +120 -0
- data/doc-api/classes/Erubis/ArrayEnhancer.html +174 -0
- data/doc-api/classes/Erubis/ArrayEruby.html +120 -0
- data/doc-api/classes/Erubis/BiPatternEnhancer.html +212 -0
- data/doc-api/classes/Erubis/BiPatternEruby.html +120 -0
- data/doc-api/classes/Erubis/CommandOptionError.html +113 -0
- data/doc-api/classes/Erubis/Context.html +249 -0
- data/doc-api/classes/Erubis/Ec.html +399 -0
- data/doc-api/classes/Erubis/Ejava.html +366 -0
- data/doc-api/classes/Erubis/Ejavascript.html +390 -0
- data/doc-api/classes/Erubis/Engine.html +711 -0
- data/doc-api/classes/Erubis/Eperl.html +350 -0
- data/doc-api/classes/Erubis/Ephp.html +308 -0
- data/doc-api/classes/Erubis/ErubisError.html +117 -0
- data/doc-api/classes/Erubis/Eruby.html +310 -0
- data/doc-api/classes/Erubis/EscapeEnhancer.html +167 -0
- data/doc-api/classes/Erubis/EscapedEc.html +120 -0
- data/doc-api/classes/Erubis/EscapedEjava.html +120 -0
- data/doc-api/classes/Erubis/EscapedEjavascript.html +120 -0
- data/doc-api/classes/Erubis/EscapedEperl.html +120 -0
- data/doc-api/classes/Erubis/EscapedEphp.html +120 -0
- data/doc-api/classes/Erubis/EscapedEruby.html +127 -0
- data/doc-api/classes/Erubis/EscapedEscheme.html +120 -0
- data/doc-api/classes/Erubis/Escheme.html +389 -0
- data/doc-api/classes/Erubis/HeaderFooterEnhancer.html +264 -0
- data/doc-api/classes/Erubis/HeaderFooterEruby.html +120 -0
- data/doc-api/classes/Erubis/Main.html +318 -0
- data/doc-api/classes/Erubis/NoTextEnhancer.html +159 -0
- data/doc-api/classes/Erubis/NoTextEruby.html +120 -0
- data/doc-api/classes/Erubis/OptimizedEruby.html +445 -0
- data/doc-api/classes/Erubis/OptimizedXmlEruby.html +163 -0
- data/doc-api/classes/Erubis/PercentLineEnhancer.html +174 -0
- data/doc-api/classes/Erubis/PercentLineEruby.html +120 -0
- data/doc-api/classes/Erubis/PrintEnabledEnhancer.html +212 -0
- data/doc-api/classes/Erubis/PrintEnabledEruby.html +120 -0
- data/doc-api/classes/Erubis/PrintOutEnhancer.html +244 -0
- data/doc-api/classes/Erubis/PrintOutEruby.html +120 -0
- data/doc-api/classes/Erubis/PrintOutSimplifiedEruby.html +121 -0
- data/doc-api/classes/Erubis/SimplifiedEruby.html +120 -0
- data/doc-api/classes/Erubis/SimplifyEnhancer.html +185 -0
- data/doc-api/classes/Erubis/StdoutEnhancer.html +173 -0
- data/doc-api/classes/Erubis/StdoutEruby.html +120 -0
- data/doc-api/classes/Erubis/StdoutSimplifiedEruby.html +121 -0
- data/doc-api/classes/Erubis/StringBufferEnhancer.html +174 -0
- data/doc-api/classes/Erubis/StringBufferEruby.html +120 -0
- data/doc-api/classes/Erubis/StringIOEruby.html +120 -0
- data/doc-api/classes/Erubis/TinyEruby.html +305 -0
- data/doc-api/classes/Erubis/XmlEruby.html +130 -0
- data/doc-api/classes/Erubis/XmlHelper.html +193 -0
- data/doc-api/created.rid +1 -0
- data/doc-api/files/__/README_txt.html +214 -0
- data/doc-api/files/erubis/engine/ec_rb.html +115 -0
- data/doc-api/files/erubis/engine/ejava_rb.html +115 -0
- data/doc-api/files/erubis/engine/ejavascript_rb.html +115 -0
- data/doc-api/files/erubis/engine/enhanced_rb.html +115 -0
- data/doc-api/files/erubis/engine/eperl_rb.html +115 -0
- data/doc-api/files/erubis/engine/ephp_rb.html +115 -0
- data/doc-api/files/erubis/engine/eruby_rb.html +115 -0
- data/doc-api/files/erubis/engine/escheme_rb.html +115 -0
- data/doc-api/files/erubis/engine/optimized_rb.html +114 -0
- data/doc-api/files/erubis/engine_rb.html +114 -0
- data/doc-api/files/erubis/enhancer_rb.html +114 -0
- data/doc-api/files/erubis/helper_rb.html +107 -0
- data/doc-api/files/erubis/local-setting_rb.html +107 -0
- data/doc-api/files/erubis/main_rb.html +125 -0
- data/doc-api/files/erubis/tiny_rb.html +107 -0
- data/doc-api/files/erubis_rb.html +118 -0
- data/doc-api/fr_class_index.html +77 -0
- data/doc-api/fr_file_index.html +43 -0
- data/doc-api/fr_method_index.html +157 -0
- data/doc-api/index.html +24 -0
- data/doc-api/rdoc-style.css +208 -0
- data/doc/users-guide.html +1507 -375
- data/examples/Makefile +53 -0
- data/examples/example.ec +24 -0
- data/examples/example.ejava +41 -0
- data/examples/example.ejavascript +16 -0
- data/examples/example.eperl +16 -0
- data/examples/example.ephp +17 -0
- data/examples/example.eruby +15 -0
- data/examples/example.escheme +26 -0
- data/lib/erubis.rb +37 -269
- data/lib/erubis/engine.rb +260 -0
- data/lib/erubis/engine/ec.rb +106 -0
- data/lib/erubis/engine/ejava.rb +101 -0
- data/lib/erubis/engine/ejavascript.rb +104 -0
- data/lib/erubis/engine/enhanced.rb +102 -0
- data/lib/erubis/engine/eperl.rb +83 -0
- data/lib/erubis/engine/ephp.rb +84 -0
- data/lib/erubis/engine/eruby.rb +91 -0
- data/lib/erubis/engine/escheme.rb +96 -0
- data/lib/erubis/engine/optimized.rb +114 -0
- data/lib/erubis/enhancer.rb +487 -0
- data/lib/erubis/helper.rb +53 -0
- data/lib/erubis/local-setting.rb +10 -0
- data/lib/erubis/main.rb +368 -0
- data/lib/erubis/tiny.rb +65 -0
- data/test/assert-text-equal.rb +45 -0
- data/test/test-bin.rb +222 -45
- data/test/test-engines.rb +343 -0
- data/test/test-erubis.rb +836 -501
- data/test/test.rb +27 -0
- data/test/testutil.rb +86 -0
- metadata +131 -8
- data/README +0 -50
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
##
|
|
2
|
+
## $Rev: 21 $
|
|
3
|
+
## $Release: 2.0.0 $
|
|
4
|
+
## copyright(c) 2006 kuwata-lab all rights reserved.
|
|
5
|
+
##
|
|
6
|
+
|
|
7
|
+
require 'abstract'
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
module Erubis
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
##
|
|
14
|
+
## base error class
|
|
15
|
+
##
|
|
16
|
+
class ErubisError < StandardError
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
##
|
|
21
|
+
## .[abstract] context object for Engine#evaluate
|
|
22
|
+
##
|
|
23
|
+
## ex.
|
|
24
|
+
## template = <<'END'
|
|
25
|
+
## Hello <%= @user %>!
|
|
26
|
+
## <% for item in @list %>
|
|
27
|
+
## - <%= item %>
|
|
28
|
+
## <% end %>
|
|
29
|
+
## END
|
|
30
|
+
##
|
|
31
|
+
## context = Erubis::Context.new(:user=>'World', :list=>['a','b','c'])
|
|
32
|
+
## # or
|
|
33
|
+
## # context = Erubis::Context.new
|
|
34
|
+
## # context[:user] = 'World'
|
|
35
|
+
## # context[:list] = ['a', 'b', 'c']
|
|
36
|
+
##
|
|
37
|
+
## eruby = Erubis::Eruby.new(template)
|
|
38
|
+
## print eruby.evaluate(context)
|
|
39
|
+
##
|
|
40
|
+
class Context
|
|
41
|
+
|
|
42
|
+
def initialize(hash=nil)
|
|
43
|
+
hash.each do |name, value|
|
|
44
|
+
self[name] = value
|
|
45
|
+
end if hash
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def [](key)
|
|
49
|
+
return instance_variable_get("@#{key}")
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def []=(key, value)
|
|
53
|
+
return instance_variable_set("@#{key}", value)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def keys
|
|
57
|
+
return instance_variables.collect { |name| name[1,name.length-1] }
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
##
|
|
64
|
+
## [abstract] base engine class
|
|
65
|
+
##
|
|
66
|
+
class Engine
|
|
67
|
+
|
|
68
|
+
def self.supported_properties # :nodoc:
|
|
69
|
+
return [
|
|
70
|
+
[:pattern, '<% %>', "embed pattern"],
|
|
71
|
+
#[:filename, nil, "filename"],
|
|
72
|
+
[:trim, true, "trim spaces around <% ... %>"],
|
|
73
|
+
[:preamble, nil, "preamble (no preamble when false)"],
|
|
74
|
+
[:postamble, nil, "postamble (no postamble when false)"],
|
|
75
|
+
[:escape, nil, "escape function name"],
|
|
76
|
+
]
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def initialize(input, properties={})
|
|
80
|
+
#@input = input
|
|
81
|
+
@pattern = properties[:pattern] || '<% %>'
|
|
82
|
+
@filename = properties[:filename]
|
|
83
|
+
@trim = properties[:trim] != false
|
|
84
|
+
@preamble = properties[:preamble]
|
|
85
|
+
@postamble = properties[:postamble]
|
|
86
|
+
@escape = properties[:escape]
|
|
87
|
+
@src = compile(input) if input
|
|
88
|
+
end
|
|
89
|
+
attr_reader :src
|
|
90
|
+
attr_accessor :filename
|
|
91
|
+
|
|
92
|
+
## load file and create engine object
|
|
93
|
+
def self.load_file(filename, properties={})
|
|
94
|
+
input = File.open(filename, 'rb') { |f| f.read }
|
|
95
|
+
input.untaint # is it ok?
|
|
96
|
+
properties[:filename] = filename
|
|
97
|
+
engine = self.new(input, properties)
|
|
98
|
+
return engine
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
## eval(@src) with binding
|
|
102
|
+
def result(_binding_or_hash=TOPLEVEL_BINDING)
|
|
103
|
+
_arg = _binding_or_hash
|
|
104
|
+
if _arg.is_a?(Hash)
|
|
105
|
+
## load _context data as local variables by eval
|
|
106
|
+
eval _arg.keys.inject("") { |s, k| s << "#{k.to_s} = _arg[#{k.inspect}];" }
|
|
107
|
+
_arg = binding()
|
|
108
|
+
end
|
|
109
|
+
return eval(@src, _arg, (@filename || '(erubis)'))
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
## call context.instance_eval(@src)
|
|
113
|
+
def evaluate(context=Context.new)
|
|
114
|
+
context = Context.new(context) if context.is_a?(Hash)
|
|
115
|
+
return context.instance_eval(@src, (@filename || '(erubis)'))
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
DEFAULT_REGEXP = /(.*?)(^[ \t]*)?<%(=+|\#)?(.*?)-?%>([ \t]*\r?\n)?/m
|
|
119
|
+
|
|
120
|
+
## return regexp of pattern to parse eRuby script
|
|
121
|
+
def pattern_regexp(pattern=@pattern)
|
|
122
|
+
if pattern == '<% %>'
|
|
123
|
+
return DEFAULT_REGEXP
|
|
124
|
+
else
|
|
125
|
+
prefix, postfix = pattern.split()
|
|
126
|
+
return /(.*?)(^[ \t]*)?#{prefix}(=+|\#)?(.*?)-?#{postfix}([ \t]*\r?\n)?/m
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
protected :pattern_regexp
|
|
130
|
+
|
|
131
|
+
## compile input string into target language
|
|
132
|
+
def compile(input)
|
|
133
|
+
src = ""
|
|
134
|
+
@preamble.nil? ? add_preamble(src) : (@preamble && (src << @preamble))
|
|
135
|
+
regexp = pattern_regexp(@pattern)
|
|
136
|
+
input.scan(regexp) do |text, lspace, indicator, code, rspace|
|
|
137
|
+
add_text(src, text)
|
|
138
|
+
## * when '<%= %>', do nothing
|
|
139
|
+
## * when '<% %>' or '<%# %>', delete spaces iff only spaces are around '<% %>'
|
|
140
|
+
if !indicator # <% %>
|
|
141
|
+
if @trim && lspace && rspace
|
|
142
|
+
add_stmt(src, "#{lspace}#{code}#{rspace}")
|
|
143
|
+
else
|
|
144
|
+
add_text(src, lspace) if lspace
|
|
145
|
+
add_stmt(src, code)
|
|
146
|
+
add_text(src, rspace) if rspace
|
|
147
|
+
end
|
|
148
|
+
elsif indicator[0] == ?\# # <%# %>
|
|
149
|
+
n = code.count("\n") + (rspace ? 1 : 0)
|
|
150
|
+
if @trim && lspace && rspace
|
|
151
|
+
add_stmt(src, "\n" * n)
|
|
152
|
+
else
|
|
153
|
+
add_text(src, lspace) if lspace
|
|
154
|
+
add_stmt(src, "\n" * n)
|
|
155
|
+
add_text(src, rspace) if lspace
|
|
156
|
+
end
|
|
157
|
+
#flag_trim = @trim && lspace && rspace
|
|
158
|
+
#add_text(src, lspace) if !flag_trim && lspace
|
|
159
|
+
#n = code.count("\n") + (rspace ? 1 : 0)
|
|
160
|
+
#add_stmt(src, "\n" * n)
|
|
161
|
+
#add_text(src, rspace) if !flag_trim && rspace
|
|
162
|
+
else # <%= %>
|
|
163
|
+
add_text(src, lspace) if lspace
|
|
164
|
+
add_expr(src, code, indicator)
|
|
165
|
+
add_text(src, rspace) if rspace
|
|
166
|
+
end
|
|
167
|
+
#if indicator && indicator[0] == ?=
|
|
168
|
+
# flag_trim = false
|
|
169
|
+
#else
|
|
170
|
+
# flag_trim = @trim && lspace && rspace
|
|
171
|
+
#end
|
|
172
|
+
##flag_trim = @trim && !(indicator && indicator[0]==?=) && lspace && rspace
|
|
173
|
+
#add_text(src, text)
|
|
174
|
+
#add_text(src, lspace) if !flag_trim && lspace
|
|
175
|
+
#if !indicator # <% %>
|
|
176
|
+
# code = "#{lspace}#{code}#{rspace}" if flag_trim
|
|
177
|
+
# add_stmt(src, code)
|
|
178
|
+
#elsif indicator[0] == ?\# # <%# %>
|
|
179
|
+
# n = code.count("\n") + (rspace ? 1 : 0)
|
|
180
|
+
# add_stmt(src, "\n" * n)
|
|
181
|
+
#else # <%= %>
|
|
182
|
+
# add_expr(src, code, indicator)
|
|
183
|
+
#end
|
|
184
|
+
#add_text(src, rspace) if !flag_trim && rspace
|
|
185
|
+
end
|
|
186
|
+
rest = $' || input # add input when no matched
|
|
187
|
+
add_text(src, rest)
|
|
188
|
+
@postamble.nil? ? add_postamble(src) : (@postamble && (src << @postamble))
|
|
189
|
+
return src
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
## compile input string and set it to @src
|
|
193
|
+
def compile!(input)
|
|
194
|
+
@src = compile(input)
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
protected
|
|
198
|
+
|
|
199
|
+
## escape text string
|
|
200
|
+
def escape_text(text)
|
|
201
|
+
return text
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
## return escaped expression code
|
|
205
|
+
def escaped_expr(code)
|
|
206
|
+
@escape ||= 'escape'
|
|
207
|
+
return "#{@escape}(#{code.strip})"
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
## .[empty] add @preamble to src
|
|
211
|
+
def add_preamble(src)
|
|
212
|
+
# empty
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
## .[abstract] add text string to src
|
|
216
|
+
def add_text(src, text)
|
|
217
|
+
not_implemented
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
## .[abstract] add statement code to src
|
|
221
|
+
def add_stmt(src, code)
|
|
222
|
+
not_implemented
|
|
223
|
+
end
|
|
224
|
+
|
|
225
|
+
## add expression code to src
|
|
226
|
+
def add_expr(src, code, indicator)
|
|
227
|
+
case indicator
|
|
228
|
+
when '='
|
|
229
|
+
add_expr_literal(src, code)
|
|
230
|
+
when '=='
|
|
231
|
+
add_expr_escaped(src, code)
|
|
232
|
+
when '==='
|
|
233
|
+
add_expr_debug(src, code)
|
|
234
|
+
end
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
## .[abstract] add expression literal code to src. this is called by add_expr().
|
|
238
|
+
def add_expr_literal(src, code)
|
|
239
|
+
not_implemented
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
## .[abstract] add escaped expression code to src. this is called by add_expr().
|
|
243
|
+
def add_expr_escaped(src, code)
|
|
244
|
+
not_implemented
|
|
245
|
+
end
|
|
246
|
+
|
|
247
|
+
## .[empty] add expression code to src for debug. this is called by add_expr().
|
|
248
|
+
def add_expr_debug(src, code)
|
|
249
|
+
# empty
|
|
250
|
+
end
|
|
251
|
+
|
|
252
|
+
## .[empty] add @postamble to src
|
|
253
|
+
def add_postamble(src)
|
|
254
|
+
# empty
|
|
255
|
+
end
|
|
256
|
+
|
|
257
|
+
end # end of class Engine
|
|
258
|
+
|
|
259
|
+
|
|
260
|
+
end
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
##
|
|
2
|
+
## $Rev: 21 $
|
|
3
|
+
## $Release: 2.0.0 $
|
|
4
|
+
## copyright(c) 2006 kuwata-lab all rights reserved.
|
|
5
|
+
##
|
|
6
|
+
|
|
7
|
+
require 'erubis/engine'
|
|
8
|
+
require 'erubis/enhancer'
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
module Erubis
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
##
|
|
15
|
+
## engine for C
|
|
16
|
+
##
|
|
17
|
+
class Ec < Engine
|
|
18
|
+
|
|
19
|
+
def self.supported_properties() # :nodoc:
|
|
20
|
+
list = super
|
|
21
|
+
list << [:indent, '', "indent spaces (ex. ' ')"]
|
|
22
|
+
list << [:out, 'stdout', "output file pointer name"]
|
|
23
|
+
return list
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def initialize(input, properties={})
|
|
27
|
+
@indent = properties[:indent] || ''
|
|
28
|
+
@out = properties[:out] || 'stdout'
|
|
29
|
+
super
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def add_preamble(src)
|
|
33
|
+
src << "#line 1 \"#{self.filename}\"\n" if self.filename
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def escape_text(text)
|
|
37
|
+
@@table_ ||= { "\r"=>"\\r", "\n"=>"\\n", "\t"=>"\\t", '"'=>'\\"', "\\"=>"\\\\" }
|
|
38
|
+
text.gsub!(/[\r\n\t"\\]/) { |m| @@table_[m] }
|
|
39
|
+
return text
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def escaped_expr(code)
|
|
43
|
+
@escape ||= "escape"
|
|
44
|
+
code.strip!
|
|
45
|
+
if code =~ /\A(\".*?\")\s*,\s*(.*)/
|
|
46
|
+
return "#{$1}, #{@escape}(#{$2})"
|
|
47
|
+
else
|
|
48
|
+
return "#{@escape}(#{code})"
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def add_text(src, text)
|
|
53
|
+
return if text.empty?
|
|
54
|
+
src << (src.empty? || src[-1] == ?\n ? @indent : ' ')
|
|
55
|
+
src << "fputs("
|
|
56
|
+
i = 0
|
|
57
|
+
text.each_line do |line|
|
|
58
|
+
src << "\n" << @indent << ' ' if i > 0
|
|
59
|
+
i += 1
|
|
60
|
+
src << '"' << escape_text(line) << '"'
|
|
61
|
+
end
|
|
62
|
+
src << ", #{@out});" #<< (text[-1] == ?\n ? "\n" : "")
|
|
63
|
+
src << "\n" if text[-1] == ?\n
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def add_stmt(src, code)
|
|
67
|
+
src << code
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def add_expr_literal(src, code)
|
|
71
|
+
src << @indent if src.empty? || src[-1] == ?\n
|
|
72
|
+
src << " fprintf(#{@out}, " << code.strip << ');'
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def add_expr_escaped(src, code)
|
|
76
|
+
src << @indent if src.empty? || src[-1] == ?\n
|
|
77
|
+
src << " fprintf(#{@out}, " << escaped_expr(code) << ');'
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def add_expr_debug(src, code)
|
|
81
|
+
code.strip!
|
|
82
|
+
s = nil
|
|
83
|
+
if code =~ /\A\".*?\"\s*,\s*(.*)/
|
|
84
|
+
s = $1.gsub(/[%"]/, '\\\1') + '='
|
|
85
|
+
end
|
|
86
|
+
src << @indent if src.empty? || src[-1] == ?\n
|
|
87
|
+
src << " fprintf(stderr, \"*** debug: #{s}\" #{code});"
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def add_postamble(src)
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
class EscapedEc < Ec
|
|
97
|
+
include EscapeEnhancer
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
#class XmlEc < Ec
|
|
102
|
+
# include EscapeEnhancer
|
|
103
|
+
#end
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
end
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
##
|
|
2
|
+
## $Rev: 21 $
|
|
3
|
+
## $Release: 2.0.0 $
|
|
4
|
+
## copyright(c) 2006 kuwata-lab all rights reserved.
|
|
5
|
+
##
|
|
6
|
+
|
|
7
|
+
require 'erubis/engine'
|
|
8
|
+
require 'erubis/enhancer'
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
module Erubis
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
##
|
|
15
|
+
## engine for Java
|
|
16
|
+
##
|
|
17
|
+
class Ejava < Engine
|
|
18
|
+
|
|
19
|
+
def self.supported_properties() # :nodoc:
|
|
20
|
+
list = super
|
|
21
|
+
list << [:indent, '', "indent spaces (ex. ' ')"]
|
|
22
|
+
list << [:buf, '_buf', "output buffer name"]
|
|
23
|
+
list << [:bufclass, 'StringBuffer', "output buffer class (ex. 'StringBuilder')"]
|
|
24
|
+
return list
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def initialize(input, properties={})
|
|
28
|
+
@indent = properties[:indent] || ''
|
|
29
|
+
@buf = properties[:buf] || '_buf'
|
|
30
|
+
@bufclass = properties[:bufclass] || 'StringBuffer'
|
|
31
|
+
super
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def add_preamble(src)
|
|
35
|
+
src << "#{@indent}#{@bufclass} #{@buf} = new #{@bufclass}();"
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def escape_text(text)
|
|
39
|
+
@@table_ ||= { "\r"=>"\\r", "\n"=>"\\n", "\t"=>"\\t", '"'=>'\\"', "\\"=>"\\\\" }
|
|
40
|
+
return text.gsub!(/[\r\n\t"\\]/) { |m| @@table_[m] } || text
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
#--
|
|
44
|
+
#def escaped_expr(code)
|
|
45
|
+
# @escape ||= 'escape'
|
|
46
|
+
# return "#{@escape}(#{code.strip})"
|
|
47
|
+
#end
|
|
48
|
+
#++
|
|
49
|
+
|
|
50
|
+
def add_text(src, text)
|
|
51
|
+
return if text.empty?
|
|
52
|
+
src << (src.empty? || src[-1] == ?\n ? @indent : ' ')
|
|
53
|
+
src << @buf << ".append("
|
|
54
|
+
i = 0
|
|
55
|
+
text.each_line do |line|
|
|
56
|
+
src << "\n" << @indent << ' + ' if i > 0
|
|
57
|
+
i += 1
|
|
58
|
+
src << '"' << escape_text(line) << '"'
|
|
59
|
+
end
|
|
60
|
+
src << ");" << (text[-1] == ?\n ? "\n" : "")
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def add_stmt(src, code)
|
|
64
|
+
src << code
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def add_expr_literal(src, code)
|
|
68
|
+
src << @indent if src.empty? || src[-1] == ?\n
|
|
69
|
+
src << ' ' << @buf << '.append(' << code.strip << ');'
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def add_expr_escaped(src, code)
|
|
73
|
+
src << @indent if src.empty? || src[-1] == ?\n
|
|
74
|
+
src << ' ' << @buf << '.append(' << escaped_expr(code) << ');'
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def add_expr_debug(src, code)
|
|
78
|
+
code.strip!
|
|
79
|
+
src << @indent if src.empty? || src[-1] == ?\n
|
|
80
|
+
src << " System.err.println(\"*** debug: #{code}=\"+(#{code}));"
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def add_postamble(src)
|
|
84
|
+
src << "\n" if src[-1] == ?;
|
|
85
|
+
src << @indent << "return " << @buf << ".toString();\n"
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
class EscapedEjava < Ejava
|
|
92
|
+
include EscapeEnhancer
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
#class XmlEjava < Ejava
|
|
97
|
+
# include EscapeEnhancer
|
|
98
|
+
#end
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
end
|