Support for the XPath translate() function.

This commit is contained in:
Yorick Peterse 2014-08-26 18:14:44 +02:00
parent 7f3f626744
commit 8295fa5783
2 changed files with 63 additions and 0 deletions

View File

@ -1002,6 +1002,35 @@ module Oga
return str.strip.gsub(/\s+/, ' ')
end
##
# Processes the `translate()` function call.
#
# This function takes the string of the 1st argument and replaces all
# characters of the 2nd argument with those specified in the 3rd argument.
#
# @example
# translate("bar", "abc", "ABC") # => "BAr"
#
# @param [Oga::XML::NodeSet] context
# @param [Oga::XPath::Node] input
# @param [Oga::XPath::Node] find
# @param [Oga::XPath::Node] replace
# @return [String]
#
def on_call_translate(context, input, find, replace)
input_str = on_call_string(context, input)
find_chars = on_call_string(context, find).chars
replace_chars = on_call_string(context, replace).chars
replaced = input_str
find_chars.each_with_index do |char, index|
replace_with = replace_chars[index] ? replace_chars[index] : ''
replaced = replaced.gsub(char, replace_with)
end
return replaced
end
##
# Processes an `(int)` node.
#

View File

@ -0,0 +1,34 @@
require 'spec_helper'
describe Oga::XPath::Evaluator do
context 'translate() function' do
before do
@document = parse('<root><a>bar</a><b>abc</b><c>ABC</c></root>')
@evaluator = described_class.new(@document)
end
example 'translate a string using all string literals' do
@evaluator.evaluate('translate("bar", "abc", "ABC")').should == 'BAr'
end
example "remove characters that don't occur in the replacement string" do
@evaluator.evaluate('translate("-aaa-", "abc-", "ABC")').should == 'AAA'
end
example 'use the first character occurence in the search string' do
@evaluator.evaluate('translate("ab", "aba", "123")').should == '12'
end
example 'ignore excess characters in the replacement string' do
@evaluator.evaluate('translate("abc", "abc", "123456")').should == '123'
end
example 'translate a node set string using string literals' do
@evaluator.evaluate('translate(root/a, "abc", "ABC")').should == 'BAr'
end
example 'translate a node set string using other node set strings' do
@evaluator.evaluate('translate(root/a, root/b, root/c)').should == 'BAr'
end
end
end