summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Kaganski <mike.kaganski@collabora.com>2018-05-03 15:09:40 +0300
committerMike Kaganski <mike.kaganski@collabora.com>2018-05-03 19:29:54 +0200
commit247dabcb0b92a62b233ec0237deac84e6675325c (patch)
treef52476d6ed9ac7802ab45729542401688493e03e
parent6441eaaa5fa72946f52579426cc8847a42d94e10 (diff)
tdf#117268: treat erroneous \itap0 the same way as Word does
... so that if we are inside a table, it would not convert table paragraphs into top-level paragraphs. (The in-the-wild documents with this invalid input are, e.g., generated by Consultant+ legal reference database). Change-Id: I45eb9073a0651bc963badb84229ce5ae437f1a8c Reviewed-on: https://gerrit.libreoffice.org/53790 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com>
-rw-r--r--sw/qa/extras/rtfexport/data/tdf117268.rtf35
-rw-r--r--sw/qa/extras/rtfexport/rtfexport3.cxx36
-rw-r--r--writerfilter/source/rtftok/rtfdispatchvalue.cxx7
3 files changed, 78 insertions, 0 deletions
diff --git a/sw/qa/extras/rtfexport/data/tdf117268.rtf b/sw/qa/extras/rtfexport/data/tdf117268.rtf
new file mode 100644
index 000000000000..608ea65637cc
--- /dev/null
+++ b/sw/qa/extras/rtfexport/data/tdf117268.rtf
@@ -0,0 +1,35 @@
+{\rtf1
+{\trowd
+\clbrdrl\brdrs\brdrw10\clbrdrr\brdrs\brdrw10\clbrdrt\brdrs\brdrw10\clbrdrb\brdrs\brdrw10\cellx2000
+\pard
+Text 1
+\itap0
+\cell
+\row}
+\pard
+\par
+\itap0
+{\trowd
+\clbrdrl\brdrs\brdrw10\clbrdrr\brdrs\brdrw10\clbrdrt\brdrs\brdrw10\clbrdrb\brdrs\brdrw10\cellx2000
+\pard
+Text 2
+\itap0
+\cell
+\row}
+\itap0
+{\trowd
+\clbrdrl\brdrs\brdrw10\clbrdrr\brdrs\brdrw10\clbrdrt\brdrs\brdrw10\clbrdrb\brdrs\brdrw10\cellx2000
+\pard
+\itap2
+Text 3
+\nestcell
+\itap2
+{\nesttableprops\trowd
+\clbrdrl\brdrs\brdrw10\clbrdrr\brdrs\brdrw10\clbrdrt\brdrs\brdrw10\clbrdrb\brdrs\brdrw10\cellx1000
+\nestrow}
+\itap0
+\cell
+\row}
+\itap0
+\par
+} \ No newline at end of file
diff --git a/sw/qa/extras/rtfexport/rtfexport3.cxx b/sw/qa/extras/rtfexport/rtfexport3.cxx
index d07740cc2879..142c7f6c8381 100644
--- a/sw/qa/extras/rtfexport/rtfexport3.cxx
+++ b/sw/qa/extras/rtfexport/rtfexport3.cxx
@@ -109,6 +109,42 @@ DECLARE_RTFEXPORT_TEST(testTdf116841, "tdf116841.rtf")
getProperty<sal_Int32>(getParagraph(1), "ParaLeftMargin"));
}
+DECLARE_RTFEXPORT_TEST(testTdf117268, "tdf117268.rtf")
+{
+ // Here we check that we correctly mimic Word's treatment of erroneous \itap0 inside tables.
+ // Previously, the first table was import as text, and second top-level one only imported
+ // last row with nested table (first row was also imported as text).
+ uno::Reference<text::XTextTablesSupplier> xTablesSupplier(mxComponent, uno::UNO_QUERY_THROW);
+ uno::Reference<container::XIndexAccess> xTables(xTablesSupplier->getTextTables(),
+ uno::UNO_QUERY_THROW);
+
+ // First (simple) table
+ uno::Reference<text::XTextTable> xTable(xTables->getByIndex(0), uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getRows()->getCount());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getColumns()->getCount());
+ uno::Reference<text::XTextRange> xCell(xTable->getCellByName("A1"), uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(OUString("Text 1"), xCell->getString());
+
+ // Nested table
+ xTable.set(xTables->getByIndex(1), uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getRows()->getCount());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getColumns()->getCount());
+ xCell.set(xTable->getCellByName("A1"), uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(OUString("Text 3"), xCell->getString());
+ uno::Reference<beans::XPropertySet> xNestedAnchor(xTable->getAnchor(), uno::UNO_QUERY_THROW);
+ uno::Reference<text::XTextRange> xAnchorCell(xNestedAnchor->getPropertyValue("Cell"),
+ uno::UNO_QUERY_THROW);
+
+ // Outer table
+ xTable.set(xTables->getByIndex(2), uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getRows()->getCount());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getColumns()->getCount());
+ xCell.set(xTable->getCellByName("A1"), uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(OUString("Text 2"), xCell->getString());
+ xCell.set(xTable->getCellByName("A2"), uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(xCell, xAnchorCell);
+}
+
CPPUNIT_PLUGIN_IMPLEMENT();
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/rtftok/rtfdispatchvalue.cxx b/writerfilter/source/rtftok/rtfdispatchvalue.cxx
index 27f3d9ae9de9..11fe8e6237bd 100644
--- a/writerfilter/source/rtftok/rtfdispatchvalue.cxx
+++ b/writerfilter/source/rtftok/rtfdispatchvalue.cxx
@@ -227,6 +227,13 @@ RTFError RTFDocumentImpl::dispatchValue(RTFKeyword nKeyword, int nParam)
{
case RTF_ITAP:
nSprm = NS_ooxml::LN_tblDepth;
+ // tdf#117268: If \itap0 is encountered inside tables (between \cellxN and \cell), then
+ // use the default value (1), as Word apparently does
+ if (nParam == 0 && (m_nTopLevelCells != 0 || m_nNestedCells != 0))
+ {
+ nParam = 1;
+ pIntValue = std::make_shared<RTFValue>(nParam);
+ }
break;
default:
break;