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