|
1 /* |
|
2 ********************************************************************** |
|
3 * Copyright (c) 2002-2012, 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 FunctionReplacer *nonconst_this = const_cast<FunctionReplacer *>(this); |
|
70 UnicodeReplacer *nonconst_base = static_cast<UnicodeReplacer *>(nonconst_this); |
|
71 |
|
72 return nonconst_base; |
|
73 } |
|
74 |
|
75 /** |
|
76 * UnicodeReplacer API |
|
77 */ |
|
78 int32_t FunctionReplacer::replace(Replaceable& text, |
|
79 int32_t start, |
|
80 int32_t limit, |
|
81 int32_t& cursor) |
|
82 { |
|
83 |
|
84 // First delegate to subordinate replacer |
|
85 int32_t len = replacer->toReplacer()->replace(text, start, limit, cursor); |
|
86 limit = start + len; |
|
87 |
|
88 // Now transliterate |
|
89 limit = translit->transliterate(text, start, limit); |
|
90 |
|
91 return limit - start; |
|
92 } |
|
93 |
|
94 /** |
|
95 * UnicodeReplacer API |
|
96 */ |
|
97 UnicodeString& FunctionReplacer::toReplacerPattern(UnicodeString& rule, |
|
98 UBool escapeUnprintable) const { |
|
99 UnicodeString str; |
|
100 rule.truncate(0); |
|
101 rule.append(AMPERSAND); |
|
102 rule.append(translit->getID()); |
|
103 rule.append(OPEN, 2); |
|
104 rule.append(replacer->toReplacer()->toReplacerPattern(str, escapeUnprintable)); |
|
105 rule.append(CLOSE, 2); |
|
106 return rule; |
|
107 } |
|
108 |
|
109 /** |
|
110 * Implement UnicodeReplacer |
|
111 */ |
|
112 void FunctionReplacer::addReplacementSetTo(UnicodeSet& toUnionTo) const { |
|
113 UnicodeSet set; |
|
114 toUnionTo.addAll(translit->getTargetSet(set)); |
|
115 } |
|
116 |
|
117 /** |
|
118 * UnicodeFunctor API |
|
119 */ |
|
120 void FunctionReplacer::setData(const TransliterationRuleData* d) { |
|
121 replacer->setData(d); |
|
122 } |
|
123 |
|
124 U_NAMESPACE_END |
|
125 |
|
126 #endif /* #if !UCONFIG_NO_TRANSLITERATION */ |
|
127 |
|
128 //eof |