From 6e89bf230725e59e71a3273bf8492ed0a2066716 Mon Sep 17 00:00:00 2001 From: Aqua-sama Date: Fri, 15 Nov 2019 17:02:39 +0200 Subject: Bookmarks: move xbel implementation to formats/ --- lib/bookmarks/formats/xbel.cpp | 110 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 lib/bookmarks/formats/xbel.cpp (limited to 'lib/bookmarks/formats/xbel.cpp') 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 +#include + +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(""); + + xmlWriter.writeStartElement("xbel"); + xmlWriter.writeAttribute("version", "1.0"); + + writeChildElements(xmlWriter, item); + + xmlWriter.writeEndDocument(); +} -- cgit v1.2.1