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

Justin Luth (via logerrit) logerrit at kemper.freedesktop.org
Sat Jun 26 16:32:31 UTC 2021


 sw/qa/extras/ww8export/data/tdf104239_chapterNumberTortureTest.doc |binary
 sw/qa/extras/ww8export/ww8export3.cxx                              |   28 ++++++++++
 sw/source/filter/ww8/ww8par.cxx                                    |   22 +++++++
 3 files changed, 50 insertions(+)

New commits:
commit f5394ceda7e714b87050d78a0319dc3cfab9ac99
Author:     Justin Luth <justin_luth at sil.org>
AuthorDate: Fri Jun 25 14:49:13 2021 +0200
Commit:     Justin Luth <justin_luth at sil.org>
CommitDate: Sat Jun 26 18:31:49 2021 +0200

    tdf#104239 doc import: chose m_pChosenWW8OutlineStyle carefully
    
    Chapter numbering is a horrendous invention of LibreOffice.
    It is not at all a part of MS Formats.
    
    If there is anything that potentially can cause problems
    by choosing one style to be the outline style,
    invalidate it.
    
    We won't totally ignore CN because it has some unique
    properties in LO, and so it is worthwhile trying
    to round-trip it (alwyas LFO 0?) or populate it
    with the expected Heading styles if compatible.
    
    (I tried looping through and re-setting the
    matching styles with the "Outline" numrule first,
    but lots of unit tests prove that doesn't work well.)
    
    I couldn't believe the incredibly good effect this had on
    my torture test example document. Hurray.
    Then again, completely preventing CN at all also
    passed all unit tests, so I added a preventative test earlier.
    
    Change-Id: Iafa0d3606e558a3f17e49c3f1f6cebb7b25de962
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/117920
    Tested-by: Jenkins
    Reviewed-by: Justin Luth <justin_luth at sil.org>

diff --git a/sw/qa/extras/ww8export/data/tdf104239_chapterNumberTortureTest.doc b/sw/qa/extras/ww8export/data/tdf104239_chapterNumberTortureTest.doc
new file mode 100755
index 000000000000..dc8f65e76d40
Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf104239_chapterNumberTortureTest.doc differ
diff --git a/sw/qa/extras/ww8export/ww8export3.cxx b/sw/qa/extras/ww8export/ww8export3.cxx
index b9a2a847c986..1ca05650da55 100644
--- a/sw/qa/extras/ww8export/ww8export3.cxx
+++ b/sw/qa/extras/ww8export/ww8export3.cxx
@@ -822,6 +822,34 @@ DECLARE_WW8EXPORT_TEST(testTdf106541_inheritChapterNumberingB, "tdf106541_inheri
     CPPUNIT_ASSERT_EQUAL(OUString("1.1"), getProperty<OUString>(xPara, "ListLabelString"));
 }
 
+DECLARE_WW8EXPORT_TEST(testTdf104239_chapterNumberTortureTest, "tdf104239_chapterNumberTortureTest.doc")
+{
+    // There is no point in identifying what the wrong values where in this test,
+    //because EVERYTHING was wrong, and MANY different fixes are required to solve the problems.
+    uno::Reference<beans::XPropertySet> xPara(getParagraph(1, "No numId in style or paragraph"), uno::UNO_QUERY);
+    CPPUNIT_ASSERT_EQUAL(OUString(""), getProperty<OUString>(xPara, "ListLabelString"));
+    xPara.set(getParagraph(2, "Paragraph cancels numbering(0)"), uno::UNO_QUERY);
+    CPPUNIT_ASSERT_EQUAL(OUString(""), getProperty<OUString>(xPara, "ListLabelString"));
+    xPara.set(getParagraph(3, "First numbered line"), uno::UNO_QUERY);
+    CPPUNIT_ASSERT_EQUAL(OUString("1st.i.a.1.I"), getProperty<OUString>(xPara, "ListLabelString"));
+    xPara.set(getParagraph(7, "inheritOnly: inherit outlineLvl and listLvl."), uno::UNO_QUERY);
+    CPPUNIT_ASSERT_EQUAL(OUString("2nd.ii"), getProperty<OUString>(xPara, "ListLabelString"));
+    CPPUNIT_ASSERT_EQUAL(sal_Int16(1), getProperty<sal_Int16>(xPara, "NumberingLevel")); // Level 2
+    xPara.set(getParagraph(9, "outline with Body listLvl(9)."), uno::UNO_QUERY);
+    if (!mbExported)
+        CPPUNIT_ASSERT_EQUAL(OUString(""), getProperty<OUString>(xPara, "ListLabelString"));
+    xPara.set(getParagraph(10, "outline with Body listLvl(9) #2."), uno::UNO_QUERY);
+    if (!mbExported)
+        CPPUNIT_ASSERT_EQUAL(OUString(""), getProperty<OUString>(xPara, "ListLabelString"));
+    xPara.set(getParagraph(11, "direct formatting - Body listLvl(9)."), uno::UNO_QUERY);
+    //CPPUNIT_ASSERT_EQUAL(OUString(""), getProperty<OUString>(xPara, "ListLabelString"));
+    xPara.set(getParagraph(12, "direct numId, inherit listLvl."), uno::UNO_QUERY);
+    //CPPUNIT_ASSERT_EQUAL(OUString("2nd.ii.a.1.I"), getProperty<OUString>(xPara, "ListLabelString"));
+    CPPUNIT_ASSERT_EQUAL(sal_Int16(4), getProperty<sal_Int16>(xPara, "NumberingLevel")); // Level 5
+    xPara.set(getParagraph(13, "Style numId0 cancels inherited numbering."), uno::UNO_QUERY);
+    CPPUNIT_ASSERT_EQUAL(OUString(""), getProperty<OUString>(xPara, "ListLabelString"));
+}
+
 DECLARE_WW8EXPORT_TEST(testTdf106541_inheritOutlineNumbering, "tdf106541_inheritOutlineNumbering.doc")
 {
     // The level and numbering are inherited from Level2.
diff --git a/sw/source/filter/ww8/ww8par.cxx b/sw/source/filter/ww8/ww8par.cxx
index d4c2ddc62cd6..0f5257417dfb 100644
--- a/sw/source/filter/ww8/ww8par.cxx
+++ b/sw/source/filter/ww8/ww8par.cxx
@@ -5916,6 +5916,7 @@ void SwWW8ImplReader::SetOutlineStyles()
     {
         sal_uInt16 nStyle = 0;
         std::map<const SwNumRule*, int> aWW8ListStyleCounts;
+        std::map<const SwNumRule*, bool> aPreventUseAsChapterNumbering;
         for (SwWW8StyInf& rSI : m_vColl)
         {
             // Copy inherited numbering info since LO drops inheritance after ChapterNumbering
@@ -5925,7 +5926,18 @@ void SwWW8ImplReader::SetOutlineStyles()
                 && m_vColl[rSI.m_nBase].HasWW8OutlineLevel())
             {
                 if (rSI.m_nLFOIndex == USHRT_MAX)
+                {
                     rSI.m_nLFOIndex = m_vColl[rSI.m_nBase].m_nLFOIndex;
+
+                    // When ANYTHING is wrong or strange, prohibit eligibility for ChapterNumbering.
+                    // A style never inherits numbering from Chapter Numbering.
+                    if (rSI.m_nLFOIndex != USHRT_MAX)
+                    {
+                        const SwNumRule* pNumRule = m_vColl[rSI.m_nBase].m_pOutlineNumrule;
+                        if (pNumRule)
+                            aPreventUseAsChapterNumbering[pNumRule] = true;
+                    }
+                }
                 if (rSI.m_nListLevel == MAXLEVEL)
                     rSI.m_nListLevel = m_vColl[rSI.m_nBase].m_nListLevel;
                 if (rSI.mnWW8OutlineLevel == MAXLEVEL)
@@ -5943,6 +5955,13 @@ void SwWW8ImplReader::SetOutlineStyles()
             if (bReRegister)
                 RegisterNumFormatOnStyle(nStyle);
 
+            // When ANYTHING is wrong or strange, prohibit eligibility for ChapterNumbering.
+            if (rSI.IsWW8BuiltInHeadingStyle() && rSI.m_nListLevel != rSI.mnWW8OutlineLevel
+                && rSI.IsOutlineNumbered())
+            {
+                aPreventUseAsChapterNumbering[rSI.m_pOutlineNumrule] = true;
+            }
+
             ++nStyle; // increment before the first "continue";
 
             if (!rSI.IsWW8BuiltInHeadingStyle() || !rSI.HasWW8OutlineLevel())
@@ -5955,6 +5974,9 @@ void SwWW8ImplReader::SetOutlineStyles()
             const SwNumRule* pWW8ListStyle = rSI.GetOutlineNumrule();
             if (pWW8ListStyle != nullptr)
             {
+                if (aPreventUseAsChapterNumbering[pWW8ListStyle])
+                    continue;
+
                 std::map<const SwNumRule*, int>::iterator aCountIter
                     = aWW8ListStyleCounts.find(pWW8ListStyle);
                 if (aCountIter == aWW8ListStyleCounts.end())


More information about the Libreoffice-commits mailing list