00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef TRANSLIT_H
00013 #define TRANSLIT_H
00014
00015 #include "unicode/utypes.h"
00016
00017 #if U_SHOW_CPLUSPLUS_API
00018
00024 #if !UCONFIG_NO_TRANSLITERATION
00025
00026 #include "unicode/uobject.h"
00027 #include "unicode/unistr.h"
00028 #include "unicode/parseerr.h"
00029 #include "unicode/utrans.h"
00030 #include "unicode/strenum.h"
00031
00032 U_NAMESPACE_BEGIN
00033
00034 class UnicodeFilter;
00035 class UnicodeSet;
00036 class TransliteratorParser;
00037 class NormalizationTransliterator;
00038 class TransliteratorIDParser;
00039
00490 class U_I18N_API Transliterator : public UObject {
00491
00492 private:
00493
00497 UnicodeString ID;
00498
00505 UnicodeFilter* filter;
00506
00507 int32_t maximumContextLength;
00508
00509 public:
00510
00516 union Token {
00521 int32_t integer;
00526 void* pointer;
00527 };
00528
00529 #ifndef U_HIDE_INTERNAL_API
00530
00535 inline static Token integerToken(int32_t);
00536
00542 inline static Token pointerToken(void*);
00543 #endif
00544
00560 typedef Transliterator* (U_EXPORT2 *Factory)(const UnicodeString& ID, Token context);
00561
00562 protected:
00563
00573 Transliterator(const UnicodeString& ID, UnicodeFilter* adoptedFilter);
00574
00579 Transliterator(const Transliterator&);
00580
00585 Transliterator& operator=(const Transliterator&);
00586
00598 static Transliterator* createBasicInstance(const UnicodeString& id,
00599 const UnicodeString* canon);
00600
00601 friend class TransliteratorParser;
00602 friend class TransliteratorIDParser;
00603 friend class TransliteratorAlias;
00604
00605 public:
00606
00611 virtual ~Transliterator();
00612
00627 virtual Transliterator* clone() const;
00628
00644 virtual int32_t transliterate(Replaceable& text,
00645 int32_t start, int32_t limit) const;
00646
00652 virtual void transliterate(Replaceable& text) const;
00653
00718 virtual void transliterate(Replaceable& text, UTransPosition& index,
00719 const UnicodeString& insertion,
00720 UErrorCode& status) const;
00721
00737 virtual void transliterate(Replaceable& text, UTransPosition& index,
00738 UChar32 insertion,
00739 UErrorCode& status) const;
00740
00753 virtual void transliterate(Replaceable& text, UTransPosition& index,
00754 UErrorCode& status) const;
00755
00766 virtual void finishTransliteration(Replaceable& text,
00767 UTransPosition& index) const;
00768
00769 private:
00770
00786 void _transliterate(Replaceable& text,
00787 UTransPosition& index,
00788 const UnicodeString* insertion,
00789 UErrorCode &status) const;
00790
00791 protected:
00792
00872 virtual void handleTransliterate(Replaceable& text,
00873 UTransPosition& pos,
00874 UBool incremental) const = 0;
00875
00876 public:
00888 virtual void filteredTransliterate(Replaceable& text,
00889 UTransPosition& index,
00890 UBool incremental) const;
00891
00892 private:
00893
00921 virtual void filteredTransliterate(Replaceable& text,
00922 UTransPosition& index,
00923 UBool incremental,
00924 UBool rollback) const;
00925
00926 public:
00927
00941 int32_t getMaximumContextLength(void) const;
00942
00943 protected:
00944
00951 void setMaximumContextLength(int32_t maxContextLength);
00952
00953 public:
00954
00965 virtual const UnicodeString& getID(void) const;
00966
00976 static UnicodeString& U_EXPORT2 getDisplayName(const UnicodeString& ID,
00977 UnicodeString& result);
00978
01000 static UnicodeString& U_EXPORT2 getDisplayName(const UnicodeString& ID,
01001 const Locale& inLocale,
01002 UnicodeString& result);
01003
01011 const UnicodeFilter* getFilter(void) const;
01012
01022 UnicodeFilter* orphanFilter(void);
01023
01034 void adoptFilter(UnicodeFilter* adoptedFilter);
01035
01055 Transliterator* createInverse(UErrorCode& status) const;
01056
01073 static Transliterator* U_EXPORT2 createInstance(const UnicodeString& ID,
01074 UTransDirection dir,
01075 UParseError& parseError,
01076 UErrorCode& status);
01077
01088 static Transliterator* U_EXPORT2 createInstance(const UnicodeString& ID,
01089 UTransDirection dir,
01090 UErrorCode& status);
01091
01109 static Transliterator* U_EXPORT2 createFromRules(const UnicodeString& ID,
01110 const UnicodeString& rules,
01111 UTransDirection dir,
01112 UParseError& parseError,
01113 UErrorCode& status);
01114
01126 virtual UnicodeString& toRules(UnicodeString& result,
01127 UBool escapeUnprintable) const;
01128
01141 int32_t countElements() const;
01142
01162 const Transliterator& getElement(int32_t index, UErrorCode& ec) const;
01163
01179 UnicodeSet& getSourceSet(UnicodeSet& result) const;
01180
01195 virtual void handleGetSourceSet(UnicodeSet& result) const;
01196
01210 virtual UnicodeSet& getTargetSet(UnicodeSet& result) const;
01211
01212 public:
01213
01230 static void U_EXPORT2 registerFactory(const UnicodeString& id,
01231 Factory factory,
01232 Token context);
01233
01255 static void U_EXPORT2 registerInstance(Transliterator* adoptedObj);
01256
01271 static void U_EXPORT2 registerAlias(const UnicodeString& aliasID,
01272 const UnicodeString& realID);
01273
01274 protected:
01275
01276 #ifndef U_HIDE_INTERNAL_API
01277
01286 static void _registerFactory(const UnicodeString& id,
01287 Factory factory,
01288 Token context);
01289
01293 static void _registerInstance(Transliterator* adoptedObj);
01294
01298 static void _registerAlias(const UnicodeString& aliasID, const UnicodeString& realID);
01299
01333 static void _registerSpecialInverse(const UnicodeString& target,
01334 const UnicodeString& inverseTarget,
01335 UBool bidirectional);
01336 #endif
01337
01338 public:
01339
01357 static void U_EXPORT2 unregister(const UnicodeString& ID);
01358
01359 public:
01360
01370 static StringEnumeration* U_EXPORT2 getAvailableIDs(UErrorCode& ec);
01371
01377 static int32_t U_EXPORT2 countAvailableSources(void);
01378
01388 static UnicodeString& U_EXPORT2 getAvailableSource(int32_t index,
01389 UnicodeString& result);
01390
01399 static int32_t U_EXPORT2 countAvailableTargets(const UnicodeString& source);
01400
01412 static UnicodeString& U_EXPORT2 getAvailableTarget(int32_t index,
01413 const UnicodeString& source,
01414 UnicodeString& result);
01415
01423 static int32_t U_EXPORT2 countAvailableVariants(const UnicodeString& source,
01424 const UnicodeString& target);
01425
01439 static UnicodeString& U_EXPORT2 getAvailableVariant(int32_t index,
01440 const UnicodeString& source,
01441 const UnicodeString& target,
01442 UnicodeString& result);
01443
01444 protected:
01445
01446 #ifndef U_HIDE_INTERNAL_API
01447
01451 static int32_t _countAvailableSources(void);
01452
01457 static UnicodeString& _getAvailableSource(int32_t index,
01458 UnicodeString& result);
01459
01464 static int32_t _countAvailableTargets(const UnicodeString& source);
01465
01470 static UnicodeString& _getAvailableTarget(int32_t index,
01471 const UnicodeString& source,
01472 UnicodeString& result);
01473
01478 static int32_t _countAvailableVariants(const UnicodeString& source,
01479 const UnicodeString& target);
01480
01485 static UnicodeString& _getAvailableVariant(int32_t index,
01486 const UnicodeString& source,
01487 const UnicodeString& target,
01488 UnicodeString& result);
01489 #endif
01490
01491 protected:
01492
01499 void setID(const UnicodeString& id);
01500
01501 public:
01502
01513 static UClassID U_EXPORT2 getStaticClassID(void);
01514
01530 virtual UClassID getDynamicClassID(void) const override = 0;
01531
01532 private:
01533 static UBool initializeRegistry(UErrorCode &status);
01534
01535 public:
01536 #ifndef U_HIDE_OBSOLETE_API
01537
01544 static int32_t U_EXPORT2 countAvailableIDs(void);
01545
01558 static const UnicodeString& U_EXPORT2 getAvailableID(int32_t index);
01559 #endif
01560 };
01561
01562 inline int32_t Transliterator::getMaximumContextLength(void) const {
01563 return maximumContextLength;
01564 }
01565
01566 inline void Transliterator::setID(const UnicodeString& id) {
01567 ID = id;
01568
01569 ID.append((char16_t)0);
01570 ID.truncate(ID.length()-1);
01571 }
01572
01573 #ifndef U_HIDE_INTERNAL_API
01574 inline Transliterator::Token Transliterator::integerToken(int32_t i) {
01575 Token t;
01576 t.integer = i;
01577 return t;
01578 }
01579
01580 inline Transliterator::Token Transliterator::pointerToken(void* p) {
01581 Token t;
01582 t.pointer = p;
01583 return t;
01584 }
01585 #endif
01586
01587 U_NAMESPACE_END
01588
01589 #endif
01590
01591 #endif
01592
01593 #endif