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