From e57752170e604c85a6fe8aeaa38784796e00bab1 Mon Sep 17 00:00:00 2001 From: Miklos Vajna Date: Mon, 26 Oct 2015 08:56:05 +0100 Subject: tdf#59454 RTF import: handle section break right before a table DOCX import could handle this situation, as commit 2e8aad6d45c53d554ccaf26de998ede708cfc289 (fdo#39056 fdo#75431 Section Properties if section starts with table, 2014-04-18) added support for this situation, in case NS_ooxml::LN_tblStart/End is emitted by the tokenizer. Fix the problem by sending these tokens in the RTF tokenizer as well, at least for non-nested tables. Change-Id: Ifedb121754634529c27820dd5175e7f9e24019e1 --- sw/qa/extras/rtfimport/data/tdf59454.rtf | 8 ++++++++ sw/qa/extras/rtfimport/rtfimport.cxx | 6 ++++++ writerfilter/source/rtftok/rtfdocumentimpl.cxx | 18 ++++++++++++++++++ 3 files changed, 32 insertions(+) create mode 100644 sw/qa/extras/rtfimport/data/tdf59454.rtf diff --git a/sw/qa/extras/rtfimport/data/tdf59454.rtf b/sw/qa/extras/rtfimport/data/tdf59454.rtf new file mode 100644 index 000000000000..b10820ad979a --- /dev/null +++ b/sw/qa/extras/rtfimport/data/tdf59454.rtf @@ -0,0 +1,8 @@ +{\rtf1 +foo\par +\sect\sectd +\trowd\cellx980\cellx11480\cellx14000\pard\plain \intbl\itap1\s33\qj\hyphpar1 \fs24 \qc\hyphpar1 A1\cell +\pard\plain \intbl\itap1\s33\qj\hyphpar1 \fs24 \qc\hyphpar1 B1\cell +\pard\plain \intbl\itap1\s33\qj\hyphpar1 \fs24 \qc\hyphpar1 C1\cell +\trowd\cellx980\clbrdrt\brdrs\brdrw10\clbrdrl\brdrs\brdrw10\clbrdrb\brdrs\brdrw10\clbrdrr\brdrs\brdrw10\clvertalt\cellx11480\clbrdrt\brdrs\brdrw10\clbrdrl\brdrs\brdrw10\clbrdrb\brdrs\brdrw10\clbrdrr\brdrs\brdrw10\clvertalt\cellx14000\row +\pard\plain bar\par } diff --git a/sw/qa/extras/rtfimport/rtfimport.cxx b/sw/qa/extras/rtfimport/rtfimport.cxx index 3a1d2fc25846..fbc835ea8bea 100644 --- a/sw/qa/extras/rtfimport/rtfimport.cxx +++ b/sw/qa/extras/rtfimport/rtfimport.cxx @@ -2361,6 +2361,12 @@ DECLARE_RTFIMPORT_TEST(testTdf94435, "tdf94435.rtf") CPPUNIT_ASSERT_EQUAL(style::ParagraphAdjust_CENTER, static_cast(getProperty(getParagraph(1), "ParaAdjust"))); } +DECLARE_RTFIMPORT_TEST(testTdf59454, "tdf59454.rtf") +{ + // This was 1, section break was ignored right before a table. + CPPUNIT_ASSERT_EQUAL(2, getPages()); +} + CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.cxx b/writerfilter/source/rtftok/rtfdocumentimpl.cxx index d8191cff9fad..f50d355f96ce 100644 --- a/writerfilter/source/rtftok/rtfdocumentimpl.cxx +++ b/writerfilter/source/rtftok/rtfdocumentimpl.cxx @@ -2136,6 +2136,15 @@ RTFError RTFDocumentImpl::dispatchSymbol(RTFKeyword nKeyword) { parBreak(); // Not in table? Reset max width. + if (m_nCellxMax) + { + // Was in table, but not anymore -> tblEnd. + RTFSprms aAttributes; + RTFSprms aSprms; + aSprms.set(NS_ooxml::LN_tblEnd, std::make_shared(1)); + writerfilter::Reference::Pointer_t pProperties = std::make_shared(aAttributes, aSprms); + Mapper().props(pProperties); + } m_nCellxMax = 0; } else if (m_aStates.top().eDestination != Destination::SHAPETEXT) @@ -4234,6 +4243,15 @@ RTFError RTFDocumentImpl::dispatchValue(RTFKeyword nKeyword, int nParam) m_aStates.top().aTableCellAttributes = m_aDefaultState.aTableCellAttributes; // We assume text after a row definition always belongs to the table, to handle text before the real INTBL token dispatchFlag(RTF_INTBL); + if (!m_nCellxMax) + { + // Wasn't in table, but now is -> tblStart. + RTFSprms aAttributes; + RTFSprms aSprms; + aSprms.set(NS_ooxml::LN_tblStart, std::make_shared(1)); + writerfilter::Reference::Pointer_t pProperties = std::make_shared(aAttributes, aSprms); + Mapper().props(pProperties); + } m_nCellxMax = std::max(m_nCellxMax, nParam); } break; -- cgit