Kaydet (Commit) e5775217 authored tarafından Miklos Vajna's avatar Miklos Vajna

tdf#59454 RTF import: handle section break right before a table

DOCX import could handle this situation, as commit
2e8aad6d (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
üst b4e2a13f
{\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 }
......@@ -2361,6 +2361,12 @@ DECLARE_RTFIMPORT_TEST(testTdf94435, "tdf94435.rtf")
CPPUNIT_ASSERT_EQUAL(style::ParagraphAdjust_CENTER, static_cast<style::ParagraphAdjust>(getProperty<sal_Int16>(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: */
......@@ -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<RTFValue>(1));
writerfilter::Reference<Properties>::Pointer_t pProperties = std::make_shared<RTFReferenceProperties>(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<RTFValue>(1));
writerfilter::Reference<Properties>::Pointer_t pProperties = std::make_shared<RTFReferenceProperties>(aAttributes, aSprms);
Mapper().props(pProperties);
}
m_nCellxMax = std::max(m_nCellxMax, nParam);
}
break;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment