erubis 2.3.1 → 2.7.0
Sign up to get free protection for your applications and to get access to all the features.
- data/{CHANGES → CHANGES.txt} +373 -3
- data/MIT-LICENSE +1 -1
- data/README.txt +6 -5
- data/benchmark/bench.rb +18 -11
- data/bin/erubis +3 -4
- data/contrib/erubis +3462 -5
- data/contrib/inline-require +54 -28
- data/doc/docstyle.css +25 -4
- data/doc/users-guide.html +814 -110
- data/doc-api/classes/ActionView/TemplateHandlers/ErubisHandler.html +209 -0
- data/doc-api/classes/ActionView.html +105 -0
- data/doc-api/classes/Erubis/ArrayBufferEnhancer.html +14 -14
- data/doc-api/classes/Erubis/ArrayEnhancer.html +16 -16
- data/doc-api/classes/Erubis/Basic/Converter.html +36 -31
- data/doc-api/classes/Erubis/BiPatternEnhancer.html +16 -13
- data/doc-api/classes/Erubis/CGenerator.html +70 -70
- data/doc-api/classes/Erubis/Context.html +49 -49
- data/doc-api/classes/Erubis/Converter.html +30 -29
- data/doc-api/classes/Erubis/CppGenerator.html +382 -0
- data/doc-api/classes/Erubis/DeleteIndentEnhancer.html +7 -7
- data/doc-api/classes/Erubis/Ecpp.html +126 -0
- data/doc-api/classes/Erubis/Engine.html +46 -43
- data/doc-api/classes/Erubis/ErboutEnhancer.html +16 -16
- data/doc-api/classes/Erubis/EscapeEnhancer.html +7 -7
- data/doc-api/classes/Erubis/EscapedEcpp.html +120 -0
- data/doc-api/classes/Erubis/Evaluator.html +22 -22
- data/doc-api/classes/Erubis/Generator.html +70 -70
- data/doc-api/classes/Erubis/HeaderFooterEnhancer.html +18 -15
- data/doc-api/classes/Erubis/Helpers/RailsFormHelper.html +787 -0
- data/doc-api/classes/Erubis/Helpers/RailsHelper/TemplateConverter.html +213 -0
- data/doc-api/classes/Erubis/Helpers/RailsHelper.html +103 -54
- data/doc-api/classes/Erubis/Helpers.html +6 -1
- data/doc-api/classes/Erubis/InterpolationEnhancer.html +42 -41
- data/doc-api/classes/Erubis/JavaGenerator.html +69 -69
- data/doc-api/classes/Erubis/JavascriptGenerator.html +79 -74
- data/doc-api/classes/Erubis/Main.html +49 -48
- data/doc-api/classes/Erubis/NoCodeEnhancer.html +35 -35
- data/doc-api/classes/Erubis/NoTextEnhancer.html +7 -7
- data/doc-api/classes/Erubis/OptimizedEruby.html +7 -7
- data/doc-api/classes/Erubis/OptimizedGenerator.html +84 -84
- data/doc-api/classes/Erubis/OptimizedXmlEruby.html +7 -7
- data/doc-api/classes/Erubis/PI/Converter.html +23 -22
- data/doc-api/classes/Erubis/PI/Ec.html +7 -7
- data/doc-api/classes/Erubis/PI/Ecpp.html +166 -0
- data/doc-api/classes/Erubis/PI/Ejava.html +7 -7
- data/doc-api/classes/Erubis/PI/Ejavascript.html +7 -7
- data/doc-api/classes/Erubis/PI/Eperl.html +7 -7
- data/doc-api/classes/Erubis/PI/Ephp.html +7 -7
- data/doc-api/classes/Erubis/PI/Eruby.html +6 -6
- data/doc-api/classes/Erubis/PI/Escheme.html +7 -7
- data/doc-api/classes/Erubis/PI/TinyEruby.html +28 -27
- data/doc-api/classes/Erubis/PI.html +1 -0
- data/doc-api/classes/Erubis/PercentLineEnhancer.html +18 -29
- data/doc-api/classes/Erubis/PerlGenerator.html +63 -63
- data/doc-api/classes/Erubis/PhpGenerator.html +63 -63
- data/doc-api/classes/Erubis/PrefixedLineEnhancer.html +210 -0
- data/doc-api/classes/Erubis/PrefixedLineEruby.html +120 -0
- data/doc-api/classes/Erubis/PreprocessingEruby.html +183 -0
- data/doc-api/classes/Erubis/PreprocessingHelper.html +212 -0
- data/doc-api/classes/Erubis/PrintEnabledEnhancer.html +23 -23
- data/doc-api/classes/Erubis/PrintOutEnhancer.html +38 -38
- data/doc-api/classes/Erubis/RubyEvaluator.html +59 -22
- data/doc-api/classes/Erubis/RubyGenerator.html +53 -52
- data/doc-api/classes/Erubis/SchemeGenerator.html +70 -70
- data/doc-api/classes/Erubis/SimplifyEnhancer.html +10 -9
- data/doc-api/classes/Erubis/StdoutEnhancer.html +3 -3
- data/doc-api/classes/Erubis/StringBufferEnhancer.html +16 -16
- data/doc-api/classes/Erubis/TinyEruby.html +33 -33
- data/doc-api/classes/Erubis/XmlHelper.html +80 -15
- data/doc-api/classes/Erubis.html +25 -1
- data/doc-api/classes/Kernel.html +155 -0
- data/doc-api/created.rid +1 -1
- data/doc-api/files/README_txt.html +8 -8
- data/doc-api/files/erubis/context_rb.html +2 -2
- data/doc-api/files/erubis/converter_rb.html +3 -3
- data/doc-api/files/erubis/engine/ec_rb.html +2 -2
- data/doc-api/files/erubis/engine/ecpp_rb.html +115 -0
- data/doc-api/files/erubis/engine/ejava_rb.html +2 -2
- data/doc-api/files/erubis/engine/ejavascript_rb.html +2 -2
- data/doc-api/files/erubis/engine/enhanced_rb.html +2 -2
- data/doc-api/files/erubis/engine/eperl_rb.html +2 -2
- data/doc-api/files/erubis/engine/ephp_rb.html +2 -2
- data/doc-api/files/erubis/engine/eruby_rb.html +2 -2
- data/doc-api/files/erubis/engine/escheme_rb.html +2 -2
- data/doc-api/files/erubis/engine/optimized_rb.html +2 -2
- data/doc-api/files/erubis/engine_rb.html +2 -2
- data/doc-api/files/erubis/enhancer_rb.html +2 -2
- data/doc-api/files/erubis/error_rb.html +2 -2
- data/doc-api/files/erubis/evaluator_rb.html +2 -2
- data/doc-api/files/erubis/generator_rb.html +3 -3
- data/doc-api/files/erubis/helper_rb.html +2 -2
- data/doc-api/files/erubis/helpers/rails_form_helper_rb.html +107 -0
- data/doc-api/files/erubis/helpers/rails_helper_rb.html +3 -2
- data/doc-api/files/erubis/local-setting_rb.html +2 -2
- data/doc-api/files/erubis/main_rb.html +4 -2
- data/doc-api/files/erubis/preprocessing_rb.html +114 -0
- data/doc-api/files/erubis/tiny_rb.html +2 -2
- data/doc-api/files/erubis/util_rb.html +107 -0
- data/doc-api/files/erubis_rb.html +2 -2
- data/doc-api/fr_class_index.html +13 -0
- data/doc-api/fr_file_index.html +4 -0
- data/doc-api/fr_method_index.html +237 -179
- data/examples/basic/Makefile +7 -2
- data/examples/basic/example.ecpp +33 -0
- data/lib/erubis/context.rb +2 -3
- data/lib/erubis/converter.rb +17 -11
- data/lib/erubis/engine/ec.rb +2 -3
- data/lib/erubis/engine/ecpp.rb +113 -0
- data/lib/erubis/engine/ejava.rb +9 -10
- data/lib/erubis/engine/ejavascript.rb +14 -9
- data/lib/erubis/engine/enhanced.rb +7 -3
- data/lib/erubis/engine/eperl.rb +2 -3
- data/lib/erubis/engine/ephp.rb +2 -3
- data/lib/erubis/engine/eruby.rb +8 -8
- data/lib/erubis/engine/escheme.rb +2 -3
- data/lib/erubis/engine/optimized.rb +2 -3
- data/lib/erubis/engine.rb +13 -11
- data/lib/erubis/enhancer.rb +101 -34
- data/lib/erubis/error.rb +2 -3
- data/lib/erubis/evaluator.rb +27 -10
- data/lib/erubis/generator.rb +3 -4
- data/lib/erubis/helper.rb +14 -3
- data/lib/erubis/helpers/rails_form_helper.rb +197 -0
- data/lib/erubis/helpers/rails_helper.rb +219 -77
- data/lib/erubis/local-setting.rb +2 -3
- data/lib/erubis/main.rb +85 -60
- data/lib/erubis/preprocessing.rb +58 -0
- data/lib/erubis/tiny.rb +9 -9
- data/lib/erubis/util.rb +22 -0
- data/lib/erubis.rb +4 -4
- data/test/assert-text-equal.rb +2 -3
- data/test/data/users-guide/bufvar-example.rb +10 -0
- data/test/data/users-guide/bufvar-example.result +17 -0
- data/test/data/users-guide/def_method.rb +14 -0
- data/test/data/users-guide/def_method.result +3 -0
- data/test/data/users-guide/example.ecpp +30 -0
- data/test/data/users-guide/example1.rb +1 -0
- data/test/data/users-guide/example_c.result +22 -19
- data/test/data/users-guide/fasteruby-example.rb +8 -0
- data/test/data/users-guide/fasteruby-example.result +18 -0
- data/test/data/users-guide/main_program1.rb +8 -0
- data/test/data/users-guide/main_program1.result +6 -0
- data/test/data/users-guide/main_program2.rb +8 -0
- data/test/data/users-guide/main_program2.result +6 -0
- data/test/data/users-guide/percentline-example.rhtml +3 -1
- data/test/data/users-guide/percentline_example.result +5 -3
- data/test/data/users-guide/prefixedline-example.rb +9 -0
- data/test/data/users-guide/prefixedline-example.rhtml +6 -0
- data/test/data/users-guide/prefixedline_example.result +9 -0
- data/test/data/users-guide/tail_260.result +4 -0
- data/test/data/users-guide/tailnewline.rhtml +3 -0
- data/test/data/users-guide/template1.rhtml +4 -0
- data/test/data/users-guide/template2.rhtml +4 -0
- data/test/test-engines.rb +88 -5
- data/test/test-enhancers.rb +83 -6
- data/test/test-erubis.rb +115 -11
- data/test/test-index-cgi.rb +191 -0
- data/test/test-main.rb +143 -31
- data/test/test-users-guide.rb +20 -3
- data/test/test.rb +18 -3
- data/test/testutil.rb +44 -8
- metadata +104 -67
- data/contrib/action_view_base_rb.patch +0 -23
data/lib/erubis/main.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
###
|
2
|
-
### $
|
3
|
-
###
|
4
|
-
### copyright(c) 2006-2007 kuwata-lab.com all rights reserved.
|
2
|
+
### $Release: 2.7.0 $
|
3
|
+
### copyright(c) 2006-2011 kuwata-lab.com all rights reserved.
|
5
4
|
###
|
6
5
|
|
7
6
|
require 'yaml'
|
@@ -12,6 +11,7 @@ require 'erubis/engine/optimized'
|
|
12
11
|
require 'erubis/engine/eruby'
|
13
12
|
require 'erubis/engine/ephp'
|
14
13
|
require 'erubis/engine/ec'
|
14
|
+
require 'erubis/engine/ecpp'
|
15
15
|
require 'erubis/engine/ejava'
|
16
16
|
require 'erubis/engine/escheme'
|
17
17
|
require 'erubis/engine/eperl'
|
@@ -52,34 +52,34 @@ module Erubis
|
|
52
52
|
@single_options = "hvxztTSbeBXNUC"
|
53
53
|
@arg_options = "pcrfKIlaE" #C
|
54
54
|
@option_names = {
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
55
|
+
'h' => :help,
|
56
|
+
'v' => :version,
|
57
|
+
'x' => :source,
|
58
|
+
'z' => :syntax,
|
59
|
+
'T' => :unexpand,
|
60
|
+
't' => :untabify, # obsolete
|
61
|
+
'S' => :intern,
|
62
|
+
'b' => :bodyonly,
|
63
|
+
'B' => :binding,
|
64
|
+
'p' => :pattern,
|
65
|
+
'c' => :context,
|
66
|
+
#'C' => :class,
|
67
|
+
'e' => :escape,
|
68
|
+
'r' => :requires,
|
69
|
+
'f' => :datafiles,
|
70
|
+
'K' => :kanji,
|
71
|
+
'I' => :includes,
|
72
|
+
'l' => :lang,
|
73
|
+
'a' => :action,
|
74
|
+
'E' => :enhancers,
|
75
|
+
'X' => :notext,
|
76
|
+
'N' => :linenum,
|
77
|
+
'U' => :unique,
|
78
|
+
'C' => :compact,
|
79
79
|
}
|
80
80
|
assert unless @single_options.length + @arg_options.length == @option_names.length
|
81
81
|
(@single_options + @arg_options).each_byte do |ch|
|
82
|
-
assert unless @option_names.key?(ch)
|
82
|
+
assert unless @option_names.key?(ch.chr)
|
83
83
|
end
|
84
84
|
end
|
85
85
|
|
@@ -88,9 +88,9 @@ module Erubis
|
|
88
88
|
## parse command-line options
|
89
89
|
options, properties = parse_argv(argv, @single_options, @arg_options)
|
90
90
|
filenames = argv
|
91
|
-
options[
|
91
|
+
options['h'] = true if properties[:help]
|
92
92
|
opts = Object.new
|
93
|
-
arr = @option_names.collect {
|
93
|
+
arr = @option_names.collect {|ch, name| "def #{name}; @#{name}; end\n" }
|
94
94
|
opts.instance_eval arr.join
|
95
95
|
options.each do |ch, val|
|
96
96
|
name = @option_names[ch]
|
@@ -166,14 +166,15 @@ module Erubis
|
|
166
166
|
msg = "Syntax OK\n"
|
167
167
|
if filenames && !filenames.empty?
|
168
168
|
filenames.each do |filename|
|
169
|
-
|
169
|
+
File.file?(filename) or
|
170
|
+
raise CommandOptionError.new("#{filename}: file not found.")
|
170
171
|
engine.filename = filename
|
171
172
|
engine.convert!(File.read(filename))
|
172
173
|
val = do_action(action, engine, context, filename, opts)
|
173
174
|
msg = nil if val
|
174
175
|
end
|
175
176
|
else
|
176
|
-
engine.filename = '(stdin)'
|
177
|
+
engine.filename = filename = '(stdin)'
|
177
178
|
engine.convert!($stdin.read())
|
178
179
|
val = do_action(action, engine, context, filename, opts)
|
179
180
|
msg = nil if val
|
@@ -215,8 +216,8 @@ module Erubis
|
|
215
216
|
return source
|
216
217
|
end
|
217
218
|
|
218
|
-
def usage
|
219
|
-
command
|
219
|
+
def usage(command=nil)
|
220
|
+
command ||= File.basename($0)
|
220
221
|
buf = []
|
221
222
|
buf << "erubis - embedded program converter for multi-language"
|
222
223
|
buf << "Usage: #{command} [..options..] [file ...]"
|
@@ -231,7 +232,7 @@ module Erubis
|
|
231
232
|
buf << " -z : syntax checking"
|
232
233
|
buf << " -e : escape (equal to '--E Escape')"
|
233
234
|
buf << " -p pattern : embedded pattern (default '<% %>')"
|
234
|
-
buf << " -l lang : convert but no execute (ruby/php/c/java/scheme/perl/js)"
|
235
|
+
buf << " -l lang : convert but no execute (ruby/php/c/cpp/java/scheme/perl/js)"
|
235
236
|
buf << " -E e1,e2,... : enhancer names (Escape, PercentLine, BiPattern, ...)"
|
236
237
|
buf << " -I path : library include path"
|
237
238
|
buf << " -K kanji : kanji code (euc/sjis/utf8) (default none)"
|
@@ -247,10 +248,9 @@ module Erubis
|
|
247
248
|
# -c class : class name (XmlEruby/PercentLineEruby/...) (default Eruby)
|
248
249
|
# -r library : require library
|
249
250
|
# -a : action (convert/execute)
|
250
|
-
return join("\n")
|
251
|
+
return buf.join("\n")
|
251
252
|
end
|
252
253
|
|
253
|
-
|
254
254
|
def collect_supported_properties(erubis_klass)
|
255
255
|
list = []
|
256
256
|
erubis_klass.ancestors.each do |klass|
|
@@ -270,7 +270,7 @@ module Erubis
|
|
270
270
|
list << ['(common)', common_props]
|
271
271
|
list << ['(basic)', basic_props - common_props]
|
272
272
|
list << ['(pi)', pi_props - common_props]
|
273
|
-
%w[ruby php c java scheme perl javascript].each do |lang|
|
273
|
+
%w[ruby php c cpp java scheme perl javascript].each do |lang|
|
274
274
|
klass = Erubis.const_get("E#{lang}")
|
275
275
|
list << [lang, collect_supported_properties(klass) - basic_props]
|
276
276
|
end
|
@@ -285,14 +285,13 @@ module Erubis
|
|
285
285
|
end
|
286
286
|
|
287
287
|
def show_enhancers
|
288
|
+
dict = {}
|
289
|
+
ObjectSpace.each_object(Module) do |mod|
|
290
|
+
dict[$1] = mod if mod.name =~ /\AErubis::(.*)Enhancer\z/
|
291
|
+
end
|
288
292
|
s = "enhancers:\n"
|
289
|
-
|
290
|
-
|
291
|
-
list.sort_by { |m| m.name }.each do |m|
|
292
|
-
next unless m.name =~ /\AErubis::(.*)Enhancer\z/
|
293
|
-
name = $1
|
294
|
-
desc = m.desc
|
295
|
-
s << (" %-13s : %s\n" % [name, desc])
|
293
|
+
dict.sort_by {|name, mod| name }.each do |name, mod|
|
294
|
+
s << (" %-13s : %s\n" % [name, mod.desc])
|
296
295
|
end
|
297
296
|
return s
|
298
297
|
end
|
@@ -309,10 +308,9 @@ module Erubis
|
|
309
308
|
optstr = optstr[1, optstr.length-1]
|
310
309
|
#
|
311
310
|
if optstr[0] == ?- # context
|
312
|
-
|
311
|
+
optstr =~ /\A\-([-\w]+)(?:=(.*))?/ or
|
313
312
|
raise CommandOptionError.new("-#{optstr}: invalid context value.")
|
314
|
-
|
315
|
-
name = $1; value = $2
|
313
|
+
name, value = $1, $2
|
316
314
|
name = name.gsub(/-/, '_').intern
|
317
315
|
#value = value.nil? ? true : YAML.load(value) # error, why?
|
318
316
|
value = value.nil? ? true : YAML.load("---\n#{value}\n")
|
@@ -320,16 +318,13 @@ module Erubis
|
|
320
318
|
#
|
321
319
|
else # options
|
322
320
|
while optstr && !optstr.empty?
|
323
|
-
optchar = optstr[0]
|
324
|
-
optstr[
|
321
|
+
optchar = optstr[0].chr
|
322
|
+
optstr = optstr[1..-1]
|
325
323
|
if arg_none.include?(optchar)
|
326
324
|
options[optchar] = true
|
327
325
|
elsif arg_required.include?(optchar)
|
328
|
-
arg = optstr.empty? ? argv.shift : optstr
|
329
|
-
|
330
|
-
mesg = "-#{optchar.chr}: #{@option_args[optchar]} required."
|
331
|
-
raise CommandOptionError.new(mesg)
|
332
|
-
end
|
326
|
+
arg = optstr.empty? ? argv.shift : optstr or
|
327
|
+
raise CommandOptionError.new("-#{optchar}: #{@option_names[optchar]} required.")
|
333
328
|
options[optchar] = arg
|
334
329
|
optstr = nil
|
335
330
|
elsif arg_optional.include?(optchar)
|
@@ -337,7 +332,7 @@ module Erubis
|
|
337
332
|
options[optchar] = arg
|
338
333
|
optstr = nil
|
339
334
|
else
|
340
|
-
raise CommandOptionError.new("-#{optchar
|
335
|
+
raise CommandOptionError.new("-#{optchar}: unknown option.")
|
341
336
|
end
|
342
337
|
end
|
343
338
|
end
|
@@ -396,18 +391,19 @@ module Erubis
|
|
396
391
|
enhancers = []
|
397
392
|
shortname = nil
|
398
393
|
begin
|
399
|
-
enhancer_names.split(/,/).each do |
|
394
|
+
enhancer_names.split(/,/).each do |name|
|
395
|
+
shortname = name
|
400
396
|
enhancers << Erubis.const_get("#{shortname}Enhancer")
|
401
397
|
end
|
402
398
|
rescue NameError
|
403
|
-
raise CommandOptionError.new("#{shortname}: no such Enhancer (try '-
|
399
|
+
raise CommandOptionError.new("#{shortname}: no such Enhancer (try '-h' to show all enhancers).")
|
404
400
|
end
|
405
401
|
return enhancers
|
406
402
|
end
|
407
403
|
|
408
404
|
def load_datafiles(filenames, opts)
|
409
405
|
context = Erubis::Context.new
|
410
|
-
return
|
406
|
+
return context unless filenames
|
411
407
|
filenames.split(/,/).each do |filename|
|
412
408
|
filename.strip!
|
413
409
|
test(?f, filename) or raise CommandOptionError.new("#{filename}: file not found.")
|
@@ -473,7 +469,10 @@ module Erubis
|
|
473
469
|
|
474
470
|
def check_syntax(filename, src)
|
475
471
|
require 'open3'
|
476
|
-
|
472
|
+
#command = (ENV['_'] || 'ruby') + ' -wc' # ENV['_'] stores command name
|
473
|
+
bin = ENV['_'] && File.basename(ENV['_']) =~ /^ruby/ ? ENV['_'] : 'ruby'
|
474
|
+
command = bin + ' -wc'
|
475
|
+
stdin, stdout, stderr = Open3.popen3(command)
|
477
476
|
stdin.write(src)
|
478
477
|
stdin.close
|
479
478
|
result = stdout.read()
|
@@ -486,6 +485,32 @@ module Erubis
|
|
486
485
|
return "#{filename}:#{linenum}: #{message}"
|
487
486
|
end
|
488
487
|
|
488
|
+
if defined?(RUBY_ENGINE) && RUBY_ENGINE == "rbx"
|
489
|
+
def check_syntax(filename, src)
|
490
|
+
require 'compiler'
|
491
|
+
verbose = $VERBOSE
|
492
|
+
msg = nil
|
493
|
+
begin
|
494
|
+
$VERBOSE = true
|
495
|
+
Rubinius::Compiler.compile_string(src, filename)
|
496
|
+
rescue SyntaxError => ex
|
497
|
+
ex_linenum = ex.line
|
498
|
+
linenum = 0
|
499
|
+
srcline = src.each_line do |line|
|
500
|
+
linenum += 1
|
501
|
+
break line if linenum == ex_linenum
|
502
|
+
end
|
503
|
+
msg = "#{ex.message}\n"
|
504
|
+
msg << srcline
|
505
|
+
msg << "\n" unless srcline =~ /\n\z/
|
506
|
+
msg << (" " * (ex.column-1)) << "^\n"
|
507
|
+
ensure
|
508
|
+
$VERBOSE = verbose
|
509
|
+
end
|
510
|
+
return msg
|
511
|
+
end
|
512
|
+
end
|
513
|
+
|
489
514
|
end
|
490
515
|
|
491
516
|
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
###
|
2
|
+
### $Release: 2.7.0 $
|
3
|
+
### copyright(c) 2006-2011 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!(/<%=(.*?)%>/) { "<%=#{CGI.unescapeHTML($1)}%>" }
|
52
|
+
return arg
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
|
57
|
+
|
58
|
+
end
|
data/lib/erubis/tiny.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
##
|
2
|
-
## $
|
3
|
-
##
|
4
|
-
## copyright(c) 2006-2007 kuwata-lab.com all rights reserved.
|
2
|
+
## $Release: 2.7.0 $
|
3
|
+
## copyright(c) 2006-2011 kuwata-lab.com all rights reserved.
|
5
4
|
##
|
6
5
|
|
7
6
|
module Erubis
|
@@ -28,10 +27,9 @@ module Erubis
|
|
28
27
|
src = "_buf = '';" # preamble
|
29
28
|
pos = 0
|
30
29
|
input.scan(EMBEDDED_PATTERN) do |indicator, code|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
pos = match.end(0)
|
30
|
+
m = Regexp.last_match
|
31
|
+
text = input[pos...m.begin(0)]
|
32
|
+
pos = m.end(0)
|
35
33
|
#src << " _buf << '" << escape_text(text) << "';"
|
36
34
|
text.gsub!(/['\\]/, '\\\\\&')
|
37
35
|
src << " _buf << '" << text << "';" unless text.empty?
|
@@ -43,7 +41,8 @@ module Erubis
|
|
43
41
|
src << " _buf << (" << code << ").to_s;"
|
44
42
|
end
|
45
43
|
end
|
46
|
-
rest = $' || input
|
44
|
+
#rest = $' || input # ruby1.8
|
45
|
+
rest = pos == 0 ? input : input[pos..-1] # ruby1.9
|
47
46
|
#src << " _buf << '" << escape_text(rest) << "';"
|
48
47
|
rest.gsub!(/['\\]/, '\\\\\&')
|
49
48
|
src << " _buf << '" << rest << "';" unless rest.empty?
|
@@ -113,7 +112,8 @@ module Erubis
|
|
113
112
|
end
|
114
113
|
end
|
115
114
|
end
|
116
|
-
rest = $' || input
|
115
|
+
#rest = $' || input # ruby1.8
|
116
|
+
rest = pos == 0 ? input : input[pos..-1] # ruby1.9
|
117
117
|
#src << " _buf << '" << escape_text(rest) << "';"
|
118
118
|
rest.gsub!(/['\\]/, '\\\\\&')
|
119
119
|
src << " _buf << '" << rest << "';" unless rest.empty?
|
data/lib/erubis/util.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
##
|
2
|
+
## $Release: 2.7.0 $
|
3
|
+
## copyright(c) 2006-2011 kuwata-lab.com all rights reserved.
|
4
|
+
##
|
5
|
+
|
6
|
+
module Kernel
|
7
|
+
|
8
|
+
##
|
9
|
+
## raise NotImplementedError
|
10
|
+
##
|
11
|
+
def not_implemented #:doc:
|
12
|
+
backtrace = caller()
|
13
|
+
method_name = (backtrace.shift =~ /`(\w+)'$/) && $1
|
14
|
+
mesg = "class #{self.class.name} must implement abstract method '#{method_name}()'."
|
15
|
+
#mesg = "#{self.class.name}##{method_name}() is not implemented."
|
16
|
+
err = NotImplementedError.new mesg
|
17
|
+
err.set_backtrace backtrace
|
18
|
+
raise err
|
19
|
+
end
|
20
|
+
private :not_implemented
|
21
|
+
|
22
|
+
end
|
data/lib/erubis.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
##
|
2
|
-
## $
|
3
|
-
##
|
4
|
-
## copyright(c) 2006-2007 kuwata-lab.com all rights reserved.
|
2
|
+
## $Release: 2.7.0 $
|
3
|
+
## copyright(c) 2006-2011 kuwata-lab.com all rights reserved.
|
5
4
|
##
|
6
5
|
|
7
6
|
##
|
@@ -48,7 +47,7 @@
|
|
48
47
|
|
49
48
|
|
50
49
|
module Erubis
|
51
|
-
VERSION = ('$Release: 2.
|
50
|
+
VERSION = ('$Release: 2.7.0 $' =~ /([.\d]+)/) && $1
|
52
51
|
end
|
53
52
|
|
54
53
|
require 'erubis/engine'
|
@@ -57,6 +56,7 @@ require 'erubis/engine'
|
|
57
56
|
#require 'erubis/evaluator'
|
58
57
|
#require 'erubis/error'
|
59
58
|
#require 'erubis/context'
|
59
|
+
#requier 'erubis/util'
|
60
60
|
require 'erubis/helper'
|
61
61
|
require 'erubis/enhancer'
|
62
62
|
#require 'erubis/tiny'
|
data/test/assert-text-equal.rb
CHANGED
@@ -0,0 +1,10 @@
|
|
1
|
+
require 'erubis'
|
2
|
+
input = File.read('example.eruby')
|
3
|
+
|
4
|
+
puts "----- default -----"
|
5
|
+
eruby = Erubis::FastEruby.new(input)
|
6
|
+
puts eruby.src
|
7
|
+
|
8
|
+
puts "----- with :bufvar option -----"
|
9
|
+
eruby = Erubis::FastEruby.new(input, :bufvar=>'@_out_buf')
|
10
|
+
print eruby.src
|
@@ -0,0 +1,17 @@
|
|
1
|
+
$ ruby bufvar-example.rb
|
2
|
+
----- default -----
|
3
|
+
_buf = ''; _buf << %Q`<div>\n`
|
4
|
+
for item in list
|
5
|
+
_buf << %Q` <p>#{ item }</p>
|
6
|
+
<p>#{Erubis::XmlHelper.escape_xml( item )}</p>\n`
|
7
|
+
end
|
8
|
+
_buf << %Q`</div>\n`
|
9
|
+
_buf.to_s
|
10
|
+
----- with :bufvar option -----
|
11
|
+
@_out_buf = ''; @_out_buf << %Q`<div>\n`
|
12
|
+
for item in list
|
13
|
+
@_out_buf << %Q` <p>#{ item }</p>
|
14
|
+
<p>#{Erubis::XmlHelper.escape_xml( item )}</p>\n`
|
15
|
+
end
|
16
|
+
@_out_buf << %Q`</div>\n`
|
17
|
+
@_out_buf.to_s
|
@@ -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"
|
@@ -0,0 +1,30 @@
|
|
1
|
+
<%
|
2
|
+
#include <string>
|
3
|
+
#include <iostream>
|
4
|
+
#include <sstream>
|
5
|
+
|
6
|
+
int main(int argc, char *argv[])
|
7
|
+
{
|
8
|
+
std::stringstream _buf;
|
9
|
+
%>
|
10
|
+
<html>
|
11
|
+
<body>
|
12
|
+
<p>Hello <%= argv[0] %>!</p>
|
13
|
+
<table>
|
14
|
+
<tbody>
|
15
|
+
<% for (int i = 1; i < argc; i++) { %>
|
16
|
+
<tr bgcolor="<%= i % 2 == 0 ? "#FFCCCC" : "#CCCCFF" %>">
|
17
|
+
<td><%= i %></td>
|
18
|
+
<td><%= argv[i] %></td>
|
19
|
+
</tr>
|
20
|
+
<% } %>
|
21
|
+
</tbody>
|
22
|
+
</table>
|
23
|
+
</body>
|
24
|
+
</html>
|
25
|
+
<%
|
26
|
+
std::string output = _buf.str();
|
27
|
+
std::cout << output;
|
28
|
+
return 0;
|
29
|
+
}
|
30
|
+
%>
|
@@ -8,6 +8,7 @@ puts eruby.src # print script source
|
|
8
8
|
puts "---------- result ----------"
|
9
9
|
list = ['aaa', 'bbb', 'ccc']
|
10
10
|
puts eruby.result(binding()) # get result
|
11
|
+
## or puts eruby.result(:list=>list) # or pass Hash instead of Binding
|
11
12
|
|
12
13
|
## # or
|
13
14
|
## eruby = Erubis::Eruby.new
|
@@ -1,29 +1,32 @@
|
|
1
|
-
$ erubis -l
|
2
|
-
#line 1 "example.
|
1
|
+
$ erubis -l cpp example.ecpp
|
2
|
+
#line 1 "example.ecpp"
|
3
3
|
|
4
|
-
#include <
|
4
|
+
#include <string>
|
5
|
+
#include <iostream>
|
6
|
+
#include <sstream>
|
5
7
|
|
6
8
|
int main(int argc, char *argv[])
|
7
9
|
{
|
8
|
-
|
10
|
+
std::stringstream _buf;
|
9
11
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
" </tr>\n", stdout);
|
12
|
+
_buf << "<html>\n"
|
13
|
+
" <body>\n"
|
14
|
+
" <p>Hello "; _buf << (argv[0]); _buf << "!</p>\n"
|
15
|
+
" <table>\n"
|
16
|
+
" <tbody>\n";
|
17
|
+
for (int i = 1; i < argc; i++) {
|
18
|
+
_buf << " <tr bgcolor=\""; _buf << (i % 2 == 0 ? "#FFCCCC" : "#CCCCFF"); _buf << "\">\n"
|
19
|
+
" <td>"; _buf << (i); _buf << "</td>\n"
|
20
|
+
" <td>"; _buf << (argv[i]); _buf << "</td>\n"
|
21
|
+
" </tr>\n";
|
21
22
|
}
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
23
|
+
_buf << " </tbody>\n"
|
24
|
+
" </table>\n"
|
25
|
+
" </body>\n"
|
26
|
+
"</html>\n";
|
26
27
|
|
28
|
+
std::string output = _buf.str();
|
29
|
+
std::cout << output;
|
27
30
|
return 0;
|
28
31
|
}
|
29
32
|
|
@@ -0,0 +1,18 @@
|
|
1
|
+
$ ruby fasteruby-example.rb
|
2
|
+
----- Erubis::Eruby -----
|
3
|
+
_buf = ''; _buf << '<div>
|
4
|
+
'; for item in list
|
5
|
+
_buf << ' <p>'; _buf << ( item ).to_s; _buf << '</p>
|
6
|
+
<p>'; _buf << Erubis::XmlHelper.escape_xml( item ); _buf << '</p>
|
7
|
+
'; end
|
8
|
+
_buf << '</div>
|
9
|
+
';
|
10
|
+
_buf.to_s
|
11
|
+
----- Erubis::FastEruby -----
|
12
|
+
_buf = ''; _buf << %Q`<div>\n`
|
13
|
+
for item in list
|
14
|
+
_buf << %Q` <p>#{ item }</p>
|
15
|
+
<p>#{Erubis::XmlHelper.escape_xml( item )}</p>\n`
|
16
|
+
end
|
17
|
+
_buf << %Q`</div>\n`
|
18
|
+
_buf.to_s
|
@@ -0,0 +1,8 @@
|
|
1
|
+
require 'erubis'
|
2
|
+
eruby = Erubis::Eruby.new(File.read('template1.rhtml'))
|
3
|
+
items = ['foo', 'bar', 'baz']
|
4
|
+
x = 1
|
5
|
+
## local variable 'x' and 'eruby' are passed to template as well as 'items'!
|
6
|
+
print eruby.result(binding())
|
7
|
+
## local variable 'x' is changed unintendedly because it is changed in template!
|
8
|
+
puts "** debug: x=#{x.inspect}" #=> "baz"
|
@@ -0,0 +1,8 @@
|
|
1
|
+
require 'erubis'
|
2
|
+
eruby = Erubis::Eruby.new(File.read('template2.rhtml'))
|
3
|
+
items = ['foo', 'bar', 'baz']
|
4
|
+
x = 1
|
5
|
+
## only 'items' are passed to template
|
6
|
+
print eruby.evaluate(:items=>items)
|
7
|
+
## local variable 'x' is not changed!
|
8
|
+
puts "** debug: x=#{x.inspect}" #=> 1
|