erubis 2.3.1 → 2.7.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 → 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
|