mirror of
https://github.com/kemko/liquid.git
synced 2026-01-03 08:45:42 +03:00
* Add ForceEqualSignAlignment to .rubocop.yml * Revert ForceEqualSignAlignment cop * Update method alignment * Undo addition of whitespace to improve readability * Fix missing alignment
43 lines
1020 B
Ruby
43 lines
1020 B
Ruby
# frozen_string_literal: true
|
|
|
|
module Liquid
|
|
class ParseTreeVisitor
|
|
def self.for(node, callbacks = Hash.new(proc {}))
|
|
if defined?(node.class::ParseTreeVisitor)
|
|
node.class::ParseTreeVisitor
|
|
else
|
|
self
|
|
end.new(node, callbacks)
|
|
end
|
|
|
|
def initialize(node, callbacks)
|
|
@node = node
|
|
@callbacks = callbacks
|
|
end
|
|
|
|
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
|
|
|
|
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
|
|
|
|
def children
|
|
@node.respond_to?(:nodelist) ? Array(@node.nodelist) : []
|
|
end
|
|
end
|
|
end
|