[Libreoffice-commits] core.git: sc/source

Laurent Balland-Poirier laurent.balland-poirier at laposte.net
Wed Jun 29 18:15:16 UTC 2016


 sc/source/filter/oox/numberformatsbuffer.cxx |   44 +++++++++++++++++++++++++--
 1 file changed, 42 insertions(+), 2 deletions(-)

New commits:
commit 7c6a8f404bad90fb4d96dbf75e8824f673e16899
Author: Laurent Balland-Poirier <laurent.balland-poirier at laposte.net>
Date:   Sun Jun 19 09:18:41 2016 +0200

    tdf#81939 Remove escape char only for fraction
    
    In XLSX files, in number format, all escape characters were removed.
    But it is only necessary for space character in fraction.
    Preserve escape character in other cases.
    
    Change-Id: I6f82b7285cf91726725b723b0bb109bcced066b8
    Reviewed-on: https://gerrit.libreoffice.org/26466
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Eike Rathke <erack at redhat.com>
    Tested-by: Eike Rathke <erack at redhat.com>

diff --git a/sc/source/filter/oox/numberformatsbuffer.cxx b/sc/source/filter/oox/numberformatsbuffer.cxx
index cc8ede8..278a61c8 100644
--- a/sc/source/filter/oox/numberformatsbuffer.cxx
+++ b/sc/source/filter/oox/numberformatsbuffer.cxx
@@ -1875,6 +1875,30 @@ NumberFormatFinalizer::NumberFormatFinalizer( const WorkbookHelper& rHelper ) :
     OSL_ENSURE( mxNumFmts.is(), "NumberFormatFinalizer::NumberFormatFinalizer - cannot get number formats" );
 }
 
+sal_Int32 lclPosToken ( const OUString& sFormat, const OUString& sSearch, sal_Int32 nStartPos )
+{
+    sal_Int32 nLength = sFormat.getLength();
+    for ( sal_Int32 i = nStartPos; i < nLength && i >= 0 ; i++ )
+    {
+        switch(sFormat[i])
+        {
+            case '\"' : // skip text
+                i = sFormat.indexOf('\"',i+1);
+                break;
+            case '['  : // skip condition
+                i = sFormat.indexOf(']',i+1);
+                break;
+            default :
+                if ( sFormat.match(sSearch, i) )
+                    return i;
+                break;
+        }
+        if ( i < 0 )
+            i--;
+    }
+    return -2;
+}
+
 } // namespace
 
 NumberFormat::NumberFormat( const WorkbookHelper& rHelper ) :
@@ -1884,11 +1908,27 @@ NumberFormat::NumberFormat( const WorkbookHelper& rHelper ) :
 
 void NumberFormat::setFormatCode( const OUString& rFmtCode )
 {
-    // especiall for a fraction code '\ ?/?' is passed to us in xml, the '\' is not
+    // Special case for fraction code '\ ?/?', it is passed to us in xml, the '\' is not
     // an escape character but merely should be telling the formatter to display the next
     // char in the format ( afaics it does that anyhow )
+    sal_Int32 nPosEscape = 0;
+    sal_Int32 nErase = 0;
+    sal_Int32 nLastIndex = rFmtCode.getLength() - 1;
+    OUStringBuffer sFormat = rFmtCode;
 
-    maModel.maFmtCode = rFmtCode.replaceAll("\\", "");
+    while ( ( nPosEscape = lclPosToken( rFmtCode, "\\ ", nPosEscape ) ) > 0 )
+    {
+        sal_Int32 nPos = nPosEscape + 2;
+        while ( nPos < nLastIndex && ( rFmtCode[nPos] == '?' || rFmtCode[nPos] == '#' || rFmtCode[nPos] == '0' ) )
+            nPos++;
+        if ( nPos < nLastIndex && rFmtCode[nPos] == '/' )
+        {
+            sFormat.remove(nPosEscape - nErase, 1);
+            nErase ++;
+        }  // tdf#81939 preserve other escape characters
+        nPosEscape = lclPosToken( rFmtCode, ";", nPosEscape ); // skip to next format
+    }
+    maModel.maFmtCode = sFormat.makeStringAndClear();
 }
 
 void NumberFormat::setFormatCode( const Locale& rLocale, const sal_Char* pcFmtCode )


More information about the Libreoffice-commits mailing list