[Libreoffice-commits] core.git: sw/qa writerfilter/source

Libreoffice Gerrit user logerrit at kemper.freedesktop.org
Fri Jan 4 17:43:56 UTC 2019


 sw/qa/extras/rtfexport/data/tdf122424.rtf        |   22 ++++++++++++++++++++++
 sw/qa/extras/rtfexport/rtfexport3.cxx            |   10 ++++++++++
 writerfilter/source/rtftok/rtfdispatchsymbol.cxx |   10 ++++++++++
 writerfilter/source/rtftok/rtfdocumentimpl.cxx   |   21 ++++++++++++++++++---
 writerfilter/source/rtftok/rtfdocumentimpl.hxx   |    4 ++++
 5 files changed, 64 insertions(+), 3 deletions(-)

New commits:
commit dc8fa612054363e1a871b0e413a59889fbdb156a
Author:     László Németh <nemeth at numbertext.org>
AuthorDate: Fri Jan 4 11:40:39 2019 +0100
Commit:     László Németh <nemeth at numbertext.org>
CommitDate: Fri Jan 4 18:43:30 2019 +0100

    tdf#122424 RTF import: ignore table row text outside the cells
    
    instead of extending the next row with them.
    
    Change-Id: I09941e977d0036fcea07885ccc7b745d396619c2
    Reviewed-on: https://gerrit.libreoffice.org/65852
    Tested-by: Jenkins
    Reviewed-by: László Németh <nemeth at numbertext.org>

diff --git a/sw/qa/extras/rtfexport/data/tdf122424.rtf b/sw/qa/extras/rtfexport/data/tdf122424.rtf
new file mode 100644
index 000000000000..6baf526dd473
--- /dev/null
+++ b/sw/qa/extras/rtfexport/data/tdf122424.rtf
@@ -0,0 +1,22 @@
+{\rtf1\adeflang1025\ansi\ansicpg1250\uc1\adeff0\deff0
+\colsx708
+\cellx885
+\cellx10260
+\pard cell1
+\cell
+\pard cell2
+\cell
+X\trowd
+\cellx885
+\cellx10260\row
+\trowd
+\cellx885
+\cellx5036
+\pard cell3
+\cell
+\pard cell4
+\cell
+\trowd
+\cellx885
+\cellx5036\row
+}
diff --git a/sw/qa/extras/rtfexport/rtfexport3.cxx b/sw/qa/extras/rtfexport/rtfexport3.cxx
index 6ada28d4476f..2657c5494061 100644
--- a/sw/qa/extras/rtfexport/rtfexport3.cxx
+++ b/sw/qa/extras/rtfexport/rtfexport3.cxx
@@ -208,6 +208,16 @@ DECLARE_RTFEXPORT_TEST(testTdf66543, "tdf66543.rtf")
                          getProperty<sal_Int32>(getParagraph(1), "ParaLineNumberStartValue"));
 }
 
+DECLARE_RTFEXPORT_TEST(testTdf122424_textOutsideCellInATableRow, "tdf122424.rtf")
+{
+    uno::Reference<text::XTextTablesSupplier> xTextTablesSupplier(mxComponent, uno::UNO_QUERY);
+    uno::Reference<container::XIndexAccess> xTables(xTextTablesSupplier->getTextTables(),
+                                                    uno::UNO_QUERY);
+    uno::Reference<text::XTextTable> xTable(xTables->getByIndex(0), uno::UNO_QUERY);
+    uno::Reference<text::XTextRange> xCell(xTable->getCellByName("A2"), uno::UNO_QUERY_THROW);
+    CPPUNIT_ASSERT_EQUAL(OUString("cell3"), xCell->getString());
+}
+
 CPPUNIT_PLUGIN_IMPLEMENT();
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/rtftok/rtfdispatchsymbol.cxx b/writerfilter/source/rtftok/rtfdispatchsymbol.cxx
index f7371ee7ac22..ed97ad5c9a15 100644
--- a/writerfilter/source/rtftok/rtfdispatchsymbol.cxx
+++ b/writerfilter/source/rtftok/rtfdispatchsymbol.cxx
@@ -176,7 +176,16 @@ RTFError RTFDocumentImpl::dispatchSymbol(RTFKeyword nKeyword)
         case RTF_NESTCELL:
         {
             if (nKeyword == RTF_CELL)
+            {
                 m_bAfterCellBeforeRow = true;
+                if (m_nCellsInRow != -1)
+                    m_nCellsInRow++;
+            }
+            else
+            {
+                // in the case of nested tables, disable ignoring row text outside of cell content
+                m_nCellsInRow = -1;
+            }
 
             checkFirstRun();
             if (m_bNeedPap)
@@ -232,6 +241,7 @@ RTFError RTFDocumentImpl::dispatchSymbol(RTFKeyword nKeyword)
         case RTF_ROW:
         {
             m_bAfterCellBeforeRow = false;
+            m_nActualCellInRow = 0;
             if (m_aStates.top().nTableRowWidthAfter > 0)
             {
                 // Add fake cellx / cell, RTF equivalent of
diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.cxx b/writerfilter/source/rtftok/rtfdocumentimpl.cxx
index 22b766889711..f3449254ebf7 100644
--- a/writerfilter/source/rtftok/rtfdocumentimpl.cxx
+++ b/writerfilter/source/rtftok/rtfdocumentimpl.cxx
@@ -300,6 +300,8 @@ RTFDocumentImpl::RTFDocumentImpl(uno::Reference<uno::XComponentContext> const& x
     , m_hasRFooter(false)
     , m_hasFFooter(false)
     , m_bAfterCellBeforeRow(false)
+    , m_nCellsInRow(0)
+    , m_nActualCellInRow(0)
 {
     OSL_ASSERT(xInputStream.is());
     m_pInStream = utl::UcbStreamHelper::CreateStream(xInputStream, true);
@@ -1478,6 +1480,12 @@ void RTFDocumentImpl::text(OUString& rString)
 
     RTFBuffer_t* pCurrentBuffer = m_aStates.top().pCurrentBuffer;
 
+    if (m_nActualCellInRow > 0)
+    {
+        m_nActualCellInRow = 0;
+        m_nCellsInRow = 0;
+    }
+
     if (!pCurrentBuffer && m_aStates.top().eDestination != Destination::FOOTNOTE)
         Mapper().startCharacterGroup();
     else if (pCurrentBuffer)
@@ -1619,6 +1627,7 @@ void RTFDocumentImpl::replayBuffer(RTFBuffer_t& rBuffer, RTFSprms* const pSprms,
         }
         else if (std::get<0>(aTuple) == BUFFER_CELLEND)
         {
+            m_nActualCellInRow++;
             assert(pSprms && pAttributes);
             auto pValue = new RTFValue(1);
             pSprms->set(NS_ooxml::LN_tblCell, pValue);
@@ -1637,9 +1646,15 @@ void RTFDocumentImpl::replayBuffer(RTFBuffer_t& rBuffer, RTFSprms* const pSprms,
         }
         else if (std::get<0>(aTuple) == BUFFER_UTEXT)
         {
-            OUString const aString(std::get<1>(aTuple)->getString());
-            Mapper().utext(reinterpret_cast<sal_uInt8 const*>(aString.getStr()),
-                           aString.getLength());
+            // ignore text outside the cell content in table rows
+            // except in the case of nested tables
+            if (m_nActualCellInRow == 0 || m_nActualCellInRow < m_nCellsInRow
+                || m_nCellsInRow == -1)
+            {
+                OUString const aString(std::get<1>(aTuple)->getString());
+                Mapper().utext(reinterpret_cast<sal_uInt8 const*>(aString.getStr()),
+                               aString.getLength());
+            }
         }
         else if (std::get<0>(aTuple) == BUFFER_ENDRUN)
             Mapper().endCharacterGroup();
diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.hxx b/writerfilter/source/rtftok/rtfdocumentimpl.hxx
index 6fe21351c5c8..11c8dc851a9d 100644
--- a/writerfilter/source/rtftok/rtfdocumentimpl.hxx
+++ b/writerfilter/source/rtftok/rtfdocumentimpl.hxx
@@ -720,6 +720,10 @@ private:
 
     /// Are we after a \cell, but before a \row?
     bool m_bAfterCellBeforeRow;
+    /// cells in row, to ignore extra text content of the row
+    int m_nCellsInRow;
+    /// actual cell in row
+    int m_nActualCellInRow;
 };
 } // namespace rtftok
 } // namespace writerfilter


More information about the Libreoffice-commits mailing list