require 'liquid'
require 'extras/liquid_view'

# LiquidView is a action view extension class. You can register it with rails
# and use liquid as an template system for .liquid files
#
# PATCHED to work with Rails 2.2.2 and Liquid Gem 1.9.0
# see here; http://groups.google.com/group/liquid-templates/msg/b58ebd9b358e4672
# -- matthewhutchinson.net

class LiquidView

def initialize(action_view)
@action_view = action_view
end

def self.call(template)
"LiquidView.new(self).render(template, local_assigns)"
end

def render(template, local_assigns_for_rails_less_than_2_1_0 = nil)
@action_view.controller.headers["Content-Type"] ||= 'text/html; charset=utf-8'
assigns = @action_view.assigns.dup

# template is a Template object in Rails >=2.1.0, a source string previously.
if template.respond_to? :source
source = template.source
local_assigns = local_assigns_for_rails_less_than_2_1_0
local_assigns = template.locals if template.respond_to? :locals
else
source = template
local_assigns = local_assigns_for_rails_less_than_2_1_0
end

if content_for_layout = @action_view.instance_variable_get("@content_for_layout")
assigns['content_for_layout'] = content_for_layout
end
assigns.merge!(local_assigns)

liquid = Liquid::Template.parse(source)
liquid.render(assigns, :filters => [@action_view.controller.master_helper_module], :registers => {:action_view => @action_view, :controller => @action_view.controller})
end

def compilable?
false
end

end

# register template handler
ActionView::Template.register_template_handler(:liquid, LiquidView)