11#include "modelmaker.h"
18#include <documentsource.h>
20#include <QDomDocument>
21#include <QDomNodeList>
32class SYNDICATION_NO_EXPORT Parser::ParserPrivate
36 void map09to10(Model model);
37 void addSequenceFor09(Model model);
43bool Parser::accept(
const DocumentSource &source)
const
56 return root.
namespaceURI() == RDFVocab::self()->namespaceURI();
59SpecificDocumentPtr Parser::parse(
const DocumentSource &source)
const
64 return Syndication::SpecificDocumentPtr(
new Document());
67 doc = d->addEnumeration(doc);
70 Model model = maker.createFromXML(doc);
72 bool is09 = !model.resourcesWithType(RSS09Vocab::self()->channel()).isEmpty();
76 d->addSequenceFor09(model);
82 return Syndication::SpecificDocumentPtr(
new Document());
94 for (
int i = 0; i <
list.
size(); ++i) {
106void Parser::ParserPrivate::map09to10(Model model)
110 hash.
insert(RSS09Vocab::self()->title()->uri(), RSSVocab::self()->title());
111 hash.
insert(RSS09Vocab::self()->description()->uri(), RSSVocab::self()->description());
112 hash.
insert(RSS09Vocab::self()->
link()->uri(), RSSVocab::self()->
link());
113 hash.
insert(RSS09Vocab::self()->
name()->uri(), RSSVocab::self()->
name());
114 hash.
insert(RSS09Vocab::self()->url()->uri(), RSSVocab::self()->url());
115 hash.
insert(RSS09Vocab::self()->image()->uri(), RSSVocab::self()->image());
116 hash.
insert(RSS09Vocab::self()->textinput()->uri(), RSSVocab::self()->textinput());
118 QStringList uris09 = RSS09Vocab::self()->properties();
124 for (
const auto &stmt : statements) {
125 const QString predUri = stmt->predicate()->uri();
127 model.addStatement(stmt->subject(), hash[predUri], stmt->object());
136 channel = *(channels.
begin());
138 model.removeStatement(channel, RDFVocab::self()->type(), RSS09Vocab::self()->channel());
139 model.addStatement(channel, RDFVocab::self()->type(), RSSVocab::self()->channel());
143void Parser::ParserPrivate::addSequenceFor09(Model model)
153 const QList<ResourcePtr> channels = model.resourcesWithType(RSSVocab::self()->channel());
159 PropertyPtr itemIndex = model.createProperty(strInternalNs + strItemIndex);
164 for (
const ResourcePtr &i : items) {
165 QString numstr = i->property(itemIndex)->asString();
167 uint num = numstr.
toUInt(&ok);
173 SequencePtr seq = model.createSequence();
174 model.addStatement(channels.
first(), RSSVocab::self()->items(), seq);
176 for (
const ResourcePtr &i :
std::as_const(sorted)) {
179 model.addStatement(i, RDFVocab::self()->
type(), RSSVocab::self()->item());
182 model.addStatement(seq, RDFVocab::self()->li(), i);
187 : d(new ParserPrivate)
189 d->strInternalNs = QStringLiteral(
"http://akregator.sf.net/libsyndication/internal#");
190 d->strItemIndex = QStringLiteral(
"itemIndex");
193Parser::~Parser() =
default;
195Parser::Parser(
const Parser &other)
196 : AbstractParser(other)
200Parser &Parser::operator=(
const Parser & )
207 return QStringLiteral(
"rdf");
Type type(const QSqlDatabase &db)
KIOCORE_EXPORT CopyJob * link(const QList< QUrl > &src, const QUrl &destDir, JobFlags flags=DefaultFlags)
KIOCORE_EXPORT QStringList list(const QString &fileClass)
QString name(StandardShortcut id)
QDomElement createElementNS(const QString &nsURI, const QString &qName)
QDomText createTextNode(const QString &value)
QDomElement documentElement() const const
QDomNodeList elementsByTagNameNS(const QString &nsURI, const QString &localName)
QDomNode appendChild(const QDomNode &newChild)
bool isElement() const const
bool isNull() const const
QString namespaceURI() const const
iterator insert(const Key &key, const T &value)
bool isEmpty() const const
qsizetype size() const const
QString number(double n, char format, int precision)
uint toUInt(bool *ok, int base) const const
bool contains(QLatin1StringView str, Qt::CaseSensitivity cs) const const