From 97f9af714ea1c46e498fa99f7ca34fc1708d38a6 Mon Sep 17 00:00:00 2001 From: Miklos Vajna Date: Wed, 30 Oct 2019 16:02:35 +0100 Subject: [PATCH] Related: tdf#125038 DOCX import: fix unexpected linebreak inside IF condition Writer body text is expected to only contain the result of the field. So in case both the field command and the field result contains a linebreak, we need to make sure that linebreaks are ignored in the field command for field types where the Writer field implementation expects a single string. With this, the number of paragraphs in the bugdoc is now correct. Change-Id: I42f208d6943750ba2e8f88b52c373f6ca9cb2b71 Reviewed-on: https://gerrit.libreoffice.org/81786 Reviewed-by: Miklos Vajna Tested-by: Jenkins --- sw/qa/extras/ooxmlexport/data/tdf125038b.docx | Bin 0 -> 12649 bytes sw/qa/extras/ooxmlexport/ooxmlexport14.cxx | 17 +++++++++++++++++ .../source/dmapper/DomainMapper_Impl.cxx | 15 +++++++++++++++ 3 files changed, 32 insertions(+) create mode 100644 sw/qa/extras/ooxmlexport/data/tdf125038b.docx diff --git a/sw/qa/extras/ooxmlexport/data/tdf125038b.docx b/sw/qa/extras/ooxmlexport/data/tdf125038b.docx new file mode 100644 index 0000000000000000000000000000000000000000..3aa189daded8302e53a828f294a2b47cf3026535 GIT binary patch literal 12649 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 literal 0 HcmV?d00001 diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport14.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport14.cxx index 6dd91d44960a..82237bffa368 100644 --- a/sw/qa/extras/ooxmlexport/ooxmlexport14.cxx +++ b/sw/qa/extras/ooxmlexport/ooxmlexport14.cxx @@ -49,6 +49,23 @@ DECLARE_OOXMLIMPORT_TEST(testTdf125038, "tdf125038.docx") CPPUNIT_ASSERT_EQUAL(OUString("phone: \t1234567890"), aActual); } +DECLARE_OOXMLIMPORT_TEST(testTdf125038b, "tdf125038b.docx") +{ + // Load a document with an IF field, where the IF field command contains a paragraph break. + uno::Reference xTextDocument(mxComponent, uno::UNO_QUERY); + uno::Reference xParagraphAccess(xTextDocument->getText(), uno::UNO_QUERY); + uno::Reference xParagraphs = xParagraphAccess->createEnumeration(); + CPPUNIT_ASSERT(xParagraphs->hasMoreElements()); + xParagraphs->nextElement(); + CPPUNIT_ASSERT(xParagraphs->hasMoreElements()); + xParagraphs->nextElement(); + + // Without the accompanying fix in place, this test would have failed with: + // - Expression: !xParagraphs->hasMoreElements() + // i.e. the document had 3 paragraphs, while only 2 was expected. + CPPUNIT_ASSERT(!xParagraphs->hasMoreElements()); +} + CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx b/writerfilter/source/dmapper/DomainMapper_Impl.cxx index 276f408451f3..c0492804e119 100644 --- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx +++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx @@ -1250,6 +1250,21 @@ void DomainMapper_Impl::finishParagraph( const PropertyMapPtr& pPropertyMap, con { if (m_bDiscardHeaderFooter) return; + + if (!m_aFieldStack.empty()) + { + FieldContextPtr pFieldContext = m_aFieldStack.back(); + if (pFieldContext && !pFieldContext->IsCommandCompleted()) + { + std::vector aCommandParts = pFieldContext->GetCommandParts(); + if (!aCommandParts.empty() && aCommandParts[0] == "IF") + { + // Conditional text field conditions don't support linebreaks in Writer. + return; + } + } + } + #ifdef DBG_UTIL TagLogger::getInstance().startElement("finishParagraph"); #endif