diff options
author | Michael Stahl <mstahl@redhat.com> | 2017-02-23 15:33:55 +0100 |
---|---|---|
committer | Michael Stahl <mstahl@redhat.com> | 2017-02-23 16:42:38 +0100 |
commit | 10e733908038407791f9c14af2a86417cc4a653c (patch) | |
tree | 62c3c794739912b642b5adfbdbed2be00176a4ec | |
parent | 78e25558e86188314b9b72048b8ddca18697cb86 (diff) |
writerfilter: RTF import: hex-escaped \r and \n create paragraph break
... in Word 2010, while the spec doesn't say what they do.
So just handle \'0d and \'0a like \par.
This fixes an assert failure on importing lp556169-2.rtf, where
insertTextPortion was called with a string containing "\r", which split
the paragraph and that messed up the SwPaM.
Change-Id: Iee8b5b47e15d18232de841adfbc9c6498727c384
-rw-r--r-- | sw/qa/extras/rtfimport/data/hexcrlf.rtf | 4 | ||||
-rw-r--r-- | sw/qa/extras/rtfimport/rtfimport.cxx | 10 | ||||
-rw-r--r-- | writerfilter/source/rtftok/rtfdocumentimpl.cxx | 14 |
3 files changed, 27 insertions, 1 deletions
diff --git a/sw/qa/extras/rtfimport/data/hexcrlf.rtf b/sw/qa/extras/rtfimport/data/hexcrlf.rtf new file mode 100644 index 000000000000..7c7ed1a9b5f8 --- /dev/null +++ b/sw/qa/extras/rtfimport/data/hexcrlf.rtf @@ -0,0 +1,4 @@ +{\rtf1 +foo\'0dba +r\'0abaz\'0d\'0aquux +\par } diff --git a/sw/qa/extras/rtfimport/rtfimport.cxx b/sw/qa/extras/rtfimport/rtfimport.cxx index 855b2da3967e..64a6dc90f132 100644 --- a/sw/qa/extras/rtfimport/rtfimport.cxx +++ b/sw/qa/extras/rtfimport/rtfimport.cxx @@ -1101,6 +1101,16 @@ DECLARE_RTFIMPORT_TEST(testFdo59419, "fdo59419.rtf") CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTables->getCount()); } +DECLARE_RTFIMPORT_TEST(testHexCRLF, "hexcrlf.rtf") +{ + // hex-escaped \r and \n should create a paragraph break + getParagraph(1, "foo"); + getParagraph(2, "bar"); + getParagraph(3, "baz"); + getParagraph(4, ""); + getParagraph(5, "quux"); +} + DECLARE_RTFIMPORT_TEST(testFdo58076_2, "fdo58076-2.rtf") { // Position of the picture wasn't correct. diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.cxx b/writerfilter/source/rtftok/rtfdocumentimpl.cxx index a42b52833ab0..ef5e0868d1ef 100644 --- a/writerfilter/source/rtftok/rtfdocumentimpl.cxx +++ b/writerfilter/source/rtftok/rtfdocumentimpl.cxx @@ -1120,7 +1120,19 @@ RTFError RTFDocumentImpl::resolveChars(char ch) if (m_aStates.top().nInternalState == RTFInternalState::HEX && m_aStates.top().eDestination != Destination::LEVELNUMBERS) { if (!bSkipped) - m_aHexBuffer.append(ch); + { + // note: apparently \'0d\'0a is interpreted as 2 breaks, not 1 + if (m_aStates.top().eDestination != Destination::DOCCOMM + && (ch == '\r' || ch == '\n')) + { + checkUnicode(/*bUnicode =*/ false, /*bHex =*/ true); + dispatchSymbol(RTF_PAR); + } + else + { + m_aHexBuffer.append(ch); + } + } return RTFError::OK; } |