diff options
author | Caolán McNamara <caolanm@redhat.com> | 2014-10-20 11:17:56 +0100 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2014-10-20 11:53:18 +0100 |
commit | e12ba2eddc827e39444f5efe6107d8afe1f7aaff (patch) | |
tree | 4510c21ddbe5da9d948e9ef3253e5321a3234d9f /unotools/source/misc | |
parent | eb7aa9f1fa58ff43d4a974aec868f627755ce152 (diff) |
Resolves: fdo#85006 limit script stripping to known suffixes
Change-Id: I276535b007bbb55555148d5937076b86da5de825
Diffstat (limited to 'unotools/source/misc')
-rw-r--r-- | unotools/source/misc/fontdefs.cxx | 67 |
1 files changed, 38 insertions, 29 deletions
diff --git a/unotools/source/misc/fontdefs.cxx b/unotools/source/misc/fontdefs.cxx index 4f0fb085634f..cac720fe5dd9 100644 --- a/unotools/source/misc/fontdefs.cxx +++ b/unotools/source/misc/fontdefs.cxx @@ -320,9 +320,43 @@ static ImplLocalizedFontName aImplLocalizedNamesList[] = { NULL, NULL }, }; -OUString GetEnglishSearchFontName( const OUString& rInName ) +OUString StripScriptFromName(const OUString& _aName) { - OUStringBuffer rName( rInName.getStr()); + // I worry that someone will have a font which *does* have + // e.g. "Greek" legitimately at the end of its name :-( + const char*suffixes[] = { " baltic", + " ce", + " cyr", + " greek", + " tur", + " (arabic)", + " (hebrew)", + " (thai)", + " (vietnamese)" + }; + + OUString aName = _aName; + // These can be crazily piled up, e.g. Times New Roman CYR Greek + bool bFinished = false; + while (!bFinished) + { + bFinished = true; + for (size_t i = 0; i < SAL_N_ELEMENTS(suffixes); ++i) + { + size_t nLen = strlen(suffixes[i]); + if (aName.endsWithIgnoreAsciiCaseAsciiL(suffixes[i], nLen)) + { + bFinished = false; + aName = aName.copy(0, aName.getLength() - nLen); + } + } + } + return aName; +} + +OUString GetEnglishSearchFontName(const OUString& rInName) +{ + OUStringBuffer rName(rInName); bool bNeedTranslation = false; sal_Int32 nLen = rName.getLength(); @@ -334,33 +368,8 @@ OUString GetEnglishSearchFontName( const OUString& rInName ) rName.truncate(i); // Remove Script at the end - // Scriptname must be the last part of the fontname and - // looks like "fontname (scriptname)". So there can only be a - // script name at the end of the fontname, when the last char is ')' - if ( (nLen >= 3) && rName[ nLen-1 ] == ')' ) - { - int nOpen = 1; - sal_Int32 nTempLen = nLen-2; - while ( nTempLen ) - { - if ( rName[ nTempLen ] == '(' ) - { - nOpen--; - if ( !nOpen ) - { - // Remove Space at the end - if ( nTempLen && (rName[ nTempLen-1 ] == ' ') ) - nTempLen--; - rName.truncate(nTempLen); - nLen = nTempLen; - break; - } - } - if ( rName[ nTempLen ] == ')' ) - nOpen++; - nTempLen--; - } - } + rName = StripScriptFromName(rName.toString()); + nLen = rName.getLength(); // remove all whitespaces and converts to lower case ASCII // TODO: better transliteration to ASCII e.g. all digits |