123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- require 'tilt/template'
- module Tilt
- # ERB template implementation. See:
- # http://www.ruby-doc.org/stdlib/libdoc/erb/rdoc/classes/ERB.html
- class ERBTemplate < Template
- @@default_output_variable = '_erbout'
- def self.default_output_variable
- @@default_output_variable
- end
- def self.default_output_variable=(name)
- @@default_output_variable = name
- end
- def self.engine_initialized?
- defined? ::ERB
- end
- def initialize_engine
- require_template_library 'erb'
- end
- def prepare
- @outvar = options[:outvar] || self.class.default_output_variable
- options[:trim] = '<>' if options[:trim].nil? || options[:trim] == true
- @engine = ::ERB.new(data, options[:safe], options[:trim], @outvar)
- end
- def precompiled_template(locals)
- source = @engine.src
- source
- end
- def precompiled_preamble(locals)
- <<-RUBY
- begin
- __original_outvar = #{@outvar} if defined?(#{@outvar})
- #{super}
- RUBY
- end
- def precompiled_postamble(locals)
- <<-RUBY
- #{super}
- ensure
- #{@outvar} = __original_outvar
- end
- RUBY
- end
- # ERB generates a line to specify the character coding of the generated
- # source in 1.9. Account for this in the line offset.
- if RUBY_VERSION >= '1.9.0'
- def precompiled(locals)
- source, offset = super
- [source, offset + 1]
- end
- end
- end
- # Erubis template implementation. See:
- # http://www.kuwata-lab.com/erubis/
- #
- # ErubisTemplate supports the following additional options, which are not
- # passed down to the Erubis engine:
- #
- # :engine_class allows you to specify a custom engine class to use
- # instead of the default (which is ::Erubis::Eruby).
- #
- # :escape_html when true, ::Erubis::EscapedEruby will be used as
- # the engine class instead of the default. All content
- # within <%= %> blocks will be automatically html escaped.
- class ErubisTemplate < ERBTemplate
- def self.engine_initialized?
- defined? ::Erubis
- end
- def initialize_engine
- require_template_library 'erubis'
- end
- def prepare
- @outvar = options.delete(:outvar) || self.class.default_output_variable
- @options.merge!(:preamble => false, :postamble => false, :bufvar => @outvar)
- engine_class = options.delete(:engine_class)
- engine_class = ::Erubis::EscapedEruby if options.delete(:escape_html)
- @engine = (engine_class || ::Erubis::Eruby).new(data, options)
- end
- def precompiled_preamble(locals)
- [super, "#{@outvar} = _buf = ''"].join("\n")
- end
- def precompiled_postamble(locals)
- [@outvar, super].join("\n")
- end
- # Erubis doesn't have ERB's line-off-by-one under 1.9 problem.
- # Override and adjust back.
- if RUBY_VERSION >= '1.9.0'
- def precompiled(locals)
- source, offset = super
- [source, offset - 1]
- end
- end
- end
- end
|