Class: Hivemind::Renderer

Inherits:
Object
  • Object
show all
Defined in:
lib/hivemind/renderer.rb

Instance Method Summary collapse

Constructor Details

#initialize(tree, syntax) ⇒ Renderer

Returns a new instance of Renderer.



32
33
34
35
# File 'lib/hivemind/renderer.rb', line 32

def initialize(tree, syntax)
  @tree, @syntax = tree, syntax
  @rules = BASE_RULES.merge(Syntax.load_rules(syntax))
end

Instance Method Details

#offset(depth = 0) ⇒ Object



41
42
43
# File 'lib/hivemind/renderer.rb', line 41

def offset(depth = 0)
  '    ' * depth
end

#render(depth = 0) ⇒ Object



37
38
39
# File 'lib/hivemind/renderer.rb', line 37

def render(depth = 0)
  render_element(@tree, depth).gsub(/\n\n+/, "\n\n").gsub(/\)\s+\)/, '))').gsub(/\}\s+\}/, '}}')
end

#render_element(element, depth = 0) ⇒ Object



45
46
47
48
49
50
51
52
53
54
# File 'lib/hivemind/renderer.rb', line 45

def render_element(element, depth = 0)
  rule = @rules[element.class.name.split('::').last.downcase.gsub('attributeassign', 'attribute_assign').gsub('statement', '_statement').to_sym]
  depth += 1 if element.class.name.end_with?('MethodStatement')
  # p "for #{element.class.name.split('::').last.downcase.gsub('statement', '_statement').to_sym} #{depth}"
  offset(depth) + if rule.is_a?(String)
    render_template rule, element, depth
  elsif rule.is_a?(Proc)
    instance_exec element, depth, &rule
  end
end

#render_template(plan, element, depth = 0) ⇒ Object



56
57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/hivemind/renderer.rb', line 56

def render_template(plan, element, depth = 0)
  plan = plan.gsub(/\<\<([a-zA-Z_]+)\:'([^\']*)'\>\>/) do
    element.send(Regexp.last_match[1]).map(&method(:render_element)).join(Regexp.last_match[2])
  end
  # p plan
  plan = plan.gsub(/\<\<([a-zA-Z_]+)\>\>/) do
    element.send(Regexp.last_match[1]).map { |e| render_element(e, depth) }.join("\n")
  end
  p plan
  plan = plan.gsub(/\<([a-zA-Z_]+)\>/) do
    render_element(element.send(Regexp.last_match[1]))
  end
  plan
end