diff options
author | Rüdiger Timm <rt@openoffice.org> | 2003-04-08 15:05:59 +0000 |
---|---|---|
committer | Rüdiger Timm <rt@openoffice.org> | 2003-04-08 15:05:59 +0000 |
commit | f28b6bcb23973d23ea84d43d760234a4021eddf4 (patch) | |
tree | bc328bcd1df03ea52867ef4622ddae7b818a9ad4 /i18npool/source/transliteration/numtotext_cjk.cxx | |
parent | 8f7fc3caadcdf7ac6e56ec18a2f4cd6b236c8c05 (diff) |
INTEGRATION: CWS calc06 (1.9.38); FILE MERGED
2003/03/21 22:08:14 khong 1.9.38.1: #106680# Implementing new XExtendedTransliteration interface
Diffstat (limited to 'i18npool/source/transliteration/numtotext_cjk.cxx')
-rw-r--r-- | i18npool/source/transliteration/numtotext_cjk.cxx | 265 |
1 files changed, 47 insertions, 218 deletions
diff --git a/i18npool/source/transliteration/numtotext_cjk.cxx b/i18npool/source/transliteration/numtotext_cjk.cxx index f9c0c2d7e5ad..be0c4e5f0a78 100644 --- a/i18npool/source/transliteration/numtotext_cjk.cxx +++ b/i18npool/source/transliteration/numtotext_cjk.cxx @@ -2,9 +2,9 @@ * * $RCSfile: numtotext_cjk.cxx,v $ * - * $Revision: 1.9 $ + * $Revision: 1.10 $ * - * last change: $Author: khong $ $Date: 2002-09-07 01:30:26 $ + * last change: $Author: rt $ $Date: 2003-04-08 16:05:59 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -61,234 +61,63 @@ #define TRANSLITERATION_ALL #include <numtotext_cjk.hxx> -#include <data/numberchar.h> #include <bullet.h> - -using namespace com::sun::star::uno; -using namespace rtl; +#include <drafts/com/sun/star/i18n/NativeNumberMode.hpp> namespace com { namespace sun { namespace star { namespace i18n { -#define NUMBER_OMIT_ZERO (1 << 0) -#define NUMBER_OMIT_ONE (1 << 1) -#define NUMBER_OMIT_ONLY_ZERO (1 << 2) - -#define NUMBER_COMMA 0x002C -#define isComma(ch) (ch == NUMBER_COMMA) -#define MAX_SAL_UINT32 0xFFFFFFFF -#define MAX_VALUE (MAX_SAL_UINT32 - 9) / 10 - -NumToText_CJK::NumToText_CJK() { - numberChar = NULL; - bulletCount = 0; - number = 0; -} - -OUString SAL_CALL NumToText_CJK::transliterate( const OUString& inStr, sal_Int32 startPos, sal_Int32 nCount, - Sequence< sal_Int32 >& offset ) throw(RuntimeException) -{ - if (! numberChar) throw RuntimeException(); - - sal_Int32 strLen = inStr.getLength() - startPos; - - if (nCount > strLen) - nCount = strLen; - - if (nCount > 0) { - const sal_Unicode *str = inStr.getStr() + startPos; - rtl_uString *newStr = x_rtl_uString_new_WithLength(nCount * 2); - rtl_uString *srcStr = x_rtl_uString_new_WithLength(nCount); // for keeping number without comma - sal_Int32 i, len = 0, count = 0; - - offset.realloc( nCount * 2 ); - sal_Bool doDecimal = sal_False; - sal_Bool makeBullet = bulletCount > 0; - - for (i = 0; i <= nCount; i++) { - if (i < nCount && isNumber(str[i])) { - if (doDecimal) { - newStr->buffer[count] = numberChar[str[i] - NUMBER_ZERO]; - offset[count++] = i + startPos; - } - else - srcStr->buffer[len++] = str[i]; - } else { - if (len > 0) { - if (isComma(str[i]) && i < nCount-1 && isNumber(str[i+1])) - continue; // skip comma inside number string - if (makeBullet) { - sal_uInt32 value = 0; - for (sal_Int32 j = 0; j < len; j++) { - if (value < MAX_VALUE) - value = (value * 10) + (str[j] - NUMBER_ZERO); - else - throw RuntimeException(); // overfollow, number is too big - } - if (! recycleBullet && value > bulletCount) { - for (sal_Int32 j = 0; j < len; j++) { - newStr->buffer[count] = str[j]; - offset[count++] = i - len + startPos + j; - } - } else { - newStr->buffer[count] = value ? numberChar[(value-1) % bulletCount] : NUMBER_ZERO; - offset[count++] = i - len + startPos; - } - } - else { - sal_Bool notZero = sal_False; - for (sal_Int32 begin = 0, end = len % multiplierExponent[0]; - end <= len; begin = end, end += multiplierExponent[0]) { - sal_Int32 _count = count; - notZero |= numberMaker(srcStr->buffer, begin, end - begin, newStr->buffer, count, - end == len ? 0 : multiplierChar[0], offset, i - len + startPos); - if (count > 0 && newStr->buffer[count-1] == numberChar[0]) - count--; - if (notZero && _count == count) { - if (end != len) { - newStr->buffer[count] = multiplierChar[0]; - offset[count++] = i - len + startPos; - } - } - } - if (! notZero && ! (numberFlag & NUMBER_OMIT_ONLY_ZERO)) { - newStr->buffer[count] = numberChar[0]; - offset[count++] = i - len + startPos; - } - } - len = 0; - } - if (i < nCount) { - if (doDecimal = (!makeBullet && !doDecimal && - isDecimal(str[i]) && i < nCount-1 && isNumber(str[i+1]))) - newStr->buffer[count] = DecimalChar[number]; - else if (!makeBullet && isMinus(str[i]) && i < nCount-1 && isNumber(str[i+1])) - newStr->buffer[count] = MinusChar[number]; - else - newStr->buffer[count] = str[i]; - offset[count++] = i + startPos; - } - } - } - - offset.realloc(count); - return OUString(newStr->buffer, count); - } - return OUString(); -} - -sal_Bool SAL_CALL NumToText_CJK::numberMaker(const sal_Unicode *str, sal_Int32 begin, sal_Int32 len, - sal_Unicode *dst, sal_Int32& count, sal_Unicode multiChar, Sequence< sal_Int32 >& offset, sal_Int32 startPos) -{ - if ( len <= multiplierExponent[exponentCount-1] ) { - if (multiplierExponent[exponentCount-1] > 1) { - sal_Int16 i; - sal_Bool notZero = false; - for (i = 0; i < len; i++, begin++) { - if (notZero || str[begin] != NUMBER_ZERO) { - dst[count] = numberChar[str[begin] - NUMBER_ZERO]; - offset[count++] = begin + startPos; - notZero = sal_True; - } - } - if (notZero && multiChar > 0) { - dst[count] = multiChar; - offset[count++] = begin + startPos; - } - return notZero; - } else if (str[begin] != NUMBER_ZERO) { - if (!(numberFlag & NUMBER_OMIT_ONE) || multiChar == 0 || str[begin] != NUMBER_ONE) { - dst[count] = numberChar[str[begin] - NUMBER_ZERO]; - offset[count++] = begin + startPos; - } - if (multiChar > 0) { - dst[count] = multiChar; - offset[count++] = begin + startPos; - } - } else if (!(numberFlag & NUMBER_OMIT_ZERO) && count > 0 && dst[count-1] != numberChar[0]) { - dst[count] = numberChar[0]; - offset[count++] = begin + startPos; - } - return str[begin] != NUMBER_ZERO; - } else { - sal_Bool printPower = sal_False; - sal_Int16 last = 0; - for (sal_Int16 i = 1; i <= exponentCount; i++) { - sal_Int32 tmp = len - (i == exponentCount ? 0 : multiplierExponent[i]); - if (tmp > 0) { - printPower |= numberMaker(str, begin, tmp, dst, count, - (i == exponentCount ? 0 : multiplierChar[i]), offset, startPos); - begin += tmp; - len -= tmp; - } - } - if (printPower) { - if (count > 0 && dst[count-1] == numberChar[0]) - count--; - if (multiChar > 0) { - dst[count] = multiChar; - offset[count++] = begin + startPos; - } - } - return printPower; - } -} - -#define TRANSLITERATION_NUMTOTEXT( name, _number, _mult, _short, flag ) \ +#define TRANSLITERATION_NUMTOTEXT( name, number, type ) \ NumToText##name::NumToText##name() \ { \ - number = NumberChar_##_number; \ - numberChar = NumberChar[NumberChar_##_number]; \ - multiplierChar = MultiplierChar_##_short[Multiplier_##_mult]; \ - exponentCount = ExponentCount_##_short; \ - multiplierExponent = MultiplierExponent_##_short; \ - numberFlag = flag; \ - transliterationName = "NumToText"#name; \ - implementationName = "com.sun.star.i18n.Transliteration.NumToText"#name; \ + nNativeNumberMode = number; \ + tableSize = 0; \ + transliterationName = "NumToText"#name; \ + implementationName = "com.sun.star.i18n.Transliteration.NumToText"#name; \ } -TRANSLITERATION_NUMTOTEXT( Lower_zh_CN, Lower_zh, Lower_zh, CJK, 0 ) -TRANSLITERATION_NUMTOTEXT( Upper_zh_CN, Upper_zh, Upper_zh, CJK, 0 ) -TRANSLITERATION_NUMTOTEXT( Lower_zh_TW, Lower_zh, Lower_zh, CJK, 0 ) -TRANSLITERATION_NUMTOTEXT( Upper_zh_TW, Upper_zh_TW, Upper_zh_TW, CJK, 0 ) -TRANSLITERATION_NUMTOTEXT( Fullwidth_zh_CN, FullWidth, Lower_zh, CJK, 0 ) -TRANSLITERATION_NUMTOTEXT( Fullwidth_zh_TW, FullWidth, Lower_zh_TW, CJK, 0 ) -TRANSLITERATION_NUMTOTEXT( Fullwidth_ja_JP, FullWidth, Modern_ja, CJK, 0 ) -TRANSLITERATION_NUMTOTEXT( Fullwidth_ko, FullWidth, Hangul_ko, CJK, 0 ) -#define Multiplier_Lower_ko Multiplier_Upper_zh_TW -#define Multiplier_Upper_ko Multiplier_Upper_zh_TW -TRANSLITERATION_NUMTOTEXT( FormalLower_ko, Lower_ko, Lower_ko, CJK, NUMBER_OMIT_ZERO ) -TRANSLITERATION_NUMTOTEXT( FormalUpper_ko, Upper_ko, Upper_ko, CJK, NUMBER_OMIT_ZERO ) -TRANSLITERATION_NUMTOTEXT( FormalHangul_ko, Hangul_ko, Hangul_ko, CJK, NUMBER_OMIT_ZERO ) -#define NUMBER_OMIT_ALL ( NUMBER_OMIT_ZERO|NUMBER_OMIT_ONE|NUMBER_OMIT_ONLY_ZERO ) -TRANSLITERATION_NUMTOTEXT( InformalLower_ko, Lower_ko, Lower_ko, CJK, NUMBER_OMIT_ALL ) -TRANSLITERATION_NUMTOTEXT( InformalUpper_ko, Upper_ko, Upper_ko, CJK, NUMBER_OMIT_ALL ) -TRANSLITERATION_NUMTOTEXT( InformalHangul_ko, Hangul_ko, Hangul_ko, CJK, NUMBER_OMIT_ALL ) -TRANSLITERATION_NUMTOTEXT( KanjiLongTraditional_ja_JP, Traditional_ja, Traditional_ja, CJK, NUMBER_OMIT_ALL ) -TRANSLITERATION_NUMTOTEXT( KanjiLongModern_ja_JP, Modern_ja, Modern_ja, CJK, NUMBER_OMIT_ALL ) -TRANSLITERATION_NUMTOTEXT( Date_zh, Lower_zh, Lower_zh, CJK, NUMBER_OMIT_ALL ) -TRANSLITERATION_NUMTOTEXT( KanjiShortTraditional_ja_JP, Traditional_ja, Traditional_ja, short_CJK, NUMBER_OMIT_ALL ) -TRANSLITERATION_NUMTOTEXT( KanjiShortModern_ja_JP, Modern_ja, Modern_ja,short_CJK, NUMBER_OMIT_ALL ) +using namespace drafts::com::sun::star::i18n::NativeNumberMode; + +TRANSLITERATION_NUMTOTEXT( Lower_zh_CN, NATNUM4) +TRANSLITERATION_NUMTOTEXT( Upper_zh_CN, NATNUM5) +TRANSLITERATION_NUMTOTEXT( Lower_zh_TW, NATNUM4) +TRANSLITERATION_NUMTOTEXT( Upper_zh_TW, NATNUM5) +TRANSLITERATION_NUMTOTEXT( Fullwidth_zh_CN, NATNUM6) +TRANSLITERATION_NUMTOTEXT( Fullwidth_zh_TW, NATNUM6) +TRANSLITERATION_NUMTOTEXT( Fullwidth_ja_JP, NATNUM6) +TRANSLITERATION_NUMTOTEXT( Fullwidth_ko, NATNUM6) +TRANSLITERATION_NUMTOTEXT( FormalLower_ko, NATNUM4) +TRANSLITERATION_NUMTOTEXT( FormalUpper_ko, NATNUM5) +TRANSLITERATION_NUMTOTEXT( FormalHangul_ko, NATNUM10) +TRANSLITERATION_NUMTOTEXT( InformalLower_ko, NATNUM7) +TRANSLITERATION_NUMTOTEXT( InformalUpper_ko, NATNUM8) +TRANSLITERATION_NUMTOTEXT( InformalHangul_ko, NATNUM11) +TRANSLITERATION_NUMTOTEXT( KanjiLongTraditional_ja_JP, NATNUM5) +TRANSLITERATION_NUMTOTEXT( KanjiLongModern_ja_JP, NATNUM4) +TRANSLITERATION_NUMTOTEXT( Date_zh, NATNUM7) +TRANSLITERATION_NUMTOTEXT( KanjiShortTraditional_ja_JP, NATNUM8) +TRANSLITERATION_NUMTOTEXT( KanjiShortModern_ja_JP, NATNUM7) #undef TRANSLITERATION_NUMTOTEXT -#define TRANSLITERATION_NUMTOTEXT( name, recycle ) \ +#define TRANSLITERATION_NUMTOTEXT( name, _table, recycle ) \ NumToText##name::NumToText##name() \ { \ - numberChar = table_##name; \ - bulletCount = sizeof(table_##name) / sizeof(sal_Unicode); \ - transliterationName = "NumToText"#name; \ - implementationName = "com.sun.star.i18n.Transliteration.NumToText"#name; \ - recycleBullet = recycle; \ + table = _table;\ + tableSize = sizeof(_table) / sizeof(sal_Unicode); \ + recycleSymbol = recycle; \ + transliterationName = "NumToText"#name; \ + implementationName = "com.sun.star.i18n.Transliteration.NumToText"#name; \ } -TRANSLITERATION_NUMTOTEXT( AIUFullWidth_ja_JP, sal_False ) -TRANSLITERATION_NUMTOTEXT( AIUHalfWidth_ja_JP, sal_False ) -TRANSLITERATION_NUMTOTEXT( IROHAFullWidth_ja_JP, sal_False ) -TRANSLITERATION_NUMTOTEXT( IROHAHalfWidth_ja_JP, sal_False ) -TRANSLITERATION_NUMTOTEXT( CircledNumber, sal_False ) -TRANSLITERATION_NUMTOTEXT( HangulJamo_ko, sal_False ) -TRANSLITERATION_NUMTOTEXT( HangulSyllable_ko, sal_False ) -TRANSLITERATION_NUMTOTEXT( HangulCircledJamo_ko, sal_False ) -TRANSLITERATION_NUMTOTEXT( HangulCircledSyllable_ko, sal_False ) -TRANSLITERATION_NUMTOTEXT( TianGan_zh, sal_False ) -TRANSLITERATION_NUMTOTEXT( DiZi_zh, sal_False ) + +TRANSLITERATION_NUMTOTEXT ( AIUFullWidth_ja_JP, table_AIUFullWidth_ja_JP, sal_False) +TRANSLITERATION_NUMTOTEXT ( AIUHalfWidth_ja_JP, table_AIUHalfWidth_ja_JP, sal_False) +TRANSLITERATION_NUMTOTEXT ( IROHAFullWidth_ja_JP, table_IROHAFullWidth_ja_JP, sal_False) +TRANSLITERATION_NUMTOTEXT ( IROHAHalfWidth_ja_JP, table_IROHAHalfWidth_ja_JP, sal_False) +TRANSLITERATION_NUMTOTEXT ( CircledNumber, table_CircledNumber, sal_False) +TRANSLITERATION_NUMTOTEXT ( TianGan_zh, table_TianGan_zh, sal_False) +TRANSLITERATION_NUMTOTEXT ( DiZi_zh, table_DiZi_zh, sal_False) +TRANSLITERATION_NUMTOTEXT ( HangulJamo_ko, table_HangulJamo_ko, sal_True) +TRANSLITERATION_NUMTOTEXT ( HangulSyllable_ko, table_HangulSyllable_ko, sal_True) +TRANSLITERATION_NUMTOTEXT ( HangulCircledJamo_ko, table_HangulCircledJamo_ko, sal_True) +TRANSLITERATION_NUMTOTEXT ( HangulCircledSyllable_ko, table_HangulCircledSyllable_ko, sal_True) #undef TRANSLITERATION_NUMTOTEXT } } } } |