12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- require 'tilt/template'
- module Tilt
- # Haml template implementation. See:
- # http://haml.hamptoncatlin.com/
- class HamlTemplate < Template
- self.default_mime_type = 'text/html'
- def self.engine_initialized?
- defined? ::Haml::Engine
- end
- def initialize_engine
- require_template_library 'haml'
- end
- def prepare
- options = @options.merge(:filename => eval_file, :line => line)
- @engine = ::Haml::Engine.new(data, options)
- end
- def evaluate(scope, locals, &block)
- if @engine.respond_to?(:precompiled_method_return_value, true)
- super
- else
- @engine.render(scope, locals, &block)
- end
- end
- # Precompiled Haml source. Taken from the precompiled_with_ambles
- # method in Haml::Precompiler:
- # http://github.com/nex3/haml/blob/master/lib/haml/precompiler.rb#L111-126
- def precompiled_template(locals)
- @engine.precompiled
- end
- def precompiled_preamble(locals)
- local_assigns = super
- @engine.instance_eval do
- <<-RUBY
- begin
- extend Haml::Helpers
- _hamlout = @haml_buffer = Haml::Buffer.new(@haml_buffer, #{options_for_buffer.inspect})
- _erbout = _hamlout.buffer
- __in_erb_template = true
- _haml_locals = locals
- #{local_assigns}
- RUBY
- end
- end
- def precompiled_postamble(locals)
- @engine.instance_eval do
- <<-RUBY
- #{precompiled_method_return_value}
- ensure
- @haml_buffer = @haml_buffer.upper
- end
- RUBY
- end
- end
- end
- end
|