00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #ifndef TRANSLIT_H
00011 #define TRANSLIT_H
00012
00013 #include "unicode/utypes.h"
00014
00020 #if !UCONFIG_NO_TRANSLITERATION
00021
00022 #include "unicode/uobject.h"
00023 #include "unicode/unistr.h"
00024 #include "unicode/parseerr.h"
00025 #include "unicode/utrans.h"
00026 #include "unicode/strenum.h"
00027
00028 U_NAMESPACE_BEGIN
00029
00030 class UnicodeFilter;
00031 class UnicodeSet;
00032 class CompoundTransliterator;
00033 class TransliteratorParser;
00034 class NormalizationTransliterator;
00035 class TransliteratorIDParser;
00036
00241 class U_I18N_API Transliterator : public UObject {
00242
00243 private:
00244
00248 UnicodeString ID;
00249
00256 UnicodeFilter* filter;
00257
00258 int32_t maximumContextLength;
00259
00260 public:
00261
00267 union Token {
00272 int32_t integer;
00277 void* pointer;
00278 };
00279
00285 inline static Token integerToken(int32_t);
00286
00292 inline static Token pointerToken(void*);
00293
00309 typedef Transliterator* (U_EXPORT2 *Factory)(const UnicodeString& ID, Token context);
00310
00311 protected:
00312
00322 Transliterator(const UnicodeString& ID, UnicodeFilter* adoptedFilter);
00323
00328 Transliterator(const Transliterator&);
00329
00334 Transliterator& operator=(const Transliterator&);
00335
00347 static Transliterator* createBasicInstance(const UnicodeString& id,
00348 const UnicodeString* canon);
00349
00350 friend class TransliteratorParser;
00351 friend class TransliteratorIDParser;
00352 friend class TransliteratorAlias;
00353
00354 public:
00355
00360 virtual ~Transliterator();
00361
00376 virtual Transliterator* clone() const { return 0; }
00377
00393 virtual int32_t transliterate(Replaceable& text,
00394 int32_t start, int32_t limit) const;
00395
00401 virtual void transliterate(Replaceable& text) const;
00402
00467 virtual void transliterate(Replaceable& text, UTransPosition& index,
00468 const UnicodeString& insertion,
00469 UErrorCode& status) const;
00470
00489 virtual void transliterate(Replaceable& text, UTransPosition& index,
00490 UChar32 insertion,
00491 UErrorCode& status) const;
00492
00507 virtual void transliterate(Replaceable& text, UTransPosition& index,
00508 UErrorCode& status) const;
00509
00521 virtual void finishTransliteration(Replaceable& text,
00522 UTransPosition& index) const;
00523
00524 private:
00525
00541 void _transliterate(Replaceable& text,
00542 UTransPosition& index,
00543 const UnicodeString* insertion,
00544 UErrorCode &status) const;
00545
00546 protected:
00547
00627 virtual void handleTransliterate(Replaceable& text,
00628 UTransPosition& pos,
00629 UBool incremental) const = 0;
00630
00642 virtual void filteredTransliterate(Replaceable& text,
00643 UTransPosition& index,
00644 UBool incremental) const;
00645
00646 friend class CompoundTransliterator;
00647 friend class AnyTransliterator;
00648
00649 private:
00650
00678 virtual void filteredTransliterate(Replaceable& text,
00679 UTransPosition& index,
00680 UBool incremental,
00681 UBool rollback) const;
00682
00683 public:
00684
00698 int32_t getMaximumContextLength(void) const;
00699
00700 protected:
00701
00708 void setMaximumContextLength(int32_t maxContextLength);
00709
00710 public:
00711
00722 virtual const UnicodeString& getID(void) const;
00723
00733 static UnicodeString& U_EXPORT2 getDisplayName(const UnicodeString& ID,
00734 UnicodeString& result);
00735
00757 static UnicodeString& U_EXPORT2 getDisplayName(const UnicodeString& ID,
00758 const Locale& inLocale,
00759 UnicodeString& result);
00760
00768 const UnicodeFilter* getFilter(void) const;
00769
00779 UnicodeFilter* orphanFilter(void);
00780
00791 void adoptFilter(UnicodeFilter* adoptedFilter);
00792
00812 Transliterator* createInverse(UErrorCode& status) const;
00813
00830 static Transliterator* U_EXPORT2 createInstance(const UnicodeString& ID,
00831 UTransDirection dir,
00832 UParseError& parseError,
00833 UErrorCode& status);
00834
00845 static Transliterator* U_EXPORT2 createInstance(const UnicodeString& ID,
00846 UTransDirection dir,
00847 UErrorCode& status);
00848
00864 static Transliterator* U_EXPORT2 createFromRules(const UnicodeString& ID,
00865 const UnicodeString& rules,
00866 UTransDirection dir,
00867 UParseError& parseError,
00868 UErrorCode& status);
00869
00881 virtual UnicodeString& toRules(UnicodeString& result,
00882 UBool escapeUnprintable) const;
00883
00896 int32_t countElements() const;
00897
00917 const Transliterator& getElement(int32_t index, UErrorCode& ec) const;
00918
00934 UnicodeSet& getSourceSet(UnicodeSet& result) const;
00935
00950 virtual void handleGetSourceSet(UnicodeSet& result) const;
00951
00965 virtual UnicodeSet& getTargetSet(UnicodeSet& result) const;
00966
00967 public:
00968
00980 static void U_EXPORT2 registerFactory(const UnicodeString& id,
00981 Factory factory,
00982 Token context);
00983
01001 static void U_EXPORT2 registerInstance(Transliterator* adoptedObj);
01002
01003 protected:
01004
01014 static void _registerFactory(const UnicodeString& id,
01015 Factory factory,
01016 Token context);
01017
01021 static void _registerInstance(Transliterator* adoptedObj);
01022
01056 static void _registerSpecialInverse(const UnicodeString& target,
01057 const UnicodeString& inverseTarget,
01058 UBool bidirectional);
01059
01060 public:
01061
01075 static void U_EXPORT2 unregister(const UnicodeString& ID);
01076
01077 public:
01078
01088 static StringEnumeration* U_EXPORT2 getAvailableIDs(UErrorCode& ec);
01089
01095 static int32_t U_EXPORT2 countAvailableSources(void);
01096
01106 static UnicodeString& U_EXPORT2 getAvailableSource(int32_t index,
01107 UnicodeString& result);
01108
01117 static int32_t U_EXPORT2 countAvailableTargets(const UnicodeString& source);
01118
01130 static UnicodeString& U_EXPORT2 getAvailableTarget(int32_t index,
01131 const UnicodeString& source,
01132 UnicodeString& result);
01133
01141 static int32_t U_EXPORT2 countAvailableVariants(const UnicodeString& source,
01142 const UnicodeString& target);
01143
01157 static UnicodeString& U_EXPORT2 getAvailableVariant(int32_t index,
01158 const UnicodeString& source,
01159 const UnicodeString& target,
01160 UnicodeString& result);
01161
01162 protected:
01163
01168 static int32_t _countAvailableSources(void);
01169
01174 static UnicodeString& _getAvailableSource(int32_t index,
01175 UnicodeString& result);
01176
01181 static int32_t _countAvailableTargets(const UnicodeString& source);
01182
01187 static UnicodeString& _getAvailableTarget(int32_t index,
01188 const UnicodeString& source,
01189 UnicodeString& result);
01190
01195 static int32_t _countAvailableVariants(const UnicodeString& source,
01196 const UnicodeString& target);
01197
01202 static UnicodeString& _getAvailableVariant(int32_t index,
01203 const UnicodeString& source,
01204 const UnicodeString& target,
01205 UnicodeString& result);
01206
01207 protected:
01208
01215 void setID(const UnicodeString& id);
01216
01217 public:
01218
01229 static UClassID U_EXPORT2 getStaticClassID(void);
01230
01246 virtual UClassID getDynamicClassID(void) const = 0;
01247
01248 private:
01249 static UBool initializeRegistry(void);
01250
01251 public:
01259 static int32_t U_EXPORT2 countAvailableIDs(void);
01260
01273 static const UnicodeString& U_EXPORT2 getAvailableID(int32_t index);
01274 };
01275
01276 inline int32_t Transliterator::getMaximumContextLength(void) const {
01277 return maximumContextLength;
01278 }
01279
01280 inline void Transliterator::setID(const UnicodeString& id) {
01281 ID = id;
01282
01283 ID.getTerminatedBuffer();
01284 }
01285
01286 inline Transliterator::Token Transliterator::integerToken(int32_t i) {
01287 Token t;
01288 t.integer = i;
01289 return t;
01290 }
01291
01292 inline Transliterator::Token Transliterator::pointerToken(void* p) {
01293 Token t;
01294 t.pointer = p;
01295 return t;
01296 }
01297
01298 U_NAMESPACE_END
01299
01300 #endif
01301
01302 #endif