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

Vasily Melenchuk (via logerrit) logerrit at kemper.freedesktop.org
Tue Jun 16 10:13:13 UTC 2020


 sw/qa/extras/ooxmlexport/data/tdf133605.docx     |binary
 sw/qa/extras/ooxmlexport/data/tdf133605_2.docx   |binary
 sw/qa/extras/ooxmlexport/ooxmlexport14.cxx       |   51 +++++++++++++++++++++++
 writerfilter/source/dmapper/NumberingManager.cxx |   23 ++++------
 writerfilter/source/dmapper/NumberingManager.hxx |    2 
 5 files changed, 63 insertions(+), 13 deletions(-)

New commits:
commit 408f2a1c09a6563caf193384df8e1cac6e153fbb
Author:     Vasily Melenchuk <vasily.melenchuk at cib.de>
AuthorDate: Sun Jun 14 14:47:57 2020 +0300
Commit:     Thorsten Behrens <Thorsten.Behrens at CIB.de>
CommitDate: Tue Jun 16 12:12:34 2020 +0200

    tdf#133605: docx import: use ilvl value for list level import
    
    Previous implementation was not aware about ilvl value which
    declares a level number it is defining. So LO was able correctly
    handle only lists were levels are defined in increasing order
    starting from zero. Same problem was also with override lists: if
    we just override only one some random level (for example ilvl=2
    in bugdoc) it was applied to level 0.
    
    Change-Id: If1f466fcbae0c82a8601e5b638e541d75aab665c
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/96268
    Tested-by: Jenkins
    Reviewed-by: Thorsten Behrens <Thorsten.Behrens at CIB.de>

diff --git a/sw/qa/extras/ooxmlexport/data/tdf133605.docx b/sw/qa/extras/ooxmlexport/data/tdf133605.docx
new file mode 100644
index 000000000000..d248d5e1a93b
Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf133605.docx differ
diff --git a/sw/qa/extras/ooxmlexport/data/tdf133605_2.docx b/sw/qa/extras/ooxmlexport/data/tdf133605_2.docx
new file mode 100644
index 000000000000..8d3c5acba609
Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf133605_2.docx differ
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport14.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport14.cxx
index e2c5f0dbf9b6..99e1d29c93d8 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport14.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport14.cxx
@@ -954,6 +954,57 @@ DECLARE_OOXMLEXPORT_TEST(testTdf120394, "tdf120394.docx")
     }
 }
 
+DECLARE_OOXMLEXPORT_TEST(testTdf133605, "tdf133605.docx")
+{
+    CPPUNIT_ASSERT_EQUAL(1, getPages());
+    {
+        uno::Reference<beans::XPropertySet> xPara(getParagraph(3), uno::UNO_QUERY);
+        CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int16>(0), getProperty<sal_Int16>(xPara, "NumberingLevel"));
+        CPPUNIT_ASSERT_EQUAL(OUString(CHAR_ZWSP), getProperty<OUString>(xPara, "ListLabelString"));
+    }
+    {
+        uno::Reference<beans::XPropertySet> xPara(getParagraph(4), uno::UNO_QUERY);
+        CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int16>(1), getProperty<sal_Int16>(xPara, "NumberingLevel"));
+        CPPUNIT_ASSERT_EQUAL(OUString("1."), getProperty<OUString>(xPara, "ListLabelString"));
+    }
+    {
+        uno::Reference<beans::XPropertySet> xPara(getParagraph(5), uno::UNO_QUERY);
+        CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int16>(2), getProperty<sal_Int16>(xPara, "NumberingLevel"));
+        CPPUNIT_ASSERT_EQUAL(OUString("1.1"), getProperty<OUString>(xPara, "ListLabelString"));
+    }
+    {
+        uno::Reference<beans::XPropertySet> xPara(getParagraph(6), uno::UNO_QUERY);
+        CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int16>(3), getProperty<sal_Int16>(xPara, "NumberingLevel"));
+        CPPUNIT_ASSERT_EQUAL(OUString("(a)"), getProperty<OUString>(xPara, "ListLabelString"));
+    }
+}
+
+DECLARE_OOXMLEXPORT_TEST(testTdf133605_2, "tdf133605_2.docx")
+{
+    // About the same document as tdf133605.docx, but number definition has level definitions in random order
+    CPPUNIT_ASSERT_EQUAL(1, getPages());
+    {
+        uno::Reference<beans::XPropertySet> xPara(getParagraph(3), uno::UNO_QUERY);
+        CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int16>(0), getProperty<sal_Int16>(xPara, "NumberingLevel"));
+        CPPUNIT_ASSERT_EQUAL(OUString(CHAR_ZWSP), getProperty<OUString>(xPara, "ListLabelString"));
+    }
+    {
+        uno::Reference<beans::XPropertySet> xPara(getParagraph(4), uno::UNO_QUERY);
+        CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int16>(1), getProperty<sal_Int16>(xPara, "NumberingLevel"));
+        CPPUNIT_ASSERT_EQUAL(OUString("1."), getProperty<OUString>(xPara, "ListLabelString"));
+    }
+    {
+        uno::Reference<beans::XPropertySet> xPara(getParagraph(5), uno::UNO_QUERY);
+        CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int16>(2), getProperty<sal_Int16>(xPara, "NumberingLevel"));
+        CPPUNIT_ASSERT_EQUAL(OUString("1.1"), getProperty<OUString>(xPara, "ListLabelString"));
+    }
+    {
+        uno::Reference<beans::XPropertySet> xPara(getParagraph(6), uno::UNO_QUERY);
+        CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int16>(3), getProperty<sal_Int16>(xPara, "NumberingLevel"));
+        CPPUNIT_ASSERT_EQUAL(OUString("(a)"), getProperty<OUString>(xPara, "ListLabelString"));
+    }
+}
+
 DECLARE_OOXMLEXPORT_EXPORTONLY_TEST(testTdf123757, "tdf123757.docx")
 {
     xmlDocUniquePtr pXml = parseExport("word/document.xml");
diff --git a/writerfilter/source/dmapper/NumberingManager.cxx b/writerfilter/source/dmapper/NumberingManager.cxx
index 713313fbba74..5a33327597c8 100644
--- a/writerfilter/source/dmapper/NumberingManager.cxx
+++ b/writerfilter/source/dmapper/NumberingManager.cxx
@@ -366,11 +366,14 @@ ListLevel::Pointer AbstractListDef::GetLevel( sal_uInt16 nLvl )
     return pLevel;
 }
 
-void AbstractListDef::AddLevel( )
+void AbstractListDef::AddLevel( sal_uInt16 nLvl )
 {
+    if ( nLvl >= m_aLevels.size() )
+        m_aLevels.resize( nLvl+1 );
+
     ListLevel::Pointer pLevel( new ListLevel );
     m_pCurrentLevel = pLevel;
-    m_aLevels.push_back( pLevel );
+    m_aLevels[nLvl] = pLevel;
 }
 
 uno::Sequence<uno::Sequence<beans::PropertyValue>> AbstractListDef::GetPropertyValues(bool bDefaults)
@@ -381,7 +384,8 @@ uno::Sequence<uno::Sequence<beans::PropertyValue>> AbstractListDef::GetPropertyV
     int nLevels = m_aLevels.size( );
     for ( int i = 0; i < nLevels; i++ )
     {
-        aResult[i] = m_aLevels[i]->GetProperties(bDefaults);
+        if (m_aLevels[i])
+            aResult[i] = m_aLevels[i]->GetProperties(bDefaults);
     }
 
     return result;
@@ -700,14 +704,11 @@ void ListsManager::lcl_attribute( Id nName, Value& rVal )
             AbstractListDef::SetValue( nName );
         break;
         case NS_ooxml::LN_CT_NumLvl_ilvl:
-        {
             //add a new level to the level vector and make it the current one
-            m_pCurrentDefinition->AddLevel();
-
-            writerfilter::Reference<Properties>::Pointer_t pProperties = rVal.getProperties();
-            if(pProperties)
-                pProperties->resolve(*this);
-        }
+            m_pCurrentDefinition->AddLevel(rVal.getString().toInt32());
+        break;
+        case NS_ooxml::LN_CT_Lvl_ilvl:
+            m_pCurrentDefinition->AddLevel(rVal.getString().toInt32());
         break;
         case NS_ooxml::LN_CT_AbstractNum_abstractNumId:
         {
@@ -733,7 +734,6 @@ void ListsManager::lcl_attribute( Id nName, Value& rVal )
                 pCurrentLvl->Insert(
                     PROP_FIRST_LINE_INDENT, uno::makeAny( ConversionHelper::convertTwipToMM100( nIntValue ) ));
         break;
-        case NS_ooxml::LN_CT_Lvl_ilvl: //overrides previous level - unsupported
         case NS_ooxml::LN_CT_Lvl_tplc: //template code - unsupported
         case NS_ooxml::LN_CT_Lvl_tentative: //marks level as unused in the document - unsupported
         break;
@@ -895,7 +895,6 @@ void ListsManager::lcl_sprm( Sprm& rSprm )
             break;
             case NS_ooxml::LN_CT_AbstractNum_lvl:
             {
-                m_pCurrentDefinition->AddLevel();
                 writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
                 if(pProperties)
                     pProperties->resolve(*this);
diff --git a/writerfilter/source/dmapper/NumberingManager.hxx b/writerfilter/source/dmapper/NumberingManager.hxx
index 6173f1431f0e..29f139082522 100644
--- a/writerfilter/source/dmapper/NumberingManager.hxx
+++ b/writerfilter/source/dmapper/NumberingManager.hxx
@@ -152,7 +152,7 @@ public:
 
     sal_Int16             Size( ) { return sal_Int16( m_aLevels.size( ) ); };
     ListLevel::Pointer    GetLevel( sal_uInt16 nLvl );
-    void                  AddLevel( );
+    void                  AddLevel( sal_uInt16 nLvl );
 
     const ListLevel::Pointer&  GetCurrentLevel( ) const { return m_pCurrentLevel; };
 


More information about the Libreoffice-commits mailing list