00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #ifndef TRANSLIT_H
00011 #define TRANSLIT_H
00012
00013 #include "unicode/utypes.h"
00014
00015 #if !UCONFIG_NO_TRANSLITERATION
00016
00017 #include "unicode/uobject.h"
00018 #include "unicode/unistr.h"
00019 #include "unicode/parseerr.h"
00020 #include "unicode/utrans.h"
00021 #include "unicode/strenum.h"
00022
00023 U_NAMESPACE_BEGIN
00024
00025 class UnicodeFilter;
00026 class UnicodeSet;
00027 class CompoundTransliterator;
00028 class TransliteratorParser;
00029 class NormalizationTransliterator;
00030 class TransliteratorIDParser;
00031
00235 class U_I18N_API Transliterator : public UObject {
00236
00237 private:
00238
00242 UnicodeString ID;
00243
00250 UnicodeFilter* filter;
00251
00252 int32_t maximumContextLength;
00253
00254 public:
00255
00261 union Token {
00266 int32_t integer;
00271 void* pointer;
00272 };
00273
00279 inline static Token integerToken(int32_t);
00280
00286 inline static Token pointerToken(void*);
00287
00303 typedef Transliterator* (U_EXPORT2 *Factory)(const UnicodeString& ID, Token context);
00304
00305 protected:
00306
00316 Transliterator(const UnicodeString& ID, UnicodeFilter* adoptedFilter);
00317
00322 Transliterator(const Transliterator&);
00323
00328 Transliterator& operator=(const Transliterator&);
00329
00341 static Transliterator* createBasicInstance(const UnicodeString& id,
00342 const UnicodeString* canon);
00343
00344 friend class TransliteratorParser;
00345 friend class TransliteratorIDParser;
00346
00347 public:
00348
00353 virtual ~Transliterator();
00354
00369 virtual Transliterator* clone() const { return 0; }
00370
00386 virtual int32_t transliterate(Replaceable& text,
00387 int32_t start, int32_t limit) const;
00388
00394 virtual void transliterate(Replaceable& text) const;
00395
00460 virtual void transliterate(Replaceable& text, UTransPosition& index,
00461 const UnicodeString& insertion,
00462 UErrorCode& status) const;
00463
00482 virtual void transliterate(Replaceable& text, UTransPosition& index,
00483 UChar32 insertion,
00484 UErrorCode& status) const;
00485
00500 virtual void transliterate(Replaceable& text, UTransPosition& index,
00501 UErrorCode& status) const;
00502
00514 virtual void finishTransliteration(Replaceable& text,
00515 UTransPosition& index) const;
00516
00517 private:
00518
00534 void _transliterate(Replaceable& text,
00535 UTransPosition& index,
00536 const UnicodeString* insertion,
00537 UErrorCode &status) const;
00538
00539 protected:
00540
00620 virtual void handleTransliterate(Replaceable& text,
00621 UTransPosition& pos,
00622 UBool incremental) const = 0;
00623
00635 virtual void filteredTransliterate(Replaceable& text,
00636 UTransPosition& index,
00637 UBool incremental) const;
00638
00639 friend class CompoundTransliterator;
00640 friend class AnyTransliterator;
00641
00642 private:
00643
00671 virtual void filteredTransliterate(Replaceable& text,
00672 UTransPosition& index,
00673 UBool incremental,
00674 UBool rollback) const;
00675
00676 public:
00677
00691 int32_t getMaximumContextLength(void) const;
00692
00693 protected:
00694
00701 void setMaximumContextLength(int32_t maxContextLength);
00702
00703 public:
00704
00715 virtual const UnicodeString& getID(void) const;
00716
00726 static UnicodeString& U_EXPORT2 getDisplayName(const UnicodeString& ID,
00727 UnicodeString& result);
00728
00750 static UnicodeString& U_EXPORT2 getDisplayName(const UnicodeString& ID,
00751 const Locale& inLocale,
00752 UnicodeString& result);
00753
00761 const UnicodeFilter* getFilter(void) const;
00762
00772 UnicodeFilter* orphanFilter(void);
00773
00784 void adoptFilter(UnicodeFilter* adoptedFilter);
00785
00805 Transliterator* createInverse(UErrorCode& status) const;
00806
00823 static Transliterator* U_EXPORT2 createInstance(const UnicodeString& ID,
00824 UTransDirection dir,
00825 UParseError& parseError,
00826 UErrorCode& status);
00827
00838 static Transliterator* U_EXPORT2 createInstance(const UnicodeString& ID,
00839 UTransDirection dir,
00840 UErrorCode& status);
00841
00857 static Transliterator* U_EXPORT2 createFromRules(const UnicodeString& ID,
00858 const UnicodeString& rules,
00859 UTransDirection dir,
00860 UParseError& parseError,
00861 UErrorCode& status);
00862
00874 virtual UnicodeString& toRules(UnicodeString& result,
00875 UBool escapeUnprintable) const;
00876
00889 int32_t countElements() const;
00890
00910 const Transliterator& getElement(int32_t index, UErrorCode& ec) const;
00911
00927 UnicodeSet& getSourceSet(UnicodeSet& result) const;
00928
00943 virtual void handleGetSourceSet(UnicodeSet& result) const;
00944
00958 virtual UnicodeSet& getTargetSet(UnicodeSet& result) const;
00959
00960 public:
00961
00973 static void U_EXPORT2 registerFactory(const UnicodeString& id,
00974 Factory factory,
00975 Token context);
00976
00994 static void U_EXPORT2 registerInstance(Transliterator* adoptedObj);
00995
00996 protected:
00997
01007 static void _registerFactory(const UnicodeString& id,
01008 Factory factory,
01009 Token context);
01010
01014 static void _registerInstance(Transliterator* adoptedObj);
01015
01049 static void _registerSpecialInverse(const UnicodeString& target,
01050 const UnicodeString& inverseTarget,
01051 UBool bidirectional);
01052
01053 public:
01054
01068 static void U_EXPORT2 unregister(const UnicodeString& ID);
01069
01070 public:
01071
01081 static StringEnumeration* U_EXPORT2 getAvailableIDs(UErrorCode& ec);
01082
01088 static int32_t U_EXPORT2 countAvailableSources(void);
01089
01099 static UnicodeString& U_EXPORT2 getAvailableSource(int32_t index,
01100 UnicodeString& result);
01101
01110 static int32_t U_EXPORT2 countAvailableTargets(const UnicodeString& source);
01111
01123 static UnicodeString& U_EXPORT2 getAvailableTarget(int32_t index,
01124 const UnicodeString& source,
01125 UnicodeString& result);
01126
01134 static int32_t U_EXPORT2 countAvailableVariants(const UnicodeString& source,
01135 const UnicodeString& target);
01136
01150 static UnicodeString& U_EXPORT2 getAvailableVariant(int32_t index,
01151 const UnicodeString& source,
01152 const UnicodeString& target,
01153 UnicodeString& result);
01154
01155 protected:
01156
01161 static int32_t _countAvailableSources(void);
01162
01167 static UnicodeString& _getAvailableSource(int32_t index,
01168 UnicodeString& result);
01169
01174 static int32_t _countAvailableTargets(const UnicodeString& source);
01175
01180 static UnicodeString& _getAvailableTarget(int32_t index,
01181 const UnicodeString& source,
01182 UnicodeString& result);
01183
01188 static int32_t _countAvailableVariants(const UnicodeString& source,
01189 const UnicodeString& target);
01190
01195 static UnicodeString& _getAvailableVariant(int32_t index,
01196 const UnicodeString& source,
01197 const UnicodeString& target,
01198 UnicodeString& result);
01199
01200 protected:
01201
01208 void setID(const UnicodeString& id);
01209
01210 public:
01211
01222 static UClassID U_EXPORT2 getStaticClassID(void);
01223
01239 virtual UClassID getDynamicClassID(void) const = 0;
01240
01241 private:
01242 static UBool initializeRegistry(void);
01243
01244 public:
01252 static int32_t U_EXPORT2 countAvailableIDs(void);
01253
01266 static const UnicodeString& U_EXPORT2 getAvailableID(int32_t index);
01267 };
01268
01269 inline int32_t Transliterator::getMaximumContextLength(void) const {
01270 return maximumContextLength;
01271 }
01272
01273 inline void Transliterator::setID(const UnicodeString& id) {
01274 ID = id;
01275
01276 ID.getTerminatedBuffer();
01277 }
01278
01279 inline Transliterator::Token Transliterator::integerToken(int32_t i) {
01280 Token t;
01281 t.integer = i;
01282 return t;
01283 }
01284
01285 inline Transliterator::Token Transliterator::pointerToken(void* p) {
01286 Token t;
01287 t.pointer = p;
01288 return t;
01289 }
01290
01291 U_NAMESPACE_END
01292
01293 #endif
01294
01295 #endif