diff options
author | Vladimir Glazounov <vg@openoffice.org> | 2008-01-28 14:32:14 +0000 |
---|---|---|
committer | Vladimir Glazounov <vg@openoffice.org> | 2008-01-28 14:32:14 +0000 |
commit | ba18a8ca66e6e297db372ac311c37e46cf3529b8 (patch) | |
tree | 4f3a0b3031e9f9c284359a84fbf9b8c4678bcf4d /i18nutil | |
parent | f50adf12764f4d21931cb5c0f76dc6923ee28630 (diff) |
INTEGRATION: CWS i18n39 (1.5.38); FILE MERGED
2007/12/12 22:42:25 khong 1.5.38.1: #i81366# add new Japanese transliterations
Diffstat (limited to 'i18nutil')
-rw-r--r-- | i18nutil/source/utility/widthfolding.cxx | 113 |
1 files changed, 105 insertions, 8 deletions
diff --git a/i18nutil/source/utility/widthfolding.cxx b/i18nutil/source/utility/widthfolding.cxx index c8f70c1a68cc..39609e37392d 100644 --- a/i18nutil/source/utility/widthfolding.cxx +++ b/i18nutil/source/utility/widthfolding.cxx @@ -4,9 +4,9 @@ * * $RCSfile: widthfolding.cxx,v $ * - * $Revision: 1.5 $ + * $Revision: 1.6 $ * - * last change: $Author: rt $ $Date: 2005-09-07 17:42:08 $ + * last change: $Author: vg $ $Date: 2008-01-28 15:32:14 $ * * The Contents of this file are made available subject to * the terms of GNU Lesser General Public License Version 2.1. @@ -111,7 +111,7 @@ OUString widthfolding::decompose_ja_voiced_sound_marks (const OUString& inStr, s oneToOneMapping& widthfolding::getfull2halfTable(void) { - static oneToOneMapping table(full2half, sizeof(full2half)); + static oneToOneMappingWithFlag table(full2half, sizeof(full2half), FULL2HALF_NORMAL); table.makeIndex(); return table; } @@ -119,7 +119,7 @@ oneToOneMapping& widthfolding::getfull2halfTable(void) /** * Compose Japanese specific voiced and semi-voiced sound marks. */ -OUString widthfolding::compose_ja_voiced_sound_marks (const OUString& inStr, sal_Int32 startPos, sal_Int32 nCount, Sequence< sal_Int32 >& offset, sal_Bool useOffset ) +OUString widthfolding::compose_ja_voiced_sound_marks (const OUString& inStr, sal_Int32 startPos, sal_Int32 nCount, Sequence< sal_Int32 >& offset, sal_Bool useOffset, sal_Int32 nFlags ) { // Create a string buffer which can hold nCount + 1 characters. // Its size may become equal to nCount or smaller. @@ -162,10 +162,27 @@ OUString widthfolding::compose_ja_voiced_sound_marks (const OUString& inStr, sal // see http://charts.unicode.org/Web/U30A0.html Katakana (U+30A0..U+30FF) // 0x3099 COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK // 0x309a COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK - int j = currentChar - 0x3099; // 0x3099 or 0x309a ? - if (0 <= j && j <= 1) { // 0 addresses a code point regarding 0x3099, 1 is 0x309a + // 0x309b KATAKANA-HIRAGANA VOICED SOUND MARK + // 0x309c KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK + int j = currentChar - 0x3099; // 0x3099, 0x309a, 0x309b, 0x309c ? + + if (2 <= j && j <= 3) // 0x309b or 0x309c + j -= 2; + + if (0 <= j && j <= 1) { + // 0 addresses a code point regarding 0x3099 or 0x309b (voiced sound mark), + // 1 is 0x309a or 0x309c (semi-voiced sound mark) int i = int(previousChar - 0x3040); // i acts as an index of array - if (0 <= i && i <= (0x30ff - 0x3040) && composition_table[i][j]) { + sal_Bool bCompose = sal_False; + + if (0 <= i && i <= (0x30ff - 0x3040) && composition_table[i][j]) + bCompose = sal_True; + + // not to use combined KATAKANA LETTER VU + if ( previousChar == 0x30a6 && (nFlags & WIDTHFOLDNIG_DONT_USE_COMBINED_VU) ) + bCompose = sal_False; + + if( bCompose ){ if (useOffset) { position ++; *p ++ = position ++; @@ -199,7 +216,7 @@ OUString widthfolding::compose_ja_voiced_sound_marks (const OUString& inStr, sal oneToOneMapping& widthfolding::gethalf2fullTable(void) { - static oneToOneMapping table(half2full, sizeof(half2full)); + static oneToOneMappingWithFlag table(half2full, sizeof(half2full), HALF2FULL_NORMAL); table.makeIndex(); return table; } @@ -209,4 +226,84 @@ sal_Unicode widthfolding::getCompositionChar(sal_Unicode c1, sal_Unicode c2) return composition_table[c1 - 0x3040][c2 - 0x3099]; } + +oneToOneMapping& widthfolding::getfull2halfTableForASC() +{ + static oneToOneMappingWithFlag table(full2half, sizeof(full2half), FULL2HALF_ASC_FUNCTION); + table.makeIndex(); + + // bluedwarf: dirty hack! + // There is an exception. Additional conversion is required following: + // 0xFFE5 (FULLWIDTH YEN SIGN) --> 0x005C (REVERSE SOLIDUS) + // + // See the following page for detail: + // http://wiki.services.openoffice.org/wiki/Calc/Features/JIS_and_ASC_functions + int i, j, high, low; + int n = sizeof(full2halfASCException) / sizeof(UnicodePairWithFlag); + for( i = 0; i < n; i++ ) + { + high = (full2halfASCException[i].first >> 8) & 0xFF; + low = (full2halfASCException[i].first) & 0xFF; + + if( !table.mpIndex[high] ) + { + table.mpIndex[high] = new UnicodePairWithFlag*[256]; + + for( j = 0; j < 256; j++ ) + table.mpIndex[high][j] = NULL; + } + table.mpIndex[high][low] = &full2halfASCException[i]; + } + + return table; +} + +oneToOneMapping& widthfolding::gethalf2fullTableForJIS() +{ + static oneToOneMappingWithFlag table(half2full, sizeof(half2full), HALF2FULL_JIS_FUNCTION); + table.makeIndex(); + + // bluedwarf: dirty hack! + // There are some exceptions. Additional conversion are required following: + // 0x0022 (QUOTATION MARK) --> 0x201D (RIGHT DOUBLE QUOTATION MARK) + // 0x0027 (APOSTROPHE) --> 0x2019 (RIGHT SINGLE QUOTATION MARK) + // 0x005C (REVERSE SOLIDUS) --> 0xFFE5 (FULLWIDTH YEN SIGN) + // 0x0060 (GRAVE ACCENT) --> 0x2018 (LEFT SINGLE QUOTATION MARK) + // + // See the following page for detail: + // http://wiki.services.openoffice.org/wiki/Calc/Features/JIS_and_ASC_functions + int i, j, high, low; + int n = sizeof(half2fullJISException) / sizeof(UnicodePairWithFlag); + for( i = 0; i < n; i++ ) + { + high = (half2fullJISException[i].first >> 8) & 0xFF; + low = (half2fullJISException[i].first) & 0xFF; + + if( !table.mpIndex[high] ) + { + table.mpIndex[high] = new UnicodePairWithFlag*[256]; + + for( j = 0; j < 256; j++ ) + table.mpIndex[high][j] = NULL; + } + table.mpIndex[high][low] = &half2fullJISException[i]; + } + + return table; +} + +oneToOneMapping& widthfolding::getfullKana2halfKanaTable() +{ + static oneToOneMappingWithFlag table(full2half, sizeof(full2half), FULL2HALF_KATAKANA_ONLY); + table.makeIndex(); + return table; +} + +oneToOneMapping& widthfolding::gethalfKana2fullKanaTable() +{ + static oneToOneMappingWithFlag table(half2full, sizeof(half2full), HALF2FULL_KATAKANA_ONLY); + table.makeIndex(); + return table; +} + } } } } |