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)
61 Item::Item(
const Item& other) : ElementWrapper(other), SpecificItem(other)
66 Item& Item::operator=(
const Item& other)
68 ElementWrapper::operator=(other);
69 SpecificItem::operator=(other);
74 QString Item::title()
const
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"));
97 QString Item::link()
const
99 return extractElementTextNS(QString(), QLatin1String(
"link") );
102 QString Item::description()
const
105 return originalDescription();
107 bool isCDATA =
false;
108 bool containsMarkup =
false;
109 d->doc->getItemDescriptionFormatInfo(&isCDATA, &containsMarkup);
111 return normalize(originalDescription(), isCDATA, containsMarkup);
114 QString Item::content()
const
120 QList<Category> Item::categories()
const
122 QList<QDomElement> cats = elementsByTagNameNS(QString(),
123 QLatin1String(
"category"));
125 QList<Category> categories;
127 QList<QDomElement>::ConstIterator it = cats.constBegin();
128 for ( ; it != cats.constEnd(); ++it)
130 categories.append(Category(*it));
135 QString Item::comments()
const
137 return extractElementTextNS(QString(), QLatin1String(
"comments") );
140 QString Item::author()
const
142 QString a = extractElementTextNS(QString(), QLatin1String(
"author") );
150 return extractElementTextNS(dublinCoreNamespace(),
151 QLatin1String(
"creator") );
156 QList<Enclosure> Item::enclosures()
const
158 QList<QDomElement> encs = elementsByTagNameNS(QString(),
159 QLatin1String(
"enclosure"));
161 QList<Enclosure> enclosures;
163 QList<QDomElement>::ConstIterator it = encs.constBegin();
164 for ( ; it != encs.constEnd(); ++it)
166 enclosures.append(Enclosure(*it));
171 QString Item::guid()
const
173 return extractElementTextNS(QString(), QLatin1String(
"guid") );
176 bool Item::guidIsPermaLink()
const
178 bool guidIsPermaLink =
true;
180 QDomElement guidNode = firstElementByTagNameNS(QString(),
181 QLatin1String(
"guid"));
182 if (!guidNode.isNull())
184 if (guidNode.attribute(QLatin1String(
"isPermaLink"))
185 == QLatin1String(
"false"))
187 guidIsPermaLink =
false;
191 return guidIsPermaLink;
194 time_t Item::pubDate()
const
196 QString str = extractElementTextNS(QString(), QLatin1String(
"pubDate"));
200 return parseDate(str, RFCDate);
204 str = extractElementTextNS(dublinCoreNamespace(), QLatin1String(
"date"));
205 return parseDate(str, ISODate);
208 time_t Item::expirationDate()
const
210 QString str = extractElementTextNS(QString(), QLatin1String(
"expirationDate"));
211 return parseDate(str, RFCDate);
214 Source Item::source()
const
216 return Source(firstElementByTagNameNS(QString(), QLatin1String(
"source")));
219 QString Item::rating()
const
221 return extractElementTextNS(QString(), QLatin1String(
"rating") );
224 QString Item::debugInfo()
const
227 info += QLatin1String(
"### Item: ###################\n");
228 if (!title().isNull())
229 info += QLatin1String(
"title: #") + title() + QLatin1String(
"#\n");
230 if (!link().isNull())
231 info += QLatin1String(
"link: #") + link() + QLatin1String(
"#\n");
232 if (!description().isNull())
233 info += QLatin1String(
"description: #") + description() + QLatin1String(
"#\n");
234 if (!content().isNull())
235 info += QLatin1String(
"content: #") + content() + QLatin1String(
"#\n");
236 if (!author().isNull())
237 info += QLatin1String(
"author: #") + author() + QLatin1String(
"#\n");
238 if (!comments().isNull())
239 info += QLatin1String(
"comments: #") + comments() + QLatin1String(
"#\n");
240 QString dpubdate = dateTimeToString(pubDate());
241 if (!dpubdate.isNull())
242 info += QLatin1String(
"pubDate: #") + dpubdate + QLatin1String(
"#\n");
243 if (!guid().isNull())
244 info += QLatin1String(
"guid: #") + guid() + QLatin1String(
"#\n");
245 if (guidIsPermaLink())
246 info += QLatin1String(
"guid is PL: #true#\n");
247 if (!source().isNull())
248 info += source().debugInfo();
250 QList<Category> cats = categories();
251 for (QList<Category>::ConstIterator it = cats.constBegin(); it != cats.constEnd(); ++it)
252 info += (*it).debugInfo();
253 QList<Enclosure> encs = enclosures();
254 for (QList<Enclosure>::ConstIterator it = encs.constBegin(); it != encs.constEnd(); ++it)
255 info += (*it).debugInfo();
257 info += QLatin1String(
"### Item end ################\n");
261 QList<QDomElement> Item::unhandledElements()
const
264 QList<ElementType> handled;
265 handled.append(ElementType(QLatin1String(
"title")));
266 handled.append(ElementType(QLatin1String(
"link")));
267 handled.append(ElementType(QLatin1String(
"description")));
268 handled.append(ElementType(QLatin1String(
"pubDate")));
269 handled.append(ElementType(QLatin1String(
"expirationDate")));
270 handled.append(ElementType(QLatin1String(
"rating")));
271 handled.append(ElementType(QLatin1String(
"source")));
272 handled.append(ElementType(QLatin1String(
"guid")));
273 handled.append(ElementType(QLatin1String(
"comments")));
274 handled.append(ElementType(QLatin1String(
"author")));
275 handled.append(ElementType(QLatin1String(
"date"), dublinCoreNamespace()));
277 QList<QDomElement> notHandled;
279 QDomNodeList children = element().childNodes();
280 for (
int i = 0; i < children.size(); ++i)
282 QDomElement el = children.at(i).toElement();
284 && !handled.contains(ElementType(el.localName(), el.namespaceURI())))
286 notHandled.append(el);
293 bool Item::accept(SpecificItemVisitor* visitor)
295 return visitor->visitRSS2Item(
this);