1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
|
##
## $Rev$
## $Release$
## $Copyright$
##
require 'erubis/engine'
require 'erubis/enhancer'
module Erubis
##
## engine for JavaScript
##
class Ejavascript < Engine
def self.supported_properties() # :nodoc:
list = super
#list << [:indent, '', "indent spaces (ex. ' ')"]
#list << [:out, '_out', "output buffer name"]
return list
end
def initialize(input, properties={})
@indent = properties[:indent] || ''
@out = properties[:out] || '_out'
#@outclass = properties[:outclass] || 'StringBuffer'
super
end
def add_preamble(src)
src << "#{@indent}var #{@out} = [];"
end
def escape_text(text)
@@table_ ||= { "\r"=>"\\r", "\n"=>"\\n\\\n", "\t"=>"\\t", '"'=>'\\"', "\\"=>"\\\\" }
return text.gsub!(/[\r\n\t"\\]/) { |m| @@table_[m] } || text
end
#--
#def escaped_expr(code)
# @escape ||= 'escape'
# return "#{@escape}(#{code.strip})"
#end
#++
def add_indent(src, indent)
src << (src.empty? || src[-1] == ?\n ? indent : ' ')
end
def add_text(src, text)
return if text.empty?
add_indent(src, @indent)
src << @out << '.push("'
s = escape_text(text)
if s[-1] == ?\n
s[-2, 2] = ''
src << s << "\");\n"
else
src << s << "\");"
end
end
def add_stmt(src, code)
src << code
end
def add_expr_literal(src, code)
add_indent(src, @indent)
src << @out << '.push(' << code.strip << ');'
end
def add_expr_escaped(src, code)
add_indent(src, @indent)
src << @out << '.push(' << escaped_expr(code) << ');'
end
def add_expr_debug(src, code)
add_indent(src, @indent)
code.strip!
src << "alert(\"*** debug: #{code}=\"+(#{code}));"
end
def add_postamble(src)
src << "\n" if src[-1] == ?;
src << @indent << 'document.write(' << @out << ".join(\"\"));\n"
end
end
class EscapedEjavascript < Ejavascript
include EscapeEnhancer
end
#class XmlEjavascript < Ejavascript
# include EscapeEnhancer
#end
end
|