~ubuntu-branches/ubuntu/saucy/ruby-erubis/saucy

« back to all changes in this revision

Viewing changes to lib/erubis/engine/escheme.rb

  • Committer: Package Import Robot
  • Author(s): Laurent Bigonville
  • Date: 2012-01-26 15:15:58 UTC
  • Revision ID: package-import@ubuntu.com-20120126151558-9u7mnf9ooqnw3bwz
Tags: upstream-2.7.0
ImportĀ upstreamĀ versionĀ 2.7.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
##
 
2
## $Release: 2.7.0 $
 
3
## copyright(c) 2006-2011 kuwata-lab.com all rights reserved.
 
4
##
 
5
 
 
6
require 'erubis/engine'
 
7
require 'erubis/enhancer'
 
8
 
 
9
 
 
10
module Erubis
 
11
 
 
12
 
 
13
  module SchemeGenerator
 
14
    include Generator
 
15
 
 
16
    def self.supported_properties()  # :nodoc:
 
17
      return [
 
18
              [:func,  '_add',   "function name (ex. 'display')"],
 
19
              ]
 
20
    end
 
21
 
 
22
    def init_generator(properties={})
 
23
      super
 
24
      @escapefunc ||= 'escape'
 
25
      @func = properties[:func] || '_add'   # or 'display'
 
26
    end
 
27
 
 
28
    def add_preamble(src)
 
29
      return unless @func == '_add'
 
30
      src << "(let ((_buf '())) " + \
 
31
               "(define (_add x) (set! _buf (cons x _buf))) "
 
32
      #src << "(let* ((_buf '())" + \
 
33
      #             " (_add (lambda (x) (set! _buf (cons x _buf))))) "
 
34
    end
 
35
 
 
36
    def escape_text(text)
 
37
      @table_ ||= { '"'=>'\\"', '\\'=>'\\\\' }
 
38
      text.gsub!(/["\\]/) { |m| @table_[m] }
 
39
      return text
 
40
    end
 
41
 
 
42
    def escaped_expr(code)
 
43
      code.strip!
 
44
      return "(#{@escapefunc} #{code})"
 
45
    end
 
46
 
 
47
    def add_text(src, text)
 
48
      return if text.empty?
 
49
      t = escape_text(text)
 
50
      if t[-1] == ?\n
 
51
        t[-1, 1] = ''
 
52
        src << "(#{@func} \"" << t << "\\n\")\n"
 
53
      else
 
54
        src << "(#{@func} \"" << t << '")'
 
55
      end
 
56
    end
 
57
 
 
58
    def add_stmt(src, code)
 
59
      src << code
 
60
    end
 
61
 
 
62
    def add_expr_literal(src, code)
 
63
      code.strip!
 
64
      src << "(#{@func} #{code})"
 
65
    end
 
66
 
 
67
    def add_expr_escaped(src, code)
 
68
      add_expr_literal(src, escaped_expr(code))
 
69
    end
 
70
 
 
71
    def add_expr_debug(src, code)
 
72
      s = (code.strip! || code).gsub(/\"/, '\\"')
 
73
      src << "(display \"*** debug: #{s}=\")(display #{code.strip})(display \"\\n\")"
 
74
    end
 
75
 
 
76
    def add_postamble(src)
 
77
      return unless @func == '_add'
 
78
      src << "\n" unless src[-1] == ?\n
 
79
      src << "  (reverse _buf))\n"
 
80
    end
 
81
 
 
82
  end
 
83
 
 
84
 
 
85
  ##
 
86
  ## engine for Scheme
 
87
  ##
 
88
  class Escheme < Basic::Engine
 
89
    include SchemeGenerator
 
90
  end
 
91
 
 
92
 
 
93
  class EscapedEscheme < Escheme
 
94
    include EscapeEnhancer
 
95
  end
 
96
 
 
97
 
 
98
  #class XmlEscheme < Escheme
 
99
  #  include EscapeEnhancer
 
100
  #end
 
101
 
 
102
 
 
103
  class PI::Escheme < PI::Engine
 
104
    include SchemeGenerator
 
105
 
 
106
    def init_converter(properties={})
 
107
      @pi = 'scheme'
 
108
      super(properties)
 
109
    end
 
110
 
 
111
  end
 
112
 
 
113
 
 
114
end