Class: Macros4Cuke::CollWalkerFactory
- Inherits:
-
Object
- Object
- Macros4Cuke::CollWalkerFactory
- Defined in:
- lib/macros4cuke/coll-walker-factory.rb
Overview
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.
Defined Under Namespace
Classes: StringNode
Instance Method Summary collapse
-
#build_walker(aMacroCollection) ⇒ Enumerator
Factory method.
Instance Method Details
#build_walker(aMacroCollection) ⇒ Enumerator
Factory method.
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
# 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 |