XPath compiler support for translate()

This commit is contained in:
Yorick Peterse committed 2015-08-19 20:14:24 +02:00
1 parent 106d83e780
commit b217aab2cb
3 files changed
+64

No files matched your search

+9
View File
@@ -44,6 +44,15 @@ module Oga
@children
end
##
# Returns a "to_a" call node.
#
# @return [Oga::Ruby::Node]
#
def to_array
Node.new(:send, [self, :to_a])
end
##
# Returns an assignment node.
#
+45
View File
@@ -1125,6 +1125,51 @@ module Oga
end
end
# @param [Oga::Ruby::Node] input
# @param [AST::Node] source
# @param [AST::Node] find
# @param [AST::Node] replace
# @return [Oga::Ruby::Node]
def on_call_translate(input, source, find, replace)
source_var = unique_literal(:source)
find_var = unique_literal(:find)
replace_var = unique_literal(:replace)
replaced_var = unique_literal(:replaced)
conversion = literal(Conversion)
char = unique_literal(:char)
index = unique_literal(:index)
source_var.assign(try_match_first_node(source, input))
.followed_by do
replaced_var.assign(conversion.to_string(source_var))
end
.followed_by do
find_var.assign(try_match_first_node(find, input))
end
.followed_by do
find_var.assign(conversion.to_string(find_var).chars.to_array)
end
.followed_by do
replace_var.assign(try_match_first_node(replace, input))
end
.followed_by do
replace_var.assign(conversion.to_string(replace_var).chars.to_array)
end
.followed_by do
find_var.each_with_index.add_block(char, index) do
replace_with = replace_var[index]
.if_true { replace_var[index] }
.else { string('') }
replaced_var.assign(replaced_var.gsub(char, replace_with))
end
end
.followed_by do
replaced_var
end
end
##
# Delegates type tests to specific handlers.
#