diff options
-rw-r--r-- | sw/qa/extras/rtfimport/data/fdo85812.rtf | 31 | ||||
-rw-r--r-- | sw/qa/extras/rtfimport/rtfimport.cxx | 64 | ||||
-rw-r--r-- | writerfilter/source/rtftok/rtfdocumentimpl.cxx | 5 |
3 files changed, 97 insertions, 3 deletions
diff --git a/sw/qa/extras/rtfimport/data/fdo85812.rtf b/sw/qa/extras/rtfimport/data/fdo85812.rtf index 2f3e10c96a34..152971f4cf89 100644 --- a/sw/qa/extras/rtfimport/data/fdo85812.rtf +++ b/sw/qa/extras/rtfimport/data/fdo85812.rtf @@ -4,5 +4,36 @@ \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 a4dd898c0236..3e2865956234 100644 --- a/sw/qa/extras/rtfimport/rtfimport.cxx +++ b/sw/qa/extras/rtfimport/rtfimport.cxx @@ -481,7 +481,69 @@ DECLARE_RTFIMPORT_TEST(testFdo85812, "fdo85812.rtf") // 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") diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.cxx b/writerfilter/source/rtftok/rtfdocumentimpl.cxx index 99693f3fe564..a568d954d548 100644 --- a/writerfilter/source/rtftok/rtfdocumentimpl.cxx +++ b/writerfilter/source/rtftok/rtfdocumentimpl.cxx @@ -4823,13 +4823,14 @@ 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()); } m_aStates.top().aDestinationText.setLength(0); // was copied: always reset! - m_aStates.top().isRightToLeft = false; // fdo#85812 group resets run type - m_aStates.top().eRunType = RTFParserState::LOCH; m_pTokenizer->pushGroup(); |