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>
This commit is contained in:
parent
6441eaaa5f
commit
247dabcb0b
3 changed files with 78 additions and 0 deletions
35
sw/qa/extras/rtfexport/data/tdf117268.rtf
Normal file
35
sw/qa/extras/rtfexport/data/tdf117268.rtf
Normal file
|
@ -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
|
||||
}
|
|
@ -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: */
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue