9 #include "dublincore.h"
17 #include "statement.h"
18 #include "syndicationinfo.h"
19 #include "textinput.h"
21 #include <documentvisitor.h>
26 #include <QStringList>
35 class SYNDICATION_NO_EXPORT
Document::Private
39 : itemTitleContainsMarkup(false)
40 , itemTitlesGuessed(false)
41 , itemDescriptionContainsMarkup(false)
42 , itemDescGuessed(false)
45 mutable bool itemTitleContainsMarkup;
46 mutable bool itemTitlesGuessed;
47 mutable bool itemDescriptionContainsMarkup;
48 mutable bool itemDescGuessed;
57 d->modelPrivate = resource()->model().d;
60 Document::Document(ResourcePtr resource)
62 , ResourceWrapper(resource)
65 d->modelPrivate = resource->model().d;
68 Document::Document(
const Document &other)
69 : SpecificDocument(other)
70 , ResourceWrapper(other)
76 Document::~Document() =
default;
78 bool Document::operator==(
const Document &other)
const
80 return ResourceWrapper::operator==(other);
85 ResourceWrapper::operator=(other);
91 bool Document::accept(DocumentVisitor *visitor)
93 return visitor->visitRDFDocument(
this);
96 bool Document::isValid()
const
101 QString Document::title()
const
103 const QString str = resource()->property(RSSVocab::self()->title())->asString();
107 QString Document::description()
const
109 const QString str = resource()->property(RSSVocab::self()->description())->asString();
115 return resource()->property(RSSVocab::self()->
link())->asString();
118 DublinCore Document::dc()
const
120 return DublinCore(resource());
123 SyndicationInfo Document::syn()
const
125 return SyndicationInfo(resource());
133 struct LessThanByIndex {
134 bool operator()(
const SortItem &lhs,
const SortItem &rhs)
const
136 return lhs.index < rhs.index;
144 for (
const Item &i : items) {
147 item.index = uriSequence.
indexOf(i.resource()->uri());
150 std::sort(toSort.
begin(), toSort.
end(), LessThanByIndex());
153 for (
const SortItem &sortItem : std::as_const(toSort)) {
154 items[i] = sortItem.item;
162 bool operator()(
const RDF::ResourcePtr &lhs,
const RDF::ResourcePtr &rhs)
const
164 return lhs->uri() < rhs->uri();
170 QList<ResourcePtr> items = resource()->model().resourcesWithType(RSSVocab::self()->item());
173 std::sort(items.
begin(), items.
end(), UriLessThan());
175 DocumentPtr doccpy(
new Document(*
this));
180 for (
const ResourcePtr &i : std::as_const(items)) {
184 if (resource()->
hasProperty(RSSVocab::self()->items())) {
185 NodePtr n = resource()->property(RSSVocab::self()->items())->object();
186 if (n->isSequence()) {
187 const SequencePtr seq = n.staticCast<Sequence>();
192 uriSequence.
reserve(seqItems.size());
194 for (
const NodePtr &i : seqItems) {
195 if (i->isResource()) {
199 list = sortListToMatchSequence(list, uriSequence);
206 Image Document::image()
const
208 ResourcePtr img = resource()->property(RSSVocab::self()->image())->asResource();
213 TextInput Document::textInput()
const
215 ResourcePtr ti = resource()->property(RSSVocab::self()->textinput())->asResource();
217 return ti ? TextInput(ti) : TextInput();
220 void Document::getItemTitleFormatInfo(
bool *containsMarkup)
const
222 if (!d->itemTitlesGuessed) {
227 d->itemTitlesGuessed =
true;
231 const int nmax = std::min<int>(litems.
size(), 10);
234 for (
const auto &item : litems) {
238 titles += item.originalTitle();
241 d->itemTitleContainsMarkup = stringContainsMarkup(titles);
242 d->itemTitlesGuessed =
true;
244 if (containsMarkup !=
nullptr) {
245 *containsMarkup = d->itemTitleContainsMarkup;
249 void Document::getItemDescriptionFormatInfo(
bool *containsMarkup)
const
251 if (!d->itemDescGuessed) {
256 d->itemDescGuessed =
true;
260 const int nmax = std::min<int>(litems.
size(), 10);
263 for (
const auto &item : litems) {
267 desc += item.originalDescription();
270 d->itemDescriptionContainsMarkup = stringContainsMarkup(desc);
271 d->itemDescGuessed =
true;
274 if (containsMarkup !=
nullptr) {
275 *containsMarkup = d->itemDescriptionContainsMarkup;
279 QString Document::debugInfo()
const
282 info +=
QLatin1String(
"### Document: ###################\n");
286 info += dc().debugInfo();
287 info += syn().debugInfo();
289 if (!img.resource() == 0L) {
290 info += img.debugInfo();
292 TextInput input = textInput();
293 if (!input.isNull()) {
294 info += input.debugInfo();
298 for (
const auto &item : itlist) {
299 info += item.debugInfo();
302 info +=
QLatin1String(
"### Document end ################\n");