00001
00002
00003
00004
00005
00006
00007
00008 #ifndef TRANSLIT_H
00009 #define TRANSLIT_H
00010
00011 #include "unicode/utypes.h"
00012
00013 #if !UCONFIG_NO_TRANSLITERATION
00014
00015 #include "unicode/uobject.h"
00016 #include "unicode/unistr.h"
00017 #include "unicode/parseerr.h"
00018 #include "unicode/utrans.h"
00019
00020 U_NAMESPACE_BEGIN
00021
00022 class Replaceable;
00023 class UnicodeFilter;
00024 class UnicodeSet;
00025 class TransliterationRuleData;
00026 class U_I18N_API UVector;
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* (*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
00481 virtual void transliterate(Replaceable& text, UTransPosition& index,
00482 UChar32 insertion,
00483 UErrorCode& status) const;
00484
00498 virtual void transliterate(Replaceable& text, UTransPosition& index,
00499 UErrorCode& status) const;
00500
00512 virtual void finishTransliteration(Replaceable& text,
00513 UTransPosition& index) const;
00514
00515 private:
00516
00532 void _transliterate(Replaceable& text,
00533 UTransPosition& index,
00534 const UnicodeString* insertion,
00535 UErrorCode &status) const;
00536
00537 protected:
00538
00618 virtual void handleTransliterate(Replaceable& text,
00619 UTransPosition& pos,
00620 UBool incremental) const = 0;
00621
00633 virtual void filteredTransliterate(Replaceable& text,
00634 UTransPosition& index,
00635 UBool incremental) const;
00636
00637 friend class CompoundTransliterator;
00638 friend class AnyTransliterator;
00639
00640 private:
00641
00669 virtual void filteredTransliterate(Replaceable& text,
00670 UTransPosition& index,
00671 UBool incremental,
00672 UBool rollback) const;
00673
00674 public:
00675
00689 int32_t getMaximumContextLength(void) const;
00690
00691 protected:
00692
00699 void setMaximumContextLength(int32_t maxContextLength);
00700
00701 public:
00702
00713 virtual const UnicodeString& getID(void) const;
00714
00724 static UnicodeString& getDisplayName(const UnicodeString& ID,
00725 UnicodeString& result);
00726
00748 static UnicodeString& getDisplayName(const UnicodeString& ID,
00749 const Locale& inLocale,
00750 UnicodeString& result);
00751
00759 const UnicodeFilter* getFilter(void) const;
00760
00770 UnicodeFilter* orphanFilter(void);
00771
00772 #ifdef U_USE_DEPRECATED_TRANSLITERATOR_API
00773
00783 virtual void adoptFilter(UnicodeFilter* adoptedFilter);
00784 #else
00785
00795 void adoptFilter(UnicodeFilter* adoptedFilter);
00796 #endif
00797
00817 Transliterator* createInverse(UErrorCode& status) const;
00818
00835 static Transliterator* createInstance(const UnicodeString& ID,
00836 UTransDirection dir,
00837 UParseError& parseError,
00838 UErrorCode& status);
00839
00850 static Transliterator* createInstance(const UnicodeString& ID,
00851 UTransDirection dir,
00852 UErrorCode& status);
00868 static Transliterator* createFromRules(const UnicodeString& ID,
00869 const UnicodeString& rules,
00870 UTransDirection dir,
00871 UParseError& parseError,
00872 UErrorCode& status);
00873
00885 virtual UnicodeString& toRules(UnicodeString& result,
00886 UBool escapeUnprintable) const;
00887
00903 UnicodeSet& getSourceSet(UnicodeSet& result) const;
00904
00919 virtual void handleGetSourceSet(UnicodeSet& result) const;
00920
00934 virtual UnicodeSet& getTargetSet(UnicodeSet& result) const;
00935
00936 public:
00937
00949 static void registerFactory(const UnicodeString& id,
00950 Factory factory,
00951 Token context);
00952
00970 static void registerInstance(Transliterator* adoptedObj);
00971
00972 protected:
00973
00983 static void _registerFactory(const UnicodeString& id,
00984 Factory factory,
00985 Token context);
00986
00990 static void _registerInstance(Transliterator* adoptedObj);
00991
01025 static void _registerSpecialInverse(const UnicodeString& target,
01026 const UnicodeString& inverseTarget,
01027 UBool bidirectional);
01028
01029 public:
01030
01044 static void unregister(const UnicodeString& ID);
01045
01046 public:
01047
01055 static int32_t countAvailableIDs(void);
01056
01067 static const UnicodeString& getAvailableID(int32_t index);
01068
01074 static int32_t countAvailableSources(void);
01075
01085 static UnicodeString& getAvailableSource(int32_t index,
01086 UnicodeString& result);
01087
01096 static int32_t countAvailableTargets(const UnicodeString& source);
01097
01109 static UnicodeString& getAvailableTarget(int32_t index,
01110 const UnicodeString& source,
01111 UnicodeString& result);
01112
01120 static int32_t countAvailableVariants(const UnicodeString& source,
01121 const UnicodeString& target);
01122
01136 static UnicodeString& getAvailableVariant(int32_t index,
01137 const UnicodeString& source,
01138 const UnicodeString& target,
01139 UnicodeString& result);
01140
01141 protected:
01142
01147 static int32_t _countAvailableSources(void);
01148
01153 static UnicodeString& _getAvailableSource(int32_t index,
01154 UnicodeString& result);
01155
01160 static int32_t _countAvailableTargets(const UnicodeString& source);
01161
01166 static UnicodeString& _getAvailableTarget(int32_t index,
01167 const UnicodeString& source,
01168 UnicodeString& result);
01169
01174 static int32_t _countAvailableVariants(const UnicodeString& source,
01175 const UnicodeString& target);
01176
01181 static UnicodeString& _getAvailableVariant(int32_t index,
01182 const UnicodeString& source,
01183 const UnicodeString& target,
01184 UnicodeString& result);
01185 public:
01186
01198 static UClassID getStaticClassID(void) { return (UClassID)&fgClassID; }
01199
01223 virtual UClassID getDynamicClassID(void) const = 0;
01224
01225 private:
01226
01231 static const char fgClassID;
01232
01233 protected:
01234
01241 void setID(const UnicodeString& id);
01242
01243 private:
01244 static void initializeRegistry(void);
01245
01246 #ifdef U_USE_DEPRECATED_TRANSLITERATOR_API
01247
01248 public:
01264 inline Transliterator* createInstance(const UnicodeString& ID,
01265 UTransDirection dir=UTRANS_FORWARD,
01266 UParseError* parseError=0);
01287 inline Transliterator* createInverse() const;
01288
01289 protected:
01303 UChar filteredCharAt(const Replaceable& text, int32_t i) const;
01304
01305 #endif
01306 };
01307
01308 inline int32_t Transliterator::getMaximumContextLength(void) const {
01309 return maximumContextLength;
01310 }
01311
01312 inline void Transliterator::setID(const UnicodeString& id) {
01313 ID = id;
01314 }
01315
01316 inline Transliterator::Token Transliterator::integerToken(int32_t i) {
01317 Token t;
01318 t.integer = i;
01319 return t;
01320 }
01321
01322 inline Transliterator::Token Transliterator::pointerToken(void* p) {
01323 Token t;
01324 t.pointer = p;
01325 return t;
01326 }
01327
01332 #ifdef U_USE_DEPRECATED_TRANSLITERATOR_API
01333
01334 inline Transliterator* Transliterator::createInstance(const UnicodeString& ID,
01335 UTransDirection dir,
01336 UParseError* parseError){
01337 UErrorCode status = U_ZERO_ERROR;
01338 UParseError error;
01339 if(parseError == NULL){
01340 parseError = &error;
01341 }
01342 return Transliterator::createInstance(ID,dir,*parseError,status);
01343 }
01344
01345 inline Transliterator* Transliterator::createInverse() const{
01346
01347 UErrorCode status = U_ZERO_ERROR;
01348 return createInverse(status);
01349 }
01350
01351 #endif
01352
01353 U_NAMESPACE_END
01354
01355 #endif
01356
01357 #endif