aboutsummaryrefslogtreecommitdiff
path: root/src/xbel
diff options
context:
space:
mode:
Diffstat (limited to 'src/xbel')
-rw-r--r--src/xbel/xbel.cpp170
-rw-r--r--src/xbel/xbel.h51
2 files changed, 221 insertions, 0 deletions
diff --git a/src/xbel/xbel.cpp b/src/xbel/xbel.cpp
new file mode 100644
index 0000000..509be1f
--- /dev/null
+++ b/src/xbel/xbel.cpp
@@ -0,0 +1,170 @@
+/** LICENSE ********************************************************************
+ **
+ ** smolbote: yet another qute browser
+ ** Copyright (C) 2017 Xian Nox
+ **
+ ** This program is free software: you can redistribute it and/or modify
+ ** it under the terms of the GNU General Public License as published by
+ ** the Free Software Foundation, either version 3 of the License, or
+ ** (at your option) any later version.
+ **
+ ** This program is distributed in the hope that it will be useful,
+ ** but WITHOUT ANY WARRANTY; without even the implied warranty of
+ ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ ** GNU General Public License for more details.
+ **
+ ** You should have received a copy of the GNU General Public License
+ ** along with this program. If not, see <http://www.gnu.org/licenses/>.
+ **
+ ******************************************************************************/
+
+#include "xbel.h"
+#include <QFile>
+
+#include <QTreeWidgetItem>
+
+Xbel::Xbel(QTreeWidget *widget)
+{
+ treeWidget = widget;
+}
+
+bool Xbel::read(const QString &xbel)
+{
+ // no file specified
+ if(xbel.isEmpty()) {
+ return false;
+ }
+
+ QFile file(xbel);
+ if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
+ // file cannot be opened
+ qDebug("Cannot open xbel: %s", qUtf8Printable(xbel));
+ return false;
+ }
+
+ xmlReader.setDevice(&file);
+
+ if(xmlReader.readNextStartElement()) {
+ if(xmlReader.name() == "xbel" && xmlReader.attributes().value("version") == "1.0") {
+ qDebug("valid xbel");
+ readChildElements(0);
+ } else {
+ qDebug("invalid xbel");
+ return false;
+ }
+
+ }
+ return true;
+}
+
+bool Xbel::write(const QString &xbel)
+{
+ // no file specified
+ if(xbel.isEmpty()) {
+ return false;
+ }
+
+ QFile file(xbel);
+ if(!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
+ // file cannot be opened
+ qDebug("Cannot open xbel: %s", qUtf8Printable(xbel));
+ return false;
+ }
+
+ xmlWriter.setAutoFormatting(true);
+ xmlWriter.setDevice(&file);
+
+ xmlWriter.writeStartDocument();
+ xmlWriter.writeDTD("<!DOCTYPE xbel>");
+ xmlWriter.writeStartElement("xbel");
+ xmlWriter.writeAttribute("version", "1.0");
+
+ for(int i=0; i<treeWidget->topLevelItemCount(); i++) {
+ writeItem(treeWidget->topLevelItem(i));
+ }
+
+ xmlWriter.writeEndDocument();
+ return true;
+}
+
+void Xbel::readChildElements(QTreeWidgetItem *parentItem)
+{
+ while(xmlReader.readNextStartElement()) {
+ if(xmlReader.name() == "title") {
+ readTitle(parentItem);
+ } else if(xmlReader.name() == "folder") {
+ readFolder(parentItem);
+ } else if(xmlReader.name() == "bookmark") {
+ readBookmark(parentItem);
+ } else if(xmlReader.name() == "separator") {
+ readSeparator(parentItem);
+ } else {
+ xmlReader.skipCurrentElement();
+ }
+ }
+}
+
+void Xbel::readTitle(QTreeWidgetItem *item)
+{
+ item->setText(0, xmlReader.readElementText());
+}
+
+void Xbel::readFolder(QTreeWidgetItem *parentItem)
+{
+ QTreeWidgetItem *folderItem = createChildItem(parentItem);
+ folderItem->setExpanded(xmlReader.attributes().value("folded") != "no");
+
+ readChildElements(folderItem);
+}
+
+void Xbel::readBookmark(QTreeWidgetItem *parentItem)
+{
+ QTreeWidgetItem *bookmarkItem = createChildItem(parentItem);
+ bookmarkItem->setFlags(bookmarkItem->flags() | Qt::ItemIsEditable);
+ bookmarkItem->setText(0, "Unknown Title");
+ bookmarkItem->setText(1, xmlReader.attributes().value("href").toString());
+
+ readChildElements(bookmarkItem);
+}
+
+void Xbel::readSeparator(QTreeWidgetItem *parentItem)
+{
+ QTreeWidgetItem *separatorItem = createChildItem(parentItem);
+ separatorItem->setText(0, "-----");
+ xmlReader.skipCurrentElement();
+}
+
+QTreeWidgetItem *Xbel::createChildItem(QTreeWidgetItem *item)
+{
+ QTreeWidgetItem *childItem;
+ if(item) {
+ childItem = new QTreeWidgetItem(item);
+ } else {
+ childItem = new QTreeWidgetItem(treeWidget);
+ }
+ childItem->setData(0, Qt::UserRole, xmlReader.name().toString());
+ return childItem;
+}
+
+void Xbel::writeItem(QTreeWidgetItem *item)
+{
+ QString tagName = item->data(0, Qt::UserRole).toString();
+ if (tagName == "folder") {
+ xmlWriter.writeStartElement(tagName);
+ xmlWriter.writeAttribute("folded", treeWidget->isItemExpanded(item) ? "no" : "yes");
+ xmlWriter.writeTextElement("title", item->text(0));
+ for (int i = 0; i < item->childCount(); ++i) {
+ writeItem(item->child(i));
+ }
+ xmlWriter.writeEndElement();
+ } else if (tagName == "bookmark") {
+ xmlWriter.writeStartElement(tagName);
+ if (!item->text(1).isEmpty()) {
+ xmlWriter.writeAttribute("href", item->text(1));
+ }
+ xmlWriter.writeTextElement("title", item->text(0));
+ xmlWriter.writeEndElement();
+ } else if (tagName == "separator") {
+ xmlWriter.writeEmptyElement(tagName);
+ }
+}
diff --git a/src/xbel/xbel.h b/src/xbel/xbel.h
new file mode 100644
index 0000000..7f80eeb
--- /dev/null
+++ b/src/xbel/xbel.h
@@ -0,0 +1,51 @@
+/** LICENSE ********************************************************************
+ **
+ ** smolbote: yet another qute browser
+ ** Copyright (C) 2017 Xian Nox
+ **
+ ** This program is free software: you can redistribute it and/or modify
+ ** it under the terms of the GNU General Public License as published by
+ ** the Free Software Foundation, either version 3 of the License, or
+ ** (at your option) any later version.
+ **
+ ** This program is distributed in the hope that it will be useful,
+ ** but WITHOUT ANY WARRANTY; without even the implied warranty of
+ ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ ** GNU General Public License for more details.
+ **
+ ** You should have received a copy of the GNU General Public License
+ ** along with this program. If not, see <http://www.gnu.org/licenses/>.
+ **
+ ******************************************************************************/
+
+#ifndef XBELREADER_H
+#define XBELREADER_H
+
+#include <QXmlStreamReader>
+
+class QTreeWidget;
+class QTreeWidgetItem;
+class Xbel
+{
+public:
+ Xbel(QTreeWidget *widget);
+ bool read(const QString &xbel);
+ bool write(const QString &xbel);
+
+private:
+ void readChildElements(QTreeWidgetItem *parentItem);
+ void readTitle(QTreeWidgetItem *item);
+ void readFolder(QTreeWidgetItem *parentItem);
+ void readBookmark(QTreeWidgetItem *parentItem);
+ void readSeparator(QTreeWidgetItem *parentItem);
+
+ QTreeWidgetItem *createChildItem(QTreeWidgetItem *item);
+
+ void writeItem(QTreeWidgetItem *item);
+
+ QTreeWidget *treeWidget;
+ QXmlStreamReader xmlReader;
+ QXmlStreamWriter xmlWriter;
+};
+
+#endif // XBELREADER_H