[Libreoffice-commits] core.git: 2 commits - sc/Library_sc.mk sc/source
Markus Mohrhard
markus.mohrhard at googlemail.com
Mon Aug 14 20:10:10 UTC 2017
sc/Library_sc.mk | 1
sc/source/ui/dataprovider/dataprovider.cxx | 12 ++++
sc/source/ui/dataprovider/datatransformation.cxx | 36 +++++++++++++
sc/source/ui/dataprovider/datatransformation.hxx | 43 +++++++++++++++
sc/source/ui/dataprovider/htmldataprovider.cxx | 63 ++++++++++++++++++-----
sc/source/ui/inc/dataprovider.hxx | 10 +++
6 files changed, 152 insertions(+), 13 deletions(-)
New commits:
commit b0080a8c69f1ff1fd19a0c735012a2037569b8f1
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date: Mon Aug 14 16:46:40 2017 +0200
external data: add initial work for data transformations
Change-Id: I728ca764a2ea2926f8b8f76ea576b8be1091a29a
Reviewed-on: https://gerrit.libreoffice.org/41146
Tested-by: Jenkins <ci at libreoffice.org>
Reviewed-by: Markus Mohrhard <markus.mohrhard at googlemail.com>
diff --git a/sc/Library_sc.mk b/sc/Library_sc.mk
index 8df21d883a2b..849beeb3dad6 100644
--- a/sc/Library_sc.mk
+++ b/sc/Library_sc.mk
@@ -385,6 +385,7 @@ $(eval $(call gb_Library_add_exception_objects,sc,\
sc/source/ui/condformat/colorformat \
sc/source/ui/dataprovider/csvdataprovider \
sc/source/ui/dataprovider/dataprovider \
+ sc/source/ui/dataprovider/datatransformation \
sc/source/ui/dataprovider/htmldataprovider \
sc/source/ui/dbgui/asciiopt \
sc/source/ui/dbgui/consdlg \
diff --git a/sc/source/ui/dataprovider/dataprovider.cxx b/sc/source/ui/dataprovider/dataprovider.cxx
index 57893197fdc3..4efc255be20d 100644
--- a/sc/source/ui/dataprovider/dataprovider.cxx
+++ b/sc/source/ui/dataprovider/dataprovider.cxx
@@ -15,6 +15,7 @@
#include <rtl/strbuf.hxx>
#include "htmldataprovider.hxx"
+#include "datatransformation.hxx"
using namespace com::sun::star;
@@ -175,6 +176,12 @@ DataProvider::~DataProvider()
void ScDBDataManager::WriteToDoc(ScDocument& rDoc)
{
+ // first apply all data transformations
+ for (auto& itr : maDataTransformations)
+ {
+ itr->Transform(rDoc);
+ }
+
bool bShrunk = false;
SCCOL nStartCol = 0;
SCROW nStartRow = 0;
@@ -215,6 +222,11 @@ void ScDBDataManager::SetDatabase(const OUString& rDBName)
maDBName = rDBName;
}
+void ScDBDataManager::AddDataTransformation(std::unique_ptr<sc::DataTransformation> mpDataTransformation)
+{
+ maDataTransformations.push_back(std::move(mpDataTransformation));
+}
+
ScDBData* ScDBDataManager::getDBData()
{
ScDBData* pDBData = mpDoc->GetDBCollection()->getNamedDBs().findByUpperName(ScGlobal::pCharClass->uppercase(maDBName));
diff --git a/sc/source/ui/dataprovider/datatransformation.cxx b/sc/source/ui/dataprovider/datatransformation.cxx
new file mode 100644
index 000000000000..5c581782e220
--- /dev/null
+++ b/sc/source/ui/dataprovider/datatransformation.cxx
@@ -0,0 +1,36 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "datatransformation.hxx"
+
+#include "document.hxx"
+
+namespace sc {
+
+DataTransformation::~DataTransformation()
+{
+}
+
+ColumnRemoveTransformation::ColumnRemoveTransformation(SCCOL nCol):
+ mnCol(nCol)
+{
+}
+
+ColumnRemoveTransformation::~ColumnRemoveTransformation()
+{
+}
+
+void ColumnRemoveTransformation::Transform(ScDocument& rDoc)
+{
+ rDoc.DeleteCol(0, 0, MAXROW, 0, mnCol, 1);
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/source/ui/dataprovider/datatransformation.hxx b/sc/source/ui/dataprovider/datatransformation.hxx
new file mode 100644
index 000000000000..cbe181aa921d
--- /dev/null
+++ b/sc/source/ui/dataprovider/datatransformation.hxx
@@ -0,0 +1,43 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_SC_SOURCE_UI_DATAPROVIDER_DATATRANSFORMATION_HXX
+#define INCLUDED_SC_SOURCE_UI_DATAPROVIDER_DATATRANSFORMATION_HXX
+
+#include <address.hxx>
+
+class ScDocument;
+
+namespace sc {
+
+class DataTransformation
+{
+public:
+ virtual ~DataTransformation();
+
+ virtual void Transform(ScDocument& rDoc) = 0;
+};
+
+class ColumnRemoveTransformation : public DataTransformation
+{
+ SCCOL mnCol;
+
+public:
+
+ ColumnRemoveTransformation(SCCOL nCol);
+ virtual ~ColumnRemoveTransformation() override;
+
+ virtual void Transform(ScDocument& rDoc) override;
+};
+
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/source/ui/inc/dataprovider.hxx b/sc/source/ui/inc/dataprovider.hxx
index c45adc9616a1..bd5561e382c8 100644
--- a/sc/source/ui/inc/dataprovider.hxx
+++ b/sc/source/ui/inc/dataprovider.hxx
@@ -28,6 +28,7 @@
#include <rtl/strbuf.hxx>
#include <queue>
+#include <vector>
#include "officecfg/Office/Calc.hxx"
@@ -44,6 +45,7 @@ namespace sc {
class DataProvider;
class CSVDataProvider;
class ScDBDataManager;
+class DataTransformation;
class CSVFetchThread : public salhelper::Thread
{
@@ -84,7 +86,8 @@ protected:
public:
DataProvider();
- virtual ~DataProvider() = 0;
+
+ virtual ~DataProvider();
virtual void Import() = 0;
@@ -131,12 +134,16 @@ class ScDBDataManager
OUString maDBName;
ScDocument* mpDoc;
+ std::vector<std::unique_ptr<sc::DataTransformation>> maDataTransformations;
+
public:
ScDBDataManager(const OUString& rDBName, bool bAllowResize, ScDocument* pDoc);
~ScDBDataManager();
void SetDatabase(const OUString& rDBName);
+ void AddDataTransformation(std::unique_ptr<sc::DataTransformation> mpDataTransformation);
+
ScDBData* getDBData();
void WriteToDoc(ScDocument& rDoc);
@@ -156,5 +163,6 @@ public:
};
}
+
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
commit 9f9f0fafe0549f4073b1fcc493f1614c2f3631e0
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date: Mon Aug 14 13:39:50 2017 +0200
external data: handle child elements of td correctly in html provider
Change-Id: Id4451c13931eaf52adebca13fd237ba6d73a880c
Reviewed-on: https://gerrit.libreoffice.org/41145
Tested-by: Jenkins <ci at libreoffice.org>
Reviewed-by: Markus Mohrhard <markus.mohrhard at googlemail.com>
diff --git a/sc/source/ui/dataprovider/htmldataprovider.cxx b/sc/source/ui/dataprovider/htmldataprovider.cxx
index c73efee0260c..4353d59e0364 100644
--- a/sc/source/ui/dataprovider/htmldataprovider.cxx
+++ b/sc/source/ui/dataprovider/htmldataprovider.cxx
@@ -55,29 +55,65 @@ OString toString(const xmlChar* pStr)
return OString(reinterpret_cast<const char*>(pStr), xmlStrlen(pStr));
}
+OUString trim_string(const OUString& aStr)
+{
+ OUString aOldString;
+ OUString aString = aStr;
+ do
+ {
+ aOldString = aString;
+ aString = comphelper::string::strip(aString, ' ');
+ aString = comphelper::string::strip(aString, '\n');
+ aString = comphelper::string::strip(aString, '\r');
+ aString = comphelper::string::strip(aString, '\t');
+ }
+ while (aOldString != aString);
+
+ return aString;
+}
+
+OUString get_node_str(xmlNodePtr pNode)
+{
+ OUStringBuffer aStr;
+ for (xmlNodePtr cur_node = pNode->children; cur_node; cur_node = cur_node->next)
+ {
+ if (cur_node->type == XML_TEXT_NODE)
+ {
+ OUString aString = OStringToOUString(toString(cur_node->content), RTL_TEXTENCODING_UTF8);
+ aStr.append(trim_string(aString));
+ }
+ else if (cur_node->type == XML_ELEMENT_NODE)
+ {
+ aStr.append(get_node_str(cur_node));
+ }
+ }
+
+ return aStr.makeStringAndClear();
+}
+
}
void HTMLFetchThread::handleCell(xmlNodePtr pCellNode, SCROW nRow, SCCOL nCol)
{
+ OUStringBuffer aStr;
for (xmlNodePtr cur_node = pCellNode->children; cur_node; cur_node = cur_node->next)
{
if (cur_node->type == XML_TEXT_NODE)
{
OUString aString = OStringToOUString(toString(cur_node->content), RTL_TEXTENCODING_UTF8);
- OUString aOldString;
- do
- {
- aOldString = aString;
- aString = comphelper::string::strip(aString, ' ');
- aString = comphelper::string::strip(aString, '\n');
- aString = comphelper::string::strip(aString, '\r');
- aString = comphelper::string::strip(aString, '\t');
- }
- while (aOldString != aString);
-
- mrDocument.SetString(nCol, nRow, 0, aString);
+ aStr.append(trim_string(aString));
+ }
+ else if (cur_node->type == XML_ELEMENT_NODE)
+ {
+ aStr.append(get_node_str(cur_node));
}
}
+
+ if (!aStr.isEmpty())
+ {
+ OUString aCellStr = aStr.makeStringAndClear();
+ mrDocument.SetString(nCol, nRow, 0, aCellStr);
+ }
}
void HTMLFetchThread::handleRow(xmlNodePtr pRowNode, SCROW nRow)
@@ -140,6 +176,9 @@ void HTMLFetchThread::execute()
OStringBuffer aBuffer(64000);
std::unique_ptr<SvStream> pStream = DataProvider::FetchStreamFromURL(maURL, aBuffer);
+ if (aBuffer.isEmpty())
+ return;
+
htmlDocPtr pHtmlPtr = htmlParseDoc(reinterpret_cast<xmlChar*>(const_cast<char*>(aBuffer.getStr())), nullptr);
OString aID = OUStringToOString(maID, RTL_TEXTENCODING_UTF8);
More information about the Libreoffice-commits
mailing list