sw/qa/extras/rtfimport/data/fdo85812.rtf | 39 +++++++++++++ sw/qa/extras/rtfimport/rtfimport.cxx | 72 +++++++++++++++++++++++++ writerfilter/source/rtftok/rtfdocumentimpl.cxx | 3 + 3 files changed, 114 insertions(+)
New commits: commit f6ca0bb117fd31a61f2eac06187c0f41ba95a768 Author: Michael Stahl <mst...@redhat.com> Date: Tue Nov 4 22:45:48 2014 +0100 fdo#85812: RTF import: fix run type in new groups Apparently the run type resets to LTR in a new group. (regression from fc49c052dbdbb5ab3b0a02a13143705f769b9662) (cherry picked from commit 88d3f9e4cf64e4ef037063b26ddf347fd42d8d84) fdo#85812: RTF import: better fix for run type in new groups Apparently Word treats \ltrch \rtlch differently from \loch \hich \dbch when groups are opened. Change-Id: I257712521e8e77fa66e76857489797ecc675506e (cherry picked from commit a9a9718bb1f64318429562ecdaa3d3763d9e2f4a) Reviewed-on: https://gerrit.libreoffice.org/12269 Reviewed-by: Miklos Vajna <vmik...@collabora.co.uk> Tested-by: Miklos Vajna <vmik...@collabora.co.uk> diff --git a/sw/qa/extras/rtfimport/data/fdo85812.rtf b/sw/qa/extras/rtfimport/data/fdo85812.rtf new file mode 100644 index 0000000..152971f --- /dev/null +++ b/sw/qa/extras/rtfimport/data/fdo85812.rtf @@ -0,0 +1,39 @@ +{\rtf1\ansi\deflang1049\deflangfe2052 +{\*\generator Microsoft Word 11.0.5604;} + +\pard\plain +\lang1049\langfe2052\loch\hich\dbch\langnp1049\langfenp2052 +{\lang1033\langfe2052\dbch\langnp1033 \hich\dbch\loch This } + +\par\pard\plain +\lang1049\langfe2052\loch\hich\dbch +{CharGroup} +\lang1033 AfterChar + +\par\pard\plain +\lang1049\langfe2052\loch\hich\dbch +{\*\bkmkstart foomark}{\*\bkmkend foomark} +\lang1033 AfterBookmark + +\par\pard\plain +\lang1049\langfe2052\loch\hich\lang5121\dbch\lang1049 +{CharGroup} +\lang1033 AfterChar + +\par\pard\plain +\lang1049\langfe2052\loch\hich\lang5121\dbch\lang1049 +{\*\bkmkstart foomark}{\*\bkmkend foomark} +\lang1033 AfterBookmark + +\par\pard\plain +\lang1049\langfe2052\ltrch\lang1033\rtlch\lang5121 +{CharGroup} +\lang3073 AfterChar + +\par\pard\plain +\lang1049\langfe2052\ltrch\lang1033\rtlch\lang5121 +{\*\bkmkstart foomark}{\*\bkmkend foomark} +\lang3073 AfterBookmark + +{\lang1036\langfe2052\langnp1036 \par } +} diff --git a/sw/qa/extras/rtfimport/rtfimport.cxx b/sw/qa/extras/rtfimport/rtfimport.cxx index 1c3ed00..93e1904 100644 --- a/sw/qa/extras/rtfimport/rtfimport.cxx +++ b/sw/qa/extras/rtfimport/rtfimport.cxx @@ -475,6 +475,78 @@ DECLARE_RTFIMPORT_TEST(testFdo48037, "fdo48037.rtf") CPPUNIT_ASSERT_EQUAL(nExpected, nActual); } +DECLARE_RTFIMPORT_TEST(testFdo85812, "fdo85812.rtf") +{ + lang::Locale locale(getProperty<lang::Locale>( + getRun(getParagraph(1), 1, "This "), "CharLocale")); + // the \lang inside the group was applied to CJK not Western + CPPUNIT_ASSERT_EQUAL(OUString("en"), locale.Language); + CPPUNIT_ASSERT_EQUAL(OUString("US"), locale.Country); + // further testing indicates that Word is doing really weird stuff + // \loch \hich \dbch is reset by opening a group + locale = getProperty<lang::Locale>( + getRun(getParagraph(2), 1, "CharGroup"), "CharLocale"); + CPPUNIT_ASSERT_EQUAL(OUString("ru"), locale.Language); + CPPUNIT_ASSERT_EQUAL(OUString("RU"), locale.Country); + locale = getProperty<lang::Locale>( + getRun(getParagraph(2), 2, "AfterChar"), "CharLocale"); + CPPUNIT_ASSERT_EQUAL(OUString("en"), locale.Language); + CPPUNIT_ASSERT_EQUAL(OUString("US"), locale.Country); + locale = getProperty<lang::Locale>( + getRun(getParagraph(3), 2, "AfterBookmark"), "CharLocale"); + CPPUNIT_ASSERT_EQUAL(OUString("en"), locale.Language); + CPPUNIT_ASSERT_EQUAL(OUString("US"), locale.Country); + locale = getProperty<lang::Locale>( + getRun(getParagraph(4), 1, "CharGroup"), "CharLocale"); + CPPUNIT_ASSERT_EQUAL(OUString("ru"), locale.Language); + CPPUNIT_ASSERT_EQUAL(OUString("RU"), locale.Country); + locale = getProperty<lang::Locale>( + getRun(getParagraph(4), 1, "CharGroup"), "CharLocaleComplex"); + CPPUNIT_ASSERT_EQUAL(OUString("ar"), locale.Language); + CPPUNIT_ASSERT_EQUAL(OUString("DZ"), locale.Country); + locale = getProperty<lang::Locale>( + getRun(getParagraph(4), 2, "AfterChar"), "CharLocale"); + CPPUNIT_ASSERT_EQUAL(OUString("en"), locale.Language); + CPPUNIT_ASSERT_EQUAL(OUString("US"), locale.Country); + locale = getProperty<lang::Locale>( + getRun(getParagraph(4), 2, "AfterChar"), "CharLocaleComplex"); + CPPUNIT_ASSERT_EQUAL(OUString("ar"), locale.Language); + CPPUNIT_ASSERT_EQUAL(OUString("DZ"), locale.Country); + locale = getProperty<lang::Locale>( + getRun(getParagraph(5), 2, "AfterBookmark"), "CharLocale"); + CPPUNIT_ASSERT_EQUAL(OUString("en"), locale.Language); + CPPUNIT_ASSERT_EQUAL(OUString("US"), locale.Country); + locale = getProperty<lang::Locale>( + getRun(getParagraph(5), 2, "AfterBookmark"), "CharLocaleComplex"); + CPPUNIT_ASSERT_EQUAL(OUString("ar"), locale.Language); + CPPUNIT_ASSERT_EQUAL(OUString("DZ"), locale.Country); + // \ltrch \rtlch works differently - it is sticky across groups + locale = getProperty<lang::Locale>( + getRun(getParagraph(6), 1, "CharGroup"), "CharLocale"); + CPPUNIT_ASSERT_EQUAL(OUString("en"), locale.Language); + CPPUNIT_ASSERT_EQUAL(OUString("US"), locale.Country); + locale = getProperty<lang::Locale>( + getRun(getParagraph(6), 1, "CharGroup"), "CharLocaleComplex"); + CPPUNIT_ASSERT_EQUAL(OUString("ar"), locale.Language); + CPPUNIT_ASSERT_EQUAL(OUString("DZ"), locale.Country); + locale = getProperty<lang::Locale>( + getRun(getParagraph(6), 2, "AfterChar"), "CharLocale"); + CPPUNIT_ASSERT_EQUAL(OUString("en"), locale.Language); + CPPUNIT_ASSERT_EQUAL(OUString("US"), locale.Country); + locale = getProperty<lang::Locale>( + getRun(getParagraph(6), 2, "AfterChar"), "CharLocaleComplex"); + CPPUNIT_ASSERT_EQUAL(OUString("ar"), locale.Language); + CPPUNIT_ASSERT_EQUAL(OUString("EG"), locale.Country); + locale = getProperty<lang::Locale>( + getRun(getParagraph(7), 2, "AfterBookmark"), "CharLocale"); + CPPUNIT_ASSERT_EQUAL(OUString("en"), locale.Language); + CPPUNIT_ASSERT_EQUAL(OUString("US"), locale.Country); + locale = getProperty<lang::Locale>( + getRun(getParagraph(7), 2, "AfterBookmark"), "CharLocaleComplex"); + CPPUNIT_ASSERT_EQUAL(OUString("ar"), locale.Language); + CPPUNIT_ASSERT_EQUAL(OUString("EG"), locale.Country); +} + DECLARE_RTFIMPORT_TEST(testFdo47764, "fdo47764.rtf") { // \cbpat with zero argument should mean the auto (-1) color, not a default color (black) diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.cxx b/writerfilter/source/rtftok/rtfdocumentimpl.cxx index 145fd4a..6c6e282 100644 --- a/writerfilter/source/rtftok/rtfdocumentimpl.cxx +++ b/writerfilter/source/rtftok/rtfdocumentimpl.cxx @@ -4770,6 +4770,9 @@ int RTFDocumentImpl::pushState() m_aStates.push(m_aDefaultState); else { + // fdo#85812 group resets run type of _current_ and new state (but not RTL) + m_aStates.top().eRunType = RTFParserState::LOCH; + if (m_aStates.top().nDestinationState == DESTINATION_MR) lcl_DestinationToMath(*m_aStates.top().pDestinationText, m_aMathBuffer, m_bMathNor); m_aStates.push(m_aStates.top()); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits