class Macros4Cuke::CollWalkerFactory
A Coll(ection)WalkerFactory object is a factory that creates an enumerator that itself walks in the passed macro collection object. The walker performs a depth-first visit and yields visit events.
Constants
- StringNode
Structure used internally by the walker
Public Instance Methods
build_walker(aMacroCollection)
click to toggle source
Factory method. @param aMacroCollection [MacroCollection] The collection of macros
encountered so far
@return [Enumerator]
# File lib/macros4cuke/coll-walker-factory.rb, line 21 def build_walker(aMacroCollection) level = 0 collection = aMacroCollection current_node = collection backlog = collection.macro_steps.values visitor = Enumerator.new do |result_receiver| # argument is a Yielder loop do case current_node when MacroCollection result_receiver << [:on_collection, level, current_node] level += 1 backlog << StringNode.new(:on_collection_end, nil) when MacroStep result_receiver << emit_on_step(current_node, level, backlog) level += 1 when StringNode level -= 1 if current_node.event.to_s =~ /_end$/ event = [current_node.event, level, current_node.text] event << current_node.extra unless current_node.extra.nil? result_receiver << event when Templating::Engine result_receiver << emit_on_renderer(current_node, level, backlog) level += 1 when Templating::StaticText result_receiver << [:on_static_text, level, current_node.source] when Templating::Comment result_receiver << [:on_comment, level, current_node.source] when Templating::EOLine result_receiver << [:on_eol, level, nil] when Templating::Placeholder result_receiver << [:on_placeholder, level, current_node.name] when Templating::Section result_receiver << emit_on_section(current_node, level, backlog) level += 1 else err_msg = "Don't know how to format a #{current_node.class}." raise(InternalError, err_msg) end current_node = backlog.shift break if current_node.nil? end end return visitor end
Private Instance Methods
add_children(anEnumerable, theBacklog)
click to toggle source
Add children elements to the visit backlog
# File lib/macros4cuke/coll-walker-factory.rb, line 82 def add_children(anEnumerable, theBacklog) anEnumerable.reverse_each do |elem| theBacklog.unshift(elem) end end
emit_on_renderer(current_node, nesting_level, backlog)
click to toggle source
Generate an on_renderer event
# File lib/macros4cuke/coll-walker-factory.rb, line 100 def emit_on_renderer(current_node, nesting_level, backlog) backlog.unshift(StringNode.new(:on_renderer_end, nil)) add_children(current_node.representation, backlog) backlog.unshift(StringNode.new(:on_source, current_node.source)) return [:on_renderer, nesting_level, current_node] end
emit_on_section(current_node, nesting_level, backlog)
click to toggle source
Generate an on_section event
# File lib/macros4cuke/coll-walker-factory.rb, line 109 def emit_on_section(current_node, nesting_level, backlog) backlog.unshift(StringNode.new(:on_section_end, nil)) add_children(current_node.children, backlog) return [:on_section, nesting_level, current_node.name] end
emit_on_step(current_node, nesting_level, backlog)
click to toggle source
Generate an on_step event
# File lib/macros4cuke/coll-walker-factory.rb, line 89 def emit_on_step(current_node, nesting_level, backlog) backlog.unshift(StringNode.new(:on_step_end, nil)) backlog.unshift(current_node.renderer) # Does the step use a table argument? use_table = current_node.key =~ /_T$/ ? true : false backlog.unshift(StringNode.new(:on_phrase, current_node.phrase, use_table)) return [:on_step, nesting_level, current_node] end