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
00280 #ifndef U_HIDE_INTERNAL_API
00281
00286 inline static Token integerToken(int32_t);
00287
00293 inline static Token pointerToken(void*);
00294 #endif
00295
00311 typedef Transliterator* (U_EXPORT2 *Factory)(const UnicodeString& ID, Token context);
00312
00313 protected:
00314
00324 Transliterator(const UnicodeString& ID, UnicodeFilter* adoptedFilter);
00325
00330 Transliterator(const Transliterator&);
00331
00336 Transliterator& operator=(const Transliterator&);
00337
00349 static Transliterator* createBasicInstance(const UnicodeString& id,
00350 const UnicodeString* canon);
00351
00352 friend class TransliteratorParser;
00353 friend class TransliteratorIDParser;
00354 friend class TransliteratorAlias;
00355
00356 public:
00357
00362 virtual ~Transliterator();
00363
00378 virtual Transliterator* clone() const;
00379
00395 virtual int32_t transliterate(Replaceable& text,
00396 int32_t start, int32_t limit) const;
00397
00403 virtual void transliterate(Replaceable& text) const;
00404
00469 virtual void transliterate(Replaceable& text, UTransPosition& index,
00470 const UnicodeString& insertion,
00471 UErrorCode& status) const;
00472
00488 virtual void transliterate(Replaceable& text, UTransPosition& index,
00489 UChar32 insertion,
00490 UErrorCode& status) const;
00491
00505 virtual void transliterate(Replaceable& text, UTransPosition& index,
00506 UErrorCode& status) const;
00507
00519 virtual void finishTransliteration(Replaceable& text,
00520 UTransPosition& index) const;
00521
00522 private:
00523
00539 void _transliterate(Replaceable& text,
00540 UTransPosition& index,
00541 const UnicodeString* insertion,
00542 UErrorCode &status) const;
00543
00544 protected:
00545
00625 virtual void handleTransliterate(Replaceable& text,
00626 UTransPosition& pos,
00627 UBool incremental) const = 0;
00628
00629 public:
00641 virtual void filteredTransliterate(Replaceable& text,
00642 UTransPosition& index,
00643 UBool incremental) const;
00644
00645 private:
00646
00674 virtual void filteredTransliterate(Replaceable& text,
00675 UTransPosition& index,
00676 UBool incremental,
00677 UBool rollback) const;
00678
00679 public:
00680
00694 int32_t getMaximumContextLength(void) const;
00695
00696 protected:
00697
00704 void setMaximumContextLength(int32_t maxContextLength);
00705
00706 public:
00707
00718 virtual const UnicodeString& getID(void) const;
00719
00729 static UnicodeString& U_EXPORT2 getDisplayName(const UnicodeString& ID,
00730 UnicodeString& result);
00731
00753 static UnicodeString& U_EXPORT2 getDisplayName(const UnicodeString& ID,
00754 const Locale& inLocale,
00755 UnicodeString& result);
00756
00764 const UnicodeFilter* getFilter(void) const;
00765
00775 UnicodeFilter* orphanFilter(void);
00776
00787 void adoptFilter(UnicodeFilter* adoptedFilter);
00788
00808 Transliterator* createInverse(UErrorCode& status) const;
00809
00826 static Transliterator* U_EXPORT2 createInstance(const UnicodeString& ID,
00827 UTransDirection dir,
00828 UParseError& parseError,
00829 UErrorCode& status);
00830
00841 static Transliterator* U_EXPORT2 createInstance(const UnicodeString& ID,
00842 UTransDirection dir,
00843 UErrorCode& status);
00844
00860 static Transliterator* U_EXPORT2 createFromRules(const UnicodeString& ID,
00861 const UnicodeString& rules,
00862 UTransDirection dir,
00863 UParseError& parseError,
00864 UErrorCode& status);
00865
00877 virtual UnicodeString& toRules(UnicodeString& result,
00878 UBool escapeUnprintable) const;
00879
00892 int32_t countElements() const;
00893
00913 const Transliterator& getElement(int32_t index, UErrorCode& ec) const;
00914
00930 UnicodeSet& getSourceSet(UnicodeSet& result) const;
00931
00946 virtual void handleGetSourceSet(UnicodeSet& result) const;
00947
00961 virtual UnicodeSet& getTargetSet(UnicodeSet& result) const;
00962
00963 public:
00964
00981 static void U_EXPORT2 registerFactory(const UnicodeString& id,
00982 Factory factory,
00983 Token context);
00984
01006 static void U_EXPORT2 registerInstance(Transliterator* adoptedObj);
01007
01022 static void U_EXPORT2 registerAlias(const UnicodeString& aliasID,
01023 const UnicodeString& realID);
01024
01025 protected:
01026
01027 #ifndef U_HIDE_INTERNAL_API
01028
01037 static void _registerFactory(const UnicodeString& id,
01038 Factory factory,
01039 Token context);
01040
01044 static void _registerInstance(Transliterator* adoptedObj);
01045
01049 static void _registerAlias(const UnicodeString& aliasID, const UnicodeString& realID);
01050
01084 static void _registerSpecialInverse(const UnicodeString& target,
01085 const UnicodeString& inverseTarget,
01086 UBool bidirectional);
01087 #endif
01088
01089 public:
01090
01108 static void U_EXPORT2 unregister(const UnicodeString& ID);
01109
01110 public:
01111
01121 static StringEnumeration* U_EXPORT2 getAvailableIDs(UErrorCode& ec);
01122
01128 static int32_t U_EXPORT2 countAvailableSources(void);
01129
01139 static UnicodeString& U_EXPORT2 getAvailableSource(int32_t index,
01140 UnicodeString& result);
01141
01150 static int32_t U_EXPORT2 countAvailableTargets(const UnicodeString& source);
01151
01163 static UnicodeString& U_EXPORT2 getAvailableTarget(int32_t index,
01164 const UnicodeString& source,
01165 UnicodeString& result);
01166
01174 static int32_t U_EXPORT2 countAvailableVariants(const UnicodeString& source,
01175 const UnicodeString& target);
01176
01190 static UnicodeString& U_EXPORT2 getAvailableVariant(int32_t index,
01191 const UnicodeString& source,
01192 const UnicodeString& target,
01193 UnicodeString& result);
01194
01195 protected:
01196
01197 #ifndef U_HIDE_INTERNAL_API
01198
01202 static int32_t _countAvailableSources(void);
01203
01208 static UnicodeString& _getAvailableSource(int32_t index,
01209 UnicodeString& result);
01210
01215 static int32_t _countAvailableTargets(const UnicodeString& source);
01216
01221 static UnicodeString& _getAvailableTarget(int32_t index,
01222 const UnicodeString& source,
01223 UnicodeString& result);
01224
01229 static int32_t _countAvailableVariants(const UnicodeString& source,
01230 const UnicodeString& target);
01231
01236 static UnicodeString& _getAvailableVariant(int32_t index,
01237 const UnicodeString& source,
01238 const UnicodeString& target,
01239 UnicodeString& result);
01240 #endif
01241
01242 protected:
01243
01250 void setID(const UnicodeString& id);
01251
01252 public:
01253
01264 static UClassID U_EXPORT2 getStaticClassID(void);
01265
01281 virtual UClassID getDynamicClassID(void) const = 0;
01282
01283 private:
01284 static UBool initializeRegistry(UErrorCode &status);
01285
01286 public:
01287 #ifndef U_HIDE_OBSOLETE_API
01288
01295 static int32_t U_EXPORT2 countAvailableIDs(void);
01296
01309 static const UnicodeString& U_EXPORT2 getAvailableID(int32_t index);
01310 #endif
01311 };
01312
01313 inline int32_t Transliterator::getMaximumContextLength(void) const {
01314 return maximumContextLength;
01315 }
01316
01317 inline void Transliterator::setID(const UnicodeString& id) {
01318 ID = id;
01319
01320 ID.append((UChar)0);
01321 ID.truncate(ID.length()-1);
01322 }
01323
01324 #ifndef U_HIDE_INTERNAL_API
01325 inline Transliterator::Token Transliterator::integerToken(int32_t i) {
01326 Token t;
01327 t.integer = i;
01328 return t;
01329 }
01330
01331 inline Transliterator::Token Transliterator::pointerToken(void* p) {
01332 Token t;
01333 t.pointer = p;
01334 return t;
01335 }
01336 #endif
01337
01338 U_NAMESPACE_END
01339
01340 #endif
01341
01342 #endif