summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Stahl <mstahl@redhat.com>2014-11-04 22:45:48 +0100
committerMiklos Vajna <vmiklos@collabora.co.uk>2014-11-06 12:52:06 +0000
commitf6ca0bb117fd31a61f2eac06187c0f41ba95a768 (patch)
treea7409bd06c2a38af52f7d3400f87a7067062884b
parente963f4ee14fdda118a54745dcfca46e6244f0999 (diff)
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 <vmiklos@collabora.co.uk> Tested-by: Miklos Vajna <vmiklos@collabora.co.uk>
-rw-r--r--sw/qa/extras/rtfimport/data/fdo85812.rtf39
-rw-r--r--sw/qa/extras/rtfimport/rtfimport.cxx72
-rw-r--r--writerfilter/source/rtftok/rtfdocumentimpl.cxx3
3 files changed, 114 insertions, 0 deletions
diff --git a/sw/qa/extras/rtfimport/data/fdo85812.rtf b/sw/qa/extras/rtfimport/data/fdo85812.rtf
new file mode 100644
index 000000000000..152971f4cf89
--- /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 1c3ed00a34ba..93e1904c29a2 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 145fd4a3d67f..6c6e282f9845 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());