diff options
Diffstat (limited to 'i18npool/source/transliteration/ignoreDiacritics_CTL.cxx')
-rw-r--r-- | i18npool/source/transliteration/ignoreDiacritics_CTL.cxx | 79 |
1 files changed, 69 insertions, 10 deletions
diff --git a/i18npool/source/transliteration/ignoreDiacritics_CTL.cxx b/i18npool/source/transliteration/ignoreDiacritics_CTL.cxx index 8d6292c38d0d..c910b94f8a96 100644 --- a/i18npool/source/transliteration/ignoreDiacritics_CTL.cxx +++ b/i18npool/source/transliteration/ignoreDiacritics_CTL.cxx @@ -9,25 +9,84 @@ #include <transliteration_Ignore.hxx> #include <unicode/uchar.h> +#include <unicode/translit.h> namespace com { namespace sun { namespace star { namespace i18n { -sal_Unicode -ignoreDiacritics_CTL_translator (const sal_Unicode c) -{ - if(u_getIntPropertyValue(c, UCHAR_GENERAL_CATEGORY) == U_NON_SPACING_MARK) - return 0xffff; // Skip this character - - return c; -} - ignoreDiacritics_CTL::ignoreDiacritics_CTL() { - func = ignoreDiacritics_CTL_translator; + func = nullptr; table = nullptr; map = nullptr; transliterationName = "ignoreDiacritics_CTL"; implementationName = "com.sun.star.i18n.Transliteration.ignoreDiacritics_CTL"; + + UErrorCode nStatus = U_ZERO_ERROR; + m_transliterator = icu::Transliterator::createInstance("NFD; [:M:] Remove; NFC", + UTRANS_FORWARD, nStatus); + if (U_FAILURE(nStatus)) + m_transliterator = nullptr; +} + +sal_Unicode SAL_CALL +ignoreDiacritics_CTL::transliterateChar2Char(sal_Unicode nInChar) + throw(css::uno::RuntimeException, + css::i18n::MultipleCharsOutputException, std::exception) +{ + if (!m_transliterator) + throw css::uno::RuntimeException(); + + UnicodeString aChar(nInChar); + m_transliterator->transliterate(aChar); + + if (aChar.isEmpty()) + return 0xffff; // Skip this character. + + if (aChar.length() > 1) + return nInChar; // Don't know what to do here, return the otiginal. + + return aChar[0]; +} + +OUString SAL_CALL +ignoreDiacritics_CTL::folding(const OUString& rInStr, sal_Int32 nStartPos, + sal_Int32 nCount, css::uno::Sequence<sal_Int32>& rOffset) + throw(css::uno::RuntimeException, std::exception) +{ + if (!m_transliterator) + throw css::uno::RuntimeException(); + + OUString aOutStr; + + sal_Int32 nPosition = nStartPos; + sal_Int32 nOffset = 0; + if (useOffset) + rOffset.realloc(nCount); + + while (nPosition < nStartPos + nCount) + { + sal_Int32 nIndex = nPosition; + UChar32 nChar = rInStr.iterateCodePoints(&nIndex); + UnicodeString aChar(nChar); + m_transliterator->transliterate(aChar); + + if (useOffset && nOffset + aChar.length() > rOffset.getLength()) + rOffset.realloc(rOffset.getLength() + aChar.length()); + + for (int32_t i = 0; i < aChar.length(); i++) + { + aOutStr += OUStringLiteral1(aChar[i]); + if (useOffset) + rOffset[nOffset++] = nPosition; + } + + nPosition = nIndex; + } + + if (useOffset) + rOffset.realloc(aOutStr.getLength()); + + return aOutStr; } } } } } |