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

Justin Luth (via logerrit) logerrit at kemper.freedesktop.org
Wed Jul 14 07:07:29 UTC 2021


 sw/qa/extras/ooxmlexport/ooxmlexport16.cxx        |    9 +++--
 writerfilter/source/dmapper/DomainMapper.cxx      |    5 ++
 writerfilter/source/dmapper/DomainMapper.hxx      |    1 
 writerfilter/source/dmapper/DomainMapper_Impl.cxx |   38 ++++++++++++++++++++++
 writerfilter/source/dmapper/DomainMapper_Impl.hxx |    1 
 writerfilter/source/dmapper/StyleSheetTable.cxx   |    6 +++
 6 files changed, 57 insertions(+), 3 deletions(-)

New commits:
commit 7c7dcdb5132b579485631e620c1a87cd9b3881e3
Author:     Justin Luth <justin_luth at sil.org>
AuthorDate: Mon May 24 07:35:42 2021 +0200
Commit:     Miklos Vajna <vmiklos at collabora.com>
CommitDate: Wed Jul 14 09:06:53 2021 +0200

    tdf#141964 writerfilter CN: only one style per outline level
    
    This really surprised me. On outline numbering, only one style
    can use the level of a numbering rule. Any other style that
    has it defined is ignored. First come first served.
    [All based on experimentation, no documentation found.]
    
    There are two ways the style can be attached.
    The highest priority is if the numbering style itself has
    a paragraph style defined (which obviously is exclusive).
    The second way is just to assign a list level along
    with a numbering rule in the para style.
    Surprisingly, this too creates an exclusive lock on the level.
    
    These are some existing unit tests that triggered.
    I forget which ones are important or valuable,
    but none of the contents were affected,
    only the UI use of the style didn't apply numbering in Word:
    
    Example1 -ooxmlexport6 fdo74605.docx RT
       pStyle not written out for numbering.
       List-number-2 gets ilvl0 before List-number-1,
       and loses pStyle for absLevel 1
       [NOT REALLY A PROBLEM.
        That is also how Word sees it. These aren't chapter numbering,
        so the pStyle settings just get dropped.]
    Example 2 - ooxmlexport7 fdo76979.docx RT:
       Bullet gets the numbering, but not Bullet2
    Example 3 - ooxmlexport11 tdf101122_noFillForCustomShape.odt RT:
       Heading 9 gets the numbering, but not Heading 10
       [Typical LO-originating document.]
    Example 4 - ooxmlexport13 tdf95848.docx RT:
       Heading 1, so not Heading 2
    Example 5 - ooxmlexport14 tdf136929_framesOfParagraph.odt RT:
       OOoNum123Start, so not the others (who inherit from start anyway)
    
    Change-Id: Ia27131ae6d31b6cff240477f3546ccf92ea69160
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/118707
    Tested-by: Jenkins
    Reviewed-by: Justin Luth <justin_luth at sil.org>
    Reviewed-by: Miklos Vajna <vmiklos at collabora.com>

diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport16.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport16.cxx
index 120c312969d2..504b2d3ea802 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport16.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport16.cxx
@@ -164,9 +164,12 @@ DECLARE_OOXMLEXPORT_TEST(testTdf141966_chapterNumberTortureTest, "tdf141966_chap
     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(5, "Outline with listLvl 5"), uno::UNO_QUERY);
+    CPPUNIT_ASSERT_EQUAL(OUString(""), getProperty<OUString>(xPara, "ListLabelString"));
+
     xPara.set(getParagraph(7, "inheritOnly: inherit outlineLvl and listLvl."), uno::UNO_QUERY);
-    // 2nd.iii in MS Word 2003.  2nd.ii in MS Word 2010/2016 where para5 is not numbered. Why not?
-    CPPUNIT_ASSERT_EQUAL(OUString("2nd.iii"), getProperty<OUString>(xPara, "ListLabelString"));
+    // 2nd.iii in MS Word 2003.  2nd.ii in MS Word 2010/2016 where para5 is not numbered.
+    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);
@@ -179,7 +182,7 @@ DECLARE_OOXMLEXPORT_TEST(testTdf141966_chapterNumberTortureTest, "tdf141966_chap
     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(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);
diff --git a/writerfilter/source/dmapper/DomainMapper.cxx b/writerfilter/source/dmapper/DomainMapper.cxx
index 39b118e108f0..5fecd67c07ca 100644
--- a/writerfilter/source/dmapper/DomainMapper.cxx
+++ b/writerfilter/source/dmapper/DomainMapper.cxx
@@ -4035,6 +4035,11 @@ OUString DomainMapper::GetListStyleName(sal_Int32 nListId) const
     return m_pImpl->GetListStyleName( nListId );
 }
 
+void DomainMapper::ValidateListLevel(const OUString& sStyleIdentifierD)
+{
+    m_pImpl->ValidateListLevel(sStyleIdentifierD);
+}
+
 void DomainMapper::SetDocDefaultsImport(bool bSet)
 {
     m_pImpl->SetDocDefaultsImport(bSet);
diff --git a/writerfilter/source/dmapper/DomainMapper.hxx b/writerfilter/source/dmapper/DomainMapper.hxx
index e76014737cf3..688f4c37edc0 100644
--- a/writerfilter/source/dmapper/DomainMapper.hxx
+++ b/writerfilter/source/dmapper/DomainMapper.hxx
@@ -95,6 +95,7 @@ public:
     void PushListProperties( const ::tools::SvRef<PropertyMap>& pListProperties );
     void PopListProperties();
     OUString GetListStyleName(sal_Int32 nListId) const;
+    void ValidateListLevel(const OUString& sStyleIdentifierD);
 
     bool IsOOXMLImport() const;
     bool IsRTFImport() const;
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
index 1ab11e0b149f..ae10911d5eaa 100644
--- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
@@ -1486,6 +1486,44 @@ sal_Int16 DomainMapper_Impl::GetListLevel(const StyleSheetEntryPtr& pEntry,
     return GetListLevel(pParent);
 }
 
+void DomainMapper_Impl::ValidateListLevel(const OUString& sStyleIdentifierD)
+{
+    StyleSheetEntryPtr pMyStyle = GetStyleSheetTable()->FindStyleSheetByISTD(sStyleIdentifierD);
+    if (!pMyStyle)
+        return;
+
+    sal_Int8 nListLevel = GetListLevel(pMyStyle);
+    if (nListLevel < 0 || nListLevel >= WW_OUTLINE_MAX)
+        return;
+
+    bool bDummy = false;
+    sal_Int16 nListId = lcl_getListId(pMyStyle, GetStyleSheetTable(), bDummy);
+    if (nListId < 1)
+        return;
+
+    auto const pList(GetListTable()->GetList(nListId));
+    if (!pList)
+        return;
+
+    auto pLevel = pList->GetLevel(nListLevel);
+    if (!pLevel && pList->GetAbstractDefinition())
+        pLevel = pList->GetAbstractDefinition()->GetLevel(nListLevel);
+    if (!pLevel)
+        return;
+
+    if (!pLevel->GetParaStyle())
+    {
+        // First come, first served, and it hasn't been claimed yet, so claim it now.
+        pLevel->SetParaStyle(pMyStyle);
+    }
+    else if (pLevel->GetParaStyle() != pMyStyle)
+    {
+        // This level is already used by another style, so prevent numbering via this style
+        // by setting to body level (9).
+        pMyStyle->pProperties->SetListLevel(WW_OUTLINE_MAX);
+    }
+}
+
 void DomainMapper_Impl::finishParagraph( const PropertyMapPtr& pPropertyMap, const bool bRemove, const bool bNoNumbering )
 {
     if (m_bDiscardHeaderFooter)
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.hxx b/writerfilter/source/dmapper/DomainMapper_Impl.hxx
index 88b3eb7d8332..9c3e25a6e072 100644
--- a/writerfilter/source/dmapper/DomainMapper_Impl.hxx
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.hxx
@@ -1032,6 +1032,7 @@ public:
     css::uno::Reference<css::container::XIndexAccess> GetCurrentNumberingRules(sal_Int32* pListLevel);
 
     sal_Int16 GetListLevel(const StyleSheetEntryPtr& pEntry, const PropertyMapPtr& pParaContext = nullptr);
+    void ValidateListLevel(const OUString& sStyleIdentifierD);
 
     /**
      Used for attributes/sprms which cannot be evaluated immediately (e.g. they depend
diff --git a/writerfilter/source/dmapper/StyleSheetTable.cxx b/writerfilter/source/dmapper/StyleSheetTable.cxx
index ae9440be8381..8eb833410e1a 100644
--- a/writerfilter/source/dmapper/StyleSheetTable.cxx
+++ b/writerfilter/source/dmapper/StyleSheetTable.cxx
@@ -924,6 +924,12 @@ void StyleSheetTable::ApplyNumberingStyleNameToParaStyles()
                     const OUString sNumberingStyleName = m_pImpl->m_rDMapper.GetListStyleName( pStyleSheetProperties->GetListId() );
                     if ( !sNumberingStyleName.isEmpty() || !pStyleSheetProperties->GetListId() )
                         xPropertySet->setPropertyValue( getPropertyName(PROP_NUMBERING_STYLE_NAME), uno::makeAny(sNumberingStyleName) );
+
+                    // Word 2010+ (not Word 2003, and Word 2007 is completely broken)
+                    // does something rather strange. It does not allow two paragraph styles
+                    // to share the same listLevel on a numbering rule.
+                    // Consider this style to just be body level if already used previously.
+                    m_pImpl->m_rDMapper.ValidateListLevel(pEntry->sStyleIdentifierD);
                 }
             }
         }


More information about the Libreoffice-commits mailing list