[Libreoffice-commits] core.git: sw/qa writerfilter/source

Miklos Vajna vmiklos at collabora.co.uk
Tue Sep 26 09:12:01 UTC 2017


 sw/qa/extras/rtfexport/data/tdf112211.rtf       |   31 ++++++++++++++++++++++++
 sw/qa/extras/rtfexport/rtfexport.cxx            |    8 ++++++
 sw/qa/extras/rtfexport/rtfexport2.cxx           |   16 ++++++------
 writerfilter/source/rtftok/rtfdispatchvalue.cxx |   10 ++++++-
 writerfilter/source/rtftok/rtfdocumentimpl.cxx  |    6 ++--
 writerfilter/source/rtftok/rtfsprm.cxx          |    1 
 6 files changed, 59 insertions(+), 13 deletions(-)

New commits:
commit 56a695fddb915bcba13b088b5b2b4e0841d4acbc
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Tue Sep 26 09:13:05 2017 +0200

    tdf#112211 RTF import: fix unwanted direct formatting for left indents
    
    Commit f528f9499bd91b700c549575e88fa102cfffede9 (tdf#106953 RTF import:
    fix missing paragraph left margin, 2017-05-16) fixed a problem around
    inheriting indents from numbering styles vs paragraph styles, but it
    turns out that document was rather special and in general the old
    behavior was correct.  So fix that bug in a different way again, this
    time without less side-effects.
    
    The trick is that in case the level numbers group in a list definition
    ends with \u59 (instead of an ASCII ';'), then that group is considered
    to be invalid by Word. RTF import already was aware of this, but it
    wasn't known that when this invalid state is reached, that also means
    that the indents of the list level definitions should be ignored. So in
    general not putting direct formatting on a paragraph is a good thing:
    that way in case the paragraph style and the number style both has
    indent infos, then the numbering style wins, and that is what we want --
    but in case \u59 appears in the list definition, then the indentation
    from the numbering style should be ignored.
    
    So fix up the tokenizer to import the indentation from list levels in
    general, ignore it for invalid list levels, and then we can remove the
    direct formatting from the paragraphs, which fixes this bug and keeps
    the old one fixed as well.
    
    This required fixing up two poor testcases, which tested paragraph
    properties, but in fact are interested in the real source of
    indentation, which is now the numbering style. Visually both bugdocs are
    unchanged.
    
    Change-Id: I6390aa870659a8ad02ba5512d84dea34dba29e9f

diff --git a/sw/qa/extras/rtfexport/data/tdf112211.rtf b/sw/qa/extras/rtfexport/data/tdf112211.rtf
new file mode 100644
index 000000000000..d5b8010e953b
--- /dev/null
+++ b/sw/qa/extras/rtfexport/data/tdf112211.rtf
@@ -0,0 +1,31 @@
+{\rtf1\adeflang1037\ansi\ansicpg1252\uc1\adeff1\deff0\stshfdbch0\stshfloch0\stshfhich0\stshfbi0\deflang1033
+{\fonttbl
+{\f0\fbidi \froman\fcharset238\fprq2 Times New Roman;}
+{\f1\fbidi \fswiss\fcharset238\fprq2 Arial;}
+{\f2\fbidi \fmodern\fcharset238\fprq1 Courier New;}
+{\f3\fbidi \froman\fcharset2\fprq2 Symbol;}
+}
+\noqfpromote
+{\stylesheet
+{\s66 \li720 List Paragraph;}
+}
+{\*\listtable
+{\list\listtemplateid1644085804\listhybrid
+{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0
+\levelstartat1\levelspace0\levelindent0
+{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}
+{\levelnumbers;}
+\f3\fbias0 \fi-360\li720 }
+{\listname ;}
+\listid2028170298}
+}
+{\*\listoverridetable
+{\listoverride\listid2028170298\listoverridecount0\ls1}
+}
+\paperw12240\paperh15840\margl1440\margr1440\margt1800\margb1440\gutter0\ltrsect
+\pard\plain \li0
+{Instance Size\par}
+\pard\plain \s66 \fi-360\li720
+\ls1
+{P\par}
+}
diff --git a/sw/qa/extras/rtfexport/rtfexport.cxx b/sw/qa/extras/rtfexport/rtfexport.cxx
index 7b9107819005..6e0960f39116 100644
--- a/sw/qa/extras/rtfexport/rtfexport.cxx
+++ b/sw/qa/extras/rtfexport/rtfexport.cxx
@@ -1271,6 +1271,14 @@ DECLARE_RTFEXPORT_TEST(testTdf109790, "tdf109790.rtf")
     CPPUNIT_ASSERT_EQUAL(10.f, getProperty<float>(getRun(getParagraphOfText(1, xCell->getText()), 1), "CharHeight"));
 }
 
+DECLARE_RTFEXPORT_TEST(testTdf112211, "tdf112211.rtf")
+{
+    // This was 0, \fi in a list level definition was not imported.
+    auto xRules = getProperty< uno::Reference<container::XIndexAccess> >(getStyles("NumberingStyles")->getByName("WWNum1"), "NumberingRules");
+    comphelper::SequenceAsHashMap aRule(xRules->getByIndex(0));
+    CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(-635), aRule["FirstLineIndent"].get<sal_Int32>());
+}
+
 CPPUNIT_PLUGIN_IMPLEMENT();
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/qa/extras/rtfexport/rtfexport2.cxx b/sw/qa/extras/rtfexport/rtfexport2.cxx
index fba38e6c72cb..85e101087444 100644
--- a/sw/qa/extras/rtfexport/rtfexport2.cxx
+++ b/sw/qa/extras/rtfexport/rtfexport2.cxx
@@ -973,11 +973,10 @@ DECLARE_RTFEXPORT_TEST(testN825305, "n825305.rtf")
 
 DECLARE_RTFEXPORT_TEST(testTdf106953, "tdf106953.rtf")
 {
-    CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(1270), getProperty<sal_Int32>(getParagraph(1), "ParaLeftMargin"));
-    uno::Reference<beans::XPropertyState> xPropertyState(getParagraph(1), uno::UNO_QUERY);
-    beans::PropertyState ePropertyState = xPropertyState->getPropertyState("ParaLeftMargin");
-    // Was beans::PropertyState_DEFAULT_VALUE.
-    CPPUNIT_ASSERT_EQUAL(beans::PropertyState_DIRECT_VALUE, ePropertyState);
+    auto xRules = getProperty< uno::Reference<container::XIndexAccess> >(getStyles("NumberingStyles")->getByName("WWNum1"), "NumberingRules");
+    comphelper::SequenceAsHashMap aRule(xRules->getByIndex(0));
+    CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(1270), aRule["IndentAt"].get<sal_Int32>());
+    CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(0), aRule["FirstLineIndent"].get<sal_Int32>());
 }
 
 DECLARE_RTFEXPORT_TEST(testTdf112208, "tdf112208_hangingIndent.rtf")
@@ -1788,9 +1787,10 @@ DECLARE_RTFEXPORT_TEST(testTdf104317, "tdf104317.rtf")
 
 DECLARE_RTFEXPORT_TEST(testTdf104744, "tdf104744.rtf")
 {
-    // This was 0, as an unexpected "left margin is 0" token was created during
-    // import.
-    CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(1270), getProperty<sal_Int32>(getParagraph(1), "ParaLeftMargin"));
+    auto xRules = getProperty< uno::Reference<container::XIndexAccess> >(getStyles("NumberingStyles")->getByName("WWNum1"), "NumberingRules");
+    comphelper::SequenceAsHashMap aRule(xRules->getByIndex(0));
+    // This was 0.
+    CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(1270), aRule["IndentAt"].get<sal_Int32>());
 }
 
 DECLARE_RTFEXPORT_TEST(testTdf105852, "tdf105852.rtf")
diff --git a/writerfilter/source/rtftok/rtfdispatchvalue.cxx b/writerfilter/source/rtftok/rtfdispatchvalue.cxx
index bebaee85107e..70d6cbf46f2f 100644
--- a/writerfilter/source/rtftok/rtfdispatchvalue.cxx
+++ b/writerfilter/source/rtftok/rtfdispatchvalue.cxx
@@ -1373,8 +1373,16 @@ RTFError RTFDocumentImpl::dispatchValue(RTFKeyword nKeyword, int nParam)
     }
     break;
     case RTF_FI:
-        putNestedAttribute(m_aStates.top().aParagraphSprms, NS_ooxml::LN_CT_PPrBase_ind, NS_ooxml::LN_CT_Ind_firstLine, pIntValue);
+    {
+        if (m_aStates.top().eDestination == Destination::LISTLEVEL)
+        {
+            if (m_aStates.top().bLevelNumbersValid)
+                putNestedAttribute(m_aStates.top().aTableSprms, NS_ooxml::LN_CT_PPrBase_ind, NS_ooxml::LN_CT_Ind_firstLine, pIntValue);
+        }
+        else
+            putNestedAttribute(m_aStates.top().aParagraphSprms, NS_ooxml::LN_CT_PPrBase_ind, NS_ooxml::LN_CT_Ind_firstLine, pIntValue);
         break;
+    }
     case RTF_LI:
     {
         putNestedAttribute(m_aStates.top().aParagraphSprms, NS_ooxml::LN_CT_PPrBase_ind, NS_ooxml::LN_CT_Ind_left, pIntValue);
diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.cxx b/writerfilter/source/rtftok/rtfdocumentimpl.cxx
index 575562fb2eca..4c6f03ad06c8 100644
--- a/writerfilter/source/rtftok/rtfdocumentimpl.cxx
+++ b/writerfilter/source/rtftok/rtfdocumentimpl.cxx
@@ -2976,9 +2976,9 @@ RTFError RTFDocumentImpl::popState()
         if (!m_aStates.empty())
         {
             m_aStates.top().aTableSprms = aState.aTableSprms;
-            if (aState.eDestination == Destination::LEVELNUMBERS)
-                // Both current and parent state is levelnumbers: mark parent
-                // as invalid as well if necessary.
+            if (m_aStates.top().eDestination == Destination::LEVELNUMBERS || m_aStates.top().eDestination == Destination::LISTLEVEL)
+                // Parent state is level number or list level, current state is
+                // level numbers: mark parent as invalid as well if necessary.
                 m_aStates.top().bLevelNumbersValid = aState.bLevelNumbersValid;
         }
         break;
diff --git a/writerfilter/source/rtftok/rtfsprm.cxx b/writerfilter/source/rtftok/rtfsprm.cxx
index 34293344240b..d3faf3a145fd 100644
--- a/writerfilter/source/rtftok/rtfsprm.cxx
+++ b/writerfilter/source/rtftok/rtfsprm.cxx
@@ -164,7 +164,6 @@ static bool isSPRMDeduplicateBlacklist(Id nId)
     // Erasing these just because they equal to the style one is
     // problematic, as then the used value won't be from the style, but
     // possibly from the numbering.
-    case NS_ooxml::LN_CT_Ind_left:
     case NS_ooxml::LN_CT_Ind_right:
     case NS_ooxml::LN_CT_Ind_firstLine:
     case NS_ooxml::LN_CT_Ind_hanging:


More information about the Libreoffice-commits mailing list