Home | History | Annotate | Download | only in i18n
      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) const {
     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
    126