diff options
author | Miklos Vajna <vmiklos@suse.cz> | 2012-07-27 16:32:13 +0200 |
---|---|---|
committer | Miklos Vajna <vmiklos@suse.cz> | 2012-07-27 17:28:09 +0200 |
commit | dba6b5151e26ea0bc88f8d30a70859fcbbd2e81f (patch) | |
tree | 8ad1d8ee91cddd9d474e8e2fbc4cd1aaf00a91e9 | |
parent | fb66fd63d4a1ea26d0191d3b39cb7e25abf2e714 (diff) |
fix import of nested RTF_MF groups
Change-Id: Ibd4f93663d27d997c44f73e201c355a34d6452d3
-rw-r--r-- | sw/qa/extras/rtfexport/data/math-runs.rtf | 12 | ||||
-rw-r--r-- | sw/qa/extras/rtfexport/rtfexport.cxx | 9 | ||||
-rw-r--r-- | writerfilter/source/rtftok/rtfdocumentimpl.cxx | 31 |
3 files changed, 39 insertions, 13 deletions
diff --git a/sw/qa/extras/rtfexport/data/math-runs.rtf b/sw/qa/extras/rtfexport/data/math-runs.rtf new file mode 100644 index 000000000000..7a4ae2dc5ea1 --- /dev/null +++ b/sw/qa/extras/rtfexport/data/math-runs.rtf @@ -0,0 +1,12 @@ +{\rtf1
+{\mmath
+{\*\moMath
+{\rtlch\fcs1 \af31507 \ltrch\fcs0 \i\loch\af34\hich\af34\dbch\af31505\insrsid7024409 \{\hich\af34\dbch\af31505\loch\f34
+{\mr\mscr0\msty2
+[]()}
+}
+{\rtlch\fcs1 \af31507 \ltrch\fcs0 \i\f34\insrsid7024409 \}}
+}
+}
+\par
+}
diff --git a/sw/qa/extras/rtfexport/rtfexport.cxx b/sw/qa/extras/rtfexport/rtfexport.cxx index 7cf93df6bee3..ca72d9b408b1 100644 --- a/sw/qa/extras/rtfexport/rtfexport.cxx +++ b/sw/qa/extras/rtfexport/rtfexport.cxx @@ -67,6 +67,7 @@ public: void testMathSepchr(); void testMathSubscripts(); void testMathVerticalstacks(); + void testMathRuns(); CPPUNIT_TEST_SUITE(Test); #if !defined(MACOSX) && !defined(WNT) @@ -96,6 +97,7 @@ public: CPPUNIT_TEST(testMathSepchr); CPPUNIT_TEST(testMathSubscripts); CPPUNIT_TEST(testMathVerticalstacks); + CPPUNIT_TEST(testMathRuns); #endif #endif CPPUNIT_TEST_SUITE_END(); @@ -397,6 +399,13 @@ void Test::testMathVerticalstacks() CPPUNIT_ASSERT_EQUAL(OUString("stack { a # stack { b # c } }"), getFormula(getRun(getParagraph(4), 1))); } +void Test::testMathRuns() +{ + roundtrip("math-runs.rtf"); + // was [](){}, i.e. first curly bracket had an incorrect position + CPPUNIT_ASSERT_EQUAL(OUString("\\{ left [ right ] left ( right ) \\}"), getFormula(getRun(getParagraph(1), 1))); +} + CPPUNIT_TEST_SUITE_REGISTRATION(Test); CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.cxx b/writerfilter/source/rtftok/rtfdocumentimpl.cxx index bece05203faf..2c590c0473e9 100644 --- a/writerfilter/source/rtftok/rtfdocumentimpl.cxx +++ b/writerfilter/source/rtftok/rtfdocumentimpl.cxx @@ -202,6 +202,19 @@ static util::DateTime lcl_getDateTime(std::stack<RTFParserState>& aStates) aStates.top().nDay, aStates.top().nMonth, aStates.top().nYear); } +static void lcl_DestinationToMath(OUStringBuffer& rDestinationText, oox::formulaimport::XmlStreamBuilder& rMathBuffer) +{ + OUString aStr = rDestinationText.makeStringAndClear(); + if (!aStr.isEmpty()) + { + rMathBuffer.appendOpeningTag(M_TOKEN(r)); + rMathBuffer.appendOpeningTag(M_TOKEN(t)); + rMathBuffer.appendCharacters(aStr); + rMathBuffer.appendClosingTag(M_TOKEN(t)); + rMathBuffer.appendClosingTag(M_TOKEN(r)); + } +} + RTFDocumentImpl::RTFDocumentImpl(uno::Reference<uno::XComponentContext> const& xContext, uno::Reference<io::XInputStream> const& xInputStream, uno::Reference<lang::XComponent> const& xDstDoc, @@ -3131,7 +3144,11 @@ int RTFDocumentImpl::pushState() if (m_aStates.empty()) aState = m_aDefaultState; else + { + if (m_aStates.top().nDestinationState == DESTINATION_MR) + lcl_DestinationToMath(m_aStates.top().aDestinationText, m_aMathBuffer); aState = m_aStates.top(); + } m_aStates.push(aState); m_aStates.top().aDestinationText.setLength(0); @@ -3616,19 +3633,7 @@ int RTFDocumentImpl::popState() m_aMathBuffer = oox::formulaimport::XmlStreamBuilder(); } break; - case DESTINATION_MR: - { - OUString aStr = m_aStates.top().aDestinationText.makeStringAndClear(); - if (!aStr.isEmpty()) - { - m_aMathBuffer.appendOpeningTag(M_TOKEN(r)); - m_aMathBuffer.appendOpeningTag(M_TOKEN(t)); - m_aMathBuffer.appendCharacters(aStr); - m_aMathBuffer.appendClosingTag(M_TOKEN(t)); - m_aMathBuffer.appendClosingTag(M_TOKEN(r)); - } - } - break; + case DESTINATION_MR: lcl_DestinationToMath(m_aStates.top().aDestinationText, m_aMathBuffer); break; case DESTINATION_MF: m_aMathBuffer.appendClosingTag(M_TOKEN(f)); break; case DESTINATION_MFPR: m_aMathBuffer.appendClosingTag(M_TOKEN(fPr)); break; case DESTINATION_MCTRLPR: m_aMathBuffer.appendClosingTag(M_TOKEN(ctrlPr)); break; |