class Liquid::ParseTreeVisitor

Public Class Methods

for(node, callbacks = Hash.new(proc {})) click to toggle source
# File lib/liquid/parse_tree_visitor.rb, line 5
def self.for(node, callbacks = Hash.new(proc {}))
  if defined?(node.class::ParseTreeVisitor)
    node.class::ParseTreeVisitor
  else
    self
  end.new(node, callbacks)
end
new(node, callbacks) click to toggle source
# File lib/liquid/parse_tree_visitor.rb, line 13
def initialize(node, callbacks)
  @node = node
  @callbacks = callbacks
end

Public Instance Methods

add_callback_for(*classes) { |node| ... } click to toggle source
# File lib/liquid/parse_tree_visitor.rb, line 18
def add_callback_for(*classes, &block)
  callback = block
  callback = ->(node, _) { yield node } if block.arity.abs == 1
  callback = ->(_, _) { yield } if block.arity.zero?
  classes.each { |klass| @callbacks[klass] = callback }
  self
end
visit(context = nil) click to toggle source
# File lib/liquid/parse_tree_visitor.rb, line 26
def visit(context = nil)
  children.map do |node|
    item, new_context = @callbacks[node.class].call(node, context)
    [
      item,
      ParseTreeVisitor.for(node, @callbacks).visit(new_context || context)
    ]
  end
end

Protected Instance Methods

children() click to toggle source
# File lib/liquid/parse_tree_visitor.rb, line 38
def children
  @node.respond_to?(:nodelist) ? Array(@node.nodelist) : []
end