24 #include "dublincore.h"
32 #include "statement.h"
33 #include "syndicationinfo.h"
34 #include "textinput.h"
36 #include <documentvisitor.h>
39 #include <QtCore/QList>
40 #include <QtCore/QString>
41 #include <QtCore/QStringList>
42 #include <QtCore/QVector>
44 using namespace boost;
46 namespace Syndication {
49 class Document::Private
52 Private() : itemTitleContainsMarkup(false),
53 itemTitlesGuessed(false),
54 itemDescriptionContainsMarkup(false),
55 itemDescGuessed(false)
57 mutable bool itemTitleContainsMarkup;
58 mutable bool itemTitlesGuessed;
59 mutable bool itemDescriptionContainsMarkup;
60 mutable bool itemDescGuessed;
61 shared_ptr<Model::ModelPrivate> modelPrivate;
64 Document::Document() : Syndication::SpecificDocument(),
68 d->modelPrivate = resource()->model().d;
71 Document::Document(ResourcePtr resource) : Syndication::SpecificDocument(),
72 ResourceWrapper(resource),
75 d->modelPrivate = resource->model().d;
78 Document::Document(
const Document& other) : SpecificDocument(other), ResourceWrapper(other),
90 bool Document::operator==(
const Document& other)
const
96 Document& Document::operator=(
const Document& other)
105 bool Document::accept(DocumentVisitor* visitor)
107 return visitor->visitRDFDocument(
this);
110 bool Document::isValid()
const
115 QString Document::title()
const
117 QString str = resource()->property(
RSSVocab::self()->title())->asString();
118 return normalize(str);
122 QString Document::description()
const
124 QString str = resource()->property(
RSSVocab::self()->description())->asString();
125 return normalize(str);
128 QString Document::link()
const
130 return resource()->property(
RSSVocab::self()->link())->asString();
133 DublinCore Document::dc()
const
135 return DublinCore(resource());
138 SyndicationInfo Document::syn()
const
140 return SyndicationInfo(resource());
149 struct LessThanByIndex {
150 bool operator()(
const SortItem& lhs,
const SortItem& rhs)
const {
151 return lhs.index < rhs.index;
155 static QList<Item> sortListToMatchSequence(QList<Item> items,
const QStringList& uriSequence) {
156 QVector<SortItem> toSort;
157 toSort.reserve(items.size());
158 Q_FOREACH(
const Item& i, items) {
161 item.index = uriSequence.indexOf(i.resource()->uri());
164 qSort(toSort.begin(), toSort.end(), LessThanByIndex());
167 Q_FOREACH(
const SortItem& sortItem, toSort) {
168 items[i] = sortItem.item;
175 QList<Item> Document::items()
const
179 const QList<ResourcePtr> items = resource()->model().resourcesWithType(
RSSVocab::self()->item());
180 DocumentPtr doccpy(
new Document(*
this));
181 Q_FOREACH (
const ResourcePtr& i, items)
182 list.append(Item(i, doccpy));
184 if (resource()->hasProperty(RSSVocab::self()->items())) {
185 NodePtr n = resource()->property(
RSSVocab::self()->items())->object();
188 Sequence* seq =
static_cast<Sequence*
>(n.get());
190 const QList<NodePtr> seqItems = seq->items();
192 QStringList uriSequence;
193 uriSequence.reserve(seqItems.size());
195 Q_FOREACH(
const NodePtr& i, seqItems)
197 uriSequence.append(static_cast<Resource*>(i.get())->uri());
198 list = sortListToMatchSequence(list, uriSequence);
205 Image Document::image()
const
207 ResourcePtr img = resource()->property(
RSSVocab::self()->image())->asResource();
209 return img ? Image(img) : Image();
212 TextInput Document::textInput()
const
214 ResourcePtr ti = resource()->property(
RSSVocab::self()->textinput())->asResource();
216 return ti ? TextInput(ti) : TextInput();
219 void Document::getItemTitleFormatInfo(
bool* containsMarkup)
const
221 if (!d->itemTitlesGuessed)
224 QList<Item> litems = items();
226 if (litems.isEmpty())
228 d->itemTitlesGuessed =
true;
232 int nmax = litems.size() < 10 ? litems.size() : 10;
235 QList<Item>::ConstIterator it = litems.constBegin();
239 titles += (*it).originalTitle();
244 d->itemTitleContainsMarkup = stringContainsMarkup(titles);
245 d->itemTitlesGuessed =
true;
247 if (containsMarkup != 0L)
248 *containsMarkup = d->itemTitleContainsMarkup;
251 void Document::getItemDescriptionFormatInfo(
bool* containsMarkup)
const
253 if (!d->itemDescGuessed)
256 QList<Item> litems = items();
259 if (litems.isEmpty())
261 d->itemDescGuessed =
true;
265 int nmax = litems.size() < 10 ? litems.size() : 10;
268 QList<Item>::ConstIterator it = litems.constBegin();
272 desc += (*it).originalDescription();
277 d->itemDescriptionContainsMarkup = stringContainsMarkup(desc);
278 d->itemDescGuessed =
true;
281 if (containsMarkup != 0L)
282 *containsMarkup = d->itemDescriptionContainsMarkup;
285 QString Document::debugInfo()
const
288 info += QLatin1String(
"### Document: ###################\n");
289 info += QLatin1String(
"title: #") + title() + QLatin1String(
"#\n");
290 info += QLatin1String(
"link: #") + link() + QLatin1String(
"#\n");
291 info += QLatin1String(
"description: #") + description() + QLatin1String(
"#\n");
292 info += dc().debugInfo();
293 info += syn().debugInfo();
295 if (!img.resource() == 0L)
296 info += img.debugInfo();
297 TextInput input = textInput();
299 info += input.debugInfo();
301 QList<Item> itlist = items();
302 QList<Item>::ConstIterator it = itlist.constBegin();
303 QList<Item>::ConstIterator end = itlist.constEnd();
304 for ( ; it != end; ++it)
305 info += (*it).debugInfo();
308 info += QLatin1String(
"### Document end ################\n");
bool operator==(const ResourceWrapper &other) const
compares two resource wrapper instances.
ResourceWrapper & operator=(const ResourceWrapper &other)
Assignment oeprator Due to the shared d pointer, this is a cheap operation.