summaryrefslogtreecommitdiff
path: root/lib/erubis/engine/javascript.rb
blob: b5958b2a063994daf1e7eac5c2b6186f7c262f8a (plain)
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