00001
00002
00003
00004
00005
00006
00007
00008 #ifndef TRANSLIT_H
00009 #define TRANSLIT_H
00010
00011 #include "unicode/unistr.h"
00012 #include "unicode/parseerr.h"
00013 #include "unicode/utrans.h"
00014
00015 U_NAMESPACE_BEGIN
00016
00017 class Replaceable;
00018 class UnicodeFilter;
00019 class UnicodeSet;
00020 class TransliterationRuleData;
00021 class U_I18N_API UVector;
00022 class CompoundTransliterator;
00023 class TransliteratorParser;
00024 class NormalizationTransliterator;
00025
00229 class U_I18N_API Transliterator {
00230
00231 private:
00232
00236 UnicodeString ID;
00237
00244 UnicodeFilter* filter;
00245
00246 int32_t maximumContextLength;
00247
00248 public:
00249
00254 union Token {
00255 int32_t integer;
00256 void* pointer;
00257 };
00258
00262 inline static Token integerToken(int32_t);
00263
00267 inline static Token pointerToken(void*);
00268
00279 typedef Transliterator* (*Factory)(const UnicodeString& ID, Token context);
00280
00281 protected:
00282
00291 Transliterator(const UnicodeString& ID, UnicodeFilter* adoptedFilter);
00292
00296 Transliterator(const Transliterator&);
00297
00301 Transliterator& operator=(const Transliterator&);
00302
00306 static Transliterator* createInstance(const UnicodeString& ID,
00307 UTransDirection dir,
00308 int32_t idSplitPoint,
00309 Transliterator *adoptedSplitTrans,
00310 UParseError& parseError,
00311 UErrorCode& status);
00312
00316 static void parseCompoundID(const UnicodeString& ID,
00317 UnicodeString& regenID,
00318 UTransDirection dir,
00319 int32_t idSplitPoint,
00320 Transliterator *adoptedSplitTrans,
00321 UVector& result,
00322 int32_t& splitTransIndex,
00323 UnicodeSet*& compoundFilter,
00324 UParseError& parseError,
00325 UErrorCode& status);
00326
00341 static UBool IDtoSTV(const UnicodeString& id,
00342 UnicodeString& source, UnicodeString& target,
00343 UnicodeString& variant);
00344
00348 static Transliterator* parseID(const UnicodeString& ID,
00349 UnicodeString& regenID,
00350 int32_t& pos,
00351 UBool& sawDelimiter,
00352 UnicodeSet*& compoundFilter,
00353 UTransDirection dir,
00354 UParseError& parseError,
00355 UBool create,
00356 UErrorCode& status);
00357
00361 static UBool parseIDBounds(const UnicodeString& ID,
00362 int32_t pos,
00363 UBool withinParens,
00364 int32_t& limit,
00365 int32_t& setStart,
00366 int32_t& setLimit,
00367 int32_t& revStart,
00368 UnicodeSet*& filter);
00369
00370 static void skipSpaces(const UnicodeString& str,
00371 int32_t& pos);
00372
00373 friend class TransliteratorParser;
00374
00375 public:
00376
00381 virtual ~Transliterator();
00382
00396 virtual Transliterator* clone() const { return 0; }
00397
00413 virtual int32_t transliterate(Replaceable& text,
00414 int32_t start, int32_t limit) const;
00415
00421 virtual void transliterate(Replaceable& text) const;
00422
00486 virtual void transliterate(Replaceable& text, UTransPosition& index,
00487 const UnicodeString& insertion,
00488 UErrorCode& status) const;
00489
00506 virtual void transliterate(Replaceable& text, UTransPosition& index,
00507 UChar32 insertion,
00508 UErrorCode& status) const;
00509
00522 virtual void transliterate(Replaceable& text, UTransPosition& index,
00523 UErrorCode& status) const;
00524
00536 virtual void finishTransliteration(Replaceable& text,
00537 UTransPosition& index) const;
00538
00539 private:
00540
00548 void _transliterate(Replaceable& text,
00549 UTransPosition& index,
00550 const UnicodeString* insertion,
00551 UErrorCode &status) const;
00552
00553 protected:
00554
00596 virtual void handleTransliterate(Replaceable& text,
00597 UTransPosition& pos,
00598 UBool incremental) const = 0;
00599
00610 virtual void filteredTransliterate(Replaceable& text,
00611 UTransPosition& index,
00612 UBool incremental) const;
00613
00614 friend class CompoundTransliterator;
00615
00616 private:
00617
00645 virtual void filteredTransliterate(Replaceable& text,
00646 UTransPosition& index,
00647 UBool incremental,
00648 UBool rollback) const;
00649
00650 public:
00651
00665 int32_t getMaximumContextLength(void) const;
00666
00667 protected:
00668
00673 void setMaximumContextLength(int32_t maxContextLength);
00674
00675 public:
00676
00686 virtual const UnicodeString& getID(void) const;
00687
00694 static UnicodeString& getDisplayName(const UnicodeString& ID,
00695 UnicodeString& result);
00696
00716 static UnicodeString& getDisplayName(const UnicodeString& ID,
00717 const Locale& inLocale,
00718 UnicodeString& result);
00719
00725 const UnicodeFilter* getFilter(void) const;
00726
00733 UnicodeFilter* orphanFilter(void);
00734
00735 #ifdef U_USE_DEPRECATED_TRANSLITERATOR_API
00736
00746 virtual void adoptFilter(UnicodeFilter* adoptedFilter);
00747 #else
00748
00757 void adoptFilter(UnicodeFilter* adoptedFilter);
00758 #endif
00759
00778 Transliterator* createInverse(UErrorCode& status) const;
00779
00792 static Transliterator* createInstance(const UnicodeString& ID,
00793 UTransDirection dir,
00794 UParseError& parseError,
00795 UErrorCode& status);
00796
00803 static Transliterator* createInstance(const UnicodeString& ID,
00804 UTransDirection dir,
00805 UErrorCode& status);
00815 static Transliterator* createFromRules(const UnicodeString& ID,
00816 const UnicodeString& rules,
00817 UTransDirection dir,
00818 UParseError& parseError,
00819 UErrorCode& status);
00820
00832 virtual UnicodeString& toRules(UnicodeString& result,
00833 UBool escapeUnprintable) const;
00834
00835 public:
00836
00848 static void registerFactory(const UnicodeString& id,
00849 Factory factory,
00850 Token context);
00851
00869 static void registerInstance(Transliterator* adoptedObj);
00870
00871 protected:
00872
00876 static void _registerFactory(const UnicodeString& id,
00877 Factory factory,
00878 Token context);
00879
00913 static void _registerSpecialInverse(const UnicodeString& target,
00914 const UnicodeString& inverseTarget,
00915 UBool bidirectional);
00916
00917 public:
00918
00932 static void unregister(const UnicodeString& ID);
00933
00934 public:
00935
00942 static int32_t countAvailableIDs(void);
00943
00950 static const UnicodeString& getAvailableID(int32_t index);
00951
00956 static int32_t countAvailableSources(void);
00957
00967 static UnicodeString& getAvailableSource(int32_t index,
00968 UnicodeString& result);
00969
00975 static int32_t countAvailableTargets(const UnicodeString& source);
00976
00988 static UnicodeString& getAvailableTarget(int32_t index,
00989 const UnicodeString& source,
00990 UnicodeString& result);
00991
00997 static int32_t countAvailableVariants(const UnicodeString& source,
00998 const UnicodeString& target);
00999
01013 static UnicodeString& getAvailableVariant(int32_t index,
01014 const UnicodeString& source,
01015 const UnicodeString& target,
01016 UnicodeString& result);
01017
01029 static UClassID getStaticClassID(void) { return (UClassID)&fgClassID; }
01030
01054 virtual UClassID getDynamicClassID(void) const { return getStaticClassID(); };
01055
01056 private:
01057
01062 static const char fgClassID;
01063
01064 protected:
01065
01070 void setID(const UnicodeString& id);
01071
01072 private:
01073 static void initializeRegistry(void);
01074
01075 #ifdef U_USE_DEPRECATED_TRANSLITERATOR_API
01076
01077 public:
01092 inline Transliterator* createInstance(const UnicodeString& ID,
01093 UTransDirection dir=UTRANS_FORWARD,
01094 UParseError* parseError=0);
01115 inline Transliterator* createInverse() const;
01116
01117 protected:
01132 UChar filteredCharAt(const Replaceable& text, int32_t i) const;
01133
01134 #endif
01135 };
01136
01137 inline int32_t Transliterator::getMaximumContextLength(void) const {
01138 return maximumContextLength;
01139 }
01140
01141 inline void Transliterator::setID(const UnicodeString& id) {
01142 ID = id;
01143 }
01144
01145 inline Transliterator::Token Transliterator::integerToken(int32_t i) {
01146 Token t;
01147 t.integer = i;
01148 return t;
01149 }
01150
01151 inline Transliterator::Token Transliterator::pointerToken(void* p) {
01152 Token t;
01153 t.pointer = p;
01154 return t;
01155 }
01156
01161 #ifdef U_USE_DEPRECATED_TRANSLITERATOR_API
01162
01163 inline Transliterator* Transliterator::createInstance(const UnicodeString& ID,
01164 UTransDirection dir,
01165 UParseError* parseError){
01166 UErrorCode status = U_ZERO_ERROR;
01167 UParseError error;
01168 if(parseError == NULL){
01169 parseError = &error;
01170 }
01171 return Transliterator::createInstance(ID,dir,*parseError,status);
01172 }
01173
01174 inline Transliterator* Transliterator::createInverse() const{
01175
01176 UErrorCode status = U_ZERO_ERROR;
01177 return createInverse(status);
01178 }
01179
01180 #endif
01181
01182 U_NAMESPACE_END
01183
01184 #endif
01185