require 'haml/engine' require 'rubygems' require 'active_support' require 'action_view' module Haml # This class interfaces with ActionView # to make Haml usable as a Ruby on Rails plugin. # It usually shouldn't need to be used by end users. # Just in case, though, here's what you might do to render # templates/index.haml: # # ActionView::Base.register_template_handler("haml", Haml::Template) # base = ActionView::Base.new("templates") # base.render("index") # # Or, if you want to really get into the nitty-gritty: # # base = ActionView::Base.new # template = Haml::Template.new(base) # template.render("templates/index.haml") # class Template class << self @@options = {} # Gets various options for Haml. See README for details. def options @@options end # Sets various options for Haml. See README for details. def options=(value) @@options = value end end # Creates a new Haml::Template object that uses view # to render its templates. def initialize(view) @view = view end # Renders the file at the location template, # with local_assigns available as local variables within the template. # Returns the result as a string. def render(template, local_assigns={}) @view.send(:evaluate_assigns) options = @@options.dup yield_proc = @view.instance_eval do proc { |*name| instance_variable_get("@content_for_#{name.first || 'layout'}") } end return Haml::Engine.new(template, options).to_html(@view, local_assigns, &yield_proc) if @view.haml_inline options[:filename] ||= template Haml::Engine.new(File.read(template), options).to_html(@view, local_assigns, &yield_proc) end end end # This module refers to the ActionView module that's part of Ruby on Rails. # Haml can be used as an alternate templating engine for it, # and includes several modifications to make it more Haml-friendly. # The documentation can be found # here[http://rubyonrails.org/api/classes/ActionView/Base.html]. module ActionView class Base # :nodoc: attr :haml_inline alias_method :read_template_file_old, :read_template_file def read_template_file(template_path, extension) if extension =~ /haml/i template_path else read_template_file_old(template_path, extension) end end alias_method :render_template_old, :render_template def render_template(template_extension, template, file_path = nil, local_assigns = {}) @haml_inline = !template.nil? render_template_old(template_extension, template, file_path, local_assigns) end end end