erubis 2.3.1 → 2.4.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/CHANGES +69 -2
- data/README.txt +1 -1
- data/benchmark/bench.rb +1 -1
- data/bin/erubis +1 -1
- data/contrib/erubis +3295 -2
- data/contrib/inline-require +1 -1
- data/doc-api/classes/Erubis.html +1 -1
- data/doc-api/classes/Erubis/ArrayEnhancer.html +12 -12
- data/doc-api/classes/Erubis/Basic/Converter.html +4 -4
- data/doc-api/classes/Erubis/BiPatternEnhancer.html +12 -12
- data/doc-api/classes/Erubis/CGenerator.html +60 -60
- data/doc-api/classes/Erubis/Context.html +42 -42
- data/doc-api/classes/Erubis/Converter.html +3 -2
- data/doc-api/classes/Erubis/DeleteIndentEnhancer.html +6 -6
- data/doc-api/classes/Erubis/Engine.html +30 -30
- data/doc-api/classes/Erubis/ErboutEnhancer.html +12 -12
- data/doc-api/classes/Erubis/EscapeEnhancer.html +6 -6
- data/doc-api/classes/Erubis/HeaderFooterEnhancer.html +12 -12
- data/doc-api/classes/Erubis/Helpers/RailsHelper.html +62 -7
- data/doc-api/classes/Erubis/Helpers/RailsHelper/PreprocessingEruby.html +177 -0
- data/doc-api/classes/Erubis/JavaGenerator.html +54 -54
- data/doc-api/classes/Erubis/JavascriptGenerator.html +60 -60
- data/doc-api/classes/Erubis/Main.html +20 -20
- data/doc-api/classes/Erubis/NoTextEnhancer.html +6 -6
- data/doc-api/classes/Erubis/OptimizedEruby.html +6 -6
- data/doc-api/classes/Erubis/OptimizedGenerator.html +72 -72
- data/doc-api/classes/Erubis/OptimizedXmlEruby.html +6 -6
- data/doc-api/classes/Erubis/PI/Converter.html +3 -3
- data/doc-api/classes/Erubis/PercentLineEnhancer.html +6 -6
- data/doc-api/classes/Erubis/PhpGenerator.html +54 -54
- data/doc-api/classes/Erubis/PrintEnabledEnhancer.html +20 -20
- data/doc-api/classes/Erubis/PrintOutEnhancer.html +30 -30
- data/doc-api/classes/Erubis/RubyEvaluator.html +47 -15
- data/doc-api/classes/Erubis/StringBufferEnhancer.html +12 -12
- data/doc-api/classes/Erubis/TinyEruby.html +24 -24
- data/doc-api/classes/Erubis/XmlHelper.html +79 -14
- data/doc-api/created.rid +1 -1
- data/doc-api/files/README_txt.html +2 -2
- data/doc-api/files/erubis/context_rb.html +1 -1
- data/doc-api/files/erubis/converter_rb.html +2 -2
- data/doc-api/files/erubis/engine/ec_rb.html +1 -1
- data/doc-api/files/erubis/engine/ejava_rb.html +1 -1
- data/doc-api/files/erubis/engine/ejavascript_rb.html +1 -1
- data/doc-api/files/erubis/engine/enhanced_rb.html +1 -1
- data/doc-api/files/erubis/engine/eperl_rb.html +1 -1
- data/doc-api/files/erubis/engine/ephp_rb.html +1 -1
- data/doc-api/files/erubis/engine/eruby_rb.html +1 -1
- data/doc-api/files/erubis/engine/escheme_rb.html +1 -1
- data/doc-api/files/erubis/engine/optimized_rb.html +1 -1
- data/doc-api/files/erubis/engine_rb.html +1 -1
- data/doc-api/files/erubis/enhancer_rb.html +1 -1
- data/doc-api/files/erubis/error_rb.html +1 -1
- data/doc-api/files/erubis/evaluator_rb.html +2 -2
- data/doc-api/files/erubis/generator_rb.html +1 -1
- data/doc-api/files/erubis/helper_rb.html +2 -2
- data/doc-api/files/erubis/helpers/rails_helper_rb.html +3 -2
- data/doc-api/files/erubis/local-setting_rb.html +1 -1
- data/doc-api/files/erubis/main_rb.html +2 -2
- data/doc-api/files/erubis/tiny_rb.html +1 -1
- data/doc-api/files/erubis_rb.html +1 -1
- data/doc-api/fr_class_index.html +1 -0
- data/doc-api/fr_method_index.html +128 -120
- data/doc/users-guide.html +248 -88
- data/lib/erubis.rb +2 -2
- data/lib/erubis/context.rb +1 -1
- data/lib/erubis/converter.rb +3 -2
- data/lib/erubis/engine.rb +1 -1
- data/lib/erubis/engine/ec.rb +1 -1
- data/lib/erubis/engine/ejava.rb +1 -1
- data/lib/erubis/engine/ejavascript.rb +1 -1
- data/lib/erubis/engine/enhanced.rb +1 -1
- data/lib/erubis/engine/eperl.rb +1 -1
- data/lib/erubis/engine/ephp.rb +1 -1
- data/lib/erubis/engine/eruby.rb +1 -1
- data/lib/erubis/engine/escheme.rb +1 -1
- data/lib/erubis/engine/optimized.rb +1 -1
- data/lib/erubis/enhancer.rb +1 -1
- data/lib/erubis/error.rb +1 -1
- data/lib/erubis/evaluator.rb +15 -4
- data/lib/erubis/generator.rb +1 -1
- data/lib/erubis/helper.rb +14 -2
- data/lib/erubis/helpers/rails_helper.rb +48 -3
- data/lib/erubis/local-setting.rb +1 -1
- data/lib/erubis/main.rb +7 -8
- data/lib/erubis/tiny.rb +1 -1
- data/test/assert-text-equal.rb +1 -1
- data/test/data/users-guide/def_method.rb +14 -0
- data/test/data/users-guide/def_method.result +3 -0
- data/test/test-engines.rb +1 -1
- data/test/test-enhancers.rb +1 -1
- data/test/test-erubis.rb +40 -2
- data/test/test-main.rb +17 -4
- data/test/test-users-guide.rb +1 -1
- data/test/test.rb +1 -1
- data/test/testutil.rb +1 -1
- metadata +15 -11
- data/test/data/users-guide/stderr.log +0 -3
data/lib/erubis/engine.rb
CHANGED
data/lib/erubis/engine/ec.rb
CHANGED
data/lib/erubis/engine/ejava.rb
CHANGED
data/lib/erubis/engine/eperl.rb
CHANGED
data/lib/erubis/engine/ephp.rb
CHANGED
data/lib/erubis/engine/eruby.rb
CHANGED
data/lib/erubis/enhancer.rb
CHANGED
data/lib/erubis/error.rb
CHANGED
data/lib/erubis/evaluator.rb
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
##
|
|
2
|
-
## $Rev:
|
|
3
|
-
## $Release: 2.
|
|
2
|
+
## $Rev: 91 $
|
|
3
|
+
## $Release: 2.4.0 $
|
|
4
4
|
## copyright(c) 2006-2007 kuwata-lab.com all rights reserved.
|
|
5
5
|
##
|
|
6
6
|
|
|
@@ -53,7 +53,8 @@ module Erubis
|
|
|
53
53
|
_arg = _binding_or_hash
|
|
54
54
|
if _arg.is_a?(Hash)
|
|
55
55
|
## load _context data as local variables by eval
|
|
56
|
-
eval _arg.keys.inject("") { |s, k| s << "#{k.to_s} = _arg[#{k.inspect}];" }
|
|
56
|
+
#eval _arg.keys.inject("") { |s, k| s << "#{k.to_s} = _arg[#{k.inspect}];" }
|
|
57
|
+
eval _arg.collect{|k,v| "#{k} = _arg[#{k.inspect}]; "}.join
|
|
57
58
|
_arg = binding()
|
|
58
59
|
end
|
|
59
60
|
return eval(@src, _arg, (@filename || '(erubis)'))
|
|
@@ -62,9 +63,19 @@ module Erubis
|
|
|
62
63
|
## invoke context.instance_eval(@src)
|
|
63
64
|
def evaluate(context=Context.new)
|
|
64
65
|
context = Context.new(context) if context.is_a?(Hash)
|
|
65
|
-
return context.instance_eval(@src,
|
|
66
|
+
#return context.instance_eval(@src, @filename || '(erubis)')
|
|
67
|
+
@_proc ||= eval("proc { #{@src} }", TOPLEVEL_BINDING, @filename || '(erubis)')
|
|
68
|
+
return context.instance_eval(&@_proc)
|
|
66
69
|
end
|
|
67
70
|
|
|
71
|
+
## if object is an Class or Module then define instance method to it,
|
|
72
|
+
## else define singleton method to it.
|
|
73
|
+
def def_method(object, method_name, filename=nil)
|
|
74
|
+
m = object.is_a?(Module) ? :module_eval : :instance_eval
|
|
75
|
+
object.__send__(m, "def #{method_name}; #{@src}; end", filename || @filename || '(erubis)')
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
|
|
68
79
|
end
|
|
69
80
|
|
|
70
81
|
|
data/lib/erubis/generator.rb
CHANGED
data/lib/erubis/helper.rb
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
##
|
|
2
|
-
## $Rev:
|
|
3
|
-
## $Release: 2.
|
|
2
|
+
## $Rev: 89 $
|
|
3
|
+
## $Release: 2.4.0 $
|
|
4
4
|
## copyright(c) 2006-2007 kuwata-lab.com all rights reserved.
|
|
5
5
|
##
|
|
6
6
|
|
|
@@ -27,9 +27,21 @@ module Erubis
|
|
|
27
27
|
#value.to_s.gsub(/[&<>"]/) { ESCAPE_TABLE[$&] }
|
|
28
28
|
end
|
|
29
29
|
|
|
30
|
+
def escape_xml2(value)
|
|
31
|
+
return value.to_s.gsub(/\&/,'&').gsub(/</,'<').gsub(/>/,'>').gsub(/"/,'"')
|
|
32
|
+
end
|
|
33
|
+
|
|
30
34
|
alias h escape_xml
|
|
31
35
|
alias html_escape escape_xml
|
|
32
36
|
|
|
37
|
+
def url_encode(str)
|
|
38
|
+
return str.gsub(/[^-_.a-zA-Z0-9]+/) { |s|
|
|
39
|
+
s.unpack('C*').collect { |i| "%%%02X" % i }.join
|
|
40
|
+
}
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
alias u url_encode
|
|
44
|
+
|
|
33
45
|
end
|
|
34
46
|
|
|
35
47
|
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
###
|
|
2
|
-
### $Rev:
|
|
3
|
-
### $Release: 2.
|
|
2
|
+
### $Rev: 90 $
|
|
3
|
+
### $Release: 2.4.0 $
|
|
4
4
|
### copyright(c) 2006-2007 kuwata-lab.com all rights reserved.
|
|
5
5
|
###
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
require 'erubis'
|
|
9
|
+
require 'cgi'
|
|
9
10
|
|
|
10
11
|
|
|
11
12
|
module Erubis
|
|
@@ -30,7 +31,8 @@ module Erubis
|
|
|
30
31
|
## require 'erubis/helpers/rails_helper'
|
|
31
32
|
## #Erubis::Helpers::RailsHelper.engine_class = Erubis::Eruby # or Erubis::FastEruby
|
|
32
33
|
## #Erubis::Helpers::RailsHelper.init_properties = {}
|
|
33
|
-
## #Erubis::Helpers::RailsHelper.show_src = false
|
|
34
|
+
## #Erubis::Helpers::RailsHelper.show_src = false # set true for debugging
|
|
35
|
+
## #Erubis::Helpers::RailsHelper.preprocessing = true # set true to enable preprocessing
|
|
34
36
|
##
|
|
35
37
|
## 2. (optional) apply the patch for 'action_view/base.rb'
|
|
36
38
|
##
|
|
@@ -78,6 +80,27 @@ module Erubis
|
|
|
78
80
|
@@show_src = flag
|
|
79
81
|
end
|
|
80
82
|
|
|
83
|
+
##----- preprocessor: experimental -----
|
|
84
|
+
@@preprocessing = false
|
|
85
|
+
def self.preprocessing
|
|
86
|
+
@@preprocessing
|
|
87
|
+
end
|
|
88
|
+
def self.preprocessing=(flag)
|
|
89
|
+
@@preprocessing = flag
|
|
90
|
+
end
|
|
91
|
+
class PreprocessingEruby < Erubis::Eruby
|
|
92
|
+
def initialize(input, params={})
|
|
93
|
+
params = params.dup
|
|
94
|
+
params[:pattern] = '\[% %\]' # use '[%= %]' instead of '<%= %>'
|
|
95
|
+
params[:escape] = true # transport '[%= %]' and '[%== %]'
|
|
96
|
+
super
|
|
97
|
+
end
|
|
98
|
+
def add_expr_escaped(src, code)
|
|
99
|
+
add_expr_literal(src, "_decode((#{code}))")
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
##----------------------------------------
|
|
103
|
+
|
|
81
104
|
end
|
|
82
105
|
|
|
83
106
|
end
|
|
@@ -187,11 +210,33 @@ class ActionView::Base # :nodoc:
|
|
|
187
210
|
klass = Erubis::Helpers::RailsHelper.engine_class
|
|
188
211
|
properties = Erubis::Helpers::RailsHelper.init_properties
|
|
189
212
|
show_src = Erubis::Helpers::RailsHelper.show_src
|
|
213
|
+
##----- preprocessing: experimental -----
|
|
214
|
+
if Erubis::Helpers::RailsHelper.preprocessing
|
|
215
|
+
preprocessor = Erubis::Helpers::RailsHelper::PreprocessingEruby.new(template)
|
|
216
|
+
template = self.instance_eval(preprocessor.src)
|
|
217
|
+
logger.debug "** Erubis: preprocessed==<<'END'\n#{template}END\n" if show_src
|
|
218
|
+
end
|
|
219
|
+
##----------------------------------------
|
|
190
220
|
src = klass.new(template, properties).src
|
|
191
221
|
#src.insert(0, '_erbout = ')
|
|
192
222
|
logger.debug "** Erubis: src==<<'END'\n#{src}END\n" if show_src
|
|
193
223
|
src
|
|
194
224
|
end
|
|
225
|
+
|
|
226
|
+
##----- preprocessing: experimental -----
|
|
227
|
+
def _expr(arg)
|
|
228
|
+
return "<%=#{arg}%>"
|
|
229
|
+
end
|
|
230
|
+
alias _x _expr
|
|
231
|
+
alias _? _expr
|
|
232
|
+
def _decode(arg)
|
|
233
|
+
arg = arg.to_s
|
|
234
|
+
arg.gsub!(/%3C%25%3D(.*?)%25%3E/) { "<%=#{CGI.unescape($1)}%>" }
|
|
235
|
+
arg.gsub!(/<%=(.*?)%>/) { "<%=#{CGI.unescapeHTML($1)}%>" }
|
|
236
|
+
return arg
|
|
237
|
+
end
|
|
238
|
+
##----------------------------------------
|
|
239
|
+
|
|
195
240
|
end
|
|
196
241
|
|
|
197
242
|
|
data/lib/erubis/local-setting.rb
CHANGED
data/lib/erubis/main.rb
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
###
|
|
2
|
-
### $Rev:
|
|
3
|
-
### $Release: 2.
|
|
2
|
+
### $Rev: 91 $
|
|
3
|
+
### $Release: 2.4.0 $
|
|
4
4
|
### copyright(c) 2006-2007 kuwata-lab.com all rights reserved.
|
|
5
5
|
###
|
|
6
6
|
|
|
@@ -173,7 +173,7 @@ module Erubis
|
|
|
173
173
|
msg = nil if val
|
|
174
174
|
end
|
|
175
175
|
else
|
|
176
|
-
engine.filename = '(stdin)'
|
|
176
|
+
engine.filename = filename = '(stdin)'
|
|
177
177
|
engine.convert!($stdin.read())
|
|
178
178
|
val = do_action(action, engine, context, filename, opts)
|
|
179
179
|
msg = nil if val
|
|
@@ -215,8 +215,8 @@ module Erubis
|
|
|
215
215
|
return source
|
|
216
216
|
end
|
|
217
217
|
|
|
218
|
-
def usage
|
|
219
|
-
command
|
|
218
|
+
def usage(command=nil)
|
|
219
|
+
command ||= File.basename($0)
|
|
220
220
|
buf = []
|
|
221
221
|
buf << "erubis - embedded program converter for multi-language"
|
|
222
222
|
buf << "Usage: #{command} [..options..] [file ...]"
|
|
@@ -247,10 +247,9 @@ module Erubis
|
|
|
247
247
|
# -c class : class name (XmlEruby/PercentLineEruby/...) (default Eruby)
|
|
248
248
|
# -r library : require library
|
|
249
249
|
# -a : action (convert/execute)
|
|
250
|
-
return join("\n")
|
|
250
|
+
return buf.join("\n")
|
|
251
251
|
end
|
|
252
252
|
|
|
253
|
-
|
|
254
253
|
def collect_supported_properties(erubis_klass)
|
|
255
254
|
list = []
|
|
256
255
|
erubis_klass.ancestors.each do |klass|
|
|
@@ -407,7 +406,7 @@ module Erubis
|
|
|
407
406
|
|
|
408
407
|
def load_datafiles(filenames, opts)
|
|
409
408
|
context = Erubis::Context.new
|
|
410
|
-
return
|
|
409
|
+
return context unless filenames
|
|
411
410
|
filenames.split(/,/).each do |filename|
|
|
412
411
|
filename.strip!
|
|
413
412
|
test(?f, filename) or raise CommandOptionError.new("#{filename}: file not found.")
|
data/lib/erubis/tiny.rb
CHANGED
data/test/assert-text-equal.rb
CHANGED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
require 'erubis'
|
|
2
|
+
s = "hello <%= name %>"
|
|
3
|
+
eruby = Erubis::Eruby.new(s)
|
|
4
|
+
filename = 'hello.rhtml'
|
|
5
|
+
|
|
6
|
+
## define instance method to Dummy class (or module)
|
|
7
|
+
class Dummy; end
|
|
8
|
+
eruby.def_method(Dummy, 'render(name)', filename) # filename is optional
|
|
9
|
+
p Dummy.new.render('world') #=> "hello world"
|
|
10
|
+
|
|
11
|
+
## define singleton method to dummy object
|
|
12
|
+
obj = Object.new
|
|
13
|
+
eruby.def_method(obj, 'render(name)', filename) # filename is optional
|
|
14
|
+
p obj.render('world') #=> "hello world"
|
data/test/test-engines.rb
CHANGED
data/test/test-enhancers.rb
CHANGED
data/test/test-erubis.rb
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
##
|
|
2
|
-
## $Rev:
|
|
3
|
-
## $Release: 2.
|
|
2
|
+
## $Rev: 91 $
|
|
3
|
+
## $Release: 2.4.0 $
|
|
4
4
|
## copyright(c) 2006-2007 kuwata-lab.com all rights reserved.
|
|
5
5
|
##
|
|
6
6
|
|
|
@@ -154,6 +154,44 @@ END
|
|
|
154
154
|
end
|
|
155
155
|
|
|
156
156
|
|
|
157
|
+
class Dummy
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
def test_def_method1
|
|
161
|
+
s = "<%for i in list%>i=<%=i%>\n<%end%>"
|
|
162
|
+
eruby = Erubis::Eruby.new(s)
|
|
163
|
+
assert(! Dummy.instance_methods.include?('render'))
|
|
164
|
+
eruby.def_method(Dummy, 'render(list)', 'foo.rhtml')
|
|
165
|
+
assert(Dummy.instance_methods.include?('render'))
|
|
166
|
+
actual = Dummy.new().render(%w[1 2 3])
|
|
167
|
+
assert_equal("i=1\ni=2\ni=3\n", actual)
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
def test_def_method2
|
|
171
|
+
s = "<%for i in list%>i=<%=i%>\n<%end%>"
|
|
172
|
+
eruby = Erubis::Eruby.new(s)
|
|
173
|
+
assert(! (eruby.respond_to? :render))
|
|
174
|
+
eruby.def_method(eruby, 'render(list)', 'foo.rhtml')
|
|
175
|
+
assert eruby.respond_to?(:render)
|
|
176
|
+
actual = eruby.render([1, 2, 3])
|
|
177
|
+
assert_equal("i=1\ni=2\ni=3\n", actual)
|
|
178
|
+
assert !(eruby.class.instance_methods.include? :render)
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
def test_evaluate_creates_proc
|
|
182
|
+
s = "hello <%= @name %>"
|
|
183
|
+
eruby = Erubis::Eruby.new(s)
|
|
184
|
+
assert_nil(eruby.instance_variable_get('@_proc'))
|
|
185
|
+
actual1 = eruby.evaluate(:name=>'world')
|
|
186
|
+
assert_not_nil(eruby.instance_variable_get('@_proc'))
|
|
187
|
+
assert_instance_of(Proc, eruby.instance_variable_get('@_proc'))
|
|
188
|
+
actual2 = eruby.evaluate(:name=>'world')
|
|
189
|
+
assert_equal(actual1, actual2)
|
|
190
|
+
# convert() must clear @_proc
|
|
191
|
+
eruby.convert(s)
|
|
192
|
+
assert_nil(eruby.instance_variable_get('@_proc'))
|
|
193
|
+
end
|
|
194
|
+
|
|
157
195
|
end
|
|
158
196
|
|
|
159
197
|
__END__
|