51 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Ruby
		
	
	
	
			
		
		
	
	
			51 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Ruby
		
	
	
	
# LiquidView is a action view extension class. You can register it with rails
 | 
						|
# and use liquid as an template system for .liquid files
 | 
						|
#
 | 
						|
# Example
 | 
						|
# 
 | 
						|
#   ActionView::Base::register_template_handler :liquid, LiquidView
 | 
						|
class LiquidView
 | 
						|
  PROTECTED_ASSIGNS = %w( template_root response _session template_class action_name request_origin session template
 | 
						|
                          _response url _request _cookies variables_added _flash params _headers request cookies
 | 
						|
                          ignore_missing_templates flash _params logger before_filter_chain_aborted headers )
 | 
						|
  PROTECTED_INSTANCE_VARIABLES = %w( @_request @controller @_first_render @_memoized__pick_template @view_paths 
 | 
						|
                                     @helpers @assigns_added @template @_render_stack @template_format @assigns )
 | 
						|
  
 | 
						|
  def self.call(template)
 | 
						|
    "LiquidView.new(self).render(template, local_assigns)"
 | 
						|
  end
 | 
						|
 | 
						|
  def initialize(view)
 | 
						|
    @view = view
 | 
						|
  end
 | 
						|
  
 | 
						|
  def render(template, local_assigns = nil)
 | 
						|
    @view.controller.headers["Content-Type"] ||= 'text/html; charset=utf-8'
 | 
						|
    
 | 
						|
    # Rails 2.2 Template has source, but not locals
 | 
						|
    if template.respond_to?(:source) && !template.respond_to?(:locals)
 | 
						|
      assigns = (@view.instance_variables - PROTECTED_INSTANCE_VARIABLES).inject({}) do |hash, ivar|
 | 
						|
                  hash[ivar[1..-1]] = @view.instance_variable_get(ivar)
 | 
						|
                  hash
 | 
						|
                end
 | 
						|
    else
 | 
						|
      assigns = @view.assigns.reject{ |k,v| PROTECTED_ASSIGNS.include?(k) }
 | 
						|
    end
 | 
						|
    
 | 
						|
    source = template.respond_to?(:source) ? template.source : template
 | 
						|
    local_assigns = (template.respond_to?(:locals) ? template.locals : local_assigns) || {}
 | 
						|
    
 | 
						|
    if content_for_layout = @view.instance_variable_get("@content_for_layout")
 | 
						|
      assigns['content_for_layout'] = content_for_layout
 | 
						|
    end
 | 
						|
    assigns.merge!(local_assigns.stringify_keys)
 | 
						|
    
 | 
						|
    liquid = Liquid::Template.parse(source)
 | 
						|
    liquid.render(assigns, :filters => [@view.controller.master_helper_module], :registers => {:action_view => @view, :controller => @view.controller})
 | 
						|
  end
 | 
						|
 | 
						|
  def compilable?
 | 
						|
    false
 | 
						|
  end
 | 
						|
 | 
						|
end |