summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Stahl <mstahl@redhat.com>2017-02-23 15:33:55 +0100
committerMichael Stahl <mstahl@redhat.com>2017-02-23 16:42:38 +0100
commit10e733908038407791f9c14af2a86417cc4a653c (patch)
tree62c3c794739912b642b5adfbdbed2be00176a4ec
parent78e25558e86188314b9b72048b8ddca18697cb86 (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.rtf4
-rw-r--r--sw/qa/extras/rtfimport/rtfimport.cxx10
-rw-r--r--writerfilter/source/rtftok/rtfdocumentimpl.cxx14
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;
}