XPath compiler support for local-name()
This commit is contained in:
parent
49a7c2c782
commit
25e2f57a8d
|
@ -846,6 +846,20 @@ module Oga
|
||||||
block_given? ? ast : ast.followed_by(matched)
|
block_given? ? ast : ast.followed_by(matched)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# @param [Oga::Ruby::Node] input
|
||||||
|
# @param [AST::Node] arg
|
||||||
|
# @return [Oga::Ruby::Node]
|
||||||
|
def on_call_local_name(input, arg = nil)
|
||||||
|
first_node_or_argument(input, arg) do |arg_var|
|
||||||
|
arg_var
|
||||||
|
.if_true do
|
||||||
|
ensure_element_or_attribute(arg_var)
|
||||||
|
.followed_by { block_given? ? yield : arg_var.name }
|
||||||
|
end
|
||||||
|
.else { string('') }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
##
|
##
|
||||||
# Delegates type tests to specific handlers.
|
# Delegates type tests to specific handlers.
|
||||||
#
|
#
|
||||||
|
@ -918,6 +932,13 @@ module Oga
|
||||||
Ruby::Node.new(:send, [nil, name.to_s, *args])
|
Ruby::Node.new(:send, [nil, name.to_s, *args])
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# @param [Class] klass
|
||||||
|
# @param [String] message
|
||||||
|
# @return [Oga::Ruby::Node]
|
||||||
|
def raise_message(klass, message)
|
||||||
|
send_message(:raise, literal(klass), string(message))
|
||||||
|
end
|
||||||
|
|
||||||
# @return [Oga::Ruby::Node]
|
# @return [Oga::Ruby::Node]
|
||||||
def nil
|
def nil
|
||||||
@nil ||= literal(:nil)
|
@nil ||= literal(:nil)
|
||||||
|
@ -987,6 +1008,24 @@ module Oga
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# @param [Oga::Ruby::Node] input
|
||||||
|
# @return [Oga::Ruby::Node]
|
||||||
|
def ensure_element_or_attribute(input)
|
||||||
|
element_or_attribute(input).not.if_true do
|
||||||
|
raise_message(TypeError, 'argument is not an Element or Attribute')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# @param [Oga::Ruby::Node] input
|
||||||
|
# @param [AST::Ruby] arg
|
||||||
|
# @return [Oga::Ruby::Node]
|
||||||
|
def first_node_or_argument(input, arg = nil)
|
||||||
|
arg_ast = arg ? try_match_first_node(arg, input) : input
|
||||||
|
arg_var = unique_literal(:first_node_or_argument)
|
||||||
|
|
||||||
|
arg_var.assign(arg_ast).followed_by { yield arg_var }
|
||||||
|
end
|
||||||
|
|
||||||
##
|
##
|
||||||
# Generates the code for an operator.
|
# Generates the code for an operator.
|
||||||
#
|
#
|
||||||
|
|
Loading…
Reference in New Issue