summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sw/qa/extras/rtfimport/data/fdo85812.rtf31
-rw-r--r--sw/qa/extras/rtfimport/rtfimport.cxx64
-rw-r--r--writerfilter/source/rtftok/rtfdocumentimpl.cxx5
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();