diff --git a/lib/oga/xpath/compiler.rb b/lib/oga/xpath/compiler.rb index e8ecc13..ddd0411 100644 --- a/lib/oga/xpath/compiler.rb +++ b/lib/oga/xpath/compiler.rb @@ -376,6 +376,32 @@ module Oga end end + # @param [AST::Node] ast + # @param [Oga::Ruby::Node] input + # @return [Oga::Ruby::Node] + def on_axis_preceding(ast, input, &block) + orig_input = original_input_literal + root = literal('root') + node = node_literal + doc_node = literal('doc_node') + + root_assign = orig_input.is_a?(XML::Node) + .if_true { root.assign(orig_input.root_node) } + .else { root.assign(orig_input) } + + each_node = root.each_node.add_block(doc_node) do + compare = doc_node.eq(input).if_true { send_message(:break) } + + match = backup_variable(node, doc_node) do + process(ast, node, &block).if_true { yield node } + end + + compare.followed_by(match) + end + + root_assign.followed_by(each_node) + end + # @param [AST::Node] ast # @param [Oga::Ruby::Node] input # @return [Oga::Ruby::Node]