From 93faf178195ca974747849879266783884ae27c5 Mon Sep 17 00:00:00 2001 From: Miklos Vajna Date: Wed, 10 Feb 2016 08:59:01 +0100 Subject: tdf#87034 RTF import: fix multiple superscripts after footnote ... ... in the same paragraph. The intention was to avoid replaying the supertext buffer and using its contents as a custom footnote mark at the same time. However, it's enough to check if the buffer is empty to do so, and that avoids the mis-import of the bugdoc as well. Change-Id: I1e3b0c7f0c6d8eb8250d8b1d0d7d196039c40e79 --- sw/qa/extras/rtfimport/data/tdf87034.rtf | 13 +++++++++++++ sw/qa/extras/rtfimport/rtfimport.cxx | 7 +++++++ writerfilter/source/rtftok/rtfdocumentimpl.cxx | 6 +----- writerfilter/source/rtftok/rtfdocumentimpl.hxx | 1 - 4 files changed, 21 insertions(+), 6 deletions(-) create mode 100644 sw/qa/extras/rtfimport/data/tdf87034.rtf diff --git a/sw/qa/extras/rtfimport/data/tdf87034.rtf b/sw/qa/extras/rtfimport/data/tdf87034.rtf new file mode 100644 index 000000000000..16f322c6ff28 --- /dev/null +++ b/sw/qa/extras/rtfimport/data/tdf87034.rtf @@ -0,0 +1,13 @@ +{\rtf1 +\pard\plain A +{\chftn +{\footnote\chftn F +} +} +B +{\super 3} +C +{\super 4} +D +\par +} diff --git a/sw/qa/extras/rtfimport/rtfimport.cxx b/sw/qa/extras/rtfimport/rtfimport.cxx index 1cb27c6bf3bb..b5216c98af48 100644 --- a/sw/qa/extras/rtfimport/rtfimport.cxx +++ b/sw/qa/extras/rtfimport/rtfimport.cxx @@ -2484,6 +2484,13 @@ DECLARE_RTFIMPORT_TEST(testTdf97035, "tdf97035.rtf") CPPUNIT_ASSERT_EQUAL(sal_Int16(2299), getProperty< uno::Sequence >(xTableRows->getByIndex(1), "TableColumnSeparators")[0].Position); } +DECLARE_RTFIMPORT_TEST(testTdf87034, "tdf87034.rtf") +{ + // This was A1BC34D, i.e. the first "super" text portion was mis-imported, + // and was inserted instead right before the second "super" text portion. + CPPUNIT_ASSERT_EQUAL(OUString("A1B3C4D"), getParagraph(1)->getString()); +} + 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 10db15357f39..bf41bbe37c49 100644 --- a/writerfilter/source/rtftok/rtfdocumentimpl.cxx +++ b/writerfilter/source/rtftok/rtfdocumentimpl.cxx @@ -240,7 +240,6 @@ RTFDocumentImpl::RTFDocumentImpl(uno::Reference const& x m_nBackupTopLevelCurrentCellX(0), m_aTableBufferStack(1), // create top-level buffer already m_aSuperBuffer(), - m_bHasFootnote(false), m_pSuperstream(nullptr), m_nStreamType(0), m_nHeaderFooterPositions(), @@ -1699,7 +1698,6 @@ RTFError RTFDocumentImpl::dispatchDestination(RTFKeyword nKeyword) if (aKeyword.equals("\\ftnalt")) nId = NS_ooxml::LN_endnote; - m_bHasFootnote = true; if (m_aStates.top().pCurrentBuffer == &m_aSuperBuffer) m_aStates.top().pCurrentBuffer = nullptr; bool bCustomMark = false; @@ -6095,10 +6093,8 @@ RTFError RTFDocumentImpl::popState() { OSL_ASSERT(!m_aStates.empty() && m_aStates.top().pCurrentBuffer == nullptr); - if (!m_bHasFootnote) + if (!m_aSuperBuffer.empty()) replayBuffer(m_aSuperBuffer, nullptr, nullptr); - - m_bHasFootnote = false; } return RTFError::OK; diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.hxx b/writerfilter/source/rtftok/rtfdocumentimpl.hxx index 3aa75de95f5d..830eddd232cc 100644 --- a/writerfilter/source/rtftok/rtfdocumentimpl.hxx +++ b/writerfilter/source/rtftok/rtfdocumentimpl.hxx @@ -523,7 +523,6 @@ private: /// Buffered superscript, till footnote is reached (or not). RTFBuffer_t m_aSuperBuffer; - bool m_bHasFootnote; /// Superstream of this substream. RTFDocumentImpl* m_pSuperstream; /// Type of the stream: header, footer, footnote, etc. -- cgit