funcall(name, *args)
click to toggle source
def funcall(name, *args)
begin
send('f_' + name.tr('-', '_'), *args)
rescue Object::NameError
if $@[0] == "#{__FILE__}:#{__LINE__-2}:in `send'" then
raise XPath::NameError, "undefined function `#{name}'"
end
raise
rescue Object::ArgumentError
if $@[1] == "#{__FILE__}:#{__LINE__-7}:in `send'" then
raise XPath::ArgumentError, "#{$!} for `#{name}'"
end
raise
end
end
get_namespace(prefix)
click to toggle source
def get_namespace(prefix)
ret = @namespaces[prefix] || PredefinedNamespace[prefix]
raise XPath::Error, "undeclared namespace `#{prefix}'" unless ret
ret
end
get_variable(name)
click to toggle source
def get_variable(name)
value = @variables && @variables[name]
raise XPath::NameError, "undefined variable `#{name}'" unless value
value
end
make_boolean(f)
click to toggle source
def make_boolean(f)
if f then
XPathTrue
else
XPathFalse
end
end
make_nodeset(*nodes)
click to toggle source
def make_nodeset(*nodes)
XPathNodeSet.new(self, *nodes)
end
make_number(num)
click to toggle source
def make_number(num)
XPathNumber.new num
end
make_string(str)
click to toggle source
def make_string(str)
XPathString.new str
end
reuse(node, pos = 1, size = 1)
click to toggle source
def reuse(node, pos = 1, size = 1)
@variables = nil
@node, @context_position, @context_size = node, pos, size
end
root_nodeset()
click to toggle source
def root_nodeset
make_nodeset @visitor.visit(@node).root
end
to_nodeset()
click to toggle source
def to_nodeset
make_nodeset @node
end
f_boolean(obj)
click to toggle source
def f_boolean(obj)
obj.to_boolean self
end
f_ceiling(num)
click to toggle source
def f_ceiling(num)
num.to_number(self).ceil
end
f_concat(str, str2, *strs)
click to toggle source
def f_concat(str, str2, *strs)
s = str2.to_str.dup
strs.each { |i| s << i.to_str }
str.to_string(self).concat(s)
end
f_contains(str, sub)
click to toggle source
def f_contains(str, sub)
make_boolean str.to_string(self).contain?(sub.to_str)
end
f_count(nodeset)
click to toggle source
def f_count(nodeset)
must_be_nodeset nodeset
make_number nodeset.count.to_f
end
f_false()
click to toggle source
def f_false
make_boolean false
end
f_floor(num)
click to toggle source
def f_floor(num)
num.to_number(self).floor
end
f_id(obj)
click to toggle source
def f_id(obj)
unless obj.is_a? XPathNodeSet then
ids = obj.to_str.strip.split(/\s+/)
else
ids = []
obj.each { |node| ids.push @visitor.visit(node).string_value }
end
root = @visitor.visit(@node).root
make_nodeset(*@visitor.visit(root).select_id(*ids))
end
f_lang(str)
click to toggle source
def f_lang(str)
lang = @visitor.visit(@node).lang
make_boolean(lang && /\A#{Regexp.quote(str.to_str)}(?:-|\z)/ =~ lang)
end
f_last()
click to toggle source
def f_last
make_number @context_size.to_f
end
f_local_name(nodeset = nil)
click to toggle source
def f_local_name(nodeset = nil)
unless nodeset then
n = @node
else
must_be_nodeset nodeset
n = nodeset.first
end
n = @visitor.visit(n) if n
n = n.name_localpart if n
n = '' unless n
make_string n
end
f_name(nodeset = nil)
click to toggle source
def f_name(nodeset = nil)
unless nodeset then
n = @node
else
must_be_nodeset nodeset
n = nodeset.first
end
n = @visitor.visit(n) if n
n = n.qualified_name if n
n = '' unless n
make_string n
end
f_namespace_uri(nodeset = nil)
click to toggle source
def f_namespace_uri(nodeset = nil)
unless nodeset then
n = @node
else
must_be_nodeset nodeset
n = nodeset.first
end
n = @visitor.visit(n) if n
n = n.namespace_uri if n
n = '' unless n
make_string n
end
f_normalize_space(str = nil)
click to toggle source
def f_normalize_space(str = nil)
if str then
str = str.to_string(self)
else
str = make_string(@node.string_value)
end
str.normalize_space
end
f_not(bool)
click to toggle source
def f_not(bool)
make_boolean(!bool.true?)
end
f_number(obj = nil)
click to toggle source
def f_number(obj = nil)
obj = to_nodeset unless obj
obj.to_number self
end
f_position()
click to toggle source
def f_position
make_number @context_position.to_f
end
f_round(num)
click to toggle source
def f_round(num)
num.to_number(self).round
end
f_starts_with(str, sub)
click to toggle source
def f_starts_with(str, sub)
make_boolean str.to_string(self).start_with?(sub.to_str)
end
f_string(obj = nil)
click to toggle source
def f_string(obj = nil)
obj = to_nodeset unless obj
obj.to_string self
end
f_string_length(str = nil)
click to toggle source
def f_string_length(str = nil)
if str then
str = str.to_string(self)
else
str = make_string(@node.string_value)
end
make_number str.size.to_f
end
f_substring(str, start, len = nil)
click to toggle source
def f_substring(str, start, len = nil)
len = len.to_number(self) if len
str.to_string(self).substring start.to_number(self), len
end
f_substring_after(str, sub)
click to toggle source
def f_substring_after(str, sub)
str.to_string(self).substring_after sub.to_str
end
f_substring_before(str, sub)
click to toggle source
def f_substring_before(str, sub)
str.to_string(self).substring_before sub.to_str
end
f_sum(nodeset)
click to toggle source
def f_sum(nodeset)
must_be_nodeset nodeset
sum = 0.0
nodeset.each { |node|
sum += make_string(@visitor.visit(node).string_value).to_f
}
make_number sum
end
f_translate(str, from, to)
click to toggle source
def f_translate(str, from, to)
str.to_string(self).translate from.to_str, to.to_str
end
f_true()
click to toggle source
def f_true
make_boolean true
end
must(type, *args)
click to toggle source
def must(type, *args)
args.each { |i|
unless i.is_a? type then
s = type.name.sub(/\A.*::(?:XPath)?(?=[^:]+\z)/, '')
raise XPath::TypeError, "argument must be #{s}"
end
}
end
must_be_nodeset(*args)
click to toggle source
def must_be_nodeset(*args)
must XPathNodeSet, *args
end