summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEike Rathke <erack@redhat.com>2017-07-17 20:13:07 +0200
committerMichael Meeks <michael.meeks@collabora.com>2017-07-21 11:26:29 +0200
commit461dcd1aa820ca933e322c4bcdf4adeb948c355b (patch)
tree09e0aff34a3487b8db8a2009b2917a62bbf1a1b8
parentbeb7e49e6906c5f2bbe18c87a70a47b57dd4cb2f (diff)
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/40087 Reviewed-by: Markus Mohrhard <markus.mohrhard@googlemail.com> Reviewed-by: Dennis Francis <dennis.francis@collabora.co.uk> Reviewed-by: Michael Meeks <michael.meeks@collabora.com> Tested-by: Michael Meeks <michael.meeks@collabora.com>
-rw-r--r--formula/source/core/api/FormulaCompiler.cxx28
1 files changed, 22 insertions, 6 deletions
diff --git a/formula/source/core/api/FormulaCompiler.cxx b/formula/source/core/api/FormulaCompiler.cxx
index 037d2fb745b0..0b4b85d0ac60 100644
--- a/formula/source/core/api/FormulaCompiler.cxx
+++ b/formula/source/core/api/FormulaCompiler.cxx
@@ -2135,20 +2135,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();