24#include <rss2/category.h>
25#include <rss2/enclosure.h>
26#include <rss2/source.h>
27#include <rss2/tools_p.h>
29#include <specificitem.h>
30#include <specificitemvisitor.h>
33#include <QtXml/QDomElement>
34#include <QtCore/QString>
35#include <QtCore/QList>
37namespace Syndication {
40class Item::ItemPrivate
44 boost::shared_ptr<Document> doc;
47Item::Item(boost::shared_ptr<Document> doc) : ElementWrapper(), d(new ItemPrivate)
52Item::Item(
const QDomElement& element, boost::shared_ptr<Document> doc) : ElementWrapper(element), d(new ItemPrivate)
61Item::Item(
const Item& other) : ElementWrapper(other), SpecificItem(other)
66Item& Item::operator=(
const Item& other)
68 ElementWrapper::operator=(other);
69 SpecificItem::operator=(other);
74QString Item::title()
const
77 return originalTitle();
80 bool containsMarkup =
false;
81 d->doc->getItemTitleFormatInfo(&isCDATA, &containsMarkup);
83 return normalize(originalTitle(), isCDATA, containsMarkup);
87QString Item::originalDescription()
const
89 return extractElementTextNS(QString(), QLatin1String(
"description"));
92QString Item::originalTitle()
const
94 return extractElementTextNS(QString(), QLatin1String(
"title"));
97QString Item::link()
const
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;
119QString Item::description()
const
122 return originalDescription();
124 bool isCDATA =
false;
125 bool containsMarkup =
false;
126 d->doc->getItemDescriptionFormatInfo(&isCDATA, &containsMarkup);
128 return normalize(originalDescription(), isCDATA, containsMarkup);
131QString Item::content()
const
137QList<Category> Item::categories()
const
139 QList<QDomElement> cats = elementsByTagNameNS(QString(),
140 QLatin1String(
"category"));
142 QList<Category> categories;
144 QList<QDomElement>::ConstIterator it = cats.constBegin();
145 for ( ; it != cats.constEnd(); ++it)
147 categories.append(Category(*it));
152QString Item::comments()
const
154 return extractElementTextNS(QString(), QLatin1String(
"comments") );
157QString Item::author()
const
159 QString a = extractElementTextNS(QString(), QLatin1String(
"author") );
167 return extractElementTextNS(dublinCoreNamespace(),
168 QLatin1String(
"creator") );
173QList<Enclosure> Item::enclosures()
const
175 QList<QDomElement> encs = elementsByTagNameNS(QString(),
176 QLatin1String(
"enclosure"));
178 QList<Enclosure> enclosures;
180 QList<QDomElement>::ConstIterator it = encs.constBegin();
181 for ( ; it != encs.constEnd(); ++it)
183 enclosures.append(Enclosure(*it));
188QString Item::guid()
const
190 return extractElementTextNS(QString(), QLatin1String(
"guid") );
193bool Item::guidIsPermaLink()
const
195 bool guidIsPermaLink =
true;
197 QDomElement guidNode = firstElementByTagNameNS(QString(),
198 QLatin1String(
"guid"));
199 if (!guidNode.isNull())
201 if (guidNode.attribute(QLatin1String(
"isPermaLink"))
202 == QLatin1String(
"false"))
204 guidIsPermaLink =
false;
208 return guidIsPermaLink;
211time_t Item::pubDate()
const
213 QString str = extractElementTextNS(QString(), QLatin1String(
"pubDate"));
217 return parseDate(str, RFCDate);
221 str = extractElementTextNS(dublinCoreNamespace(), QLatin1String(
"date"));
222 return parseDate(str, ISODate);
225time_t Item::expirationDate()
const
227 QString str = extractElementTextNS(QString(), QLatin1String(
"expirationDate"));
228 return parseDate(str, RFCDate);
231Source Item::source()
const
233 return Source(firstElementByTagNameNS(QString(), QLatin1String(
"source")));
236QString Item::rating()
const
238 return extractElementTextNS(QString(), QLatin1String(
"rating") );
241QString Item::debugInfo()
const
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");
249 if (!description().isNull())
250 info += QLatin1String(
"description: #") + description() + QLatin1String(
"#\n");
251 if (!content().isNull())
252 info += QLatin1String(
"content: #") + content() + QLatin1String(
"#\n");
253 if (!author().isNull())
254 info += QLatin1String(
"author: #") + author() + QLatin1String(
"#\n");
255 if (!comments().isNull())
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");
262 if (guidIsPermaLink())
263 info += QLatin1String(
"guid is PL: #true#\n");
264 if (!source().isNull())
265 info += source().debugInfo();
267 QList<Category> cats = categories();
268 for (QList<Category>::ConstIterator it = cats.constBegin(); it != cats.constEnd(); ++it)
269 info += (*it).debugInfo();
270 QList<Enclosure> encs = enclosures();
271 for (QList<Enclosure>::ConstIterator it = encs.constBegin(); it != encs.constEnd(); ++it)
272 info += (*it).debugInfo();
274 info += QLatin1String(
"### Item end ################\n");
278QList<QDomElement> Item::unhandledElements()
const
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);
310bool Item::accept(SpecificItemVisitor* visitor)
312 return visitor->visitRSS2Item(
this);