diff options
author | Miklos Vajna <vmiklos@collabora.co.uk> | 2016-03-31 08:37:43 +0200 |
---|---|---|
committer | Andras Timar <andras.timar@collabora.com> | 2016-04-14 08:16:11 +0000 |
commit | 7dece94d6aa122d69e9740b93597d13347b5cb11 (patch) | |
tree | ec64510c86463c74985a707141812494111a7768 | |
parent | 168e55d3d05224c790824ec71677ff787371ad48 (diff) |
tdf#98806 RTF import: handle bookmarks in table text
Mapper().props() was called directly, so all bookmarks pointed to the
start of the A1 cell instead of the correct text range.
(cherry picked from commit 3d922d7da4fa11b8c22bbdffd141fa1398b2fcd4)
Conflicts:
sw/qa/extras/rtfexport/rtfexport.cxx
Change-Id: I40eeb85b61d2ae9138cd666d4a6a3c08eda47da3
Reviewed-on: https://gerrit.libreoffice.org/23913
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Andras Timar <andras.timar@collabora.com>
-rw-r--r-- | sw/qa/extras/rtfexport/data/tdf98806.rtf | 11 | ||||
-rw-r--r-- | sw/qa/extras/rtfexport/rtfexport.cxx | 8 | ||||
-rw-r--r-- | writerfilter/source/rtftok/rtfdocumentimpl.cxx | 14 |
3 files changed, 29 insertions, 4 deletions
diff --git a/sw/qa/extras/rtfexport/data/tdf98806.rtf b/sw/qa/extras/rtfexport/data/tdf98806.rtf new file mode 100644 index 000000000000..e356682b30a4 --- /dev/null +++ b/sw/qa/extras/rtfexport/data/tdf98806.rtf @@ -0,0 +1,11 @@ +{\rtf1 +\trowd\cellx4000\cellx8000\pard\plain\intbl +A1\cell AAA +{\*\bkmkstart bookmark} +BBB +{\*\bkmkend bookmark} +CCC\cell +\row +\pard\plain +\par +} diff --git a/sw/qa/extras/rtfexport/rtfexport.cxx b/sw/qa/extras/rtfexport/rtfexport.cxx index 08250349b44e..11b92e8c13af 100644 --- a/sw/qa/extras/rtfexport/rtfexport.cxx +++ b/sw/qa/extras/rtfexport/rtfexport.cxx @@ -983,6 +983,14 @@ DECLARE_RTFEXPORT_TEST(testTdf96175, "tdf96175.rtf") CPPUNIT_ASSERT_EQUAL(OUString("foobar"), getProperty<OUString>(xUserDefinedProperties, "Company")); } +DECLARE_RTFEXPORT_TEST(testTdf98806, "tdf98806.rtf") +{ + uno::Reference<text::XBookmarksSupplier> xBookmarksSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference<text::XTextContent> xBookmark(xBookmarksSupplier->getBookmarks()->getByName("bookmark"), uno::UNO_QUERY); + // This was empty, bookmark in table wasn't imported correctly. + CPPUNIT_ASSERT_EQUAL(OUString("BBB"), xBookmark->getAnchor()->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 cc01274a68e8..bb1991d95d98 100644 --- a/writerfilter/source/rtftok/rtfdocumentimpl.cxx +++ b/writerfilter/source/rtftok/rtfdocumentimpl.cxx @@ -156,7 +156,7 @@ static OString lcl_DTTM22OString(long lDTTM) return DateTimeToOString(msfilter::util::DTTM2DateTime(lDTTM)); } -static writerfilter::Reference<Properties>::Pointer_t lcl_getBookmarkProperties(int nPos, OUString& rString) +static RTFSprms lcl_getBookmarkProperties(int nPos, OUString& rString) { RTFSprms aAttributes; auto pPos = std::make_shared<RTFValue>(nPos); @@ -167,7 +167,7 @@ static writerfilter::Reference<Properties>::Pointer_t lcl_getBookmarkProperties( aAttributes.set(NS_ooxml::LN_CT_Bookmark_name, pString); } aAttributes.set(NS_ooxml::LN_CT_MarkupRangeBookmark_id, pPos); - return std::make_shared<RTFReferenceProperties>(aAttributes); + return aAttributes; } static const char* lcl_RtfToString(RTFKeyword nKeyword) @@ -5313,7 +5313,10 @@ RTFError RTFDocumentImpl::popState() OUString aStr = m_aStates.top().pDestinationText->makeStringAndClear(); int nPos = m_aBookmarks.size(); m_aBookmarks[aStr] = nPos; - Mapper().props(lcl_getBookmarkProperties(nPos, aStr)); + if (!m_aStates.top().pCurrentBuffer) + Mapper().props(std::make_shared<RTFReferenceProperties>(lcl_getBookmarkProperties(nPos, aStr))); + else + m_aStates.top().pCurrentBuffer->push_back(Buf_t(BUFFER_PROPS, std::make_shared<RTFValue>(lcl_getBookmarkProperties(nPos, aStr)), nullptr)); } break; case Destination::BOOKMARKEND: @@ -5321,7 +5324,10 @@ RTFError RTFDocumentImpl::popState() if (&m_aStates.top().aDestinationText != m_aStates.top().pDestinationText) break; // not for nested group OUString aStr = m_aStates.top().pDestinationText->makeStringAndClear(); - Mapper().props(lcl_getBookmarkProperties(m_aBookmarks[aStr], aStr)); + if (!m_aStates.top().pCurrentBuffer) + Mapper().props(std::make_shared<RTFReferenceProperties>(lcl_getBookmarkProperties(m_aBookmarks[aStr], aStr))); + else + m_aStates.top().pCurrentBuffer->push_back(Buf_t(BUFFER_PROPS, std::make_shared<RTFValue>(lcl_getBookmarkProperties(m_aBookmarks[aStr], aStr)), nullptr)); } break; case Destination::INDEXENTRY: |