23 #include <rss2/item.h>
24 #include <rss2/category.h>
25 #include <rss2/enclosure.h>
26 #include <rss2/source.h>
27 #include <rss2/tools_p.h>
28 #include <constants.h>
29 #include <specificitem.h>
30 #include <specificitemvisitor.h>
33 #include <QtXml/QDomElement>
34 #include <QtCore/QString>
35 #include <QtCore/QList>
37 namespace Syndication {
40 class Item::ItemPrivate
44 boost::shared_ptr<Document> doc;
47 Item::Item(boost::shared_ptr<Document> doc) : ElementWrapper(), d(new ItemPrivate)
52 Item::Item(
const QDomElement& element, boost::shared_ptr<Document> doc) : ElementWrapper(element), d(new ItemPrivate)
68 ElementWrapper::operator=(other);
69 SpecificItem::operator=(other);
77 return originalTitle();
80 bool containsMarkup =
false;
81 d->doc->getItemTitleFormatInfo(&isCDATA, &containsMarkup);
83 return normalize(originalTitle(), isCDATA, containsMarkup);
87 QString Item::originalDescription()
const
89 return extractElementTextNS(QString(), QLatin1String(
"description"));
92 QString Item::originalTitle()
const
94 return extractElementTextNS(QString(), QLatin1String(
"title"));
99 QString url = extractElementTextNS(QString(), QLatin1String(
"link") );
100 if (url.startsWith(QLatin1String(
"http://")) || url.startsWith(QLatin1String(
"https://"))) {
106 if (d->doc->link().isEmpty()) {
111 QString baseUrl = d->doc->link();
112 if (url.startsWith(QLatin1Char(
'/')) || baseUrl.endsWith(QLatin1Char(
'/'))) {
113 return baseUrl + url;
115 return baseUrl + QLatin1Char(
'/') + url;
122 return originalDescription();
124 bool isCDATA =
false;
125 bool containsMarkup =
false;
126 d->doc->getItemDescriptionFormatInfo(&isCDATA, &containsMarkup);
128 return normalize(originalDescription(), isCDATA, containsMarkup);
139 QList<QDomElement> cats = elementsByTagNameNS(QString(),
140 QLatin1String(
"category"));
144 QList<QDomElement>::ConstIterator it = cats.constBegin();
145 for ( ; it != cats.constEnd(); ++it)
154 return extractElementTextNS(QString(), QLatin1String(
"comments") );
159 QString a = extractElementTextNS(QString(), QLatin1String(
"author") );
167 return extractElementTextNS(dublinCoreNamespace(),
168 QLatin1String(
"creator") );
175 QList<QDomElement> encs = elementsByTagNameNS(QString(),
176 QLatin1String(
"enclosure"));
180 QList<QDomElement>::ConstIterator it = encs.constBegin();
181 for ( ; it != encs.constEnd(); ++it)
190 return extractElementTextNS(QString(), QLatin1String(
"guid") );
197 QDomElement guidNode = firstElementByTagNameNS(QString(),
198 QLatin1String(
"guid"));
199 if (!guidNode.isNull())
201 if (guidNode.attribute(QLatin1String(
"isPermaLink"))
202 == QLatin1String(
"false"))
204 guidIsPermaLink =
false;
213 QString str = extractElementTextNS(QString(), QLatin1String(
"pubDate"));
217 return parseDate(str, RFCDate);
221 str = extractElementTextNS(dublinCoreNamespace(), QLatin1String(
"date"));
222 return parseDate(str, ISODate);
227 QString str = extractElementTextNS(QString(), QLatin1String(
"expirationDate"));
228 return parseDate(str, RFCDate);
233 return Source(firstElementByTagNameNS(QString(), QLatin1String(
"source")));
238 return extractElementTextNS(QString(), QLatin1String(
"rating") );
244 info += QLatin1String(
"### Item: ###################\n");
245 if (!
title().isNull())
246 info += QLatin1String(
"title: #") +
title() + QLatin1String(
"#\n");
247 if (!
link().isNull())
248 info += QLatin1String(
"link: #") +
link() + QLatin1String(
"#\n");
250 info += QLatin1String(
"description: #") +
description() + QLatin1String(
"#\n");
252 info += QLatin1String(
"content: #") +
content() + QLatin1String(
"#\n");
254 info += QLatin1String(
"author: #") +
author() + QLatin1String(
"#\n");
256 info += QLatin1String(
"comments: #") +
comments() + QLatin1String(
"#\n");
257 QString dpubdate = dateTimeToString(
pubDate());
258 if (!dpubdate.isNull())
259 info += QLatin1String(
"pubDate: #") + dpubdate + QLatin1String(
"#\n");
260 if (!
guid().isNull())
261 info += QLatin1String(
"guid: #") +
guid() + QLatin1String(
"#\n");
263 info += QLatin1String(
"guid is PL: #true#\n");
268 for (QList<Category>::ConstIterator it = cats.constBegin(); it != cats.constEnd(); ++it)
269 info += (*it).debugInfo();
271 for (QList<Enclosure>::ConstIterator it = encs.constBegin(); it != encs.constEnd(); ++it)
272 info += (*it).debugInfo();
274 info += QLatin1String(
"### Item end ################\n");
281 QList<ElementType> handled;
282 handled.append(ElementType(QLatin1String(
"title")));
283 handled.append(ElementType(QLatin1String(
"link")));
284 handled.append(ElementType(QLatin1String(
"description")));
285 handled.append(ElementType(QLatin1String(
"pubDate")));
286 handled.append(ElementType(QLatin1String(
"expirationDate")));
287 handled.append(ElementType(QLatin1String(
"rating")));
288 handled.append(ElementType(QLatin1String(
"source")));
289 handled.append(ElementType(QLatin1String(
"guid")));
290 handled.append(ElementType(QLatin1String(
"comments")));
291 handled.append(ElementType(QLatin1String(
"author")));
292 handled.append(ElementType(QLatin1String(
"date"), dublinCoreNamespace()));
294 QList<QDomElement> notHandled;
296 QDomNodeList children = element().childNodes();
297 for (
int i = 0; i < children.size(); ++i)
299 QDomElement el = children.at(i).toElement();
301 && !handled.contains(ElementType(el.localName(), el.namespaceURI())))
303 notHandled.append(el);
312 return visitor->visitRSS2Item(
this);