/* * 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/smolbote.hg * * SPDX-License-Identifier: GPL-3.0 */ #include "xbel.h" #include Xbel::Xbel(QIODevice *file) { Q_CHECK_PTR(file); m_file = file; } bool Xbel::read(BookmarkItem *root) { QXmlStreamReader xmlReader(m_file); if(xmlReader.readNextStartElement()) { if(!(xmlReader.name() == "xbel" && xmlReader.attributes().value("version") == "1.0")) { return false; } readChildElements(xmlReader, root); } return true; } void Xbel::readChildElements(QXmlStreamReader &reader, BookmarkItem *parentItem) { while(reader.readNextStartElement()) { if(reader.name() == "title") { parentItem->title = reader.readElementText(); } else if(reader.name() == "folder") { BookmarkItem *item = new BookmarkItem(BookmarkItem::Folder, parentItem); item->folded = reader.attributes().value("folded") == QLatin1String("yes"); readChildElements(reader, item); } else if(reader.name() == "bookmark") { BookmarkItem *item = new BookmarkItem(BookmarkItem::Bookmark, parentItem); item->href = reader.attributes().value("href").toString(); readChildElements(reader, item); } else { reader.skipCurrentElement(); } } } bool Xbel::write(BookmarkItem *root) { QXmlStreamWriter xmlWriter(m_file); xmlWriter.setAutoFormatting(true); xmlWriter.writeStartDocument(); xmlWriter.writeDTD(""); xmlWriter.writeStartElement("xbel"); xmlWriter.writeAttribute("version", "1.0"); writeChildElements(xmlWriter, root); xmlWriter.writeEndDocument(); return true; } void Xbel::writeChildElements(QXmlStreamWriter &writer, BookmarkItem *parentItem) { switch(parentItem->type()) { case BookmarkItem::Root: for(int i = 0; i < parentItem->childCount(); ++i) { writeChildElements(writer, parentItem->child(i)); } break; case BookmarkItem::Folder: writer.writeStartElement("folder"); writer.writeAttribute("folded", parentItem->folded ? "yes" : "no"); writer.writeTextElement("title", parentItem->title); for(int i = 0; i < parentItem->childCount(); ++i) { writeChildElements(writer, parentItem->child(i)); } writer.writeEndElement(); break; case BookmarkItem::Bookmark: writer.writeStartElement("bookmark"); writer.writeAttribute("href", parentItem->href); writer.writeTextElement("title", parentItem->title); writer.writeEndElement(); break; } }