00001
00002
00003
00004
00005
00006
00007
00008 #ifndef TRANSLIT_H
00009 #define TRANSLIT_H
00010
00011 #include "unicode/utypes.h"
00012 #include "unicode/uobject.h"
00013 #include "unicode/unistr.h"
00014 #include "unicode/parseerr.h"
00015 #include "unicode/utrans.h"
00016
00017 U_NAMESPACE_BEGIN
00018
00019 class Replaceable;
00020 class UnicodeFilter;
00021 class UnicodeSet;
00022 class TransliterationRuleData;
00023 class U_I18N_API UVector;
00024 class CompoundTransliterator;
00025 class TransliteratorParser;
00026 class NormalizationTransliterator;
00027 class TransliteratorIDParser;
00028
00232 class U_I18N_API Transliterator : public UObject {
00233
00234 private:
00235
00239 UnicodeString ID;
00240
00247 UnicodeFilter* filter;
00248
00249 int32_t maximumContextLength;
00250
00251 public:
00252
00257 union Token {
00258 int32_t integer;
00259 void* pointer;
00260 };
00261
00266 inline static Token integerToken(int32_t);
00267
00272 inline static Token pointerToken(void*);
00273
00288 typedef Transliterator* (*Factory)(const UnicodeString& ID, Token context);
00289
00290 protected:
00291
00300 Transliterator(const UnicodeString& ID, UnicodeFilter* adoptedFilter);
00301
00305 Transliterator(const Transliterator&);
00306
00310 Transliterator& operator=(const Transliterator&);
00311
00322 static Transliterator* createBasicInstance(const UnicodeString& id,
00323 const UnicodeString* canon);
00324
00325 friend class TransliteratorParser;
00326 friend class TransliteratorIDParser;
00327
00328 public:
00329
00334 virtual ~Transliterator();
00335
00350 virtual Transliterator* clone() const { return 0; }
00351
00367 virtual int32_t transliterate(Replaceable& text,
00368 int32_t start, int32_t limit) const;
00369
00375 virtual void transliterate(Replaceable& text) const;
00376
00441 virtual void transliterate(Replaceable& text, UTransPosition& index,
00442 const UnicodeString& insertion,
00443 UErrorCode& status) const;
00444
00462 virtual void transliterate(Replaceable& text, UTransPosition& index,
00463 UChar32 insertion,
00464 UErrorCode& status) const;
00465
00479 virtual void transliterate(Replaceable& text, UTransPosition& index,
00480 UErrorCode& status) const;
00481
00493 virtual void finishTransliteration(Replaceable& text,
00494 UTransPosition& index) const;
00495
00496 private:
00497
00513 void _transliterate(Replaceable& text,
00514 UTransPosition& index,
00515 const UnicodeString* insertion,
00516 UErrorCode &status) const;
00517
00518 protected:
00519
00598 virtual void handleTransliterate(Replaceable& text,
00599 UTransPosition& pos,
00600 UBool incremental) const = 0;
00601
00612 virtual void filteredTransliterate(Replaceable& text,
00613 UTransPosition& index,
00614 UBool incremental) const;
00615
00616 friend class CompoundTransliterator;
00617 friend class AnyTransliterator;
00618
00619 private:
00620
00648 virtual void filteredTransliterate(Replaceable& text,
00649 UTransPosition& index,
00650 UBool incremental,
00651 UBool rollback) const;
00652
00653 public:
00654
00668 int32_t getMaximumContextLength(void) const;
00669
00670 protected:
00671
00677 void setMaximumContextLength(int32_t maxContextLength);
00678
00679 public:
00680
00691 virtual const UnicodeString& getID(void) const;
00692
00702 static UnicodeString& getDisplayName(const UnicodeString& ID,
00703 UnicodeString& result);
00704
00726 static UnicodeString& getDisplayName(const UnicodeString& ID,
00727 const Locale& inLocale,
00728 UnicodeString& result);
00729
00737 const UnicodeFilter* getFilter(void) const;
00738
00747 UnicodeFilter* orphanFilter(void);
00748
00749 #ifdef U_USE_DEPRECATED_TRANSLITERATOR_API
00750
00760 virtual void adoptFilter(UnicodeFilter* adoptedFilter);
00761 #else
00762
00772 void adoptFilter(UnicodeFilter* adoptedFilter);
00773 #endif
00774
00794 Transliterator* createInverse(UErrorCode& status) const;
00795
00812 static Transliterator* createInstance(const UnicodeString& ID,
00813 UTransDirection dir,
00814 UParseError& parseError,
00815 UErrorCode& status);
00816
00827 static Transliterator* createInstance(const UnicodeString& ID,
00828 UTransDirection dir,
00829 UErrorCode& status);
00845 static Transliterator* createFromRules(const UnicodeString& ID,
00846 const UnicodeString& rules,
00847 UTransDirection dir,
00848 UParseError& parseError,
00849 UErrorCode& status);
00850
00862 virtual UnicodeString& toRules(UnicodeString& result,
00863 UBool escapeUnprintable) const;
00864
00879 UnicodeSet& getSourceSet(UnicodeSet& result) const;
00880
00894 virtual void handleGetSourceSet(UnicodeSet& result) const;
00895
00908 virtual UnicodeSet& getTargetSet(UnicodeSet& result) const;
00909
00910 public:
00911
00923 static void registerFactory(const UnicodeString& id,
00924 Factory factory,
00925 Token context);
00926
00944 static void registerInstance(Transliterator* adoptedObj);
00945
00946 protected:
00947
00957 static void _registerFactory(const UnicodeString& id,
00958 Factory factory,
00959 Token context);
00960
00964 static void _registerInstance(Transliterator* adoptedObj);
00965
00999 static void _registerSpecialInverse(const UnicodeString& target,
01000 const UnicodeString& inverseTarget,
01001 UBool bidirectional);
01002
01003 public:
01004
01018 static void unregister(const UnicodeString& ID);
01019
01020 public:
01021
01029 static int32_t countAvailableIDs(void);
01030
01041 static const UnicodeString& getAvailableID(int32_t index);
01042
01048 static int32_t countAvailableSources(void);
01049
01059 static UnicodeString& getAvailableSource(int32_t index,
01060 UnicodeString& result);
01061
01070 static int32_t countAvailableTargets(const UnicodeString& source);
01071
01083 static UnicodeString& getAvailableTarget(int32_t index,
01084 const UnicodeString& source,
01085 UnicodeString& result);
01086
01094 static int32_t countAvailableVariants(const UnicodeString& source,
01095 const UnicodeString& target);
01096
01110 static UnicodeString& getAvailableVariant(int32_t index,
01111 const UnicodeString& source,
01112 const UnicodeString& target,
01113 UnicodeString& result);
01114
01115 protected:
01116
01121 static int32_t _countAvailableSources(void);
01122
01127 static UnicodeString& _getAvailableSource(int32_t index,
01128 UnicodeString& result);
01129
01134 static int32_t _countAvailableTargets(const UnicodeString& source);
01135
01140 static UnicodeString& _getAvailableTarget(int32_t index,
01141 const UnicodeString& source,
01142 UnicodeString& result);
01143
01148 static int32_t _countAvailableVariants(const UnicodeString& source,
01149 const UnicodeString& target);
01150
01155 static UnicodeString& _getAvailableVariant(int32_t index,
01156 const UnicodeString& source,
01157 const UnicodeString& target,
01158 UnicodeString& result);
01159 public:
01160
01172 static UClassID getStaticClassID(void) { return (UClassID)&fgClassID; }
01173
01197 virtual UClassID getDynamicClassID(void) const { return getStaticClassID(); };
01198
01199 private:
01200
01205 static const char fgClassID;
01206
01207 protected:
01208
01214 void setID(const UnicodeString& id);
01215
01216 private:
01217 static void initializeRegistry(void);
01218
01219 #ifdef U_USE_DEPRECATED_TRANSLITERATOR_API
01220
01221 public:
01238 inline Transliterator* createInstance(const UnicodeString& ID,
01239 UTransDirection dir=UTRANS_FORWARD,
01240 UParseError* parseError=0);
01261 inline Transliterator* createInverse() const;
01262
01263 protected:
01278 UChar filteredCharAt(const Replaceable& text, int32_t i) const;
01279
01280 #endif
01281 };
01282
01283 inline int32_t Transliterator::getMaximumContextLength(void) const {
01284 return maximumContextLength;
01285 }
01286
01287 inline void Transliterator::setID(const UnicodeString& id) {
01288 ID = id;
01289 }
01290
01291 inline Transliterator::Token Transliterator::integerToken(int32_t i) {
01292 Token t;
01293 t.integer = i;
01294 return t;
01295 }
01296
01297 inline Transliterator::Token Transliterator::pointerToken(void* p) {
01298 Token t;
01299 t.pointer = p;
01300 return t;
01301 }
01302
01307 #ifdef U_USE_DEPRECATED_TRANSLITERATOR_API
01308
01309 inline Transliterator* Transliterator::createInstance(const UnicodeString& ID,
01310 UTransDirection dir,
01311 UParseError* parseError){
01312 UErrorCode status = U_ZERO_ERROR;
01313 UParseError error;
01314 if(parseError == NULL){
01315 parseError = &error;
01316 }
01317 return Transliterator::createInstance(ID,dir,*parseError,status);
01318 }
01319
01320 inline Transliterator* Transliterator::createInverse() const{
01321
01322 UErrorCode status = U_ZERO_ERROR;
01323 return createInverse(status);
01324 }
01325
01326 #endif
01327
01328 U_NAMESPACE_END
01329
01330 #endif
01331