[Libreoffice-commits] core.git: Branch 'libreoffice-6-0' - svl/source

Eike Rathke erack at redhat.com
Thu Jun 7 12:06:54 UTC 2018


 svl/source/numbers/zforscan.cxx |   42 ++++++++++++++++++++++++++++++----------
 svl/source/numbers/zforscan.hxx |   11 ++++++++--
 2 files changed, 41 insertions(+), 12 deletions(-)

New commits:
commit b203abbc50e57105bca654d024b30f7fff129456
Author: Eike Rathke <erack at redhat.com>
Date:   Mon Jun 4 20:06:49 2018 +0200

    Handle English vs locale's General keyword, tdf#33689 follow-up, tdf#107867
    
    Caller of ImpSvNumberformatScan::GetKeyWord() needs to know if
    English or locale's keyword was found and act on it.
    
    Pointed out by an assert when attempting to copy "STANDARD" length
    characters (8) from "General" (7), which doesn't harm because when
    not in debug it copied the terminating 0-character. However, the
    keyword name also needs to be replaced for the locale's resulting
    format code.
    
    Change-Id: Ia5211b307ea44c1ba9c2b86786368355c570d4a2
    Reviewed-on: https://gerrit.libreoffice.org/55293
    Reviewed-by: Eike Rathke <erack at redhat.com>
    Tested-by: Jenkins <ci at libreoffice.org>
    (cherry picked from commit bfe6e9ecb18e8a3d9da368a1eb48e807ab9041cf)
    Reviewed-on: https://gerrit.libreoffice.org/55298
    Reviewed-by: Miklos Vajna <vmiklos at collabora.co.uk>

diff --git a/svl/source/numbers/zforscan.cxx b/svl/source/numbers/zforscan.cxx
index da88794a40cf..0b2fe7ecca28 100644
--- a/svl/source/numbers/zforscan.cxx
+++ b/svl/source/numbers/zforscan.cxx
@@ -680,17 +680,21 @@ Color* ImpSvNumberformatScan::GetColor(OUString& sStr)
     return pResult;
 }
 
-short ImpSvNumberformatScan::GetKeyWord( const OUString& sSymbol, sal_Int32 nPos ) const
+short ImpSvNumberformatScan::GetKeyWord( const OUString& sSymbol, sal_Int32 nPos, bool& rbFoundEnglish ) const
 {
     OUString sString = pFormatter->GetCharClass()->uppercase( sSymbol, nPos, sSymbol.getLength() - nPos );
     const NfKeywordTable & rKeyword = GetKeywords();
     // #77026# for the Xcl perverts: the GENERAL keyword is recognized anywhere
-    if ( sString.startsWith( rKeyword[NF_KEY_GENERAL] ) ||
-            ((meKeywordLocalization == KeywordLocalization::AllowEnglish) &&
-             sString.startsWith( sEnglishKeyword[NF_KEY_GENERAL])))
+    if (sString.startsWith( rKeyword[NF_KEY_GENERAL] ))
     {
         return NF_KEY_GENERAL;
     }
+    if ((meKeywordLocalization == KeywordLocalization::AllowEnglish) &&
+            sString.startsWith( sEnglishKeyword[NF_KEY_GENERAL]))
+    {
+        rbFoundEnglish = true;
+        return NF_KEY_GENERAL;
+    }
     //! MUST be a reverse search to find longer strings first
     short i = NF_KEYWORD_ENTRIES_COUNT-1;
     bool bFound = false;
@@ -746,6 +750,7 @@ short ImpSvNumberformatScan::GetKeyWord( const OUString& sSymbol, sal_Int32 nPos
                 }
                 if ( j && sEnglishKeyword[j].getLength() > sEnglishKeyword[i].getLength() )
                 {
+                    rbFoundEnglish = true;
                     return j;
                 }
             }
@@ -911,7 +916,8 @@ short ImpSvNumberformatScan::Next_Symbol( const OUString& rStr,
                 }
                 else if ( pChrCls->isLetter( rStr, nPos-1 ) )
                 {
-                    short nTmpType = GetKeyWord( rStr, nPos-1 );
+                    bool bFoundEnglish = false;
+                    short nTmpType = GetKeyWord( rStr, nPos-1, bFoundEnglish);
                     if ( nTmpType )
                     {
                         bool bCurrency = false;
@@ -919,7 +925,7 @@ short ImpSvNumberformatScan::Next_Symbol( const OUString& rStr,
                         // like "R" (Rand) and 'R' (era)
                         if ( nCurrPos >= 0 &&
                              nPos-1 + sCurString.getLength() <= rStr.getLength() &&
-                             sCurString.startsWith( sKeyword[nTmpType] ) )
+                             sCurString.startsWith( bFoundEnglish ? sEnglishKeyword[nTmpType] : sKeyword[nTmpType]))
                         {
                             OUString aTest = pChrCls->uppercase( rStr.copy( nPos-1, sCurString.getLength() ) );
                             if ( aTest == sCurString )
@@ -935,8 +941,22 @@ short ImpSvNumberformatScan::Next_Symbol( const OUString& rStr,
                         else
                         {
                             eType = nTmpType;
-                            sal_Int32 nLen = sKeyword[eType].getLength();
-                            sSymbol = rStr.copy( nPos-1, nLen );
+                            // The code to be advanced is the detected keyword,
+                            // not necessarily the locale's keyword, but the
+                            // symbol is to be the locale's keyword.
+                            sal_Int32 nLen;
+                            if (bFoundEnglish)
+                            {
+                                nLen = sEnglishKeyword[eType].getLength();
+                                // Use the locale's General keyword name, not uppercase.
+                                sSymbol = (eType == NF_KEY_GENERAL ? sNameStandardFormat : sKeyword[eType]);
+                            }
+                            else
+                            {
+                                nLen = sKeyword[eType].getLength();
+                                // Preserve a locale's keyword's case as entered.
+                                sSymbol = rStr.copy( nPos-1, nLen);
+                            }
                             if ((eType == NF_KEY_E || IsAmbiguousE(eType)) && nPos < rStr.getLength())
                             {
                                 sal_Unicode cNext = rStr[nPos];
@@ -988,7 +1008,8 @@ short ImpSvNumberformatScan::Next_Symbol( const OUString& rStr,
         case SsGetWord:
             if ( pChrCls->isLetter( rStr, nPos-1 ) )
             {
-                short nTmpType = GetKeyWord( rStr, nPos-1 );
+                bool bFoundEnglish = false;
+                short nTmpType = GetKeyWord( rStr, nPos-1, bFoundEnglish);
                 if ( nTmpType )
                 {
                     // beginning of keyword, stop scan and put back
@@ -3083,7 +3104,8 @@ sal_Int32 ImpSvNumberformatScan::FinalScan( OUString& rString )
                 sal_Int32 nLen = rStr.getLength();
                 for ( sal_Int32 j = 0; j < nLen; j++ )
                 {
-                    if ( (j == 0 || rStr[j - 1] != '\\') && GetKeyWord( rStr, j ) )
+                    bool bFoundEnglish = false;
+                    if ( (j == 0 || rStr[j - 1] != '\\') && GetKeyWord( rStr, j, bFoundEnglish) )
                     {
                         rStr = "\"" + rStr + "\"";
                         break; // for
diff --git a/svl/source/numbers/zforscan.hxx b/svl/source/numbers/zforscan.hxx
index 79bc6e7512d1..8ef0e0a7c80f 100644
--- a/svl/source/numbers/zforscan.hxx
+++ b/svl/source/numbers/zforscan.hxx
@@ -245,8 +245,15 @@ private: // Private section
     short PreviousType( sal_uInt16 i ) const;   // Returns type before position skips EMPTY
     bool IsLastBlankBeforeFrac(sal_uInt16 i) const; // True <=> there won't be a ' ' until the '/'
     void Reset();                               // Reset all variables before starting the analysis
-    short GetKeyWord( const OUString& sSymbol,  // Determine keyword at nPos
-                      sal_Int32 nPos ) const;   // Return 0 <=> not found
+
+    /** Determine keyword at nPos.
+        @param  rbFoundEnglish set if English instead of locale's keyword
+                found, never cleared, thus init with false.
+        @return 0 if not found, else keyword enumeration.
+     */
+    short GetKeyWord( const OUString& sSymbol,
+                      sal_Int32 nPos,
+                      bool& rbFoundEnglish ) const;
 
     bool IsAmbiguousE( short nKey ) const  // whether nKey is ambiguous E of NF_KEY_E/NF_KEY_EC
         {


More information about the Libreoffice-commits mailing list