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.mohrh...@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 <c...@libreoffice.org> Reviewed-by: Markus Mohrhard <markus.mohrh...@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.mohrh...@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 <c...@libreoffice.org> Reviewed-by: Markus Mohrhard <markus.mohrh...@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); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits