erb.rb 1.4 KB
Newer Older
J
Jeremy Kemper 已提交
1
require 'active_support/core_ext/class/attribute_accessors'
2 3
require 'active_support/core_ext/string/output_safety'
require 'erubis'
4

5 6
module ActionView
  module TemplateHandlers
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
    class Erubis < ::Erubis::Eruby
      def add_preamble(src)
        src << "@output_buffer = ActionView::SafeBuffer.new;"
      end

      def add_text(src, text)
        src << "@output_buffer << ('" << escape_text(text) << "'.html_safe!);"
      end

      def add_expr_literal(src, code)
        src << '@output_buffer << ((' << code << ').to_s);'
      end

      def add_expr_escaped(src, code)
        src << '@output_buffer << ' << escaped_expr(code) << ';'
      end

      def add_postamble(src)
        src << '@output_buffer.to_s'
      end
    end

29
    class ERB < TemplateHandler
30 31
      include Compilable

P
Pratik Naik 已提交
32 33
      ##
      # :singleton-method:
34 35 36 37 38
      # Specify trim mode for the ERB compiler. Defaults to '-'.
      # See ERb documentation for suitable values.
      cattr_accessor :erb_trim_mode
      self.erb_trim_mode = '-'

39
      self.default_format = Mime::HTML
40 41 42
      
      cattr_accessor :erubis_implementation
      self.erubis_implementation = Erubis
43

44
      def compile(template)
45
        magic = $1 if template.source =~ /\A(<%#.*coding[:=]\s*(\S+)\s*-?%>)/
46
        erb = "#{magic}<% __in_erb_template=true %>#{template.source}"
47
        self.class.erubis_implementation.new(erb, :trim=>(self.class.erb_trim_mode == "-")).src
48 49 50 51
      end
    end
  end
end