[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