Class: Hivemind::Renderer
- Inherits:
-
Object
- Object
- Hivemind::Renderer
- Defined in:
- lib/hivemind/renderer.rb
Instance Method Summary collapse
-
#initialize(tree, syntax) ⇒ Renderer
constructor
A new instance of Renderer.
- #offset(depth = 0) ⇒ Object
- #render(depth = 0) ⇒ Object
- #render_element(element, depth = 0) ⇒ Object
- #render_template(plan, element, depth = 0) ⇒ Object
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 |