From d08f65118cc328de5493a68db33a155487f5fceb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Valim?= Date: Sun, 1 May 2011 10:33:30 +0200 Subject: Start abstracting the renderer. --- actionpack/lib/action_view/renderer/renderer.rb | 70 +++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 actionpack/lib/action_view/renderer/renderer.rb (limited to 'actionpack/lib/action_view/renderer/renderer.rb') diff --git a/actionpack/lib/action_view/renderer/renderer.rb b/actionpack/lib/action_view/renderer/renderer.rb new file mode 100644 index 0000000000..f0ee103d80 --- /dev/null +++ b/actionpack/lib/action_view/renderer/renderer.rb @@ -0,0 +1,70 @@ +module ActionView + # This is the main entry point for rendering. It basically delegates + # to other objects like TemplateRenderer and PartialRenderer which + # actually renders the template. + class Renderer + attr_accessor :lookup_context + + # TODO: render_context should not be an initialization parameter + def initialize(lookup_context, render_context) + @render_context = render_context + @lookup_context = lookup_context + @view_flow = OutputFlow.new + end + + # Returns the result of a render that's dictated by the options hash. The primary options are: + # + # * :partial - See ActionView::Partials. + # * :file - Renders an explicit template file (this used to be the old default), add :locals to pass in those. + # * :inline - Renders an inline template similar to how it's done in the controller. + # * :text - Renders the text passed in out. + # + # If no options hash is passed or :update specified, the default is to render a partial and use the second parameter + # as the locals hash. + def render(options = {}, locals = {}, &block) + case options + when Hash + if block_given? + _render_partial(options.merge(:partial => options[:layout]), &block) + elsif options.key?(:partial) + _render_partial(options) + else + _render_template(options) + end + else + _render_partial(:partial => options, :locals => locals) + end + end + + # Render but returns a valid Rack body. If fibers are defined, we return + # a streaming body that renders the template piece by piece. + # + # Note that partials are not supported to be rendered with streaming, + # so in such cases, we just wrap them in an array. + def render_body(options) + if options.key?(:partial) + [_render_partial(options)] + else + StreamingTemplateRenderer.new(@render_context, @lookup_context).render(options) + end + end + + private + + def _render_template(options) #:nodoc: + _template_renderer.render(options) + end + + def _template_renderer #:nodoc: + @_template_renderer ||= TemplateRenderer.new(@render_context, @lookup_context) + end + + def _render_partial(options, &block) #:nodoc: + _partial_renderer.setup(options, block).render + end + + def _partial_renderer #:nodoc: + @_partial_renderer ||= PartialRenderer.new(@render_context, @lookup_context) + end + end +end \ No newline at end of file -- cgit v1.2.3