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
00022 #if !UCONFIG_NO_TRANSLITERATION
00023
00024 #include "unicode/uobject.h"
00025 #include "unicode/unistr.h"
00026 #include "unicode/parseerr.h"
00027 #include "unicode/utrans.h"
00028 #include "unicode/strenum.h"
00029
00030 U_NAMESPACE_BEGIN
00031
00032 class UnicodeFilter;
00033 class UnicodeSet;
00034 class TransliteratorParser;
00035 class NormalizationTransliterator;
00036 class TransliteratorIDParser;
00037
00488 class U_I18N_API Transliterator : public UObject {
00489
00490 private:
00491
00495 UnicodeString ID;
00496
00503 UnicodeFilter* filter;
00504
00505 int32_t maximumContextLength;
00506
00507 public:
00508
00514 union Token {
00519 int32_t integer;
00524 void* pointer;
00525 };
00526
00527 #ifndef U_HIDE_INTERNAL_API
00528
00533 inline static Token integerToken(int32_t);
00534
00540 inline static Token pointerToken(void*);
00541 #endif
00542
00558 typedef Transliterator* (U_EXPORT2 *Factory)(const UnicodeString& ID, Token context);
00559
00560 protected:
00561
00571 Transliterator(const UnicodeString& ID, UnicodeFilter* adoptedFilter);
00572
00577 Transliterator(const Transliterator&);
00578
00583 Transliterator& operator=(const Transliterator&);
00584
00596 static Transliterator* createBasicInstance(const UnicodeString& id,
00597 const UnicodeString* canon);
00598
00599 friend class TransliteratorParser;
00600 friend class TransliteratorIDParser;
00601 friend class TransliteratorAlias;
00602
00603 public:
00604
00609 virtual ~Transliterator();
00610
00625 virtual Transliterator* clone() const;
00626
00642 virtual int32_t transliterate(Replaceable& text,
00643 int32_t start, int32_t limit) const;
00644
00650 virtual void transliterate(Replaceable& text) const;
00651
00716 virtual void transliterate(Replaceable& text, UTransPosition& index,
00717 const UnicodeString& insertion,
00718 UErrorCode& status) const;
00719
00735 virtual void transliterate(Replaceable& text, UTransPosition& index,
00736 UChar32 insertion,
00737 UErrorCode& status) const;
00738
00752 virtual void transliterate(Replaceable& text, UTransPosition& index,
00753 UErrorCode& status) const;
00754
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 = 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