diff options
author | Aqua-sama <aqua@iserlohn-fortress.net> | 2019-11-15 17:02:39 +0200 |
---|---|---|
committer | Aqua-sama <aqua@iserlohn-fortress.net> | 2019-11-15 17:02:39 +0200 |
commit | 6e89bf230725e59e71a3273bf8492ed0a2066716 (patch) | |
tree | 972e83be6577900b938768f68125e9e83bcad9ca /lib/bookmarks/formats | |
parent | Context menu: add actions for MediaTypeNone (diff) | |
download | smolbote-6e89bf230725e59e71a3273bf8492ed0a2066716.tar.xz |
Bookmarks: move xbel implementation to formats/
Diffstat (limited to 'lib/bookmarks/formats')
-rw-r--r-- | lib/bookmarks/formats/format.cpp | 26 | ||||
-rw-r--r-- | lib/bookmarks/formats/format.h | 36 | ||||
-rw-r--r-- | lib/bookmarks/formats/xbel.cpp | 110 | ||||
-rw-r--r-- | lib/bookmarks/formats/xbel.h | 20 |
4 files changed, 192 insertions, 0 deletions
diff --git a/lib/bookmarks/formats/format.cpp b/lib/bookmarks/formats/format.cpp new file mode 100644 index 0000000..551151c --- /dev/null +++ b/lib/bookmarks/formats/format.cpp @@ -0,0 +1,26 @@ +/* + * This file is part of smolbote. It's copyrighted by the contributors recorded + * in the version control history of the file, available from its original + * location: https://neueland.iserlohn-fortress.net/gitea/aqua/smolbote + * + * SPDX-License-Identifier: GPL-3.0 + */ + +#include "format.h" +#include "xbel.h" +#include <QIODevice> + +template<> +void BookmarksFormat<BookmarksFormats::XbelFormat>::read(BookmarkItem *root) +{ + Q_CHECK_PTR(m_device); + Xbel::read(m_device, root); +} + +template<> +void BookmarksFormat<BookmarksFormats::XbelFormat>::write(BookmarkItem *root) +{ + Q_CHECK_PTR(m_device); + Xbel::write(m_device, root); +} + diff --git a/lib/bookmarks/formats/format.h b/lib/bookmarks/formats/format.h new file mode 100644 index 0000000..e96dfcc --- /dev/null +++ b/lib/bookmarks/formats/format.h @@ -0,0 +1,36 @@ +/* + * This file is part of smolbote. It's copyrighted by the contributors recorded + * in the version control history of the file, available from its original + * location: https://neueland.iserlohn-fortress.net/gitea/aqua/smolbote + * + * SPDX-License-Identifier: GPL-3.0 + */ + +#ifndef BOOKMARKSFORMAT_H +#define BOOKMARKSFORMAT_H + +class QIODevice; +class BookmarkItem; + +enum BookmarksFormats { + XbelFormat +}; + +template<BookmarksFormats format> +class BookmarksFormat +{ +public: + explicit BookmarksFormat(QIODevice *device) + { + m_device = device; + } + + void read(BookmarkItem *root); + void write(BookmarkItem *root); + +protected: + QIODevice *m_device; +}; + +#endif // BOOKMARKSFORMAT_H + diff --git a/lib/bookmarks/formats/xbel.cpp b/lib/bookmarks/formats/xbel.cpp new file mode 100644 index 0000000..1cb5756 --- /dev/null +++ b/lib/bookmarks/formats/xbel.cpp @@ -0,0 +1,110 @@ +/* + * This file is part of smolbote. It's copyrighted by the contributors recorded + * in the version control history of the file, available from its original + * location: https://neueland.iserlohn-fortress.net/gitea/aqua/smolbote + * + * SPDX-License-Identifier: GPL-3.0 + */ + +#include "xbel.h" +#include "model/bookmarkitem.h" +#include <QXmlStreamReader> +#include <QXmlStreamWriter> + +inline void readChildElements(QXmlStreamReader &reader, BookmarkItem *parent) +{ + while(reader.readNextStartElement()) { + if(reader.name() == "title") { + parent->setData(BookmarkItem::Title, reader.readElementText()); + + } else if(reader.name() == "tags") { + parent->setData(BookmarkItem::Tags, reader.readElementText().split(";")); + + } else if(reader.name() == "description") { + parent->setData(BookmarkItem::Description, reader.readElementText()); + + } else if(reader.name() == "folder") { + auto *item = new BookmarkItem({}, BookmarkItem::Folder, parent); + item->setExpanded(!(reader.attributes().value("folded") == QLatin1Literal("yes"))); + parent->appendChild(item); + readChildElements(reader, item); + + } else if(reader.name() == "bookmark") { + auto *item = new BookmarkItem({}, BookmarkItem::Bookmark, parent); + item->setData(BookmarkItem::Href, reader.attributes().value("href").toString()); + parent->appendChild(item); + readChildElements(reader, item); + + } else { + reader.skipCurrentElement(); + } + } +} + +void Xbel::read(QIODevice *device, BookmarkItem *item) +{ + QXmlStreamReader qXmlStreamReader(device); + + if(qXmlStreamReader.readNextStartElement()) { + if(!(qXmlStreamReader.name() == "xbel" && qXmlStreamReader.attributes().value("version") == "1.0")) { + return; + } + + readChildElements(qXmlStreamReader, item); + } +} + +inline void writeChildElements(QXmlStreamWriter &writer, const BookmarkItem *item) +{ + switch(item->type()) { + case BookmarkItem::Root: + for(int i = 0; i < item->childCount(); ++i) { + writeChildElements(writer, item->child(i)); + } + break; + + case BookmarkItem::Folder: + writer.writeStartElement("folder"); + writer.writeAttribute("folded", !item->isExpanded() ? "yes" : "no"); + writer.writeTextElement("title", item->data(BookmarkItem::Title).toString()); + if(!item->data(BookmarkItem::Tags).isNull()) + writer.writeTextElement("tags", item->data(BookmarkItem::Tags).toStringList().join(";")); + if(!item->data(BookmarkItem::Description).isNull()) + writer.writeTextElement("description", item->data(BookmarkItem::Description).toString()); + + for(int i = 0; i < item->childCount(); ++i) { + writeChildElements(writer, item->child(i)); + } + + writer.writeEndElement(); + break; + + case BookmarkItem::Bookmark: + writer.writeStartElement("bookmark"); + writer.writeAttribute("href", item->data(BookmarkItem::Href).toString()); + writer.writeTextElement("title", item->data(BookmarkItem::Title).toString()); + if(!item->data(BookmarkItem::Tags).isNull()) + writer.writeTextElement("tags", item->data(BookmarkItem::Tags).toStringList().join(";")); + if(!item->data(BookmarkItem::Description).isNull()) + writer.writeTextElement("description", item->data(BookmarkItem::Description).toString()); + + writer.writeEndElement(); + break; + } +} + +void Xbel::write(QIODevice *device, const BookmarkItem *item) +{ + QXmlStreamWriter xmlWriter(device); + xmlWriter.setAutoFormatting(true); + + xmlWriter.writeStartDocument(); + xmlWriter.writeDTD("<!DOCTYPE xbel>"); + + xmlWriter.writeStartElement("xbel"); + xmlWriter.writeAttribute("version", "1.0"); + + writeChildElements(xmlWriter, item); + + xmlWriter.writeEndDocument(); +} diff --git a/lib/bookmarks/formats/xbel.h b/lib/bookmarks/formats/xbel.h new file mode 100644 index 0000000..44a65bb --- /dev/null +++ b/lib/bookmarks/formats/xbel.h @@ -0,0 +1,20 @@ +/* + * This file is part of smolbote. It's copyrighted by the contributors recorded + * in the version control history of the file, available from its original + * location: https://neueland.iserlohn-fortress.net/gitea/aqua/smolbote + * + * SPDX-License-Identifier: GPL-3.0 + */ + +#ifndef XBEL_H +#define XBEL_H + +class QIODevice; +class BookmarkItem; +namespace Xbel +{ +void read(QIODevice *device, BookmarkItem *item); +void write(QIODevice *device, const BookmarkItem *item); +} + +#endif // XBEL_H |