1ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* 2ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru********************************************************************** 385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho* Copyright (c) 2002-2008, International Business Machines Corporation 4ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* and others. All Rights Reserved. 5ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru********************************************************************** 6ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* Date Name Description 7ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* 02/04/2002 aliu Creation. 8ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru********************************************************************** 9ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*/ 10ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 11ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/utypes.h" 12ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 13ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if !UCONFIG_NO_TRANSLITERATION 14ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 15ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/translit.h" 16ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/uniset.h" 17ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "funcrepl.h" 18ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 19ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const UChar AMPERSAND = 38; // '&' 20ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const UChar OPEN[] = {40,32,0}; // "( " 21ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const UChar CLOSE[] = {32,41,0}; // " )" 22ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 23ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_NAMESPACE_BEGIN 24ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 25ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUOBJECT_DEFINE_RTTI_IMPLEMENTATION(FunctionReplacer) 26ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 27ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 28ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Construct a replacer that takes the output of the given 29ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * replacer, passes it through the given transliterator, and emits 30ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * the result as output. 31ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 32ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruFunctionReplacer::FunctionReplacer(Transliterator* adoptedTranslit, 33ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UnicodeFunctor* adoptedReplacer) { 34ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru translit = adoptedTranslit; 35ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru replacer = adoptedReplacer; 36ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 37ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 38ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 39ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Copy constructor. 40ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 41ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruFunctionReplacer::FunctionReplacer(const FunctionReplacer& other) : 42ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UnicodeFunctor(other), 43ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UnicodeReplacer(other) 44ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 45ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru translit = other.translit->clone(); 46ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru replacer = other.replacer->clone(); 47ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 48ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 49ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 50ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Destructor 51ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 52ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruFunctionReplacer::~FunctionReplacer() { 53ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru delete translit; 54ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru delete replacer; 55ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 56ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 57ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 58ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Implement UnicodeFunctor 59ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 60ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUnicodeFunctor* FunctionReplacer::clone() const { 61ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return new FunctionReplacer(*this); 62ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 63ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 64ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 65ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * UnicodeFunctor API. Cast 'this' to a UnicodeReplacer* pointer 66ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * and return the pointer. 67ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 68ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUnicodeReplacer* FunctionReplacer::toReplacer() const { 69ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return (UnicodeReplacer*) this; 70ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 71ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 72ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 73ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * UnicodeReplacer API 74ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 75ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruint32_t FunctionReplacer::replace(Replaceable& text, 76ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t start, 77ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t limit, 7885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t& cursor) 7985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho{ 80ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 81ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru // First delegate to subordinate replacer 82ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t len = replacer->toReplacer()->replace(text, start, limit, cursor); 83ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru limit = start + len; 84ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 85ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru // Now transliterate 86ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru limit = translit->transliterate(text, start, limit); 87ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 88ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return limit - start; 89ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 90ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 91ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 92ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * UnicodeReplacer API 93ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 94ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUnicodeString& FunctionReplacer::toReplacerPattern(UnicodeString& rule, 95ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UBool escapeUnprintable) const { 96ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UnicodeString str; 97ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru rule.truncate(0); 98ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru rule.append(AMPERSAND); 99ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru rule.append(translit->getID()); 100ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru rule.append(OPEN); 101ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru rule.append(replacer->toReplacer()->toReplacerPattern(str, escapeUnprintable)); 102ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru rule.append(CLOSE); 103ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return rule; 104ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 105ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 106ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 107ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Implement UnicodeReplacer 108ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 109ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid FunctionReplacer::addReplacementSetTo(UnicodeSet& toUnionTo) const { 110ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UnicodeSet set; 111ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru toUnionTo.addAll(translit->getTargetSet(set)); 112ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 113ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 114ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 115ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * UnicodeFunctor API 116ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 117ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid FunctionReplacer::setData(const TransliterationRuleData* d) { 118ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru replacer->setData(d); 119ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 120ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 121ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_NAMESPACE_END 122ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 123ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif /* #if !UCONFIG_NO_TRANSLITERATION */ 124ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 125ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru//eof 126