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 class TransliteratorIDParser;
00026
00230 class U_I18N_API Transliterator {
00231
00232 private:
00233
00237 UnicodeString ID;
00238
00245 UnicodeFilter* filter;
00246
00247 int32_t maximumContextLength;
00248
00249 public:
00250
00255 union Token {
00256 int32_t integer;
00257 void* pointer;
00258 };
00259
00263 inline static Token integerToken(int32_t);
00264
00268 inline static Token pointerToken(void*);
00269
00280 typedef Transliterator* (*Factory)(const UnicodeString& ID, Token context);
00281
00282 protected:
00283
00292 Transliterator(const UnicodeString& ID, UnicodeFilter* adoptedFilter);
00293
00297 Transliterator(const Transliterator&);
00298
00302 Transliterator& operator=(const Transliterator&);
00303
00314 static Transliterator* createBasicInstance(const UnicodeString& id,
00315 const UnicodeString* canon);
00316
00317 friend class TransliteratorParser;
00318 friend class TransliteratorIDParser;
00319
00320 public:
00321
00326 virtual ~Transliterator();
00327
00341 virtual Transliterator* clone() const { return 0; }
00342
00358 virtual int32_t transliterate(Replaceable& text,
00359 int32_t start, int32_t limit) const;
00360
00366 virtual void transliterate(Replaceable& text) const;
00367
00431 virtual void transliterate(Replaceable& text, UTransPosition& index,
00432 const UnicodeString& insertion,
00433 UErrorCode& status) const;
00434
00451 virtual void transliterate(Replaceable& text, UTransPosition& index,
00452 UChar32 insertion,
00453 UErrorCode& status) const;
00454
00467 virtual void transliterate(Replaceable& text, UTransPosition& index,
00468 UErrorCode& status) const;
00469
00481 virtual void finishTransliteration(Replaceable& text,
00482 UTransPosition& index) const;
00483
00484 private:
00485
00493 void _transliterate(Replaceable& text,
00494 UTransPosition& index,
00495 const UnicodeString* insertion,
00496 UErrorCode &status) const;
00497
00498 protected:
00499
00541 virtual void handleTransliterate(Replaceable& text,
00542 UTransPosition& pos,
00543 UBool incremental) const = 0;
00544
00555 virtual void filteredTransliterate(Replaceable& text,
00556 UTransPosition& index,
00557 UBool incremental) const;
00558
00559 friend class CompoundTransliterator;
00560
00561 private:
00562
00590 virtual void filteredTransliterate(Replaceable& text,
00591 UTransPosition& index,
00592 UBool incremental,
00593 UBool rollback) const;
00594
00595 public:
00596
00610 int32_t getMaximumContextLength(void) const;
00611
00612 protected:
00613
00618 void setMaximumContextLength(int32_t maxContextLength);
00619
00620 public:
00621
00631 virtual const UnicodeString& getID(void) const;
00632
00639 static UnicodeString& getDisplayName(const UnicodeString& ID,
00640 UnicodeString& result);
00641
00661 static UnicodeString& getDisplayName(const UnicodeString& ID,
00662 const Locale& inLocale,
00663 UnicodeString& result);
00664
00670 const UnicodeFilter* getFilter(void) const;
00671
00678 UnicodeFilter* orphanFilter(void);
00679
00680 #ifdef U_USE_DEPRECATED_TRANSLITERATOR_API
00681
00691 virtual void adoptFilter(UnicodeFilter* adoptedFilter);
00692 #else
00693
00702 void adoptFilter(UnicodeFilter* adoptedFilter);
00703 #endif
00704
00723 Transliterator* createInverse(UErrorCode& status) const;
00724
00737 static Transliterator* createInstance(const UnicodeString& ID,
00738 UTransDirection dir,
00739 UParseError& parseError,
00740 UErrorCode& status);
00741
00748 static Transliterator* createInstance(const UnicodeString& ID,
00749 UTransDirection dir,
00750 UErrorCode& status);
00760 static Transliterator* createFromRules(const UnicodeString& ID,
00761 const UnicodeString& rules,
00762 UTransDirection dir,
00763 UParseError& parseError,
00764 UErrorCode& status);
00765
00777 virtual UnicodeString& toRules(UnicodeString& result,
00778 UBool escapeUnprintable) const;
00779
00780 public:
00781
00793 static void registerFactory(const UnicodeString& id,
00794 Factory factory,
00795 Token context);
00796
00814 static void registerInstance(Transliterator* adoptedObj);
00815
00816 protected:
00817
00821 static void _registerFactory(const UnicodeString& id,
00822 Factory factory,
00823 Token context);
00824
00858 static void _registerSpecialInverse(const UnicodeString& target,
00859 const UnicodeString& inverseTarget,
00860 UBool bidirectional);
00861
00862 public:
00863
00877 static void unregister(const UnicodeString& ID);
00878
00879 public:
00880
00887 static int32_t countAvailableIDs(void);
00888
00895 static const UnicodeString& getAvailableID(int32_t index);
00896
00901 static int32_t countAvailableSources(void);
00902
00912 static UnicodeString& getAvailableSource(int32_t index,
00913 UnicodeString& result);
00914
00920 static int32_t countAvailableTargets(const UnicodeString& source);
00921
00933 static UnicodeString& getAvailableTarget(int32_t index,
00934 const UnicodeString& source,
00935 UnicodeString& result);
00936
00942 static int32_t countAvailableVariants(const UnicodeString& source,
00943 const UnicodeString& target);
00944
00958 static UnicodeString& getAvailableVariant(int32_t index,
00959 const UnicodeString& source,
00960 const UnicodeString& target,
00961 UnicodeString& result);
00962
00974 static UClassID getStaticClassID(void) { return (UClassID)&fgClassID; }
00975
00999 virtual UClassID getDynamicClassID(void) const { return getStaticClassID(); };
01000
01001 private:
01002
01007 static const char fgClassID;
01008
01009 protected:
01010
01015 void setID(const UnicodeString& id);
01016
01017 private:
01018 static void initializeRegistry(void);
01019
01020 #ifdef U_USE_DEPRECATED_TRANSLITERATOR_API
01021
01022 public:
01037 inline Transliterator* createInstance(const UnicodeString& ID,
01038 UTransDirection dir=UTRANS_FORWARD,
01039 UParseError* parseError=0);
01060 inline Transliterator* createInverse() const;
01061
01062 protected:
01077 UChar filteredCharAt(const Replaceable& text, int32_t i) const;
01078
01079 #endif
01080 };
01081
01082 inline int32_t Transliterator::getMaximumContextLength(void) const {
01083 return maximumContextLength;
01084 }
01085
01086 inline void Transliterator::setID(const UnicodeString& id) {
01087 ID = id;
01088 }
01089
01090 inline Transliterator::Token Transliterator::integerToken(int32_t i) {
01091 Token t;
01092 t.integer = i;
01093 return t;
01094 }
01095
01096 inline Transliterator::Token Transliterator::pointerToken(void* p) {
01097 Token t;
01098 t.pointer = p;
01099 return t;
01100 }
01101
01106 #ifdef U_USE_DEPRECATED_TRANSLITERATOR_API
01107
01108 inline Transliterator* Transliterator::createInstance(const UnicodeString& ID,
01109 UTransDirection dir,
01110 UParseError* parseError){
01111 UErrorCode status = U_ZERO_ERROR;
01112 UParseError error;
01113 if(parseError == NULL){
01114 parseError = &error;
01115 }
01116 return Transliterator::createInstance(ID,dir,*parseError,status);
01117 }
01118
01119 inline Transliterator* Transliterator::createInverse() const{
01120
01121 UErrorCode status = U_ZERO_ERROR;
01122 return createInverse(status);
01123 }
01124
01125 #endif
01126
01127 U_NAMESPACE_END
01128
01129 #endif
01130