[Libreoffice-commits] core.git: Branch 'libreoffice-5-3-5' - formula/source

Eike Rathke erack at redhat.com
Wed Jul 26 13:55:18 UTC 2017


 formula/source/core/api/FormulaCompiler.cxx |   28 ++++++++++++++++++++++------
 1 file changed, 22 insertions(+), 6 deletions(-)

New commits:
commit e76351c03a0d7f53f64ab1c8eb86f81295511a40
Author: Eike Rathke <erack at redhat.com>
Date:   Mon Jul 17 20:13:07 2017 +0200

    Resolves: tdf#104186 spaces between function name and ( not allowed in OOXML
    
    (cherry picked from commit 7232980be6a4d67ed28a21b74ef3544cacb29d6a)
    
     Conflicts:
            formula/source/core/api/FormulaCompiler.cxx
    
    Backported.
    
    Change-Id: I6f6fcdab24a426d0f62052fa2d31f4098d1d893a
    Reviewed-on: https://gerrit.libreoffice.org/40088
    Reviewed-by: Markus Mohrhard <markus.mohrhard at googlemail.com>
    Reviewed-by: Dennis Francis <dennis.francis at collabora.co.uk>
    Reviewed-by: Michael Stahl <mstahl at redhat.com>
    Tested-by: Michael Stahl <mstahl at redhat.com>

diff --git a/formula/source/core/api/FormulaCompiler.cxx b/formula/source/core/api/FormulaCompiler.cxx
index 2a561d2182e3..d251dc7c17c2 100644
--- a/formula/source/core/api/FormulaCompiler.cxx
+++ b/formula/source/core/api/FormulaCompiler.cxx
@@ -2153,20 +2153,36 @@ const FormulaToken* FormulaCompiler::CreateStringFromToken( OUStringBuffer& rBuf
 
     if( eOp == ocSpaces )
     {
-        bool bIntersectionOp = mxSymbols->isODFF();
-        if (bIntersectionOp)
+        bool bWriteSpaces = true;
+        if (mxSymbols->isODFF())
         {
             const FormulaToken* p = pArr->PeekPrevNoSpaces();
-            bIntersectionOp = (p && p->GetOpCode() == ocColRowName);
+            bool bIntersectionOp = (p && p->GetOpCode() == ocColRowName);
             if (bIntersectionOp)
             {
                 p = pArr->PeekNextNoSpaces();
                 bIntersectionOp = (p && p->GetOpCode() == ocColRowName);
             }
+            if (bIntersectionOp)
+            {
+                rBuffer.append( "!!");
+                bWriteSpaces = false;
+            }
         }
-        if (bIntersectionOp)
-            rBuffer.append( "!!");
-        else
+        else if (mxSymbols->isOOXML())
+        {
+            // ECMA-376-1:2016 18.17.2 Syntax states "that no space characters
+            // shall separate a function-name from the left parenthesis (()
+            // that follows it." and Excel even chokes on it.
+            const FormulaToken* p = pArr->PeekPrevNoSpaces();
+            if (p && p->isFunction())
+            {
+                p = pArr->PeekNextNoSpaces();
+                if (p && p->GetOpCode() == ocOpen)
+                    bWriteSpaces = false;
+            }
+        }
+        if (bWriteSpaces)
         {
             // most times it's just one blank
             sal_uInt8 n = t->GetByte();


More information about the Libreoffice-commits mailing list