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
Instance Method Details
#build_walker(aMacroCollection) ⇒ Object
17 18 19 20 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 |
# File 'lib/macros4cuke/coll-walker-factory.rb', line 17 def build_walker(aMacroCollection) level = 0 collection = aMacroCollection current_node = collection backlog = collection.macro_steps.values visitor = Enumerator.new do |result_receiver| # 'result_receiver' 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}." fail(InternalError, err_msg) end current_node = backlog.shift break if current_node.nil? end end return visitor end |