hiptest/hiptest-publisher

View on GitHub
lib/hiptest-publisher/renderer.rb

Summary

Maintainability
A
35 mins
Test Coverage
require 'ruby-handlebars'

require 'hiptest-publisher/nodes_walker'
require 'hiptest-publisher/render_context_maker'

module Hiptest
  class Renderer < Hiptest::Nodes::Walker
    attr_reader :rendered
    include RenderContextMaker

    def self.render(node, context)
      renderer = self.new(context)
      context.renderer_addons.each do |addon|
        renderer.singleton_class.include(addon)
      end
      renderer.walk_node(node)
      renderer.rendered[node]
    end

    def initialize(context)
      @rendered = {}
      @context = context
      @template_finder = context.template_finder
    end

    def call_node_walker(node)
      if node.is_a? Hiptest::Nodes::Node
        @rendered_children = {}

        node.children.each do |name, child| 
          @rendered_children[name] = @rendered[child]

          @rendered_children[name].uniq! if name == :actionwords && @rendered_children[name].is_a?(Array)
        end
        @rendered[node] = render_node(node, super(node))
      elsif node.is_a? Array
        @rendered[node] = node.map {|item| @rendered[item]}
      else
        @rendered[node] = node
      end
    end

    def render_node(node, render_context)
      render_context ||= {}
      render_context[:node] = node
      render_context[:rendered_children] = @rendered_children
      render_context[:context] = @context

      @template_finder.get_compiled_handlebars(node.kind).call(render_context)
    end
  end
end