8
arguments = node.arguments.map { |argument| convert_argument(argument) }
9
send(node.expression, *arguments)
12
def convert_argument(argument)
14
when Expression, Union then render(argument)
15
when Array then argument.map { |element| convert_argument(element) }
16
when String then string_literal(argument)
17
when Literal then argument.value
22
def string_literal(string)
23
if string.include?("'")
24
string = string.split("'", -1).map do |substr|
37
def descendant(parent, element_names)
38
if element_names.length == 1
39
"#{parent}//#{element_names.first}"
40
elsif element_names.length > 1
41
"#{parent}//*[#{element_names.map { |e| "self::#{e}" }.join(" | ")}]"
47
def child(parent, element_names)
48
if element_names.length == 1
49
"#{parent}/#{element_names.first}"
50
elsif element_names.length > 1
51
"#{parent}/*[#{element_names.map { |e| "self::#{e}" }.join(" | ")}]"
57
def axis(parent, name, tag_name)
58
"#{parent}/#{name}::#{tag_name}"
61
def node_name(current)
65
def where(on, condition)
69
def attribute(current, name)
73
def equality(one, two)
85
def normalized_space(current)
86
"normalize-space(#{current})"
93
def css(current, selector)
94
paths = Nokogiri::CSS.xpath_for(selector).map do |xpath_selector|
95
"#{current}#{xpath_selector}"
100
def union(*expressions)
101
expressions.join(' | ')
104
def anywhere(tag_name)
108
def contains(current, value)
109
"contains(#{current}, #{value})"
112
def starts_with(current, value)
113
"starts-with(#{current}, #{value})"
117
"(#{one} and #{two})"
124
def one_of(current, values)
125
values.map { |value| "#{current} = #{value}" }.join(' or ')
128
def next_sibling(current, element_names)
129
if element_names.length == 1
130
"#{current}/following-sibling::*[1]/self::#{element_names.first}"
131
elsif element_names.length > 1
132
"#{current}/following-sibling::*[1]/self::*[#{element_names.map { |e| "self::#{e}" }.join(" | ")}]"
134
"#{current}/following-sibling::*[1]/self::*"
138
def previous_sibling(current, element_names)
139
if element_names.length == 1
140
"#{current}/preceding-sibling::*[1]/self::#{element_names.first}"
141
elsif element_names.length > 1
142
"#{current}/preceding-sibling::*[1]/self::*[#{element_names.map { |e| "self::#{e}" }.join(" | ")}]"
144
"#{current}/preceding-sibling::*[1]/self::*"
152
def string_function(current)