erbse 0.0.1
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.
- checksums.yaml +7 -0
- data/CHANGES.txt +828 -0
- data/MIT-LICENSE +20 -0
- data/README.md +51 -0
- data/benchmark/Makefile +6 -0
- data/benchmark/bench.rb +313 -0
- data/benchmark/bench_context.yaml +141 -0
- data/benchmark/templates/_footer.html +4 -0
- data/benchmark/templates/_header.html +52 -0
- data/benchmark/templates/bench_erb.rhtml +29 -0
- data/benchmark/templates/bench_erubis.rhtml +29 -0
- data/benchmark/templates/bench_eruby.rhtml +29 -0
- data/bin/erubis +10 -0
- data/erbse.gemspec +24 -0
- data/lib/erbse.rb +52 -0
- data/lib/erbse/context.rb +83 -0
- data/lib/erbse/converter.rb +357 -0
- data/lib/erbse/engine.rb +114 -0
- data/lib/erbse/engine/ec.rb +117 -0
- data/lib/erbse/engine/ecpp.rb +113 -0
- data/lib/erbse/engine/ejava.rb +110 -0
- data/lib/erbse/engine/ejavascript.rb +119 -0
- data/lib/erbse/engine/enhanced.rb +126 -0
- data/lib/erbse/engine/eperl.rb +95 -0
- data/lib/erbse/engine/ephp.rb +99 -0
- data/lib/erbse/engine/eruby.rb +119 -0
- data/lib/erbse/engine/escheme.rb +114 -0
- data/lib/erbse/engine/optimized.rb +127 -0
- data/lib/erbse/enhancer.rb +723 -0
- data/lib/erbse/error.rb +23 -0
- data/lib/erbse/evaluator.rb +88 -0
- data/lib/erbse/generator.rb +85 -0
- data/lib/erbse/helper.rb +47 -0
- data/lib/erbse/helpers/rails_form_helper.rb +197 -0
- data/lib/erbse/helpers/rails_helper.rb +353 -0
- data/lib/erbse/main.rb +516 -0
- data/lib/erbse/preprocessing.rb +58 -0
- data/lib/erbse/tiny.rb +144 -0
- data/lib/erbse/util.rb +22 -0
- data/lib/erbse/version.rb +3 -0
- data/test/assert-text-equal.rb +44 -0
- data/test/data/users-guide/Example.ejava +55 -0
- data/test/data/users-guide/array_example.result +9 -0
- data/test/data/users-guide/arraybuffer_example.result +9 -0
- data/test/data/users-guide/bipattern-example.rhtml +4 -0
- data/test/data/users-guide/bipattern_example.result +6 -0
- 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/context.rb +6 -0
- data/test/data/users-guide/context.yaml +8 -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/escape_example.result +9 -0
- data/test/data/users-guide/example.ec +27 -0
- data/test/data/users-guide/example.ecpp +30 -0
- data/test/data/users-guide/example.ejs +20 -0
- data/test/data/users-guide/example.eperl +18 -0
- data/test/data/users-guide/example.ephp +18 -0
- data/test/data/users-guide/example.eruby +6 -0
- data/test/data/users-guide/example.escheme +28 -0
- data/test/data/users-guide/example1.eruby +6 -0
- data/test/data/users-guide/example1.rb +17 -0
- data/test/data/users-guide/example1.result +16 -0
- data/test/data/users-guide/example10.rb +4 -0
- data/test/data/users-guide/example10.result +17 -0
- data/test/data/users-guide/example10.xhtml +14 -0
- data/test/data/users-guide/example10_x.result +17 -0
- data/test/data/users-guide/example11.php +20 -0
- data/test/data/users-guide/example11.result +23 -0
- data/test/data/users-guide/example11.rhtml +21 -0
- data/test/data/users-guide/example11_C.result +10 -0
- data/test/data/users-guide/example11_N.result +16 -0
- data/test/data/users-guide/example11_U.result +16 -0
- data/test/data/users-guide/example11_php.result +15 -0
- data/test/data/users-guide/example1_x.result +9 -0
- data/test/data/users-guide/example2.eruby +7 -0
- data/test/data/users-guide/example2.rb +10 -0
- data/test/data/users-guide/example2.result +27 -0
- data/test/data/users-guide/example2_trim.result +10 -0
- data/test/data/users-guide/example2_x.result +10 -0
- data/test/data/users-guide/example3.eruby +6 -0
- data/test/data/users-guide/example3.rb +10 -0
- data/test/data/users-guide/example31.result +22 -0
- data/test/data/users-guide/example32.result +4 -0
- data/test/data/users-guide/example3_e.result +8 -0
- data/test/data/users-guide/example4.eruby +3 -0
- data/test/data/users-guide/example4.rb +11 -0
- data/test/data/users-guide/example4.result +10 -0
- data/test/data/users-guide/example4_x.result +5 -0
- data/test/data/users-guide/example5.eruby +6 -0
- data/test/data/users-guide/example5.rb +16 -0
- data/test/data/users-guide/example5.result +7 -0
- data/test/data/users-guide/example6.rb +12 -0
- data/test/data/users-guide/example6.result +7 -0
- data/test/data/users-guide/example7.eruby +8 -0
- data/test/data/users-guide/example71.result +13 -0
- data/test/data/users-guide/example72.result +13 -0
- data/test/data/users-guide/example8.eruby +6 -0
- data/test/data/users-guide/example8_ruby.result +7 -0
- data/test/data/users-guide/example8_yaml.result +7 -0
- data/test/data/users-guide/example9.eruby +3 -0
- data/test/data/users-guide/example9.rb +8 -0
- data/test/data/users-guide/example9.result +9 -0
- data/test/data/users-guide/example91.result +5 -0
- data/test/data/users-guide/example92.result +4 -0
- data/test/data/users-guide/example_c.result +32 -0
- data/test/data/users-guide/example_java.result +56 -0
- data/test/data/users-guide/example_js.result +22 -0
- data/test/data/users-guide/example_perl.result +20 -0
- data/test/data/users-guide/example_php.result +19 -0
- data/test/data/users-guide/example_scheme.result +30 -0
- data/test/data/users-guide/example_scheme_display.result +29 -0
- 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/fasteruby.rb +11 -0
- data/test/data/users-guide/fasteruby.result +38 -0
- data/test/data/users-guide/fasteruby.rhtml +15 -0
- data/test/data/users-guide/headerfooter-example.eruby +9 -0
- data/test/data/users-guide/headerfooter-example2.rb +8 -0
- data/test/data/users-guide/headerfooter-example2.rhtml +10 -0
- data/test/data/users-guide/headerfooter_example.result +11 -0
- data/test/data/users-guide/headerfooter_example2.result +13 -0
- data/test/data/users-guide/interpolation_example.result +9 -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/nocode-example.eruby +14 -0
- data/test/data/users-guide/nocode-php.result +20 -0
- data/test/data/users-guide/nocode_example.result +15 -0
- data/test/data/users-guide/normal-eruby-test.eruby +9 -0
- data/test/data/users-guide/normal_eruby_test.result +11 -0
- data/test/data/users-guide/notext-example.eruby +14 -0
- data/test/data/users-guide/notext-example.php +19 -0
- data/test/data/users-guide/notext-php.result +20 -0
- data/test/data/users-guide/notext_example.result +16 -0
- data/test/data/users-guide/percentline-example.rhtml +6 -0
- data/test/data/users-guide/percentline_example.result +9 -0
- 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/printenable_example.result +4 -0
- data/test/data/users-guide/printenabled-example.eruby +3 -0
- data/test/data/users-guide/printenabled-example.rb +8 -0
- data/test/data/users-guide/printstatement_example.result +8 -0
- data/test/data/users-guide/simplify_example.result +9 -0
- data/test/data/users-guide/stderr.log +3 -0
- data/test/data/users-guide/stdout_exmple.result +9 -0
- data/test/data/users-guide/stringbuffer_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 +425 -0
- data/test/test-enhancers.rb +646 -0
- data/test/test-erubis.rb +887 -0
- data/test/test-index-cgi.rb +191 -0
- data/test/test-main.rb +752 -0
- data/test/test-users-guide.rb +73 -0
- data/test/test.rb +45 -0
- data/test/testutil.rb +111 -0
- metadata +233 -0
|
@@ -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/erbse/tiny.rb
ADDED
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
##
|
|
2
|
+
## $Release: 2.7.0 $
|
|
3
|
+
## copyright(c) 2006-2011 kuwata-lab.com all rights reserved.
|
|
4
|
+
##
|
|
5
|
+
|
|
6
|
+
module Erubis
|
|
7
|
+
|
|
8
|
+
##
|
|
9
|
+
## tiny and the simplest implementation of eRuby
|
|
10
|
+
##
|
|
11
|
+
## ex.
|
|
12
|
+
## eruby = TinyEruby.new(File.read('example.rhtml'))
|
|
13
|
+
## print eruby.src # print ruby code
|
|
14
|
+
## print eruby.result(binding()) # eval ruby code with Binding object
|
|
15
|
+
## print eruby.evalute(context) # eval ruby code with context object
|
|
16
|
+
##
|
|
17
|
+
class TinyEruby
|
|
18
|
+
|
|
19
|
+
def initialize(input=nil)
|
|
20
|
+
@src = convert(input) if input
|
|
21
|
+
end
|
|
22
|
+
attr_reader :src
|
|
23
|
+
|
|
24
|
+
EMBEDDED_PATTERN = /<%(=+|\#)?(.*?)-?%>/m
|
|
25
|
+
|
|
26
|
+
def convert(input)
|
|
27
|
+
src = "_buf = '';" # preamble
|
|
28
|
+
pos = 0
|
|
29
|
+
input.scan(EMBEDDED_PATTERN) do |indicator, code|
|
|
30
|
+
m = Regexp.last_match
|
|
31
|
+
text = input[pos...m.begin(0)]
|
|
32
|
+
pos = m.end(0)
|
|
33
|
+
#src << " _buf << '" << escape_text(text) << "';"
|
|
34
|
+
text.gsub!(/['\\]/, '\\\\\&')
|
|
35
|
+
src << " _buf << '" << text << "';" unless text.empty?
|
|
36
|
+
if !indicator # <% %>
|
|
37
|
+
src << code << ";"
|
|
38
|
+
elsif indicator == '#' # <%# %>
|
|
39
|
+
src << ("\n" * code.count("\n"))
|
|
40
|
+
else # <%= %>
|
|
41
|
+
src << " _buf << (" << code << ").to_s;"
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
#rest = $' || input # ruby1.8
|
|
45
|
+
rest = pos == 0 ? input : input[pos..-1] # ruby1.9
|
|
46
|
+
#src << " _buf << '" << escape_text(rest) << "';"
|
|
47
|
+
rest.gsub!(/['\\]/, '\\\\\&')
|
|
48
|
+
src << " _buf << '" << rest << "';" unless rest.empty?
|
|
49
|
+
src << "\n_buf.to_s\n" # postamble
|
|
50
|
+
return src
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
#def escape_text(text)
|
|
54
|
+
# return text.gsub!(/['\\]/, '\\\\\&') || text
|
|
55
|
+
#end
|
|
56
|
+
|
|
57
|
+
def result(_binding=TOPLEVEL_BINDING)
|
|
58
|
+
eval @src, _binding
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def evaluate(_context=Object.new)
|
|
62
|
+
if _context.is_a?(Hash)
|
|
63
|
+
_obj = Object.new
|
|
64
|
+
_context.each do |k, v| _obj.instance_variable_set("@#{k}", v) end
|
|
65
|
+
_context = _obj
|
|
66
|
+
end
|
|
67
|
+
_context.instance_eval @src
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
module PI
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
class PI::TinyEruby
|
|
78
|
+
|
|
79
|
+
def initialize(input=nil, options={})
|
|
80
|
+
@escape = options[:escape] || 'Erubis::XmlHelper.escape_xml'
|
|
81
|
+
@src = convert(input) if input
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
attr_reader :src
|
|
85
|
+
|
|
86
|
+
EMBEDDED_PATTERN = /(^[ \t]*)?<\?rb(\s.*?)\?>([ \t]*\r?\n)?|@(!+)?\{(.*?)\}@/m
|
|
87
|
+
|
|
88
|
+
def convert(input)
|
|
89
|
+
src = "_buf = '';" # preamble
|
|
90
|
+
pos = 0
|
|
91
|
+
input.scan(EMBEDDED_PATTERN) do |lspace, stmt, rspace, indicator, expr|
|
|
92
|
+
match = Regexp.last_match
|
|
93
|
+
len = match.begin(0) - pos
|
|
94
|
+
text = input[pos, len]
|
|
95
|
+
pos = match.end(0)
|
|
96
|
+
#src << " _buf << '" << escape_text(text) << "';"
|
|
97
|
+
text.gsub!(/['\\]/, '\\\\\&')
|
|
98
|
+
src << " _buf << '" << text << "';" unless text.empty?
|
|
99
|
+
if stmt # <?rb ... ?>
|
|
100
|
+
if lspace && rspace
|
|
101
|
+
src << "#{lspace}#{stmt}#{rspace}"
|
|
102
|
+
else
|
|
103
|
+
src << " _buf << '" << lspace << "';" if lspace
|
|
104
|
+
src << stmt << ";"
|
|
105
|
+
src << " _buf << '" << rspace << "';" if rspace
|
|
106
|
+
end
|
|
107
|
+
else # ${...}, $!{...}
|
|
108
|
+
if !indicator
|
|
109
|
+
src << " _buf << " << @escape << "(" << expr << ");"
|
|
110
|
+
elsif indicator == '!'
|
|
111
|
+
src << " _buf << (" << expr << ").to_s;"
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
#rest = $' || input # ruby1.8
|
|
116
|
+
rest = pos == 0 ? input : input[pos..-1] # ruby1.9
|
|
117
|
+
#src << " _buf << '" << escape_text(rest) << "';"
|
|
118
|
+
rest.gsub!(/['\\]/, '\\\\\&')
|
|
119
|
+
src << " _buf << '" << rest << "';" unless rest.empty?
|
|
120
|
+
src << "\n_buf.to_s\n" # postamble
|
|
121
|
+
return src
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
#def escape_text(text)
|
|
125
|
+
# return text.gsub!(/['\\]/, '\\\\\&') || text
|
|
126
|
+
#end
|
|
127
|
+
|
|
128
|
+
def result(_binding=TOPLEVEL_BINDING)
|
|
129
|
+
eval @src, _binding
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
def evaluate(_context=Object.new)
|
|
133
|
+
if _context.is_a?(Hash)
|
|
134
|
+
_obj = Object.new
|
|
135
|
+
_context.each do |k, v| _obj.instance_variable_set("@#{k}", v) end
|
|
136
|
+
_context = _obj
|
|
137
|
+
end
|
|
138
|
+
_context.instance_eval @src
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
end
|
data/lib/erbse/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
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
###
|
|
2
|
+
### $Release: 2.7.0 $
|
|
3
|
+
### copyright(c) 2006-2011 kuwata-lab.com all rights reserved.
|
|
4
|
+
###
|
|
5
|
+
|
|
6
|
+
require 'test/unit'
|
|
7
|
+
require 'tempfile'
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
module Test
|
|
11
|
+
module Unit
|
|
12
|
+
class TestCase
|
|
13
|
+
|
|
14
|
+
def assert_text_equal(expected, actual, message=nil, diffopt='-u', flag_cut=true)
|
|
15
|
+
if expected == actual
|
|
16
|
+
assert(true)
|
|
17
|
+
return
|
|
18
|
+
end
|
|
19
|
+
if expected[-1] != ?\n || actual[-1] != ?\n
|
|
20
|
+
expected += "\n"
|
|
21
|
+
actual += "\n"
|
|
22
|
+
end
|
|
23
|
+
begin
|
|
24
|
+
expfile = Tempfile.new(".expected.")
|
|
25
|
+
expfile.write(expected); expfile.flush()
|
|
26
|
+
actfile = Tempfile.new(".actual.")
|
|
27
|
+
actfile.write(actual); actfile.flush()
|
|
28
|
+
diff = `diff #{diffopt} #{expfile.path} #{actfile.path}`
|
|
29
|
+
ensure
|
|
30
|
+
expfile.close(true) if expfile
|
|
31
|
+
actfile.close(true) if actfile
|
|
32
|
+
end
|
|
33
|
+
# cut 1st & 2nd lines
|
|
34
|
+
message = (flag_cut ? diff.gsub(/\A.*\n.*\n/, '') : diff) unless message
|
|
35
|
+
#raise Test::Unit::AssertionFailedError.new(message)
|
|
36
|
+
assert_block(message) { false } # or assert(false, message)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
alias assert_equal_with_diff assert_text_equal # for compatibility
|
|
40
|
+
alias assert_text_equals assert_text_equal # for typo
|
|
41
|
+
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
<%
|
|
2
|
+
import java.util.*;
|
|
3
|
+
|
|
4
|
+
public class Example {
|
|
5
|
+
private String user;
|
|
6
|
+
private String[] list;
|
|
7
|
+
public example(String user, String[] list) {
|
|
8
|
+
this.user = user;
|
|
9
|
+
this.list = list;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
public String view() {
|
|
13
|
+
StringBuffer _buf = new StringBuffer();
|
|
14
|
+
%>
|
|
15
|
+
<html>
|
|
16
|
+
<body>
|
|
17
|
+
<p>Hello <%= user %>!</p>
|
|
18
|
+
<table>
|
|
19
|
+
<tbody>
|
|
20
|
+
<% for (int i = 0; i < list.length; i++) { %>
|
|
21
|
+
<tr bgcolor="<%= i % 2 == 0 ? "#FFCCCC" : "#CCCCFF" %>">
|
|
22
|
+
<td><%= i + 1 %></td>
|
|
23
|
+
<td><%== list[i] %></td>
|
|
24
|
+
</tr>
|
|
25
|
+
<% } %>
|
|
26
|
+
</tbody>
|
|
27
|
+
</table>
|
|
28
|
+
<body>
|
|
29
|
+
</html>
|
|
30
|
+
<%
|
|
31
|
+
return _buf.toString();
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
public static void main(String[] args) {
|
|
35
|
+
String[] list = { "<aaa>", "b&b", "\"ccc\"" };
|
|
36
|
+
Example ex = Example.new("Erubis", list);
|
|
37
|
+
System.out.print(ex.view());
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
public static String escape(String s) {
|
|
41
|
+
StringBuffer sb = new StringBuffer();
|
|
42
|
+
for (int i = 0; i < s.length(); i++) {
|
|
43
|
+
char ch = s.charAt(i);
|
|
44
|
+
switch (ch) {
|
|
45
|
+
case '<': sb.append("<"); break;
|
|
46
|
+
case '>': sb.append(">"); break;
|
|
47
|
+
case '&': sb.append("&"); break;
|
|
48
|
+
case '"': sb.append("""); break;
|
|
49
|
+
default: sb.append(ch);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return sb.toString();
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
%>
|
|
@@ -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"
|