summaryrefslogtreecommitdiff
path: root/chart2
diff options
context:
space:
mode:
authorTünde Tóth <toth.tunde@nisz.hu>2021-06-04 13:10:51 +0200
committerAndras Timar <andras.timar@collabora.com>2021-06-14 08:08:30 +0200
commitc780bfeb662fee6bf46457ba19524d9c0f75b971 (patch)
treee682dbbbb39786499e5d3b7f0527346613a7ad64 /chart2
parent5b3455612266388cc269ed189a720c79ca35c02f (diff)
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 <nemeth@numbertext.org> Reviewed-by: László Németh <nemeth@numbertext.org> Signed-off-by: Xisco Fauli <xiscofauli@libreoffice.org> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/116998 Tested-by: Jenkins
Diffstat (limited to 'chart2')
-rw-r--r--chart2/qa/extras/chart2import.cxx22
-rw-r--r--chart2/qa/extras/data/docx/tdf139658.docxbin0 -> 27488 bytes
-rw-r--r--chart2/source/tools/InternalDataProvider.cxx12
3 files changed, 32 insertions, 2 deletions
diff --git a/chart2/qa/extras/chart2import.cxx b/chart2/qa/extras/chart2import.cxx
index fe9ebb5bc502..b3b5a3921d3a 100644
--- a/chart2/qa/extras/chart2import.cxx
+++ b/chart2/qa/extras/chart2import.cxx
@@ -174,6 +174,7 @@ public:
void testTdf137734();
void testTdf137874();
void testTdfCustomShapePos();
+ void testTdf139658();
CPPUNIT_TEST_SUITE(Chart2ImportTest);
CPPUNIT_TEST(Fdo60083);
@@ -295,6 +296,7 @@ public:
CPPUNIT_TEST(testTdf137734);
CPPUNIT_TEST(testTdf137874);
CPPUNIT_TEST(testTdfCustomShapePos);
+ CPPUNIT_TEST(testTdf139658);
CPPUNIT_TEST_SUITE_END();
@@ -2845,6 +2847,26 @@ void Chart2ImportTest::testTdfCustomShapePos()
}
}
+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
--- /dev/null
+++ b/chart2/qa/extras/data/docx/tdf139658.docx
Binary files differ
diff --git a/chart2/source/tools/InternalDataProvider.cxx b/chart2/source/tools/InternalDataProvider.cxx
index c1d0008098ab..415f08ac3ea9 100644
--- a/chart2/source/tools/InternalDataProvider.cxx
+++ b/chart2/source/tools/InternalDataProvider.cxx
@@ -518,7 +518,14 @@ InternalDataProvider::createDataSequenceFromArray( const OUString& rArrayStr, co
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, co
// 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();