chart2/qa/extras/chart2import.cxx            |   22 ++++++++++++++++++++++
 chart2/qa/extras/data/docx/tdf139658.docx    |binary
 chart2/source/tools/InternalDataProvider.cxx |   12 ++++++++++--
 3 files changed, 32 insertions(+), 2 deletions(-)

New commits:
commit c9f071ff49bace0809d3a55d4d4b76a26d933f9c
Author:     Tünde Tóth <toth.tu...@nisz.hu>
AuthorDate: Fri Jun 4 13:10:51 2021 +0200
Commit:     László Németh <nem...@numbertext.org>
CommitDate: Thu Jun 10 15:04:50 2021 +0200

    tdf#139658 OOXML: fix broken chart import at labels with quotes
    
    During the import of the internal data table, incomplete
    parsing of category labels with escaped quotation marks
    resulted broken category labels and charts.
    
    Change-Id: If5af3d527b80d1e055562f589bdaf17096ad49f3
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/116714
    Tested-by: László Németh <nem...@numbertext.org>
    Reviewed-by: László Németh <nem...@numbertext.org>

diff --git a/chart2/qa/extras/chart2import.cxx 
b/chart2/qa/extras/chart2import.cxx
index 3a8b77f48cdd..0c142a4e7f97 100644
--- a/chart2/qa/extras/chart2import.cxx
+++ b/chart2/qa/extras/chart2import.cxx
@@ -174,6 +174,7 @@ public:
     void testTdf137874();
     void testTdfCustomShapePos();
     void testTdf121281();
+    void testTdf139658();
 
     CPPUNIT_TEST_SUITE(Chart2ImportTest);
     CPPUNIT_TEST(Fdo60083);
@@ -297,6 +298,7 @@ public:
     CPPUNIT_TEST(testTdf137874);
     CPPUNIT_TEST(testTdfCustomShapePos);
     CPPUNIT_TEST(testTdf121281);
+    CPPUNIT_TEST(testTdf139658);
 
     CPPUNIT_TEST_SUITE_END();
 
@@ -2895,6 +2897,26 @@ void Chart2ImportTest::testTdf121281()
     CPPUNIT_ASSERT_GREATEREQUAL(static_cast<sal_Int32>(0), aLabelPosition.Y);
 }
 
+void Chart2ImportTest::testTdf139658()
+{
+    load(u"/chart2/qa/extras/data/docx/", "tdf139658.docx");
+    uno::Reference<chart2::XChartDocument> xChartDoc(getChartDocFromWriter(0), 
uno::UNO_QUERY);
+    CPPUNIT_ASSERT(xChartDoc.is());
+    Reference<chart2::XInternalDataProvider> 
xInternalProvider(xChartDoc->getDataProvider(),
+                                                               uno::UNO_QUERY);
+    CPPUNIT_ASSERT(xInternalProvider.is());
+
+    Reference<chart::XComplexDescriptionAccess> xDescAccess(xInternalProvider, 
uno::UNO_QUERY);
+    CPPUNIT_ASSERT(xDescAccess.is());
+
+    // Get the category labels.
+    Sequence<OUString> aCategories = xDescAccess->getRowDescriptions();
+    CPPUNIT_ASSERT_EQUAL(sal_Int32(3), aCategories.getLength());
+    CPPUNIT_ASSERT_EQUAL(OUString("category1"), aCategories[0]);
+    CPPUNIT_ASSERT_EQUAL(OUString("\"category2\""), aCategories[1]);
+    CPPUNIT_ASSERT_EQUAL(OUString("category\"3"), aCategories[2]);
+}
+
 CPPUNIT_TEST_SUITE_REGISTRATION(Chart2ImportTest);
 
 CPPUNIT_PLUGIN_IMPLEMENT();
diff --git a/chart2/qa/extras/data/docx/tdf139658.docx 
b/chart2/qa/extras/data/docx/tdf139658.docx
new file mode 100644
index 000000000000..59deda9f83f9
Binary files /dev/null and b/chart2/qa/extras/data/docx/tdf139658.docx differ
diff --git a/chart2/source/tools/InternalDataProvider.cxx 
b/chart2/source/tools/InternalDataProvider.cxx
index 1b2f6ae28351..9595cf2375d7 100644
--- a/chart2/source/tools/InternalDataProvider.cxx
+++ b/chart2/source/tools/InternalDataProvider.cxx
@@ -518,7 +518,14 @@ InternalDataProvider::createDataSequenceFromArray( const 
OUString& rArrayStr, st
     bool bInQuote = false;
     for (; p != pEnd; ++p)
     {
-        if (*p == '"')
+        // Skip next "" within the title text: it's an escaped double 
quotation mark.
+        if (bInQuote && *p == '"' && *(p + 1) == '"')
+        {
+            if (!pElem)
+                pElem = p;
+            ++p;
+        }
+        else if (*p == '"')
         {
             bInQuote = !bInQuote;
             if (bInQuote)
@@ -534,7 +541,8 @@ InternalDataProvider::createDataSequenceFromArray( const 
OUString& rArrayStr, st
                 // Non empty string
                 if (!aElem.isEmpty())
                     bAllNumeric = false;
-                aRawElems.push_back(aElem);
+                // Restore also escaped double quotation marks
+                aRawElems.push_back(aElem.replaceAll("\"\"", "\""));
                 pElem = nullptr;
                 aElem.clear();
 
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to