erubis 2.0.1 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/ChangeLog +150 -2
- data/LGPL +504 -0
- data/README.txt +14 -8
- data/benchmark/erubybench.rb +1 -1
- data/benchmark/erubybench.rhtml +3 -3
- data/bin/erubis +1 -1
- data/bin/notext +154 -0
- data/contrib/erubis +1036 -374
- data/contrib/inline-require +5 -3
- data/doc-api/classes/Erubis.html +43 -1
- data/doc-api/classes/Erubis/ArrayBufferEnhancer.html +14 -14
- data/doc-api/classes/Erubis/ArrayEnhancer.html +14 -14
- data/doc-api/classes/Erubis/Basic.html +112 -0
- data/doc-api/classes/Erubis/Basic/Converter.html +318 -0
- data/doc-api/classes/Erubis/Basic/Engine.html +130 -0
- data/doc-api/classes/Erubis/BiPatternEnhancer.html +14 -14
- data/doc-api/classes/Erubis/CGenerator.html +386 -0
- data/doc-api/classes/Erubis/Context.html +31 -32
- data/doc-api/classes/Erubis/Converter.html +231 -0
- data/doc-api/classes/Erubis/Ec.html +9 -283
- data/doc-api/classes/Erubis/Ejava.html +9 -274
- data/doc-api/classes/Erubis/Ejavascript.html +9 -298
- data/doc-api/classes/Erubis/Engine.html +68 -508
- data/doc-api/classes/Erubis/Eperl.html +9 -259
- data/doc-api/classes/Erubis/Ephp.html +9 -239
- data/doc-api/classes/Erubis/ErubisError.html +2 -2
- data/doc-api/classes/Erubis/Eruby.html +4 -187
- data/doc-api/classes/Erubis/EscapeEnhancer.html +9 -11
- data/doc-api/classes/Erubis/Escheme.html +9 -272
- data/doc-api/classes/Erubis/Evaluator.html +212 -0
- data/doc-api/classes/Erubis/Generator.html +410 -0
- data/doc-api/classes/Erubis/HeaderFooterEnhancer.html +16 -16
- data/doc-api/classes/Erubis/Helper.html +112 -0
- data/doc-api/classes/Erubis/Helper/CachedRailsTemplate.html +198 -0
- data/doc-api/classes/Erubis/Helper/RailsTemplate.html +366 -0
- data/doc-api/classes/Erubis/JavaGenerator.html +359 -0
- data/doc-api/classes/Erubis/JavascriptGenerator.html +381 -0
- data/doc-api/classes/Erubis/Main.html +27 -25
- data/doc-api/classes/Erubis/NoCodeEnhancer.html +249 -0
- data/doc-api/classes/Erubis/NoCodeEruby.html +120 -0
- data/doc-api/classes/Erubis/NoTextEnhancer.html +8 -8
- data/doc-api/classes/Erubis/NotSupportedError.html +119 -0
- data/doc-api/classes/Erubis/OptimizedEruby.html +22 -304
- data/doc-api/classes/Erubis/OptimizedGenerator.html +439 -0
- data/doc-api/classes/Erubis/OptimizedXmlEruby.html +7 -7
- data/doc-api/classes/Erubis/PI.html +124 -0
- data/doc-api/classes/Erubis/PI/Converter.html +318 -0
- data/doc-api/classes/Erubis/PI/Ec.html +166 -0
- data/doc-api/classes/Erubis/PI/Ejava.html +166 -0
- data/doc-api/classes/Erubis/PI/Ejavascript.html +166 -0
- data/doc-api/classes/Erubis/PI/Engine.html +122 -0
- data/doc-api/classes/Erubis/PI/Eperl.html +166 -0
- data/doc-api/classes/Erubis/PI/Ephp.html +166 -0
- data/doc-api/classes/Erubis/PI/Eruby.html +155 -0
- data/doc-api/classes/Erubis/PI/Escheme.html +166 -0
- data/doc-api/classes/Erubis/PI/TinyEruby.html +305 -0
- data/doc-api/classes/Erubis/PercentLineEnhancer.html +7 -7
- data/doc-api/classes/Erubis/PerlGenerator.html +344 -0
- data/doc-api/classes/Erubis/PhpGenerator.html +350 -0
- data/doc-api/classes/Erubis/PrintEnabledEnhancer.html +24 -24
- data/doc-api/classes/Erubis/PrintOutEnhancer.html +35 -35
- data/doc-api/classes/Erubis/RubyEvaluator.html +190 -0
- data/doc-api/classes/Erubis/RubyGenerator.html +327 -0
- data/doc-api/classes/Erubis/SchemeGenerator.html +382 -0
- data/doc-api/classes/Erubis/SimplifyEnhancer.html +17 -13
- data/doc-api/classes/Erubis/StdoutEnhancer.html +14 -14
- data/doc-api/classes/Erubis/StringBufferEnhancer.html +14 -14
- data/doc-api/classes/Erubis/TinyEruby.html +45 -40
- data/doc-api/classes/Erubis/XmlHelper.html +14 -14
- data/doc-api/created.rid +1 -1
- data/doc-api/files/__/README_txt.html +27 -9
- data/doc-api/files/erubis/context_rb.html +107 -0
- data/doc-api/files/erubis/converter_rb.html +114 -0
- data/doc-api/files/erubis/engine/ec_rb.html +2 -2
- 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 +3 -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 +6 -3
- data/doc-api/files/erubis/enhancer_rb.html +2 -9
- data/doc-api/files/erubis/error_rb.html +107 -0
- data/doc-api/files/erubis/evaluator_rb.html +115 -0
- data/doc-api/files/erubis/generator_rb.html +114 -0
- data/doc-api/files/erubis/helper/rails_rb.html +140 -0
- data/doc-api/files/erubis/helper_rb.html +1 -1
- 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 +2 -2
- data/doc-api/files/erubis_rb.html +2 -2
- data/doc-api/fr_class_index.html +32 -0
- data/doc-api/fr_file_index.html +6 -0
- data/doc-api/fr_method_index.html +178 -136
- data/doc/users-guide.html +538 -199
- data/examples/{Makefile → basic/Makefile} +11 -11
- data/examples/basic/example.ec +42 -0
- data/examples/{example.ejava → basic/example.ejava} +5 -1
- data/examples/{example.ejavascript → basic/example.ejs} +0 -0
- data/examples/{example.eperl → basic/example.eperl} +2 -2
- data/examples/{example.ephp → basic/example.ephp} +0 -0
- data/examples/{example.eruby → basic/example.eruby} +0 -0
- data/examples/{example.escheme → basic/example.escheme} +0 -0
- data/examples/pi/Makefile +54 -0
- data/examples/pi/example.ec +42 -0
- data/examples/pi/example.ejava +45 -0
- data/examples/pi/example.ejs +16 -0
- data/examples/pi/example.eperl +16 -0
- data/examples/pi/example.ephp +17 -0
- data/examples/pi/example.eruby +15 -0
- data/examples/pi/example.escheme +26 -0
- data/lib/erubis.rb +15 -8
- data/lib/erubis/context.rb +54 -0
- data/lib/erubis/converter.rb +307 -0
- data/lib/erubis/engine.rb +57 -227
- data/lib/erubis/engine/ec.rb +31 -20
- data/lib/erubis/engine/ejava.rb +33 -21
- data/lib/erubis/engine/ejavascript.rb +30 -18
- data/lib/erubis/engine/enhanced.rb +7 -2
- data/lib/erubis/engine/eperl.rb +33 -19
- data/lib/erubis/engine/ephp.rb +32 -14
- data/lib/erubis/engine/eruby.rb +34 -7
- data/lib/erubis/engine/escheme.rb +34 -15
- data/lib/erubis/engine/optimized.rb +25 -11
- data/lib/erubis/enhancer.rb +53 -19
- data/lib/erubis/error.rb +24 -0
- data/lib/erubis/evaluator.rb +71 -0
- data/lib/erubis/generator.rb +83 -0
- data/lib/erubis/helper.rb +1 -1
- data/lib/erubis/helper/rails.rb +159 -0
- data/lib/erubis/local-setting.rb +1 -1
- data/lib/erubis/main.rb +87 -46
- data/lib/erubis/tiny.rb +81 -7
- data/test/assert-text-equal.rb +1 -1
- data/test/test-engines.rb +8 -9
- data/test/test-erubis.rb +196 -18
- data/test/{test-bin.rb → test-main.rb} +123 -21
- data/test/test-notext.rb +27 -0
- data/test/test.rb +5 -3
- data/test/testutil.rb +25 -36
- metadata +75 -13
- data/COPYING +0 -340
- data/examples/example.ec +0 -24
data/README.txt
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
= README
|
|
2
2
|
|
|
3
|
-
release:: $Release: 2.0
|
|
3
|
+
release:: $Release: 2.1.0 $
|
|
4
4
|
copyright:: copyright(c) 2006 kuwata-lab all rights reserved.
|
|
5
5
|
|
|
6
6
|
|
|
@@ -8,13 +8,16 @@ copyright:: copyright(c) 2006 kuwata-lab all rights reserved.
|
|
|
8
8
|
== About Erubis
|
|
9
9
|
|
|
10
10
|
Erubis is an implementation of eRuby. It has the following features.
|
|
11
|
-
* Very fast
|
|
12
|
-
* Auto trimming spaces around '<% %>'
|
|
13
|
-
* Auto escape (sanitizing)
|
|
14
|
-
* Changeable embedded pattern (default '<% %>')
|
|
15
|
-
* Context object available
|
|
16
|
-
* Easy to expand and customize in subclass
|
|
11
|
+
* Very fast, almost three times faster than ERB and even faster than eruby
|
|
17
12
|
* Multi-language support (Ruby/PHP/C/Java/Scheme/Perl/Javascript)
|
|
13
|
+
* Auto escaping support
|
|
14
|
+
* Auto trimming spaces around '<% %>'
|
|
15
|
+
* Embedded pattern changeable (default '<% %>')
|
|
16
|
+
* Enable to handle Processing Instructions (PI) as embedded pattern (ex. '<?rb ... ?>')
|
|
17
|
+
* Context object available and easy to combine eRuby template with YAML datafile
|
|
18
|
+
* Print statement available
|
|
19
|
+
* Easy to extend and customize in subclass
|
|
20
|
+
* Ruby on Rails support
|
|
18
21
|
|
|
19
22
|
Erubis is implemented in pure Ruby. It requires Ruby 1.8 or higher.
|
|
20
23
|
|
|
@@ -59,6 +62,8 @@ If you are exploring Eruby, see the following class at first.
|
|
|
59
62
|
base class of Eruby, Ephp, Ejava, and so on.
|
|
60
63
|
* Erubis::Eruby (erubis/engine/eruby.rb) --
|
|
61
64
|
engine class for eRuby.
|
|
65
|
+
* Erubis::Converter (erubis/converter.rb) --
|
|
66
|
+
convert eRuby script into Ruby code.
|
|
62
67
|
|
|
63
68
|
|
|
64
69
|
|
|
@@ -71,8 +76,9 @@ Try 'ruby erubybenchmark.rb' in benchmark directory.
|
|
|
71
76
|
|
|
72
77
|
== License
|
|
73
78
|
|
|
74
|
-
|
|
79
|
+
LGPL version 2.1
|
|
75
80
|
|
|
81
|
+
If you need looser license, please suggest me.
|
|
76
82
|
|
|
77
83
|
|
|
78
84
|
== Author
|
data/benchmark/erubybench.rb
CHANGED
data/benchmark/erubybench.rhtml
CHANGED
|
@@ -40,17 +40,17 @@ thead {
|
|
|
40
40
|
</tr>
|
|
41
41
|
</thead>
|
|
42
42
|
<tbody>
|
|
43
|
-
<% data.each_with_index do |
|
|
43
|
+
<% data.each_with_index do |hash, i| %>
|
|
44
44
|
<% n = i + 1 %>
|
|
45
45
|
<tr class="<%= n % 2 == 0 ? 'even' : 'odd' %>">
|
|
46
46
|
<td style="text-align: center">
|
|
47
47
|
<span><%= n %></span>
|
|
48
48
|
</td>
|
|
49
49
|
<td>
|
|
50
|
-
<a href="/stock/<%=
|
|
50
|
+
<a href="/stock/<%= hash[:code] %>"><%= hash[:code] %></a>
|
|
51
51
|
</td>
|
|
52
52
|
<td>
|
|
53
|
-
<a href="<%=
|
|
53
|
+
<a href="<%= hash[:url] %>"><%= hash[:name] %></a>
|
|
54
54
|
</td>
|
|
55
55
|
</tr>
|
|
56
56
|
<% end %>
|
data/bin/erubis
CHANGED
data/bin/notext
ADDED
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
###
|
|
4
|
+
### notext - retrieve embedded code from eRuby, PHP, and so on
|
|
5
|
+
###
|
|
6
|
+
### $Rev$
|
|
7
|
+
### $Release: 2.1.0 $
|
|
8
|
+
### copyright(c) 2006 kuwata-lab all rights reserved.
|
|
9
|
+
###
|
|
10
|
+
|
|
11
|
+
require 'erubis'
|
|
12
|
+
require 'erubis/engine/eruby'
|
|
13
|
+
require 'erubis/engine/ephp'
|
|
14
|
+
require 'erubis/engine/ec'
|
|
15
|
+
require 'erubis/engine/ejava'
|
|
16
|
+
require 'erubis/engine/escheme'
|
|
17
|
+
require 'erubis/engine/eperl'
|
|
18
|
+
require 'erubis/engine/ejavascript'
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def help()
|
|
22
|
+
command = File.basename($0)
|
|
23
|
+
s = <<END
|
|
24
|
+
#{command} - retrieve embedded code from eRuby, PHP, and so on.
|
|
25
|
+
Usage: #{command} [-hvncu] [-l lang] [-p pattern] file.php ...
|
|
26
|
+
-h : help
|
|
27
|
+
-v : version
|
|
28
|
+
-n : show line number
|
|
29
|
+
-c : compact mode (delete empty lines)
|
|
30
|
+
-u : uniq mode (compress repeated empty lines to a line)
|
|
31
|
+
-l lang : ruby/php/perl/c/java/scheme/javascript
|
|
32
|
+
-p pattern : embedded pattern (default '<% %>' or '<\\?(?:php|=|\\s) \\?>')
|
|
33
|
+
END
|
|
34
|
+
return s
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
## Engine classes which include NoTextEnhancer
|
|
39
|
+
klass_table = {}
|
|
40
|
+
lang_list = %w[ruby php c java scheme perl javascript]
|
|
41
|
+
lang_list.each do |lang|
|
|
42
|
+
eval <<-END
|
|
43
|
+
class NoTextE#{lang} < Erubis::E#{lang}
|
|
44
|
+
include Erubis::NoTextEnhancer
|
|
45
|
+
end
|
|
46
|
+
END
|
|
47
|
+
klass_table[lang] = Object.const_get("NoTextE#{lang}")
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
## parse command-line options
|
|
52
|
+
options = {}
|
|
53
|
+
properties = {}
|
|
54
|
+
while !ARGV.empty? && ARGV[0][0] == ?-
|
|
55
|
+
optstr = ARGV.shift
|
|
56
|
+
optstr = optstr.sub(/^-/, '')
|
|
57
|
+
while !optstr.empty?
|
|
58
|
+
optch = optstr[0]
|
|
59
|
+
optstr = optstr[1, optstr.length-1]
|
|
60
|
+
case optch
|
|
61
|
+
when ?h, ?v, ?n, ?c, ?u # help, version, linenum, compact, uniq
|
|
62
|
+
options[optch] = true
|
|
63
|
+
when ?l, ?p # lang, pattern
|
|
64
|
+
arg = !optstr.empty? ? optstr : ARGV.shift
|
|
65
|
+
unless arg
|
|
66
|
+
argnames = { ?l => 'lang name', ?p => 'pattern' }
|
|
67
|
+
$stderr.puts "-#{optch.chr}: #{argnames[optch]} required."
|
|
68
|
+
exit(1)
|
|
69
|
+
end
|
|
70
|
+
options[optch] = arg
|
|
71
|
+
else
|
|
72
|
+
$stderr.puts "-#{optch.chr}: unknown option."
|
|
73
|
+
exit(1)
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
opt_help = options[?h]
|
|
79
|
+
opt_version = options[?v]
|
|
80
|
+
opt_linenum = options[?n]
|
|
81
|
+
opt_compact = options[?c]
|
|
82
|
+
opt_unique = options[?u]
|
|
83
|
+
opt_pattern = options[?p]
|
|
84
|
+
opt_lang = options[?l]
|
|
85
|
+
|
|
86
|
+
if opt_lang
|
|
87
|
+
unless lang_list.include?(opt_lang)
|
|
88
|
+
$stderr.puts "-l #{opt_lang}: not supported."
|
|
89
|
+
exit(1)
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
## help message
|
|
95
|
+
if opt_help || opt_version
|
|
96
|
+
version = ('$Release: 2.1.0 $' =~ /[\.\d]+/) && $&
|
|
97
|
+
puts version if opt_version
|
|
98
|
+
puts help() if opt_help
|
|
99
|
+
exit(0)
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
## determine pattern
|
|
104
|
+
lang = opt_lang
|
|
105
|
+
unless lang
|
|
106
|
+
filename = ARGV[0]
|
|
107
|
+
if filename && filename =~ /\.(\w+)$/
|
|
108
|
+
case suffix = $1
|
|
109
|
+
when 'php', 'php5', 'inc' ; lang = 'php'
|
|
110
|
+
when 'ec' ; lang = 'c'
|
|
111
|
+
when 'ejava' ; lang = 'java'
|
|
112
|
+
when 'escheme', 'escm' ; lang = 'scheme'
|
|
113
|
+
when 'eperl' ; lang = 'perl'
|
|
114
|
+
when 'js', 'javascript' ; lang = 'javascript'
|
|
115
|
+
else ; lang = 'ruby'
|
|
116
|
+
end
|
|
117
|
+
else
|
|
118
|
+
lang = 'ruby'
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
## determine pattern
|
|
124
|
+
if opt_pattern
|
|
125
|
+
pattern = opt_pattern
|
|
126
|
+
else
|
|
127
|
+
case lang
|
|
128
|
+
when 'php' ; pattern = '<\?(?:php\b|(?==)|(?=\s)) \?>'
|
|
129
|
+
when 'perl' ; pattern = '<\?(?=\s|=) !>'
|
|
130
|
+
else ; pattern = '<% %>'
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
## read input and create engine
|
|
136
|
+
klass = klass_table[lang]
|
|
137
|
+
input = ARGF.read()
|
|
138
|
+
engine = klass.new(input, :pattern=>pattern, :trim=>false)
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
## print embedded code
|
|
142
|
+
n = 0
|
|
143
|
+
prev_empty = false
|
|
144
|
+
engine.src.each_line do |line|
|
|
145
|
+
n += 1
|
|
146
|
+
if line =~ /^\s*$/
|
|
147
|
+
next if opt_compact || (opt_unique && prev_empty)
|
|
148
|
+
print opt_linenum && !opt_unique ? ("%3d: \n" % n) : "\n"
|
|
149
|
+
prev_empty = true
|
|
150
|
+
else
|
|
151
|
+
print opt_linenum ? ("%3d: %s" % [n, line]) : line
|
|
152
|
+
prev_empty = false
|
|
153
|
+
end
|
|
154
|
+
end
|
data/contrib/erubis
CHANGED
|
@@ -2,22 +2,22 @@
|
|
|
2
2
|
|
|
3
3
|
###
|
|
4
4
|
### $Rev: 10 $
|
|
5
|
-
### $Release: 2.0
|
|
5
|
+
### $Release: 2.1.0 $
|
|
6
6
|
### copyright(c) 2006 kuwata-lab all rights reserved.
|
|
7
7
|
###
|
|
8
8
|
|
|
9
9
|
#--begin of require 'erubis/main'
|
|
10
10
|
###
|
|
11
|
-
### $Rev:
|
|
12
|
-
### $Release: 2.0
|
|
11
|
+
### $Rev: 41 $
|
|
12
|
+
### $Release: 2.1.0 $
|
|
13
13
|
### copyright(c) 2006 kuwata-lab all rights reserved.
|
|
14
14
|
###
|
|
15
15
|
|
|
16
16
|
require 'yaml'
|
|
17
17
|
#--begin of require 'erubis'
|
|
18
18
|
##
|
|
19
|
-
## $Rev:
|
|
20
|
-
## $Release: 2.0
|
|
19
|
+
## $Rev: 36 $
|
|
20
|
+
## $Release: 2.1.0 $
|
|
21
21
|
## copyright(c) 2006 kuwata-lab all rights reserved.
|
|
22
22
|
##
|
|
23
23
|
|
|
@@ -41,12 +41,15 @@ require 'yaml'
|
|
|
41
41
|
## </ul>
|
|
42
42
|
## END
|
|
43
43
|
## list = ['<aaa>', 'b&b', '"ccc"']
|
|
44
|
-
## eruby = Erubis::Eruby.new(
|
|
45
|
-
##
|
|
46
|
-
## puts
|
|
44
|
+
## eruby = Erubis::Eruby.new()
|
|
45
|
+
## code = eruby.convert(input)
|
|
46
|
+
## puts "--- code ---"
|
|
47
|
+
## puts code
|
|
47
48
|
## puts "--- result ---"
|
|
48
|
-
##
|
|
49
|
-
##
|
|
49
|
+
## context = Object.new
|
|
50
|
+
## context.instance_variable_set("@list", list)
|
|
51
|
+
## puts context.instance_eval(code)
|
|
52
|
+
## # or @list = list; puts eval(code, binding())
|
|
50
53
|
##
|
|
51
54
|
## result:
|
|
52
55
|
## --- source ---
|
|
@@ -71,16 +74,24 @@ require 'yaml'
|
|
|
71
74
|
|
|
72
75
|
#--begin of require 'erubis/engine'
|
|
73
76
|
##
|
|
74
|
-
## $Rev:
|
|
75
|
-
## $Release: 2.0
|
|
77
|
+
## $Rev: 32 $
|
|
78
|
+
## $Release: 2.1.0 $
|
|
79
|
+
## copyright(c) 2006 kuwata-lab all rights reserved.
|
|
80
|
+
##
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
#--begin of require 'erubis/generator'
|
|
84
|
+
##
|
|
85
|
+
## $Rev: 32 $
|
|
86
|
+
## $Release: 2.1.0 $
|
|
76
87
|
## copyright(c) 2006 kuwata-lab all rights reserved.
|
|
77
88
|
##
|
|
78
89
|
|
|
79
90
|
#--begin of require 'abstract'
|
|
80
91
|
##
|
|
81
92
|
## $Rev: 1 $
|
|
82
|
-
## $Release$
|
|
83
|
-
##
|
|
93
|
+
## $Release: 0.1.0 $
|
|
94
|
+
## copyright(c) 2006 kuwata-lab.com all rights reserved.
|
|
84
95
|
##
|
|
85
96
|
##
|
|
86
97
|
## helper to define abstract method in Ruby.
|
|
@@ -154,116 +165,163 @@ module Kernel
|
|
|
154
165
|
end
|
|
155
166
|
#--end of require 'abstract'
|
|
156
167
|
|
|
157
|
-
|
|
158
168
|
module Erubis
|
|
159
169
|
|
|
160
170
|
|
|
161
|
-
|
|
162
|
-
## base error class
|
|
163
|
-
##
|
|
164
|
-
class ErubisError < StandardError
|
|
165
|
-
end
|
|
171
|
+
module Generator
|
|
166
172
|
|
|
173
|
+
def self.supported_properties() # :nodoc:
|
|
174
|
+
return [
|
|
175
|
+
[:escapefunc, nil, "escape function name"],
|
|
176
|
+
]
|
|
177
|
+
end
|
|
167
178
|
|
|
168
|
-
|
|
169
|
-
## .[abstract] context object for Engine#evaluate
|
|
170
|
-
##
|
|
171
|
-
## ex.
|
|
172
|
-
## template = <<'END'
|
|
173
|
-
## Hello <%= @user %>!
|
|
174
|
-
## <% for item in @list %>
|
|
175
|
-
## - <%= item %>
|
|
176
|
-
## <% end %>
|
|
177
|
-
## END
|
|
178
|
-
##
|
|
179
|
-
## context = Erubis::Context.new(:user=>'World', :list=>['a','b','c'])
|
|
180
|
-
## # or
|
|
181
|
-
## # context = Erubis::Context.new
|
|
182
|
-
## # context[:user] = 'World'
|
|
183
|
-
## # context[:list] = ['a', 'b', 'c']
|
|
184
|
-
##
|
|
185
|
-
## eruby = Erubis::Eruby.new(template)
|
|
186
|
-
## print eruby.evaluate(context)
|
|
187
|
-
##
|
|
188
|
-
class Context
|
|
179
|
+
attr_accessor :escapefunc
|
|
189
180
|
|
|
190
|
-
def
|
|
191
|
-
|
|
192
|
-
self[name] = value
|
|
193
|
-
end if hash
|
|
181
|
+
def init_generator(properties={})
|
|
182
|
+
@escapefunc = properties[:escapefunc]
|
|
194
183
|
end
|
|
195
184
|
|
|
196
|
-
|
|
197
|
-
|
|
185
|
+
|
|
186
|
+
## (abstract) escape text string
|
|
187
|
+
##
|
|
188
|
+
## ex.
|
|
189
|
+
## def escape_text(text)
|
|
190
|
+
## return text.dump
|
|
191
|
+
## # or return "'" + text.gsub(/['\\]/, '\\\\\&') + "'"
|
|
192
|
+
## end
|
|
193
|
+
def escape_text(text)
|
|
194
|
+
not_implemented
|
|
198
195
|
end
|
|
199
196
|
|
|
200
|
-
|
|
201
|
-
|
|
197
|
+
## return escaped expression code (ex. 'h(...)' or 'htmlspecialchars(...)')
|
|
198
|
+
def escaped_expr(code)
|
|
199
|
+
code.strip!
|
|
200
|
+
return "#{@escapefunc}(#{code})"
|
|
202
201
|
end
|
|
203
202
|
|
|
204
|
-
|
|
205
|
-
|
|
203
|
+
## (abstract) add @preamble to src
|
|
204
|
+
def add_preamble(src)
|
|
205
|
+
not_implemented
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
## (abstract) add text string to src
|
|
209
|
+
def add_text(src, text)
|
|
210
|
+
not_implemented
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
## (abstract) add statement code to src
|
|
214
|
+
def add_stmt(src, code)
|
|
215
|
+
not_implemented
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
## (abstract) add expression literal code to src. this is called by add_expr().
|
|
219
|
+
def add_expr_literal(src, code)
|
|
220
|
+
not_implemented
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
## (abstract) add escaped expression code to src. this is called by add_expr().
|
|
224
|
+
def add_expr_escaped(src, code)
|
|
225
|
+
not_implemented
|
|
226
|
+
end
|
|
227
|
+
|
|
228
|
+
## (abstract) add expression code to src for debug. this is called by add_expr().
|
|
229
|
+
def add_expr_debug(src, code)
|
|
230
|
+
not_implemented
|
|
231
|
+
end
|
|
232
|
+
|
|
233
|
+
## (abstract) add @postamble to src
|
|
234
|
+
def add_postamble(src)
|
|
235
|
+
not_implemented
|
|
206
236
|
end
|
|
207
237
|
|
|
238
|
+
|
|
208
239
|
end
|
|
209
240
|
|
|
210
241
|
|
|
242
|
+
end
|
|
243
|
+
#--end of require 'erubis/generator'
|
|
244
|
+
#--begin of require 'erubis/converter'
|
|
245
|
+
##
|
|
246
|
+
## $Rev: 37 $
|
|
247
|
+
## $Release: 2.1.0 $
|
|
248
|
+
## copyright(c) 2006 kuwata-lab all rights reserved.
|
|
249
|
+
##
|
|
250
|
+
|
|
251
|
+
#--already included require 'abstract'
|
|
252
|
+
|
|
253
|
+
module Erubis
|
|
254
|
+
|
|
255
|
+
|
|
211
256
|
##
|
|
212
|
-
##
|
|
257
|
+
## convert
|
|
213
258
|
##
|
|
214
|
-
|
|
259
|
+
module Converter
|
|
260
|
+
|
|
261
|
+
attr_accessor :preamble, :postamble, :escape
|
|
215
262
|
|
|
216
263
|
def self.supported_properties # :nodoc:
|
|
217
264
|
return [
|
|
218
|
-
[:pattern, '<% %>', "embed pattern"],
|
|
219
|
-
#[:filename, nil, "filename"],
|
|
220
|
-
[:trim, true, "trim spaces around <% ... %>"],
|
|
221
265
|
[:preamble, nil, "preamble (no preamble when false)"],
|
|
222
266
|
[:postamble, nil, "postamble (no postamble when false)"],
|
|
223
|
-
[:escape, nil,
|
|
267
|
+
[:escape, nil, "escape expression or not in default"],
|
|
224
268
|
]
|
|
225
269
|
end
|
|
226
270
|
|
|
227
|
-
def
|
|
228
|
-
#@input = input
|
|
229
|
-
@pattern = properties[:pattern]
|
|
230
|
-
@filename = properties[:filename]
|
|
231
|
-
@trim = properties[:trim] != false
|
|
271
|
+
def init_converter(properties={})
|
|
232
272
|
@preamble = properties[:preamble]
|
|
233
273
|
@postamble = properties[:postamble]
|
|
234
274
|
@escape = properties[:escape]
|
|
235
|
-
@src = compile(input) if input
|
|
236
275
|
end
|
|
237
|
-
attr_reader :src
|
|
238
|
-
attr_accessor :filename
|
|
239
276
|
|
|
240
|
-
##
|
|
241
|
-
def
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
return
|
|
277
|
+
## convert input string into target language
|
|
278
|
+
def convert(input)
|
|
279
|
+
codebuf = "" # or []
|
|
280
|
+
@preamble.nil? ? add_preamble(codebuf) : (@preamble && (codebuf << @preamble))
|
|
281
|
+
convert_input(codebuf, input)
|
|
282
|
+
@postamble.nil? ? add_postamble(codebuf) : (@postamble && (codebuf << @postamble))
|
|
283
|
+
return codebuf # or codebuf.join()
|
|
247
284
|
end
|
|
248
285
|
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
end
|
|
257
|
-
return eval(@src, _arg, (@filename || '(erubis)'))
|
|
286
|
+
protected
|
|
287
|
+
|
|
288
|
+
##
|
|
289
|
+
## (abstract) convert input to code
|
|
290
|
+
##
|
|
291
|
+
def convert_input(codebuf, input)
|
|
292
|
+
not_implemented
|
|
258
293
|
end
|
|
259
294
|
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
295
|
+
end
|
|
296
|
+
|
|
297
|
+
|
|
298
|
+
module Basic
|
|
299
|
+
end
|
|
300
|
+
|
|
301
|
+
|
|
302
|
+
##
|
|
303
|
+
## basic converter which supports '<% ... %>' notation.
|
|
304
|
+
##
|
|
305
|
+
module Basic::Converter
|
|
306
|
+
include Erubis::Converter
|
|
307
|
+
|
|
308
|
+
def self.supported_properties # :nodoc:
|
|
309
|
+
return [
|
|
310
|
+
[:pattern, '<% %>', "embed pattern"],
|
|
311
|
+
[:trim, true, "trim spaces around <% ... %>"],
|
|
312
|
+
]
|
|
313
|
+
end
|
|
314
|
+
|
|
315
|
+
attr_accessor :pattern, :trim
|
|
316
|
+
|
|
317
|
+
def init_converter(properties={})
|
|
318
|
+
super(properties)
|
|
319
|
+
@pattern = properties[:pattern]
|
|
320
|
+
@trim = properties[:trim] != false
|
|
264
321
|
end
|
|
265
322
|
|
|
266
|
-
DEFAULT_REGEXP = /(.*?)(^[ \t]*)?<%(=+|\#)?(.*?)-?%>([ \t]*\r?\n)?/m
|
|
323
|
+
#DEFAULT_REGEXP = /(.*?)(^[ \t]*)?<%(=+|\#)?(.*?)-?%>([ \t]*\r?\n)?/m
|
|
324
|
+
DEFAULT_REGEXP = /(^[ \t]*)?<%(=+|\#)?(.*?)-?%>([ \t]*\r?\n)?/m
|
|
267
325
|
|
|
268
326
|
## return regexp of pattern to parse eRuby script
|
|
269
327
|
def pattern_regexp(pattern=@pattern)
|
|
@@ -271,17 +329,20 @@ module Erubis
|
|
|
271
329
|
return DEFAULT_REGEXP
|
|
272
330
|
else
|
|
273
331
|
prefix, postfix = pattern.split()
|
|
274
|
-
return /(.*?)(^[ \t]*)?#{prefix}(=+|\#)?(.*?)-?#{postfix}([ \t]*\r?\n)?/m
|
|
332
|
+
#return /(.*?)(^[ \t]*)?#{prefix}(=+|\#)?(.*?)-?#{postfix}([ \t]*\r?\n)?/m
|
|
333
|
+
return /(^[ \t]*)?#{prefix}(=+|\#)?(.*?)-?#{postfix}([ \t]*\r?\n)?/m
|
|
275
334
|
end
|
|
276
335
|
end
|
|
277
336
|
protected :pattern_regexp
|
|
278
337
|
|
|
279
|
-
|
|
280
|
-
def compile(input)
|
|
281
|
-
src = ""
|
|
282
|
-
@preamble.nil? ? add_preamble(src) : (@preamble && (src << @preamble))
|
|
338
|
+
def convert_input(src, input)
|
|
283
339
|
regexp = pattern_regexp(@pattern)
|
|
284
|
-
|
|
340
|
+
pos = 0
|
|
341
|
+
input.scan(regexp) do |lspace, indicator, code, rspace|
|
|
342
|
+
match = Regexp.last_match()
|
|
343
|
+
index = match.begin(0)
|
|
344
|
+
text = input[pos, index - pos]
|
|
345
|
+
pos = match.end(0)
|
|
285
346
|
add_text(src, text)
|
|
286
347
|
## * when '<%= %>', do nothing
|
|
287
348
|
## * when '<% %>' or '<%# %>', delete spaces iff only spaces are around '<% %>'
|
|
@@ -302,126 +363,447 @@ module Erubis
|
|
|
302
363
|
add_stmt(src, "\n" * n)
|
|
303
364
|
add_text(src, rspace) if rspace
|
|
304
365
|
end
|
|
305
|
-
#flag_trim = @trim && lspace && rspace
|
|
306
|
-
#add_text(src, lspace) if !flag_trim && lspace
|
|
307
|
-
#n = code.count("\n") + (rspace ? 1 : 0)
|
|
308
|
-
#add_stmt(src, "\n" * n)
|
|
309
|
-
#add_text(src, rspace) if !flag_trim && rspace
|
|
310
366
|
else # <%= %>
|
|
311
367
|
add_text(src, lspace) if lspace
|
|
312
368
|
add_expr(src, code, indicator)
|
|
313
369
|
add_text(src, rspace) if rspace
|
|
314
370
|
end
|
|
315
|
-
#if indicator && indicator[0] == ?=
|
|
316
|
-
# flag_trim = false
|
|
317
|
-
#else
|
|
318
|
-
# flag_trim = @trim && lspace && rspace
|
|
319
|
-
#end
|
|
320
|
-
##flag_trim = @trim && !(indicator && indicator[0]==?=) && lspace && rspace
|
|
321
|
-
#add_text(src, text)
|
|
322
|
-
#add_text(src, lspace) if !flag_trim && lspace
|
|
323
|
-
#if !indicator # <% %>
|
|
324
|
-
# code = "#{lspace}#{code}#{rspace}" if flag_trim
|
|
325
|
-
# add_stmt(src, code)
|
|
326
|
-
#elsif indicator[0] == ?\# # <%# %>
|
|
327
|
-
# n = code.count("\n") + (rspace ? 1 : 0)
|
|
328
|
-
# add_stmt(src, "\n" * n)
|
|
329
|
-
#else # <%= %>
|
|
330
|
-
# add_expr(src, code, indicator)
|
|
331
|
-
#end
|
|
332
|
-
#add_text(src, rspace) if !flag_trim && rspace
|
|
333
371
|
end
|
|
334
372
|
rest = $' || input # add input when no matched
|
|
335
373
|
add_text(src, rest)
|
|
336
|
-
@postamble.nil? ? add_postamble(src) : (@postamble && (src << @postamble))
|
|
337
|
-
return src
|
|
338
374
|
end
|
|
339
375
|
|
|
340
|
-
##
|
|
341
|
-
def
|
|
342
|
-
|
|
376
|
+
## add expression code to src
|
|
377
|
+
def add_expr(src, code, indicator)
|
|
378
|
+
case indicator
|
|
379
|
+
when '='
|
|
380
|
+
@escape ? add_expr_escaped(src, code) : add_expr_literal(src, code)
|
|
381
|
+
when '=='
|
|
382
|
+
@escape ? add_expr_literal(src, code) : add_expr_escaped(src, code)
|
|
383
|
+
when '==='
|
|
384
|
+
add_expr_debug(src, code)
|
|
385
|
+
end
|
|
343
386
|
end
|
|
344
387
|
|
|
345
|
-
|
|
388
|
+
end
|
|
346
389
|
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
390
|
+
|
|
391
|
+
module PI
|
|
392
|
+
end
|
|
393
|
+
|
|
394
|
+
##
|
|
395
|
+
## Processing Instructions (PI) converter for XML.
|
|
396
|
+
## this class converts '<?rb ... ?>' and '${...}' notation.
|
|
397
|
+
##
|
|
398
|
+
module PI::Converter
|
|
399
|
+
include Erubis::Converter
|
|
400
|
+
|
|
401
|
+
def self.desc # :nodoc:
|
|
402
|
+
"use processing instructions (PI) instead of '<% %>'"
|
|
356
403
|
end
|
|
357
404
|
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
def escaped_expr(code)
|
|
366
|
-
not_implemented
|
|
405
|
+
def self.supported_properties # :nodoc:
|
|
406
|
+
return [
|
|
407
|
+
[:trim, true, "trim spaces around <% ... %>"],
|
|
408
|
+
[:pi, 'rb', "PI (Processing Instrunctions) name"],
|
|
409
|
+
[:embchar, '@', "char for embedded expression pattern('@{...}@')"],
|
|
410
|
+
[:pattern, '<% %>', "embed pattern"],
|
|
411
|
+
]
|
|
367
412
|
end
|
|
368
413
|
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
414
|
+
attr_accessor :pi, :prefix
|
|
415
|
+
|
|
416
|
+
def init_converter(properties={})
|
|
417
|
+
super(properties)
|
|
418
|
+
@trim = !(properties[:trim] == false)
|
|
419
|
+
@pi = properties[:pi] if properties[:pi]
|
|
420
|
+
@embchar = properties[:embchar] || '@'
|
|
421
|
+
@pattern = properties[:pattern]
|
|
422
|
+
@pattern = '<% %>' if @pattern.nil? #|| @pattern == true
|
|
372
423
|
end
|
|
373
424
|
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
425
|
+
def convert(input)
|
|
426
|
+
code = super(input)
|
|
427
|
+
return @header || @footer ? "#{@header}#{code}#{@footer}" : code
|
|
377
428
|
end
|
|
378
429
|
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
430
|
+
protected
|
|
431
|
+
|
|
432
|
+
def convert_input(codebuf, input)
|
|
433
|
+
parse_stmts(codebuf, input)
|
|
434
|
+
#parse_stmts2(codebuf, input)
|
|
382
435
|
end
|
|
383
436
|
|
|
384
|
-
|
|
385
|
-
|
|
437
|
+
def parse_stmts(codebuf, input)
|
|
438
|
+
#regexp = pattern_regexp(@pattern)
|
|
439
|
+
@pi ||= 'e'
|
|
440
|
+
@stmt_pattern ||= /(^[ \t]*)?<\?#{@pi}(?:-(\w+))?(\s.*?)\?>([ \t]*\r?\n)?/m
|
|
441
|
+
pos = 0
|
|
442
|
+
input.scan(@stmt_pattern) do |lspace, pi_arg, code, rspace|
|
|
443
|
+
match = Regexp.last_match
|
|
444
|
+
index = match.begin(0)
|
|
445
|
+
text = input[pos, index - pos]
|
|
446
|
+
pos = match.end(0)
|
|
447
|
+
parse_exprs(codebuf, text) # unless text.empty?
|
|
448
|
+
if @trim && lspace && rspace
|
|
449
|
+
add_pi_stmt(codebuf, "#{lspace}#{code}#{rspace}", pi_arg)
|
|
450
|
+
else
|
|
451
|
+
add_text(codebuf, lspace)
|
|
452
|
+
add_pi_stmt(codebuf, code, pi_arg)
|
|
453
|
+
add_text(codebuf, rspace)
|
|
454
|
+
end
|
|
455
|
+
end
|
|
456
|
+
rest = $' || input
|
|
457
|
+
parse_exprs(codebuf, rest)
|
|
458
|
+
end
|
|
459
|
+
|
|
460
|
+
def parse_exprs(codebuf, input)
|
|
461
|
+
unless @expr_pattern
|
|
462
|
+
ch = Regexp.escape(@embchar)
|
|
463
|
+
if @pattern
|
|
464
|
+
left, right = @pattern.split(' ')
|
|
465
|
+
@expr_pattern = /#{ch}(!*)?\{(.*?)\}#{ch}|#{left}(=+)(.*?)#{right}/
|
|
466
|
+
else
|
|
467
|
+
@expr_pattern = /#{ch}(!*)?\{(.*?)\}#{ch}/
|
|
468
|
+
end
|
|
469
|
+
end
|
|
470
|
+
pos = 0
|
|
471
|
+
input.scan(@expr_pattern) do |indicator1, code1, indicator2, code2|
|
|
472
|
+
indicator = indicator1 || indicator2
|
|
473
|
+
code = code1 || code2
|
|
474
|
+
match = Regexp.last_match
|
|
475
|
+
index = match.begin(0)
|
|
476
|
+
text = input[pos, index - pos]
|
|
477
|
+
pos = match.end(0)
|
|
478
|
+
add_text(codebuf, text) # unless text.empty?
|
|
479
|
+
add_pi_expr(codebuf, code, indicator)
|
|
480
|
+
end
|
|
481
|
+
rest = $' || input
|
|
482
|
+
add_text(codebuf, rest)
|
|
483
|
+
end
|
|
484
|
+
|
|
485
|
+
def add_pi_stmt(codebuf, code, pi_arg) # :nodoc:
|
|
486
|
+
case pi_arg
|
|
487
|
+
when 'header' ; @header = code
|
|
488
|
+
when 'footer' ; @footer = code
|
|
489
|
+
when 'comment'; add_stmt(codebuf, "\n" * code.count("\n"))
|
|
490
|
+
when 'value' ; add_expr_literal(codebuf, code)
|
|
491
|
+
else ; add_stmt(codebuf, code)
|
|
492
|
+
end
|
|
493
|
+
end
|
|
494
|
+
|
|
495
|
+
def add_pi_expr(codebuf, code, indicator) # :nodoc:
|
|
386
496
|
case indicator
|
|
387
|
-
when '
|
|
388
|
-
add_expr_literal(
|
|
389
|
-
when '
|
|
390
|
-
add_expr_escaped(
|
|
391
|
-
when '==='
|
|
392
|
-
add_expr_debug(
|
|
497
|
+
when nil, '', '==' # @{...}@ or <%== ... %>
|
|
498
|
+
@escape == false ? add_expr_literal(codebuf, code) : add_expr_escaped(codebuf, code)
|
|
499
|
+
when '!', '=' # @!{...}@ or <%= ... %>
|
|
500
|
+
@escape == false ? add_expr_escaped(codebuf, code) : add_expr_literal(codebuf, code)
|
|
501
|
+
when '!!', '===' # @!!{...}@ or <%=== ... %>
|
|
502
|
+
add_expr_debug(codebuf, code)
|
|
503
|
+
else
|
|
504
|
+
# ignore
|
|
393
505
|
end
|
|
394
506
|
end
|
|
395
507
|
|
|
396
|
-
##
|
|
397
|
-
def
|
|
398
|
-
|
|
508
|
+
## (obsolete) equivarent to parse_stmts(), but a little slower than it.
|
|
509
|
+
def parse_stmts2(codebuf, input) # :nodoc:
|
|
510
|
+
#regexp = pattern_regexp(@pattern)
|
|
511
|
+
@pi ||= 'e'
|
|
512
|
+
unless @embedded_pattern
|
|
513
|
+
ch = Regexp.escape(@embchar)
|
|
514
|
+
if @pattern
|
|
515
|
+
left, right = @pattern.split(' ')
|
|
516
|
+
@embedded_pattern = /(^[ \t]*)?<\?#{@pi}(?:-(\w+))?(\s.*?)\?>([ \t]*\r?\n)?|#{ch}(!*)?\{(.*?)\}#{ch}|#{left}(=+)(.*?)#{right}/m
|
|
517
|
+
else
|
|
518
|
+
@embedded_pattern = /(^[ \t]*)?<\?#{@pi}(?:-(\w+))?(\s.*?)\?>([ \t]*\r?\n)?|#{ch}(!*)?\{(.*?)\}#{ch}/m
|
|
519
|
+
end
|
|
520
|
+
end
|
|
521
|
+
pos = 0
|
|
522
|
+
input.scan(@embedded_pattern) do |lspace, pi_arg, stmt, rspace,
|
|
523
|
+
indicator1, expr1, indicator2, expr2|
|
|
524
|
+
match = Regexp.last_match
|
|
525
|
+
index = match.begin(0)
|
|
526
|
+
text = input[pos, index - pos]
|
|
527
|
+
pos = match.end(0)
|
|
528
|
+
add_text(codebuf, text) # unless text.empty?
|
|
529
|
+
if stmt
|
|
530
|
+
code = stmt
|
|
531
|
+
if @trim && lspace && rspace
|
|
532
|
+
add_pi_stmt(codebuf, "#{lspace}#{code}#{rspace}", pi_arg)
|
|
533
|
+
else
|
|
534
|
+
add_text(codebuf, lspace)
|
|
535
|
+
add_pi_stmt(codebuf, code, pi_arg)
|
|
536
|
+
add_text(codebuf, rspace)
|
|
537
|
+
end
|
|
538
|
+
else
|
|
539
|
+
code = expr1 || expr2
|
|
540
|
+
indicator = indicator1 || indicator2
|
|
541
|
+
add_pi_expr(codebuf, code, indicator)
|
|
542
|
+
end
|
|
543
|
+
end
|
|
544
|
+
rest = $' || input
|
|
545
|
+
add_text(codebuf, rest)
|
|
399
546
|
end
|
|
400
547
|
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
548
|
+
end
|
|
549
|
+
|
|
550
|
+
|
|
551
|
+
end
|
|
552
|
+
#--end of require 'erubis/converter'
|
|
553
|
+
#--begin of require 'erubis/evaluator'
|
|
554
|
+
##
|
|
555
|
+
## $Rev: 32 $
|
|
556
|
+
## $Release: 2.1.0 $
|
|
557
|
+
## copyright(c) 2006 kuwata-lab all rights reserved.
|
|
558
|
+
##
|
|
559
|
+
|
|
560
|
+
#--begin of require 'erubis/error'
|
|
561
|
+
##
|
|
562
|
+
## $Rev: 32 $
|
|
563
|
+
## $Release: 2.1.0 $
|
|
564
|
+
## copyright(c) 2006 kuwata-lab all rights reserved.
|
|
565
|
+
##
|
|
566
|
+
|
|
567
|
+
module Erubis
|
|
568
|
+
|
|
569
|
+
|
|
570
|
+
##
|
|
571
|
+
## base error class
|
|
572
|
+
##
|
|
573
|
+
class ErubisError < StandardError
|
|
574
|
+
end
|
|
575
|
+
|
|
576
|
+
|
|
577
|
+
##
|
|
578
|
+
## raised when method or function is not supported
|
|
579
|
+
##
|
|
580
|
+
class NotSupportedError < ErubisError
|
|
581
|
+
end
|
|
582
|
+
|
|
583
|
+
|
|
584
|
+
end
|
|
585
|
+
#--end of require 'erubis/error'
|
|
586
|
+
#--begin of require 'erubis/context'
|
|
587
|
+
##
|
|
588
|
+
## $Rev: 32 $
|
|
589
|
+
## $Release: 2.1.0 $
|
|
590
|
+
## copyright(c) 2006 kuwata-lab all rights reserved.
|
|
591
|
+
##
|
|
592
|
+
|
|
593
|
+
|
|
594
|
+
module Erubis
|
|
595
|
+
|
|
596
|
+
|
|
597
|
+
##
|
|
598
|
+
## context object for Engine#evaluate
|
|
599
|
+
##
|
|
600
|
+
## ex.
|
|
601
|
+
## template = <<'END'
|
|
602
|
+
## Hello <%= @user %>!
|
|
603
|
+
## <% for item in @list %>
|
|
604
|
+
## - <%= item %>
|
|
605
|
+
## <% end %>
|
|
606
|
+
## END
|
|
607
|
+
##
|
|
608
|
+
## context = Erubis::Context.new(:user=>'World', :list=>['a','b','c'])
|
|
609
|
+
## # or
|
|
610
|
+
## # context = Erubis::Context.new
|
|
611
|
+
## # context[:user] = 'World'
|
|
612
|
+
## # context[:list] = ['a', 'b', 'c']
|
|
613
|
+
##
|
|
614
|
+
## eruby = Erubis::Eruby.new(template)
|
|
615
|
+
## print eruby.evaluate(context)
|
|
616
|
+
##
|
|
617
|
+
class Context
|
|
618
|
+
|
|
619
|
+
def initialize(hash=nil)
|
|
620
|
+
hash.each do |name, value|
|
|
621
|
+
self[name] = value
|
|
622
|
+
end if hash
|
|
404
623
|
end
|
|
405
624
|
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
not_implemented
|
|
625
|
+
def [](key)
|
|
626
|
+
return instance_variable_get("@#{key}")
|
|
409
627
|
end
|
|
410
628
|
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
629
|
+
def []=(key, value)
|
|
630
|
+
return instance_variable_set("@#{key}", value)
|
|
631
|
+
end
|
|
632
|
+
|
|
633
|
+
def keys
|
|
634
|
+
return instance_variables.collect { |name| name[1,name.length-1] }
|
|
635
|
+
end
|
|
636
|
+
|
|
637
|
+
end
|
|
638
|
+
|
|
639
|
+
|
|
640
|
+
end
|
|
641
|
+
#--end of require 'erubis/context'
|
|
642
|
+
|
|
643
|
+
|
|
644
|
+
module Erubis
|
|
645
|
+
|
|
646
|
+
|
|
647
|
+
##
|
|
648
|
+
## evaluate code
|
|
649
|
+
##
|
|
650
|
+
module Evaluator
|
|
651
|
+
|
|
652
|
+
def self.supported_properties # :nodoc:
|
|
653
|
+
return []
|
|
654
|
+
end
|
|
655
|
+
|
|
656
|
+
attr_accessor :src, :filename
|
|
657
|
+
|
|
658
|
+
def init_evaluator(properties)
|
|
659
|
+
@filename = properties[:filename]
|
|
660
|
+
end
|
|
661
|
+
|
|
662
|
+
def result(*args)
|
|
663
|
+
raise NotSupportedError.new("evaluation of code except Ruby is not supported.")
|
|
414
664
|
end
|
|
415
665
|
|
|
666
|
+
def evaluate(*args)
|
|
667
|
+
raise NotSupportedError.new("evaluation of code except Ruby is not supported.")
|
|
668
|
+
end
|
|
669
|
+
|
|
670
|
+
end
|
|
671
|
+
|
|
672
|
+
|
|
673
|
+
##
|
|
674
|
+
## evaluator for Ruby
|
|
675
|
+
##
|
|
676
|
+
module RubyEvaluator
|
|
677
|
+
include Evaluator
|
|
678
|
+
|
|
679
|
+
def self.supported_properties # :nodoc:
|
|
680
|
+
list = Evaluator.supported_properties
|
|
681
|
+
return list
|
|
682
|
+
end
|
|
683
|
+
|
|
684
|
+
## eval(@src) with binding object
|
|
685
|
+
def result(_binding_or_hash=TOPLEVEL_BINDING)
|
|
686
|
+
_arg = _binding_or_hash
|
|
687
|
+
if _arg.is_a?(Hash)
|
|
688
|
+
## load _context data as local variables by eval
|
|
689
|
+
eval _arg.keys.inject("") { |s, k| s << "#{k.to_s} = _arg[#{k.inspect}];" }
|
|
690
|
+
_arg = binding()
|
|
691
|
+
end
|
|
692
|
+
return eval(@src, _arg, (@filename || '(erubis)'))
|
|
693
|
+
end
|
|
694
|
+
|
|
695
|
+
## invoke context.instance_eval(@src)
|
|
696
|
+
def evaluate(context=Context.new)
|
|
697
|
+
context = Context.new(context) if context.is_a?(Hash)
|
|
698
|
+
return context.instance_eval(@src, (@filename || '(erubis)'))
|
|
699
|
+
end
|
|
700
|
+
|
|
701
|
+
end
|
|
702
|
+
|
|
703
|
+
|
|
704
|
+
end
|
|
705
|
+
#--end of require 'erubis/evaluator'
|
|
706
|
+
#--already included require 'erubis/context'
|
|
707
|
+
|
|
708
|
+
|
|
709
|
+
module Erubis
|
|
710
|
+
|
|
711
|
+
|
|
712
|
+
##
|
|
713
|
+
## (abstract) abstract engine class.
|
|
714
|
+
## subclass must include evaluator and converter module.
|
|
715
|
+
##
|
|
716
|
+
class Engine
|
|
717
|
+
#include Evaluator
|
|
718
|
+
#include Converter
|
|
719
|
+
#include Generator
|
|
720
|
+
|
|
721
|
+
# convert input string and set it to @src
|
|
722
|
+
def convert!(input)
|
|
723
|
+
@src = convert(input)
|
|
724
|
+
end
|
|
725
|
+
|
|
726
|
+
def initialize(input=nil, properties={})
|
|
727
|
+
#@input = input
|
|
728
|
+
init_generator(properties)
|
|
729
|
+
init_converter(properties)
|
|
730
|
+
init_evaluator(properties)
|
|
731
|
+
@src = convert(input) if input
|
|
732
|
+
end
|
|
733
|
+
|
|
734
|
+
## load file and create engine object
|
|
735
|
+
def self.load_file(filename, properties={})
|
|
736
|
+
input = File.open(filename, 'rb') { |f| f.read }
|
|
737
|
+
input.untaint # is it ok?
|
|
738
|
+
properties[:filename] = filename
|
|
739
|
+
engine = self.new(input, properties)
|
|
740
|
+
return engine
|
|
741
|
+
end
|
|
742
|
+
|
|
743
|
+
|
|
744
|
+
##
|
|
745
|
+
## helper method to convert and evaluate input text with context object.
|
|
746
|
+
## context may be Binding, Hash, or Object.
|
|
747
|
+
##
|
|
748
|
+
def process(input, context=nil, filename=nil)
|
|
749
|
+
code = convert(input)
|
|
750
|
+
filename ||= '(erubis)'
|
|
751
|
+
if context.is_a?(Binding)
|
|
752
|
+
return eval(code, context, filename)
|
|
753
|
+
else
|
|
754
|
+
context = Context.new(context) if context.is_a?(Hash)
|
|
755
|
+
return context.instance_eval(code, filename)
|
|
756
|
+
end
|
|
757
|
+
end
|
|
758
|
+
|
|
759
|
+
|
|
760
|
+
##
|
|
761
|
+
## helper method evaluate Proc object iwth contect object.
|
|
762
|
+
## context may be Binding, Hash, or Object.
|
|
763
|
+
##
|
|
764
|
+
def process_proc(proc_obj, context=nil, filename=nil)
|
|
765
|
+
if context.is_a?(Binding)
|
|
766
|
+
filename ||= '(erubis)'
|
|
767
|
+
return eval(proc_obj, context, filename)
|
|
768
|
+
else
|
|
769
|
+
context = Context.new(context) if context.is_a?(Hash)
|
|
770
|
+
return context.instance_eval(&proc_obj)
|
|
771
|
+
end
|
|
772
|
+
end
|
|
773
|
+
|
|
774
|
+
|
|
416
775
|
end # end of class Engine
|
|
417
776
|
|
|
418
777
|
|
|
778
|
+
##
|
|
779
|
+
## (abstract) base engine class for Eruby, Eperl, Ejava, and so on.
|
|
780
|
+
## subclass must include generator.
|
|
781
|
+
##
|
|
782
|
+
class Basic::Engine < Engine
|
|
783
|
+
include Evaluator
|
|
784
|
+
include Basic::Converter
|
|
785
|
+
include Generator
|
|
786
|
+
end
|
|
787
|
+
|
|
788
|
+
|
|
789
|
+
class PI::Engine < Engine
|
|
790
|
+
include Evaluator
|
|
791
|
+
include PI::Converter
|
|
792
|
+
include Generator
|
|
793
|
+
end
|
|
794
|
+
|
|
795
|
+
|
|
419
796
|
end
|
|
420
797
|
#--end of require 'erubis/engine'
|
|
798
|
+
#require 'erubis/generator'
|
|
799
|
+
#require 'erubis/converter'
|
|
800
|
+
#require 'erubis/evaluator'
|
|
801
|
+
#require 'erubis/error'
|
|
802
|
+
#require 'erubis/context'
|
|
421
803
|
#--begin of require 'erubis/helper'
|
|
422
804
|
##
|
|
423
805
|
## $Rev: 21 $
|
|
424
|
-
## $Release: 2.0
|
|
806
|
+
## $Release: 2.1.0 $
|
|
425
807
|
## copyright(c) 2006 kuwata-lab all rights reserved.
|
|
426
808
|
##
|
|
427
809
|
|
|
@@ -475,15 +857,12 @@ end
|
|
|
475
857
|
#--end of require 'erubis/helper'
|
|
476
858
|
#--begin of require 'erubis/enhancer'
|
|
477
859
|
##
|
|
478
|
-
## $Rev:
|
|
479
|
-
## $Release: 2.0
|
|
860
|
+
## $Rev: 32 $
|
|
861
|
+
## $Release: 2.1.0 $
|
|
480
862
|
## copyright(c) 2006 kuwata-lab all rights reserved.
|
|
481
863
|
##
|
|
482
864
|
|
|
483
865
|
|
|
484
|
-
#--already included require 'erubis/engine'
|
|
485
|
-
|
|
486
|
-
|
|
487
866
|
module Erubis
|
|
488
867
|
|
|
489
868
|
|
|
@@ -517,11 +896,9 @@ module Erubis
|
|
|
517
896
|
def add_expr(src, code, indicator)
|
|
518
897
|
case indicator
|
|
519
898
|
when '='
|
|
520
|
-
add_expr_escaped(src, code)
|
|
521
|
-
#add_expr_literal(src, code)
|
|
899
|
+
@escape ? add_expr_literal(src, code) : add_expr_escaped(src, code)
|
|
522
900
|
when '=='
|
|
523
|
-
add_expr_literal(src, code)
|
|
524
|
-
#add_expr_escaped(src, code)
|
|
901
|
+
@escape ? add_expr_escaped(src, code) : add_expr_literal(src, code)
|
|
525
902
|
when '==='
|
|
526
903
|
add_expr_debug(src, code)
|
|
527
904
|
end
|
|
@@ -617,11 +994,11 @@ module Erubis
|
|
|
617
994
|
end
|
|
618
995
|
end
|
|
619
996
|
|
|
620
|
-
def evaluate(context=
|
|
997
|
+
def evaluate(context=nil)
|
|
621
998
|
_src = @src
|
|
622
999
|
if context.is_a?(Hash)
|
|
623
1000
|
context.each do |key, val| instance_variable_set("@#{key}", val) end
|
|
624
|
-
|
|
1001
|
+
elsif context
|
|
625
1002
|
context.instance_variables.each do |name|
|
|
626
1003
|
instance_variable_set(name, context.instance_variable_get(name))
|
|
627
1004
|
end
|
|
@@ -728,46 +1105,85 @@ module Erubis
|
|
|
728
1105
|
## remove text and leave code, especially useful when debugging.
|
|
729
1106
|
##
|
|
730
1107
|
## ex.
|
|
731
|
-
## $ erubis -s -
|
|
1108
|
+
## $ erubis -s -E NoText file.eruby | more
|
|
1109
|
+
##
|
|
1110
|
+
## this is language independent.
|
|
1111
|
+
##
|
|
1112
|
+
module NoTextEnhancer
|
|
1113
|
+
|
|
1114
|
+
def self.desc # :nodoc:
|
|
1115
|
+
"remove text and leave code (useful when debugging)"
|
|
1116
|
+
end
|
|
1117
|
+
|
|
1118
|
+
def add_text(src, text)
|
|
1119
|
+
src << ("\n" * text.count("\n"))
|
|
1120
|
+
if text[-1] != ?\n
|
|
1121
|
+
text =~ /^(.*?)\z/
|
|
1122
|
+
src << (' ' * $1.length)
|
|
1123
|
+
end
|
|
1124
|
+
end
|
|
1125
|
+
|
|
1126
|
+
end
|
|
1127
|
+
|
|
1128
|
+
|
|
1129
|
+
##
|
|
1130
|
+
## remove code and leave text, especially useful when validating HTML tags.
|
|
1131
|
+
##
|
|
1132
|
+
## ex.
|
|
1133
|
+
## $ erubis -s -E NoCode file.eruby | tidy -errors
|
|
732
1134
|
##
|
|
733
1135
|
## this is language independent.
|
|
734
1136
|
##
|
|
735
|
-
module
|
|
1137
|
+
module NoCodeEnhancer
|
|
736
1138
|
|
|
737
1139
|
def self.desc # :nodoc:
|
|
738
|
-
"remove
|
|
1140
|
+
"remove code and leave text (useful when validating HTML)"
|
|
1141
|
+
end
|
|
1142
|
+
|
|
1143
|
+
def add_preamble(src)
|
|
1144
|
+
end
|
|
1145
|
+
|
|
1146
|
+
def add_postamble(src)
|
|
739
1147
|
end
|
|
740
1148
|
|
|
741
1149
|
def add_text(src, text)
|
|
742
|
-
src <<
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
1150
|
+
src << text
|
|
1151
|
+
end
|
|
1152
|
+
|
|
1153
|
+
def add_expr(src, code, indicator)
|
|
1154
|
+
src << "\n" * code.count("\n")
|
|
1155
|
+
end
|
|
1156
|
+
|
|
1157
|
+
def add_stmt(src, code)
|
|
1158
|
+
src << "\n" * code.count("\n")
|
|
747
1159
|
end
|
|
748
1160
|
|
|
749
1161
|
end
|
|
750
1162
|
|
|
751
1163
|
|
|
752
1164
|
##
|
|
753
|
-
## get
|
|
1165
|
+
## get convert faster, but spaces around '<%...%>' are not trimmed.
|
|
754
1166
|
##
|
|
755
1167
|
## this is language-independent.
|
|
756
1168
|
##
|
|
757
1169
|
module SimplifyEnhancer
|
|
758
1170
|
|
|
759
1171
|
def self.desc # :nodoc:
|
|
760
|
-
"get
|
|
1172
|
+
"get convert faster but leave spaces around '<% %>'"
|
|
761
1173
|
end
|
|
762
1174
|
|
|
763
|
-
#DEFAULT_REGEXP = /(
|
|
764
|
-
SIMPLE_REGEXP =
|
|
1175
|
+
#DEFAULT_REGEXP = /(^[ \t]*)?<%(=+|\#)?(.*?)-?%>([ \t]*\r?\n)?/m
|
|
1176
|
+
SIMPLE_REGEXP = /<%(=+|\#)?(.*?)-?%>/m
|
|
765
1177
|
|
|
766
|
-
def
|
|
1178
|
+
def convert(input)
|
|
767
1179
|
src = ""
|
|
768
1180
|
add_preamble(src)
|
|
769
1181
|
#regexp = pattern_regexp(@pattern)
|
|
770
|
-
|
|
1182
|
+
pos = 0
|
|
1183
|
+
input.scan(SIMPLE_REGEXP) do |indicator, code|
|
|
1184
|
+
index = Regexp.last_match.begin(0)
|
|
1185
|
+
text = input[pos, index - pos]
|
|
1186
|
+
pos = index + $&.length()
|
|
771
1187
|
add_text(src, text)
|
|
772
1188
|
if !indicator # <% %>
|
|
773
1189
|
add_stmt(src, code)
|
|
@@ -952,7 +1368,7 @@ module Erubis
|
|
|
952
1368
|
|
|
953
1369
|
attr_accessor :header, :footer
|
|
954
1370
|
|
|
955
|
-
def
|
|
1371
|
+
def convert(input)
|
|
956
1372
|
source = super
|
|
957
1373
|
return @src = "#{@header}#{source}#{@footer}"
|
|
958
1374
|
end
|
|
@@ -965,27 +1381,34 @@ end
|
|
|
965
1381
|
#require 'erubis/tiny'
|
|
966
1382
|
#--begin of require 'erubis/engine/eruby'
|
|
967
1383
|
##
|
|
968
|
-
## $Rev:
|
|
969
|
-
## $Release: 2.0
|
|
1384
|
+
## $Rev: 33 $
|
|
1385
|
+
## $Release: 2.1.0 $
|
|
970
1386
|
## copyright(c) 2006 kuwata-lab all rights reserved.
|
|
971
1387
|
##
|
|
972
1388
|
|
|
973
1389
|
#--already included require 'erubis/engine'
|
|
974
1390
|
#--already included require 'erubis/enhancer'
|
|
1391
|
+
#--already included require 'abstract'
|
|
975
1392
|
|
|
976
1393
|
|
|
977
1394
|
module Erubis
|
|
978
1395
|
|
|
979
1396
|
|
|
980
1397
|
##
|
|
981
|
-
##
|
|
1398
|
+
## code generator for Ruby
|
|
982
1399
|
##
|
|
983
|
-
|
|
1400
|
+
module RubyGenerator
|
|
1401
|
+
include Generator
|
|
984
1402
|
#include StringBufferEnhancer
|
|
985
1403
|
include ArrayBufferEnhancer
|
|
986
1404
|
|
|
1405
|
+
def init_generator(properties={})
|
|
1406
|
+
super
|
|
1407
|
+
@escapefunc ||= "Erubis::XmlHelper.escape_xml"
|
|
1408
|
+
end
|
|
1409
|
+
|
|
987
1410
|
def self.supported_properties() # :nodoc:
|
|
988
|
-
return
|
|
1411
|
+
return []
|
|
989
1412
|
end
|
|
990
1413
|
|
|
991
1414
|
def escape_text(text)
|
|
@@ -993,8 +1416,7 @@ module Erubis
|
|
|
993
1416
|
end
|
|
994
1417
|
|
|
995
1418
|
def escaped_expr(code)
|
|
996
|
-
|
|
997
|
-
return "#{@escape}(#{code})"
|
|
1419
|
+
return "#{@escapefunc}(#{code})"
|
|
998
1420
|
end
|
|
999
1421
|
|
|
1000
1422
|
#--
|
|
@@ -1036,6 +1458,15 @@ module Erubis
|
|
|
1036
1458
|
end
|
|
1037
1459
|
|
|
1038
1460
|
|
|
1461
|
+
##
|
|
1462
|
+
## engine for Ruby
|
|
1463
|
+
##
|
|
1464
|
+
class Eruby < Basic::Engine
|
|
1465
|
+
include RubyEvaluator
|
|
1466
|
+
include RubyGenerator
|
|
1467
|
+
end
|
|
1468
|
+
|
|
1469
|
+
|
|
1039
1470
|
##
|
|
1040
1471
|
## swtich '<%= %>' to escaped and '<%== %>' to not escaped
|
|
1041
1472
|
##
|
|
@@ -1054,6 +1485,18 @@ module Erubis
|
|
|
1054
1485
|
end
|
|
1055
1486
|
|
|
1056
1487
|
|
|
1488
|
+
class PI::Eruby < PI::Engine
|
|
1489
|
+
include RubyEvaluator
|
|
1490
|
+
include RubyGenerator
|
|
1491
|
+
|
|
1492
|
+
def init_converter(properties={})
|
|
1493
|
+
@pi = 'rb'
|
|
1494
|
+
super(properties)
|
|
1495
|
+
end
|
|
1496
|
+
|
|
1497
|
+
end
|
|
1498
|
+
|
|
1499
|
+
|
|
1057
1500
|
end
|
|
1058
1501
|
#--end of require 'erubis/engine/eruby'
|
|
1059
1502
|
#require 'erubis/engine/enhanced' # enhanced eruby engines
|
|
@@ -1065,11 +1508,10 @@ end
|
|
|
1065
1508
|
#require 'erubis/engine/eperl'
|
|
1066
1509
|
#require 'erubis/engine/ejavascript'
|
|
1067
1510
|
|
|
1068
|
-
|
|
1069
1511
|
#--begin of require 'erubis/local-setting'
|
|
1070
1512
|
##
|
|
1071
1513
|
## $Rev: 13 $
|
|
1072
|
-
## $Release: 2.0
|
|
1514
|
+
## $Release: 2.1.0 $
|
|
1073
1515
|
## copyright(c) 2006 kuwata-lab all rights reserved.
|
|
1074
1516
|
##
|
|
1075
1517
|
|
|
@@ -1081,8 +1523,8 @@ end
|
|
|
1081
1523
|
#--end of require 'erubis'
|
|
1082
1524
|
#--begin of require 'erubis/tiny'
|
|
1083
1525
|
##
|
|
1084
|
-
## $Rev:
|
|
1085
|
-
## $Release: 2.0
|
|
1526
|
+
## $Rev: 35 $
|
|
1527
|
+
## $Release: 2.1.0 $
|
|
1086
1528
|
## copyright(c) 2006 kuwata-lab all rights reserved.
|
|
1087
1529
|
##
|
|
1088
1530
|
|
|
@@ -1099,16 +1541,21 @@ module Erubis
|
|
|
1099
1541
|
##
|
|
1100
1542
|
class TinyEruby
|
|
1101
1543
|
|
|
1102
|
-
def initialize(input)
|
|
1103
|
-
@src =
|
|
1544
|
+
def initialize(input=nil)
|
|
1545
|
+
@src = convert(input) if input
|
|
1104
1546
|
end
|
|
1105
1547
|
attr_reader :src
|
|
1106
1548
|
|
|
1107
|
-
EMBEDDED_PATTERN =
|
|
1549
|
+
EMBEDDED_PATTERN = /<%(=+|\#)?(.*?)-?%>/m
|
|
1108
1550
|
|
|
1109
|
-
def
|
|
1551
|
+
def convert(input)
|
|
1110
1552
|
src = "_buf = [];" # preamble
|
|
1111
|
-
|
|
1553
|
+
pos = 0
|
|
1554
|
+
input.scan(EMBEDDED_PATTERN) do |indicator, code|
|
|
1555
|
+
match = Regexp.last_match
|
|
1556
|
+
index = match.begin(0)
|
|
1557
|
+
text = input[pos, index - pos]
|
|
1558
|
+
pos = match.end(0)
|
|
1112
1559
|
src << " _buf << '" << escape_text(text) << "';"
|
|
1113
1560
|
if !indicator # <% %>
|
|
1114
1561
|
src << code << ";"
|
|
@@ -1144,12 +1591,81 @@ module Erubis
|
|
|
1144
1591
|
|
|
1145
1592
|
end
|
|
1146
1593
|
|
|
1594
|
+
|
|
1595
|
+
|
|
1596
|
+
module PI
|
|
1597
|
+
end
|
|
1598
|
+
|
|
1599
|
+
class PI::TinyEruby
|
|
1600
|
+
|
|
1601
|
+
def initialize(input=nil, options={})
|
|
1602
|
+
@escape = options[:escape] || 'Erubis::XmlHelper.escape_xml'
|
|
1603
|
+
@src = convert(input) if input
|
|
1604
|
+
end
|
|
1605
|
+
|
|
1606
|
+
attr_reader :src
|
|
1607
|
+
|
|
1608
|
+
EMBEDDED_PATTERN = /(^[ \t]*)?<\?rb(\s.*?)\?>([ \t]*\r?\n)?|\$(!*)?\{(.*?)\}/
|
|
1609
|
+
|
|
1610
|
+
def convert(input)
|
|
1611
|
+
src = "_buf = [];" # preamble
|
|
1612
|
+
pos = 0
|
|
1613
|
+
input.scan(EMBEDDED_PATTERN) do |lspace, stmtcode, rspace, indicator, exprcode|
|
|
1614
|
+
match = Regexp.last_match
|
|
1615
|
+
index = match.begin(0)
|
|
1616
|
+
text = input[pos, index - pos]
|
|
1617
|
+
pos = match.end(0)
|
|
1618
|
+
if stmtcode # <?rb ... ?>
|
|
1619
|
+
code = stmtcode
|
|
1620
|
+
src << " _buf << '" << escape_text(text) << "';"
|
|
1621
|
+
if lspace && rspace
|
|
1622
|
+
src << "#{lspace}#{code}#{rspace}"
|
|
1623
|
+
else
|
|
1624
|
+
src << " _buf << '#{lspace}';" if lspace
|
|
1625
|
+
src << code << ";"
|
|
1626
|
+
src << " _buf << '#{rspace}';" if rspace
|
|
1627
|
+
end
|
|
1628
|
+
else # ${...}, $!{...}
|
|
1629
|
+
code = exprcode
|
|
1630
|
+
if indicator.nil? || indicator.empty?
|
|
1631
|
+
src << " _buf << #{@escape}(" << code << ");"
|
|
1632
|
+
elsif indicator == '!'
|
|
1633
|
+
src << " _buf << (" << code << ").to_s;"
|
|
1634
|
+
end
|
|
1635
|
+
end
|
|
1636
|
+
end
|
|
1637
|
+
rest = $' || input
|
|
1638
|
+
src << " _buf << '" << escape_text(rest) << "';"
|
|
1639
|
+
src << "\n_buf.join\n" # postamble
|
|
1640
|
+
return src
|
|
1641
|
+
end
|
|
1642
|
+
|
|
1643
|
+
def escape_text(text)
|
|
1644
|
+
return text.gsub!(/['\\]/, '\\\\\&') || text
|
|
1645
|
+
end
|
|
1646
|
+
|
|
1647
|
+
def result(binding=TOPLEVEL_BINDING)
|
|
1648
|
+
eval @src, binding
|
|
1649
|
+
end
|
|
1650
|
+
|
|
1651
|
+
def evaluate(context=Object.new)
|
|
1652
|
+
if context.is_a?(Hash)
|
|
1653
|
+
obj = Object.new
|
|
1654
|
+
context.each do |k, v| obj.instance_variable_set("@#{k}", v) end
|
|
1655
|
+
context = obj
|
|
1656
|
+
end
|
|
1657
|
+
context.instance_eval @src
|
|
1658
|
+
end
|
|
1659
|
+
|
|
1660
|
+
end
|
|
1661
|
+
|
|
1662
|
+
|
|
1147
1663
|
end
|
|
1148
1664
|
#--end of require 'erubis/tiny'
|
|
1149
1665
|
#--begin of require 'erubis/engine/enhanced'
|
|
1150
1666
|
##
|
|
1151
|
-
## $Rev:
|
|
1152
|
-
## $Release: 2.0
|
|
1667
|
+
## $Rev: 27 $
|
|
1668
|
+
## $Release: 2.1.0 $
|
|
1153
1669
|
## copyright(c) 2006 kuwata-lab all rights reserved.
|
|
1154
1670
|
##
|
|
1155
1671
|
|
|
@@ -1216,6 +1732,11 @@ module Erubis
|
|
|
1216
1732
|
end
|
|
1217
1733
|
|
|
1218
1734
|
|
|
1735
|
+
class NoCodeEruby < Eruby
|
|
1736
|
+
include NoCodeEnhancer
|
|
1737
|
+
end
|
|
1738
|
+
|
|
1739
|
+
|
|
1219
1740
|
class SimplifiedEruby < Eruby
|
|
1220
1741
|
include SimplifyEnhancer
|
|
1221
1742
|
end
|
|
@@ -1252,8 +1773,8 @@ end
|
|
|
1252
1773
|
#--end of require 'erubis/engine/enhanced'
|
|
1253
1774
|
#--begin of require 'erubis/engine/optimized'
|
|
1254
1775
|
##
|
|
1255
|
-
## $Rev:
|
|
1256
|
-
## $Release: 2.0
|
|
1776
|
+
## $Rev: 31 $
|
|
1777
|
+
## $Release: 2.1.0 $
|
|
1257
1778
|
## copyright(c) 2006 kuwata-lab all rights reserved.
|
|
1258
1779
|
##
|
|
1259
1780
|
|
|
@@ -1264,19 +1785,18 @@ end
|
|
|
1264
1785
|
module Erubis
|
|
1265
1786
|
|
|
1266
1787
|
|
|
1267
|
-
|
|
1268
|
-
|
|
1269
|
-
##
|
|
1270
|
-
class OptimizedEruby < Engine # Eruby
|
|
1788
|
+
module OptimizedGenerator
|
|
1789
|
+
include Generator
|
|
1271
1790
|
|
|
1272
1791
|
def self.supported_properties() # :nodoc:
|
|
1273
|
-
return
|
|
1792
|
+
return []
|
|
1274
1793
|
end
|
|
1275
1794
|
|
|
1276
|
-
def
|
|
1795
|
+
def init_generator(properties={})
|
|
1796
|
+
super
|
|
1797
|
+
@escapefunc ||= "Erubis::XmlHelper.escape_xml"
|
|
1277
1798
|
@initialized = false
|
|
1278
1799
|
@prev_is_expr = false
|
|
1279
|
-
super
|
|
1280
1800
|
end
|
|
1281
1801
|
|
|
1282
1802
|
protected
|
|
@@ -1286,8 +1806,8 @@ module Erubis
|
|
|
1286
1806
|
end
|
|
1287
1807
|
|
|
1288
1808
|
def escaped_expr(code)
|
|
1289
|
-
@
|
|
1290
|
-
return "#{@
|
|
1809
|
+
@escapefunc ||= 'Erubis::XmlHelper.escape_xml'
|
|
1810
|
+
return "#{@escapefunc}(#{code})"
|
|
1291
1811
|
end
|
|
1292
1812
|
|
|
1293
1813
|
def switch_to_expr(src)
|
|
@@ -1351,6 +1871,21 @@ module Erubis
|
|
|
1351
1871
|
end # end of class OptimizedEruby
|
|
1352
1872
|
|
|
1353
1873
|
|
|
1874
|
+
##
|
|
1875
|
+
## Eruby class which generates optimized ruby code
|
|
1876
|
+
##
|
|
1877
|
+
class OptimizedEruby < Basic::Engine # Eruby
|
|
1878
|
+
include RubyEvaluator
|
|
1879
|
+
include OptimizedGenerator
|
|
1880
|
+
|
|
1881
|
+
def init_converter(properties={})
|
|
1882
|
+
@pi = 'rb'
|
|
1883
|
+
super(properties)
|
|
1884
|
+
end
|
|
1885
|
+
|
|
1886
|
+
end
|
|
1887
|
+
|
|
1888
|
+
|
|
1354
1889
|
##
|
|
1355
1890
|
## XmlEruby class which generates optimized ruby code
|
|
1356
1891
|
##
|
|
@@ -1369,8 +1904,8 @@ end
|
|
|
1369
1904
|
#--already included require 'erubis/engine/eruby'
|
|
1370
1905
|
#--begin of require 'erubis/engine/ephp'
|
|
1371
1906
|
##
|
|
1372
|
-
## $Rev:
|
|
1373
|
-
## $Release: 2.0
|
|
1907
|
+
## $Rev: 31 $
|
|
1908
|
+
## $Release: 2.1.0 $
|
|
1374
1909
|
## copyright(c) 2006 kuwata-lab all rights reserved.
|
|
1375
1910
|
##
|
|
1376
1911
|
|
|
@@ -1381,13 +1916,16 @@ end
|
|
|
1381
1916
|
module Erubis
|
|
1382
1917
|
|
|
1383
1918
|
|
|
1384
|
-
|
|
1385
|
-
|
|
1386
|
-
##
|
|
1387
|
-
class Ephp < Engine
|
|
1919
|
+
module PhpGenerator
|
|
1920
|
+
include Generator
|
|
1388
1921
|
|
|
1389
1922
|
def self.supported_properties() # :nodoc:
|
|
1390
|
-
return
|
|
1923
|
+
return []
|
|
1924
|
+
end
|
|
1925
|
+
|
|
1926
|
+
def init_generator(properties={})
|
|
1927
|
+
super
|
|
1928
|
+
@escapefunc ||= 'htmlspecialchars'
|
|
1391
1929
|
end
|
|
1392
1930
|
|
|
1393
1931
|
def add_preamble(src)
|
|
@@ -1402,17 +1940,13 @@ module Erubis
|
|
|
1402
1940
|
src << escape_text(text)
|
|
1403
1941
|
end
|
|
1404
1942
|
|
|
1405
|
-
def escaped_expr(code)
|
|
1406
|
-
@escape ||= 'htmlspecialchars'
|
|
1407
|
-
return "#{@escape}(#{code.strip})"
|
|
1408
|
-
end
|
|
1409
|
-
|
|
1410
1943
|
def add_expr_literal(src, code)
|
|
1411
|
-
|
|
1944
|
+
code.strip!
|
|
1945
|
+
src << "<?php echo #{code}; ?>"
|
|
1412
1946
|
end
|
|
1413
1947
|
|
|
1414
1948
|
def add_expr_escaped(src, code)
|
|
1415
|
-
src
|
|
1949
|
+
add_expr_literal(src, escaped_expr(code))
|
|
1416
1950
|
end
|
|
1417
1951
|
|
|
1418
1952
|
def add_expr_debug(src, code)
|
|
@@ -1439,6 +1973,14 @@ module Erubis
|
|
|
1439
1973
|
end
|
|
1440
1974
|
|
|
1441
1975
|
|
|
1976
|
+
##
|
|
1977
|
+
## engine for PHP
|
|
1978
|
+
##
|
|
1979
|
+
class Ephp < Basic::Engine
|
|
1980
|
+
include PhpGenerator
|
|
1981
|
+
end
|
|
1982
|
+
|
|
1983
|
+
|
|
1442
1984
|
class EscapedEphp < Ephp
|
|
1443
1985
|
include EscapeEnhancer
|
|
1444
1986
|
end
|
|
@@ -1449,12 +1991,23 @@ module Erubis
|
|
|
1449
1991
|
#end
|
|
1450
1992
|
|
|
1451
1993
|
|
|
1994
|
+
class PI::Ephp < PI::Engine
|
|
1995
|
+
include PhpGenerator
|
|
1996
|
+
|
|
1997
|
+
def init_converter(properties={})
|
|
1998
|
+
@pi = 'php'
|
|
1999
|
+
super(properties)
|
|
2000
|
+
end
|
|
2001
|
+
|
|
2002
|
+
end
|
|
2003
|
+
|
|
2004
|
+
|
|
1452
2005
|
end
|
|
1453
2006
|
#--end of require 'erubis/engine/ephp'
|
|
1454
2007
|
#--begin of require 'erubis/engine/ec'
|
|
1455
2008
|
##
|
|
1456
|
-
## $Rev:
|
|
1457
|
-
## $Release: 2.0
|
|
2009
|
+
## $Rev: 33 $
|
|
2010
|
+
## $Release: 2.1.0 $
|
|
1458
2011
|
## copyright(c) 2006 kuwata-lab all rights reserved.
|
|
1459
2012
|
##
|
|
1460
2013
|
|
|
@@ -1465,22 +2018,21 @@ end
|
|
|
1465
2018
|
module Erubis
|
|
1466
2019
|
|
|
1467
2020
|
|
|
1468
|
-
|
|
1469
|
-
|
|
1470
|
-
##
|
|
1471
|
-
class Ec < Engine
|
|
2021
|
+
module CGenerator
|
|
2022
|
+
include Generator
|
|
1472
2023
|
|
|
1473
2024
|
def self.supported_properties() # :nodoc:
|
|
1474
|
-
|
|
1475
|
-
|
|
1476
|
-
|
|
1477
|
-
|
|
2025
|
+
return [
|
|
2026
|
+
[:indent, '', "indent spaces (ex. ' ')"],
|
|
2027
|
+
[:out, 'stdout', "output file pointer name"],
|
|
2028
|
+
]
|
|
1478
2029
|
end
|
|
1479
2030
|
|
|
1480
|
-
def
|
|
2031
|
+
def init_generator(properties={})
|
|
2032
|
+
super
|
|
2033
|
+
@escapefunc ||= "escape"
|
|
1481
2034
|
@indent = properties[:indent] || ''
|
|
1482
2035
|
@out = properties[:out] || 'stdout'
|
|
1483
|
-
super
|
|
1484
2036
|
end
|
|
1485
2037
|
|
|
1486
2038
|
def add_preamble(src)
|
|
@@ -1494,13 +2046,7 @@ module Erubis
|
|
|
1494
2046
|
end
|
|
1495
2047
|
|
|
1496
2048
|
def escaped_expr(code)
|
|
1497
|
-
@
|
|
1498
|
-
code.strip!
|
|
1499
|
-
if code =~ /\A(\".*?\")\s*,\s*(.*)/
|
|
1500
|
-
return "#{$1}, #{@escape}(#{$2})"
|
|
1501
|
-
else
|
|
1502
|
-
return "#{@escape}(#{code})"
|
|
1503
|
-
end
|
|
2049
|
+
return "#{@escapefunc}(#{code.strip}, #{@out})"
|
|
1504
2050
|
end
|
|
1505
2051
|
|
|
1506
2052
|
def add_text(src, text)
|
|
@@ -1528,7 +2074,7 @@ module Erubis
|
|
|
1528
2074
|
|
|
1529
2075
|
def add_expr_escaped(src, code)
|
|
1530
2076
|
src << @indent if src.empty? || src[-1] == ?\n
|
|
1531
|
-
src <<
|
|
2077
|
+
src << ' ' << escaped_expr(code) << ';'
|
|
1532
2078
|
end
|
|
1533
2079
|
|
|
1534
2080
|
def add_expr_debug(src, code)
|
|
@@ -1548,6 +2094,14 @@ module Erubis
|
|
|
1548
2094
|
end
|
|
1549
2095
|
|
|
1550
2096
|
|
|
2097
|
+
##
|
|
2098
|
+
## engine for C
|
|
2099
|
+
##
|
|
2100
|
+
class Ec < Basic::Engine
|
|
2101
|
+
include CGenerator
|
|
2102
|
+
end
|
|
2103
|
+
|
|
2104
|
+
|
|
1551
2105
|
class EscapedEc < Ec
|
|
1552
2106
|
include EscapeEnhancer
|
|
1553
2107
|
end
|
|
@@ -1557,13 +2111,23 @@ module Erubis
|
|
|
1557
2111
|
# include EscapeEnhancer
|
|
1558
2112
|
#end
|
|
1559
2113
|
|
|
2114
|
+
class PI::Ec < PI::Engine
|
|
2115
|
+
include CGenerator
|
|
2116
|
+
|
|
2117
|
+
def init_converter(properties={})
|
|
2118
|
+
@pi = 'c'
|
|
2119
|
+
super(properties)
|
|
2120
|
+
end
|
|
2121
|
+
|
|
2122
|
+
end
|
|
2123
|
+
|
|
1560
2124
|
|
|
1561
2125
|
end
|
|
1562
2126
|
#--end of require 'erubis/engine/ec'
|
|
1563
2127
|
#--begin of require 'erubis/engine/ejava'
|
|
1564
2128
|
##
|
|
1565
|
-
## $Rev:
|
|
1566
|
-
## $Release: 2.0
|
|
2129
|
+
## $Rev: 31 $
|
|
2130
|
+
## $Release: 2.1.0 $
|
|
1567
2131
|
## copyright(c) 2006 kuwata-lab all rights reserved.
|
|
1568
2132
|
##
|
|
1569
2133
|
|
|
@@ -1574,24 +2138,23 @@ end
|
|
|
1574
2138
|
module Erubis
|
|
1575
2139
|
|
|
1576
2140
|
|
|
1577
|
-
|
|
1578
|
-
|
|
1579
|
-
##
|
|
1580
|
-
class Ejava < Engine
|
|
2141
|
+
module JavaGenerator
|
|
2142
|
+
include Generator
|
|
1581
2143
|
|
|
1582
2144
|
def self.supported_properties() # :nodoc:
|
|
1583
|
-
|
|
1584
|
-
|
|
1585
|
-
|
|
1586
|
-
|
|
1587
|
-
|
|
2145
|
+
return [
|
|
2146
|
+
[:indent, '', "indent spaces (ex. ' ')"],
|
|
2147
|
+
[:buf, '_buf', "output buffer name"],
|
|
2148
|
+
[:bufclass, 'StringBuffer', "output buffer class (ex. 'StringBuilder')"],
|
|
2149
|
+
]
|
|
1588
2150
|
end
|
|
1589
2151
|
|
|
1590
|
-
def
|
|
2152
|
+
def init_generator(properties={})
|
|
2153
|
+
super
|
|
2154
|
+
@escapefunc ||= 'escape'
|
|
1591
2155
|
@indent = properties[:indent] || ''
|
|
1592
2156
|
@buf = properties[:buf] || '_buf'
|
|
1593
2157
|
@bufclass = properties[:bufclass] || 'StringBuffer'
|
|
1594
|
-
super
|
|
1595
2158
|
end
|
|
1596
2159
|
|
|
1597
2160
|
def add_preamble(src)
|
|
@@ -1603,11 +2166,6 @@ module Erubis
|
|
|
1603
2166
|
return text.gsub!(/[\r\n\t"\\]/) { |m| @@table_[m] } || text
|
|
1604
2167
|
end
|
|
1605
2168
|
|
|
1606
|
-
def escaped_expr(code)
|
|
1607
|
-
@escape ||= 'escape'
|
|
1608
|
-
return "#{@escape}(#{code.strip})"
|
|
1609
|
-
end
|
|
1610
|
-
|
|
1611
2169
|
def add_text(src, text)
|
|
1612
2170
|
return if text.empty?
|
|
1613
2171
|
src << (src.empty? || src[-1] == ?\n ? @indent : ' ')
|
|
@@ -1627,12 +2185,12 @@ module Erubis
|
|
|
1627
2185
|
|
|
1628
2186
|
def add_expr_literal(src, code)
|
|
1629
2187
|
src << @indent if src.empty? || src[-1] == ?\n
|
|
1630
|
-
|
|
2188
|
+
code.strip!
|
|
2189
|
+
src << " #{@buf}.append(#{code});"
|
|
1631
2190
|
end
|
|
1632
2191
|
|
|
1633
2192
|
def add_expr_escaped(src, code)
|
|
1634
|
-
src
|
|
1635
|
-
src << ' ' << @buf << '.append(' << escaped_expr(code) << ');'
|
|
2193
|
+
add_expr_literal(src, escaped_expr(code))
|
|
1636
2194
|
end
|
|
1637
2195
|
|
|
1638
2196
|
def add_expr_debug(src, code)
|
|
@@ -1644,11 +2202,20 @@ module Erubis
|
|
|
1644
2202
|
def add_postamble(src)
|
|
1645
2203
|
src << "\n" if src[-1] == ?;
|
|
1646
2204
|
src << @indent << "return " << @buf << ".toString();\n"
|
|
2205
|
+
#src << @indent << "System.out.print(" << @buf << ".toString());\n"
|
|
1647
2206
|
end
|
|
1648
2207
|
|
|
1649
2208
|
end
|
|
1650
2209
|
|
|
1651
2210
|
|
|
2211
|
+
##
|
|
2212
|
+
## engine for Java
|
|
2213
|
+
##
|
|
2214
|
+
class Ejava < Basic::Engine
|
|
2215
|
+
include JavaGenerator
|
|
2216
|
+
end
|
|
2217
|
+
|
|
2218
|
+
|
|
1652
2219
|
class EscapedEjava < Ejava
|
|
1653
2220
|
include EscapeEnhancer
|
|
1654
2221
|
end
|
|
@@ -1658,13 +2225,22 @@ module Erubis
|
|
|
1658
2225
|
# include EscapeEnhancer
|
|
1659
2226
|
#end
|
|
1660
2227
|
|
|
2228
|
+
class PI::Ejava < PI::Engine
|
|
2229
|
+
include JavaGenerator
|
|
2230
|
+
|
|
2231
|
+
def init_converter(properties={})
|
|
2232
|
+
@pi = 'java'
|
|
2233
|
+
super(properties)
|
|
2234
|
+
end
|
|
2235
|
+
|
|
2236
|
+
end
|
|
1661
2237
|
|
|
1662
2238
|
end
|
|
1663
2239
|
#--end of require 'erubis/engine/ejava'
|
|
1664
2240
|
#--begin of require 'erubis/engine/escheme'
|
|
1665
2241
|
##
|
|
1666
|
-
## $Rev:
|
|
1667
|
-
## $Release: 2.0
|
|
2242
|
+
## $Rev: 33 $
|
|
2243
|
+
## $Release: 2.1.0 $
|
|
1668
2244
|
## copyright(c) 2006 kuwata-lab all rights reserved.
|
|
1669
2245
|
##
|
|
1670
2246
|
|
|
@@ -1675,20 +2251,19 @@ end
|
|
|
1675
2251
|
module Erubis
|
|
1676
2252
|
|
|
1677
2253
|
|
|
1678
|
-
|
|
1679
|
-
|
|
1680
|
-
##
|
|
1681
|
-
class Escheme < Engine
|
|
2254
|
+
module SchemeGenerator
|
|
2255
|
+
include Generator
|
|
1682
2256
|
|
|
1683
2257
|
def self.supported_properties() # :nodoc:
|
|
1684
|
-
|
|
1685
|
-
|
|
1686
|
-
|
|
2258
|
+
return [
|
|
2259
|
+
[:func, '_add', "function name (ex. 'display')"],
|
|
2260
|
+
]
|
|
1687
2261
|
end
|
|
1688
2262
|
|
|
1689
|
-
def
|
|
1690
|
-
@func = properties[:func] || '_add' # or 'display'
|
|
2263
|
+
def init_generator(properties={})
|
|
1691
2264
|
super
|
|
2265
|
+
@escapefunc ||= 'escape'
|
|
2266
|
+
@func = properties[:func] || '_add' # or 'display'
|
|
1692
2267
|
end
|
|
1693
2268
|
|
|
1694
2269
|
def add_preamble(src)
|
|
@@ -1706,8 +2281,8 @@ module Erubis
|
|
|
1706
2281
|
end
|
|
1707
2282
|
|
|
1708
2283
|
def escaped_expr(code)
|
|
1709
|
-
|
|
1710
|
-
return "(#{@
|
|
2284
|
+
code.strip!
|
|
2285
|
+
return "(#{@escapefunc} #{code})"
|
|
1711
2286
|
end
|
|
1712
2287
|
|
|
1713
2288
|
def add_text(src, text)
|
|
@@ -1726,11 +2301,12 @@ module Erubis
|
|
|
1726
2301
|
end
|
|
1727
2302
|
|
|
1728
2303
|
def add_expr_literal(src, code)
|
|
1729
|
-
|
|
2304
|
+
code.strip!
|
|
2305
|
+
src << "(#{@func} #{code})"
|
|
1730
2306
|
end
|
|
1731
2307
|
|
|
1732
2308
|
def add_expr_escaped(src, code)
|
|
1733
|
-
src
|
|
2309
|
+
add_expr_literal(src, escaped_expr(code))
|
|
1734
2310
|
end
|
|
1735
2311
|
|
|
1736
2312
|
def add_expr_debug(src, code)
|
|
@@ -1747,6 +2323,14 @@ module Erubis
|
|
|
1747
2323
|
end
|
|
1748
2324
|
|
|
1749
2325
|
|
|
2326
|
+
##
|
|
2327
|
+
## engine for Scheme
|
|
2328
|
+
##
|
|
2329
|
+
class Escheme < Basic::Engine
|
|
2330
|
+
include SchemeGenerator
|
|
2331
|
+
end
|
|
2332
|
+
|
|
2333
|
+
|
|
1750
2334
|
class EscapedEscheme < Escheme
|
|
1751
2335
|
include EscapeEnhancer
|
|
1752
2336
|
end
|
|
@@ -1757,12 +2341,23 @@ module Erubis
|
|
|
1757
2341
|
#end
|
|
1758
2342
|
|
|
1759
2343
|
|
|
2344
|
+
class PI::Escheme < PI::Engine
|
|
2345
|
+
include SchemeGenerator
|
|
2346
|
+
|
|
2347
|
+
def init_converter(properties={})
|
|
2348
|
+
@pi = 'scheme'
|
|
2349
|
+
super(properties)
|
|
2350
|
+
end
|
|
2351
|
+
|
|
2352
|
+
end
|
|
2353
|
+
|
|
2354
|
+
|
|
1760
2355
|
end
|
|
1761
2356
|
#--end of require 'erubis/engine/escheme'
|
|
1762
2357
|
#--begin of require 'erubis/engine/eperl'
|
|
1763
2358
|
##
|
|
1764
|
-
## $Rev:
|
|
1765
|
-
## $Release: 2.0
|
|
2359
|
+
## $Rev: 40 $
|
|
2360
|
+
## $Release: 2.1.0 $
|
|
1766
2361
|
## copyright(c) 2006 kuwata-lab all rights reserved.
|
|
1767
2362
|
##
|
|
1768
2363
|
|
|
@@ -1773,24 +2368,23 @@ end
|
|
|
1773
2368
|
module Erubis
|
|
1774
2369
|
|
|
1775
2370
|
|
|
1776
|
-
|
|
1777
|
-
|
|
1778
|
-
##
|
|
1779
|
-
class Eperl < Engine
|
|
2371
|
+
module PerlGenerator
|
|
2372
|
+
include Generator
|
|
1780
2373
|
|
|
1781
2374
|
def self.supported_properties() # :nodoc:
|
|
1782
|
-
|
|
1783
|
-
|
|
1784
|
-
|
|
2375
|
+
return [
|
|
2376
|
+
[:func, 'print', "function name"],
|
|
2377
|
+
]
|
|
1785
2378
|
end
|
|
1786
2379
|
|
|
1787
|
-
def
|
|
1788
|
-
@func = properties[:func] || 'print'
|
|
2380
|
+
def init_generator(properties={})
|
|
1789
2381
|
super
|
|
2382
|
+
@escapefunc ||= 'encode_entities'
|
|
2383
|
+
@func = properties[:func] || 'print'
|
|
1790
2384
|
end
|
|
1791
2385
|
|
|
1792
2386
|
def add_preamble(src)
|
|
1793
|
-
|
|
2387
|
+
src << "use HTML::Entities; ";
|
|
1794
2388
|
end
|
|
1795
2389
|
|
|
1796
2390
|
def escape_text(text)
|
|
@@ -1801,17 +2395,13 @@ module Erubis
|
|
|
1801
2395
|
src << @func << "('" << escape_text(text) << "'); " unless text.empty?
|
|
1802
2396
|
end
|
|
1803
2397
|
|
|
1804
|
-
def escaped_expr(code)
|
|
1805
|
-
@escape ||= 'escape'
|
|
1806
|
-
return "escape(#{code.strip})"
|
|
1807
|
-
end
|
|
1808
|
-
|
|
1809
2398
|
def add_expr_literal(src, code)
|
|
1810
|
-
|
|
2399
|
+
code.strip!
|
|
2400
|
+
src << @func << "(" << code << "); "
|
|
1811
2401
|
end
|
|
1812
2402
|
|
|
1813
2403
|
def add_expr_escaped(src, code)
|
|
1814
|
-
src
|
|
2404
|
+
add_expr_literal(src, escaped_expr(code))
|
|
1815
2405
|
end
|
|
1816
2406
|
|
|
1817
2407
|
def add_expr_debug(src, code)
|
|
@@ -1831,6 +2421,14 @@ module Erubis
|
|
|
1831
2421
|
end
|
|
1832
2422
|
|
|
1833
2423
|
|
|
2424
|
+
##
|
|
2425
|
+
## engine for Perl
|
|
2426
|
+
##
|
|
2427
|
+
class Eperl < Basic::Engine
|
|
2428
|
+
include PerlGenerator
|
|
2429
|
+
end
|
|
2430
|
+
|
|
2431
|
+
|
|
1834
2432
|
class EscapedEperl < Eperl
|
|
1835
2433
|
include EscapeEnhancer
|
|
1836
2434
|
end
|
|
@@ -1841,12 +2439,23 @@ module Erubis
|
|
|
1841
2439
|
#end
|
|
1842
2440
|
|
|
1843
2441
|
|
|
2442
|
+
class PI::Eperl < PI::Engine
|
|
2443
|
+
include PerlGenerator
|
|
2444
|
+
|
|
2445
|
+
def init_converter(properties={})
|
|
2446
|
+
@pi = 'perl'
|
|
2447
|
+
super(properties)
|
|
2448
|
+
end
|
|
2449
|
+
|
|
2450
|
+
end
|
|
2451
|
+
|
|
2452
|
+
|
|
1844
2453
|
end
|
|
1845
2454
|
#--end of require 'erubis/engine/eperl'
|
|
1846
2455
|
#--begin of require 'erubis/engine/ejavascript'
|
|
1847
2456
|
##
|
|
1848
|
-
## $Rev:
|
|
1849
|
-
## $Release: 2.0
|
|
2457
|
+
## $Rev: 31 $
|
|
2458
|
+
## $Release: 2.1.0 $
|
|
1850
2459
|
## copyright(c) 2006 kuwata-lab all rights reserved.
|
|
1851
2460
|
##
|
|
1852
2461
|
|
|
@@ -1857,23 +2466,21 @@ end
|
|
|
1857
2466
|
module Erubis
|
|
1858
2467
|
|
|
1859
2468
|
|
|
1860
|
-
|
|
1861
|
-
|
|
1862
|
-
##
|
|
1863
|
-
class Ejavascript < Engine
|
|
2469
|
+
module JavascriptGenerator
|
|
2470
|
+
include Generator
|
|
1864
2471
|
|
|
1865
2472
|
def self.supported_properties() # :nodoc:
|
|
1866
|
-
list =
|
|
2473
|
+
list = []
|
|
1867
2474
|
#list << [:indent, '', "indent spaces (ex. ' ')"]
|
|
1868
2475
|
#list << [:buf, '_buf', "output buffer name"]
|
|
1869
2476
|
return list
|
|
1870
2477
|
end
|
|
1871
2478
|
|
|
1872
|
-
def
|
|
2479
|
+
def init_generator(properties={})
|
|
2480
|
+
super
|
|
2481
|
+
@escapefunc ||= 'escape'
|
|
1873
2482
|
@indent = properties[:indent] || ''
|
|
1874
2483
|
@buf = properties[:out] || '_buf'
|
|
1875
|
-
#@bufclass = properties[:outclass] || 'StringBuffer'
|
|
1876
|
-
super
|
|
1877
2484
|
end
|
|
1878
2485
|
|
|
1879
2486
|
def add_preamble(src)
|
|
@@ -1885,11 +2492,6 @@ module Erubis
|
|
|
1885
2492
|
return text.gsub!(/[\r\n\t"\\]/) { |m| @@table_[m] } || text
|
|
1886
2493
|
end
|
|
1887
2494
|
|
|
1888
|
-
def escaped_expr(code)
|
|
1889
|
-
@escape ||= 'escape'
|
|
1890
|
-
return "#{@escape}(#{code.strip})"
|
|
1891
|
-
end
|
|
1892
|
-
|
|
1893
2495
|
def add_indent(src, indent)
|
|
1894
2496
|
src << (src.empty? || src[-1] == ?\n ? indent : ' ')
|
|
1895
2497
|
end
|
|
@@ -1913,12 +2515,12 @@ module Erubis
|
|
|
1913
2515
|
|
|
1914
2516
|
def add_expr_literal(src, code)
|
|
1915
2517
|
add_indent(src, @indent)
|
|
1916
|
-
|
|
2518
|
+
code.strip!
|
|
2519
|
+
src << "#{@buf}.push(#{code});"
|
|
1917
2520
|
end
|
|
1918
2521
|
|
|
1919
2522
|
def add_expr_escaped(src, code)
|
|
1920
|
-
|
|
1921
|
-
src << @buf << '.push(' << escaped_expr(code) << ');'
|
|
2523
|
+
add_expr_literal(src, escaped_expr(code))
|
|
1922
2524
|
end
|
|
1923
2525
|
|
|
1924
2526
|
def add_expr_debug(src, code)
|
|
@@ -1935,6 +2537,14 @@ module Erubis
|
|
|
1935
2537
|
end
|
|
1936
2538
|
|
|
1937
2539
|
|
|
2540
|
+
##
|
|
2541
|
+
## engine for JavaScript
|
|
2542
|
+
##
|
|
2543
|
+
class Ejavascript < Basic::Engine
|
|
2544
|
+
include JavascriptGenerator
|
|
2545
|
+
end
|
|
2546
|
+
|
|
2547
|
+
|
|
1938
2548
|
class EscapedEjavascript < Ejavascript
|
|
1939
2549
|
include EscapeEnhancer
|
|
1940
2550
|
end
|
|
@@ -1945,6 +2555,17 @@ module Erubis
|
|
|
1945
2555
|
#end
|
|
1946
2556
|
|
|
1947
2557
|
|
|
2558
|
+
class PI::Ejavascript < PI::Engine
|
|
2559
|
+
include JavascriptGenerator
|
|
2560
|
+
|
|
2561
|
+
def init_converter(properties={})
|
|
2562
|
+
@pi = 'js'
|
|
2563
|
+
super(properties)
|
|
2564
|
+
end
|
|
2565
|
+
|
|
2566
|
+
end
|
|
2567
|
+
|
|
2568
|
+
|
|
1948
2569
|
end
|
|
1949
2570
|
#--end of require 'erubis/engine/ejavascript'
|
|
1950
2571
|
|
|
@@ -2043,15 +2664,15 @@ module Erubis
|
|
|
2043
2664
|
|
|
2044
2665
|
## action
|
|
2045
2666
|
action = opts.action
|
|
2046
|
-
action ||= '
|
|
2667
|
+
action ||= 'convert' if opts.source
|
|
2047
2668
|
|
|
2048
2669
|
## lang
|
|
2049
2670
|
lang = opts.lang || 'ruby'
|
|
2050
|
-
action ||= '
|
|
2671
|
+
action ||= 'convert' if opts.lang
|
|
2051
2672
|
|
|
2052
2673
|
## class name of Eruby
|
|
2053
2674
|
classname = opts.class
|
|
2054
|
-
klass = get_classobj(classname, lang)
|
|
2675
|
+
klass = get_classobj(classname, lang, properties[:pi])
|
|
2055
2676
|
|
|
2056
2677
|
## kanji code
|
|
2057
2678
|
$KCODE = opts.kanji if opts.kanji
|
|
@@ -2061,31 +2682,33 @@ module Erubis
|
|
|
2061
2682
|
context = load_yamlfiles(yamlfiles, opts)
|
|
2062
2683
|
|
|
2063
2684
|
## properties for engine
|
|
2685
|
+
properties[:escape] = true if opts.escape && !properties.key?(:escape)
|
|
2064
2686
|
properties[:pattern] = opts.pattern if opts.pattern
|
|
2065
2687
|
properties[:trim] = false if opts.notrim
|
|
2066
2688
|
properties[:preamble] = properties[:postamble] = false if opts.bodyonly
|
|
2689
|
+
properties[:pi] = nil if properties[:pi] == true
|
|
2067
2690
|
|
|
2068
2691
|
## create engine and extend enhancers
|
|
2069
2692
|
engine = klass.new(nil, properties)
|
|
2070
2693
|
enhancers = get_enhancers(opts.enhancers)
|
|
2071
|
-
enhancers.push(Erubis::EscapeEnhancer) if opts.escape
|
|
2694
|
+
#enhancers.push(Erubis::EscapeEnhancer) if opts.escape
|
|
2072
2695
|
enhancers.each do |enhancer|
|
|
2073
2696
|
engine.extend(enhancer)
|
|
2074
2697
|
engine.bipattern = properties[:bipattern] if enhancer == Erubis::BiPatternEnhancer
|
|
2075
2698
|
end
|
|
2076
2699
|
|
|
2077
|
-
##
|
|
2700
|
+
## convert and execute
|
|
2078
2701
|
val = nil
|
|
2079
2702
|
if filenames && !filenames.empty?
|
|
2080
2703
|
filenames.each do |filename|
|
|
2081
2704
|
test(?f, filename) or raise CommandOptionError.new("#{filename}: file not found.")
|
|
2082
2705
|
engine.filename = filename
|
|
2083
|
-
engine.
|
|
2706
|
+
engine.convert!(File.read(filename))
|
|
2084
2707
|
print val if val = do_action(action, engine, context, opts)
|
|
2085
2708
|
end
|
|
2086
2709
|
else
|
|
2087
2710
|
engine.filename = '(stdin)'
|
|
2088
|
-
engine.
|
|
2711
|
+
engine.convert!($stdin.read())
|
|
2089
2712
|
print val if val = do_action(action, engine, context, opts)
|
|
2090
2713
|
end
|
|
2091
2714
|
|
|
@@ -2095,7 +2718,7 @@ module Erubis
|
|
|
2095
2718
|
|
|
2096
2719
|
def do_action(action, engine, context, opts)
|
|
2097
2720
|
case action
|
|
2098
|
-
when '
|
|
2721
|
+
when 'convert'
|
|
2099
2722
|
s = engine.src
|
|
2100
2723
|
when nil, 'exec', 'execute'
|
|
2101
2724
|
s = opts.binding ? engine.result(context) : engine.evaluate(context)
|
|
@@ -2107,42 +2730,61 @@ module Erubis
|
|
|
2107
2730
|
|
|
2108
2731
|
def usage
|
|
2109
2732
|
command = File.basename($0)
|
|
2110
|
-
s = <<
|
|
2111
|
-
erubis - embedded program
|
|
2733
|
+
s = <<END
|
|
2734
|
+
erubis - embedded program converter for multi-language
|
|
2112
2735
|
Usage: #{command} [..options..] [file ...]
|
|
2113
2736
|
-h, --help : help
|
|
2114
2737
|
-v : version
|
|
2115
|
-
-x :
|
|
2738
|
+
-x : converted code
|
|
2116
2739
|
-T : don't trim spaces around '<% %>'
|
|
2117
2740
|
-b : body only (no preamble nor postamble)
|
|
2118
2741
|
-e : escape (equal to '--E Escape')
|
|
2119
2742
|
-p pattern : embedded pattern (default '<% %>')
|
|
2120
|
-
-l lang :
|
|
2121
|
-
-E
|
|
2743
|
+
-l lang : convert but no execute (ruby/php/c/java/scheme/perl/js)
|
|
2744
|
+
-E e1,e2,... : enhancer names (Escape, PercentLine, BiPattern, ...)
|
|
2122
2745
|
-I path : library include path
|
|
2123
2746
|
-K kanji : kanji code (euc/sjis/utf8) (default none)
|
|
2124
2747
|
-f file.yaml : YAML file for context values (read stdin if filename is '-')
|
|
2125
2748
|
-t : expand tab character in YAML file
|
|
2126
2749
|
-S : convert mapping key from string to symbol in YAML file
|
|
2127
2750
|
-B : invoke 'result(binding)' instead of 'evaluate(context)'
|
|
2751
|
+
--pi=name : parse '<?name ... ?>' instead of '<% ... %>'
|
|
2128
2752
|
|
|
2129
2753
|
END
|
|
2754
|
+
#'
|
|
2130
2755
|
# -c class : class name (XmlEruby/PercentLineEruby/...) (default Eruby)
|
|
2131
2756
|
# -r library : require library
|
|
2132
|
-
# -a : action (
|
|
2757
|
+
# -a : action (convert/execute)
|
|
2133
2758
|
return s
|
|
2134
2759
|
end
|
|
2135
2760
|
|
|
2761
|
+
|
|
2762
|
+
def collect_supported_properties(erubis_klass)
|
|
2763
|
+
list = []
|
|
2764
|
+
erubis_klass.ancestors.each do |klass|
|
|
2765
|
+
if klass.respond_to?(:supported_properties)
|
|
2766
|
+
list.concat(klass.supported_properties)
|
|
2767
|
+
end
|
|
2768
|
+
end
|
|
2769
|
+
return list
|
|
2770
|
+
end
|
|
2771
|
+
|
|
2136
2772
|
def show_properties
|
|
2137
2773
|
s = "supported properties:\n"
|
|
2138
|
-
|
|
2139
|
-
|
|
2140
|
-
|
|
2141
|
-
|
|
2142
|
-
|
|
2143
|
-
|
|
2774
|
+
basic_props = collect_supported_properties(Erubis::Basic::Engine)
|
|
2775
|
+
pi_props = collect_supported_properties(Erubis::PI::Engine)
|
|
2776
|
+
list = []
|
|
2777
|
+
common_props = basic_props & pi_props
|
|
2778
|
+
list << ['(common)', common_props]
|
|
2779
|
+
list << ['(basic)', basic_props - common_props]
|
|
2780
|
+
list << ['(pi)', pi_props - common_props]
|
|
2781
|
+
%w[ruby php c java scheme perl javascript].each do |lang|
|
|
2782
|
+
klass = Erubis.const_get("E#{lang}")
|
|
2783
|
+
list << [lang, collect_supported_properties(klass) - basic_props]
|
|
2784
|
+
end
|
|
2785
|
+
list.each do |lang, props|
|
|
2144
2786
|
s << " * #{lang}\n"
|
|
2145
|
-
|
|
2787
|
+
props.each do |name, default_val, desc|
|
|
2146
2788
|
s << (" --%-23s : %s\n" % ["#{name}=#{default_val.inspect}", desc])
|
|
2147
2789
|
end
|
|
2148
2790
|
end
|
|
@@ -2164,7 +2806,7 @@ END
|
|
|
2164
2806
|
end
|
|
2165
2807
|
|
|
2166
2808
|
def version
|
|
2167
|
-
release = ('$Release: 2.0
|
|
2809
|
+
release = ('$Release: 2.1.0 $' =~ /([.\d]+)/) && $1
|
|
2168
2810
|
return release
|
|
2169
2811
|
end
|
|
2170
2812
|
|
|
@@ -2214,27 +2856,42 @@ END
|
|
|
2214
2856
|
return options, context
|
|
2215
2857
|
end
|
|
2216
2858
|
|
|
2217
|
-
|
|
2859
|
+
|
|
2860
|
+
def untabify(str, width=8)
|
|
2861
|
+
list = str.split(/\t/)
|
|
2862
|
+
last = list.pop
|
|
2218
2863
|
sb = ''
|
|
2219
|
-
|
|
2220
|
-
|
|
2221
|
-
|
|
2864
|
+
list.each do |s|
|
|
2865
|
+
column = (n = s.rindex(?\n)) ? s.length - n - 1 : s.length
|
|
2866
|
+
n = width - (column % width)
|
|
2867
|
+
sb << s << (' ' * n)
|
|
2222
2868
|
end
|
|
2223
|
-
|
|
2869
|
+
sb << last
|
|
2870
|
+
return sb
|
|
2224
2871
|
end
|
|
2872
|
+
#--
|
|
2873
|
+
#def untabify(str, width=8)
|
|
2874
|
+
# sb = ''
|
|
2875
|
+
# str.scan(/(.*?)\t/m) do |s, |
|
|
2876
|
+
# len = (n = s.rindex(?\n)) ? s.length - n - 1 : s.length
|
|
2877
|
+
# sb << s << (" " * (width - len % width))
|
|
2878
|
+
# end
|
|
2879
|
+
# return $' ? (sb << $') : str
|
|
2880
|
+
#end
|
|
2881
|
+
#++
|
|
2225
2882
|
|
|
2226
|
-
|
|
2227
|
-
|
|
2228
|
-
|
|
2229
|
-
|
|
2883
|
+
|
|
2884
|
+
def get_classobj(classname, lang, pi)
|
|
2885
|
+
classname ||= "E#{lang}"
|
|
2886
|
+
base_module = pi ? Erubis::PI : Erubis
|
|
2230
2887
|
begin
|
|
2231
|
-
klass =
|
|
2888
|
+
klass = base_module.const_get(classname)
|
|
2232
2889
|
rescue NameError
|
|
2233
2890
|
klass = nil
|
|
2234
2891
|
end
|
|
2235
2892
|
unless klass
|
|
2236
2893
|
if lang
|
|
2237
|
-
msg = "-l #{lang}: invalid language name (class
|
|
2894
|
+
msg = "-l #{lang}: invalid language name (class #{base_module.name}::#{classname} not found)."
|
|
2238
2895
|
else
|
|
2239
2896
|
msg = "-c #{classname}: invalid class name."
|
|
2240
2897
|
end
|
|
@@ -2273,25 +2930,30 @@ END
|
|
|
2273
2930
|
unless ydoc.is_a?(Hash)
|
|
2274
2931
|
raise CommandOptionError.new("#{yamlfile}: root object is not a mapping.")
|
|
2275
2932
|
end
|
|
2276
|
-
|
|
2933
|
+
intern_hash_keys(ydoc) if opts.intern
|
|
2277
2934
|
hash.update(ydoc)
|
|
2278
2935
|
end
|
|
2279
2936
|
context = hash
|
|
2280
2937
|
return context
|
|
2281
2938
|
end
|
|
2282
2939
|
|
|
2283
|
-
def
|
|
2284
|
-
if
|
|
2285
|
-
|
|
2286
|
-
|
|
2287
|
-
|
|
2940
|
+
def intern_hash_keys(obj, done={})
|
|
2941
|
+
return if done.key?(obj.__id__)
|
|
2942
|
+
case obj
|
|
2943
|
+
when Hash
|
|
2944
|
+
done[obj.__id__] = obj
|
|
2945
|
+
obj.keys.each do |key|
|
|
2946
|
+
obj[key.intern] = obj.delete(key) if key.is_a?(String)
|
|
2947
|
+
end
|
|
2948
|
+
obj.values.each do |val|
|
|
2949
|
+
intern_hash_keys(val, done) if val.is_a?(Hash) || val.is_a?(Array)
|
|
2288
2950
|
end
|
|
2289
|
-
|
|
2290
|
-
|
|
2291
|
-
|
|
2951
|
+
when Array
|
|
2952
|
+
done[obj.__id__] = obj
|
|
2953
|
+
obj.each do |val|
|
|
2954
|
+
intern_hash_keys(val, done) if val.is_a?(Hash) || val.is_a?(Array)
|
|
2292
2955
|
end
|
|
2293
2956
|
end
|
|
2294
|
-
return ydoc
|
|
2295
2957
|
end
|
|
2296
2958
|
|
|
2297
2959
|
end
|