• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdepim API Reference
  • KDE Home
  • Contact Us
 

akregator

  • sources
  • kde-4.12
  • kdepim
  • akregator
  • src
articlematcher.cpp
Go to the documentation of this file.
1 /*
2  * articlematcher.cpp
3  *
4  * Copyright (c) 2004, 2005 Frerich Raabe <raabe@kde.org>
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  *
10  * 1. Redistributions of source code must retain the above copyright
11  * notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  * notice, this list of conditions and the following disclaimer in the
14  * documentation and/or other materials provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  */
27 #include "articlematcher.h"
28 #include "article.h"
29 #include "types.h"
30 
31 #include <kapplication.h>
32 #include <kconfiggroup.h>
33 #include <kdebug.h>
34 #include <krandom.h>
35 #include <kurl.h>
36 
37 #include <QList>
38 #include <QRegExp>
39 
40 
41 namespace Akregator {
42 namespace Filters {
43 
44 AbstractMatcher::AbstractMatcher() {}
45 
46 AbstractMatcher::~AbstractMatcher() {}
47 
48 QString Criterion::subjectToString(Subject subj)
49 {
50  switch (subj)
51  {
52  case Title:
53  return QString::fromLatin1("Title");
54  case Link:
55  return QString::fromLatin1("Link");
56  case Description:
57  return QString::fromLatin1("Description");
58  case Status:
59  return QString::fromLatin1("Status");
60  case KeepFlag:
61  return QString::fromLatin1("KeepFlag");
62  case Author:
63  return QString::fromLatin1("Author");
64  default: // should never happen (TM)
65  return QString::fromLatin1("Description");
66  }
67 }
68 
69 Criterion::Subject Criterion::stringToSubject(const QString& subjStr)
70 {
71  if (subjStr == QString::fromLatin1("Title"))
72  return Title;
73  else if (subjStr == QString::fromLatin1("Link"))
74  return Link;
75  else if (subjStr == QString::fromLatin1("Description"))
76  return Description;
77  else if (subjStr == QString::fromLatin1("Status"))
78  return Status;
79  else if (subjStr == QString::fromLatin1("KeepFlag"))
80  return KeepFlag;
81  else if (subjStr == QString::fromLatin1("Author"))
82  return Author;
83 
84  // hopefully never reached
85  return Description;
86 }
87 
88 QString Criterion::predicateToString(Predicate pred)
89 {
90  switch (pred)
91  {
92  case Contains:
93  return QString::fromLatin1("Contains");
94  case Equals:
95  return QString::fromLatin1("Equals");
96  case Matches:
97  return QString::fromLatin1("Matches");
98  case Negation:
99  return QString::fromLatin1("Negation");
100  default:// hopefully never reached
101  return QString::fromLatin1("Contains");
102  }
103 }
104 
105 Criterion::Predicate Criterion::stringToPredicate(const QString& predStr)
106 {
107  if (predStr == QString::fromLatin1("Contains"))
108  return Contains;
109  else if (predStr == QString::fromLatin1("Equals"))
110  return Equals;
111  else if (predStr == QString::fromLatin1("Matches"))
112  return Matches;
113  else if (predStr == QString::fromLatin1("Negation"))
114  return Negation;
115 
116  // hopefully never reached
117  return Contains;
118 }
119 
120 Criterion::Criterion()
121 {
122 }
123 
124 Criterion::Criterion( Subject subject, Predicate predicate, const QVariant &object )
125  : m_subject( subject )
126  , m_predicate( predicate )
127  , m_object( object )
128 {
129 
130 }
131 
132 void Criterion::writeConfig(KConfigGroup* config) const
133 {
134  config->writeEntry(QString::fromLatin1("subject"), subjectToString(m_subject));
135 
136  config->writeEntry(QString::fromLatin1("predicate"), predicateToString(m_predicate));
137 
138  config->writeEntry(QString::fromLatin1("objectType"), QString::fromLatin1(m_object.typeName()));
139 
140  config->writeEntry(QString::fromLatin1("objectValue"), m_object);
141 }
142 
143 void Criterion::readConfig(KConfigGroup* config)
144 {
145  m_subject = stringToSubject(config->readEntry(QString::fromLatin1("subject"), QString()));
146  m_predicate = stringToPredicate(config->readEntry(QString::fromLatin1("predicate"), QString()));
147  QVariant::Type type = QVariant::nameToType(config->readEntry(QString::fromLatin1("objType"), QString()).toLatin1());
148 
149  if (type != QVariant::Invalid)
150  {
151  m_object = config->readEntry(QString::fromLatin1("objectValue"), QVariant(type) );
152  }
153 }
154 
155 bool Criterion::satisfiedBy( const Article &article ) const
156 {
157  if ( article.isNull() ) {
158  return false;
159  }
160 
161  QVariant concreteSubject;
162 
163  switch ( m_subject ) {
164  case Title:
165  concreteSubject = QVariant(article.title());
166  break;
167  case Description:
168  concreteSubject = QVariant(article.description());
169  break;
170  case Link:
171  // ### Maybe use prettyUrl here?
172  concreteSubject = QVariant(article.link().url());
173  break;
174  case Status:
175  concreteSubject = QVariant(article.status());
176  break;
177  case KeepFlag:
178  concreteSubject = QVariant(article.keep());
179  break;
180  case Author:
181  concreteSubject = QVariant(article.authorName());
182  default:
183  break;
184  }
185 
186  bool satisfied = false;
187 
188  const Predicate predicateType = static_cast<Predicate>( m_predicate & ~Negation );
189  QString subjectType=QLatin1String(concreteSubject.typeName());
190 
191  switch ( predicateType ) {
192  case Contains:
193  satisfied = concreteSubject.toString().indexOf( m_object.toString(), 0, Qt::CaseInsensitive ) != -1;
194  break;
195  case Equals:
196  if (subjectType==QLatin1String("int"))
197  satisfied = concreteSubject.toInt() == m_object.toInt();
198  else
199  satisfied = concreteSubject.toString() == m_object.toString();
200  break;
201  case Matches:
202  satisfied = QRegExp( m_object.toString() ).indexIn( concreteSubject.toString() ) != -1;
203  break;
204  default:
205  kDebug() <<"Internal inconsistency; predicateType should never be Negation";
206  break;
207  }
208 
209  if ( m_predicate & Negation ) {
210  satisfied = !satisfied;
211  }
212 
213  return satisfied;
214 }
215 
216 Criterion::Subject Criterion::subject() const
217 {
218  return m_subject;
219 }
220 
221 Criterion::Predicate Criterion::predicate() const
222 {
223  return m_predicate;
224 }
225 
226 QVariant Criterion::object() const
227 {
228  return m_object;
229 }
230 
231 ArticleMatcher::ArticleMatcher()
232  : m_association( None )
233 {
234 }
235 
236 ArticleMatcher::~ArticleMatcher()
237 {
238 }
239 
240 ArticleMatcher::ArticleMatcher( const QList<Criterion> &criteria, Association assoc)
241  : m_criteria( criteria )
242  , m_association( assoc )
243 {
244 }
245 
246 bool ArticleMatcher::matches( const Article &a ) const
247 {
248  switch ( m_association ) {
249  case LogicalOr:
250  return anyCriterionMatches( a );
251  case LogicalAnd:
252  return allCriteriaMatch( a );
253  default:
254  break;
255  }
256  return true;
257 }
258 
259 void ArticleMatcher::writeConfig(KConfigGroup* config) const
260 {
261  config->writeEntry(QString::fromLatin1("matcherAssociation"), associationToString(m_association));
262 
263  config->writeEntry(QString::fromLatin1("matcherCriteriaCount"), m_criteria.count());
264 
265  int index = 0;
266 
267  QString criterionGroupPrefix = config->name() + QString::fromLatin1("_Criterion");
268 
269  for (QList<Criterion>::ConstIterator it = m_criteria.begin(); it != m_criteria.end(); ++it)
270  {
271  *config = KConfigGroup( config->config(), criterionGroupPrefix + QString::number(index));
272  (*it).writeConfig(config);
273  ++index;
274  }
275 }
276 
277 void ArticleMatcher::readConfig(KConfigGroup* config)
278 {
279  m_criteria.clear();
280  m_association = stringToAssociation(config->readEntry(QString::fromLatin1("matcherAssociation"), QString()));
281 
282  int count = config->readEntry(QString::fromLatin1("matcherCriteriaCount"), 0);
283 
284  QString criterionGroupPrefix = config->name() + QString::fromLatin1("_Criterion");
285 
286  for (int i = 0; i < count; ++i)
287  {
288  Criterion c;
289  *config = KConfigGroup( config->config(), criterionGroupPrefix + QString::number(i));
290  c.readConfig(config);
291  m_criteria.append(c);
292  }
293 }
294 
295 bool ArticleMatcher::operator==(const AbstractMatcher& other) const
296 {
297  AbstractMatcher* ptr = const_cast<AbstractMatcher*>(&other);
298  ArticleMatcher* o = dynamic_cast<ArticleMatcher*>(ptr);
299  if (!o)
300  return false;
301  else
302  return m_association == o->m_association && m_criteria == o->m_criteria;
303 }
304 bool ArticleMatcher::operator!=(const AbstractMatcher& other) const
305 {
306  return !(*this == other);
307 }
308 
309 bool ArticleMatcher::anyCriterionMatches( const Article &a ) const
310 {
311  if (m_criteria.count()==0)
312  return true;
313  QList<Criterion>::ConstIterator it = m_criteria.begin();
314  QList<Criterion>::ConstIterator end = m_criteria.end();
315  for ( ; it != end; ++it ) {
316  if ( ( *it ).satisfiedBy( a ) ) {
317  return true;
318  }
319  }
320  return false;
321 }
322 
323 bool ArticleMatcher::allCriteriaMatch( const Article &a ) const
324 {
325  if (m_criteria.count()==0)
326  return true;
327  QList<Criterion>::ConstIterator it = m_criteria.begin();
328  QList<Criterion>::ConstIterator end = m_criteria.end();
329  for ( ; it != end; ++it ) {
330  if ( !( *it ).satisfiedBy( a ) ) {
331  return false;
332  }
333  }
334  return true;
335 }
336 
337 ArticleMatcher::Association ArticleMatcher::stringToAssociation(const QString& assocStr)
338 {
339  if (assocStr == QString::fromLatin1("LogicalAnd"))
340  return LogicalAnd;
341  else if (assocStr == QString::fromLatin1("LogicalOr"))
342  return LogicalOr;
343  else
344  return None;
345 }
346 
347 QString ArticleMatcher::associationToString(Association association)
348 {
349  switch (association)
350  {
351  case LogicalAnd:
352  return QString::fromLatin1("LogicalAnd");
353  case LogicalOr:
354  return QString::fromLatin1("LogicalOr");
355  default:
356  return QString::fromLatin1("None");
357  }
358 }
359 
360 
361 } //namespace Filters
362 } //namespace Akregator
Akregator::Filters::Criterion::satisfiedBy
bool satisfiedBy(const Article &article) const
Definition: articlematcher.cpp:155
Akregator::Filters::Criterion::subject
Subject subject() const
Definition: articlematcher.cpp:216
articlematcher.h
Akregator::Filters::AbstractMatcher::AbstractMatcher
AbstractMatcher()
Definition: articlematcher.cpp:44
Akregator::Filters::Criterion::subjectToString
static QString subjectToString(Subject subj)
Definition: articlematcher.cpp:48
types.h
Akregator::Filters::Criterion::KeepFlag
Definition: articlematcher.h:115
Akregator::Filters::Criterion::Author
Definition: articlematcher.h:115
Akregator::Filters::AbstractMatcher
Abstract base class for matchers, a matcher just takes an article and checks whether the article matc...
Definition: articlematcher.h:50
Akregator::Filters::Criterion::Matches
Definition: articlematcher.h:124
Akregator::Article::link
KUrl link() const
Definition: article.cpp:447
Akregator::Filters::Criterion::Criterion
Criterion()
Definition: articlematcher.cpp:120
Akregator::Filters::Criterion::Link
Definition: articlematcher.h:115
Status
Status
Definition: akregatorstorageexporter.cpp:64
Akregator::Filters::ArticleMatcher::ArticleMatcher
ArticleMatcher()
Definition: articlematcher.cpp:231
Akregator::Filters::ArticleMatcher::operator!=
bool operator!=(const AbstractMatcher &other) const
Definition: articlematcher.cpp:304
Akregator::Filters::Criterion::Subject
Subject
Definition: articlematcher.h:114
Akregator::Article::isNull
bool isNull() const
Definition: article.cpp:253
Akregator::Article::title
QString title() const
Definition: article.cpp:374
Akregator::Filters::Criterion::readConfig
virtual void readConfig(KConfigGroup *config)
Definition: articlematcher.cpp:143
Akregator::Filters::ArticleMatcher::~ArticleMatcher
~ArticleMatcher()
Definition: articlematcher.cpp:236
Akregator::Filters::ArticleMatcher::operator==
bool operator==(const AbstractMatcher &other) const
Definition: articlematcher.cpp:295
Akregator::Filters::ArticleMatcher::LogicalOr
Definition: articlematcher.h:80
Akregator::Article::authorName
QString authorName() const
Definition: article.cpp:383
Akregator::Article::keep
bool keep() const
if true, the article should be kept even when expired
Definition: article.cpp:495
Akregator::Filters::ArticleMatcher::matches
bool matches(const Article &article) const
Definition: articlematcher.cpp:246
Akregator::Filters::ArticleMatcher::LogicalAnd
Definition: articlematcher.h:80
article.h
Akregator::Filters::Criterion
Criterion for ArticleMatcher.
Definition: articlematcher.h:110
Akregator::Filters::Criterion::Predicate
Predicate
Definition: articlematcher.h:121
Akregator::Filters::ArticleMatcher
a powerful matcher supporting multiple criterions, which can be combined via logical OR or AND ...
Definition: articlematcher.h:75
Akregator::Filters::Criterion::Status
Definition: articlematcher.h:115
Akregator::Filters::Criterion::Title
Definition: articlematcher.h:115
Akregator::Filters::Criterion::stringToPredicate
static Predicate stringToPredicate(const QString &predStr)
Definition: articlematcher.cpp:105
Akregator::Filters::Criterion::Negation
Definition: articlematcher.h:125
Akregator::Article::description
QString description() const
Definition: article.cpp:452
Akregator::Filters::ArticleMatcher::None
Definition: articlematcher.h:80
Akregator::Filters::Criterion::predicate
Predicate predicate() const
Definition: articlematcher.cpp:221
Akregator::Filters::Criterion::object
QVariant object() const
Definition: articlematcher.cpp:226
Akregator::Filters::ArticleMatcher::Association
Association
Definition: articlematcher.h:79
Akregator::Filters::Criterion::stringToSubject
static Subject stringToSubject(const QString &subjStr)
Definition: articlematcher.cpp:69
Akregator::Filters::Criterion::Contains
Definition: articlematcher.h:122
Akregator::Article
A proxy class for Syndication::ItemPtr with some additional methods to assist sorting.
Definition: article.h:61
Akregator::Article::status
int status() const
Definition: article.cpp:338
Akregator::Filters::Criterion::predicateToString
static QString predicateToString(Predicate pred)
Definition: articlematcher.cpp:88
Akregator::Filters::ArticleMatcher::readConfig
void readConfig(KConfigGroup *config)
Definition: articlematcher.cpp:277
Akregator::Filters::Criterion::writeConfig
virtual void writeConfig(KConfigGroup *config) const
Definition: articlematcher.cpp:132
Akregator::Filters::Criterion::Equals
Definition: articlematcher.h:123
Akregator::Filters::AbstractMatcher::~AbstractMatcher
virtual ~AbstractMatcher()
Definition: articlematcher.cpp:46
Akregator::Filters::Criterion::Description
Definition: articlematcher.h:115
Akregator::Filters::ArticleMatcher::writeConfig
void writeConfig(KConfigGroup *config) const
Definition: articlematcher.cpp:259
QList
Definition: article.h:39
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:58:14 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

akregator

Skip menu "akregator"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members

kdepim API Reference

Skip menu "kdepim API Reference"
  • akonadi_next
  • akregator
  • blogilo
  • calendarsupport
  • console
  •   kabcclient
  •   konsolekalendar
  • kaddressbook
  • kalarm
  •   lib
  • kdgantt2
  • kjots
  • kleopatra
  • kmail
  • knode
  • knotes
  • kontact
  • korgac
  • korganizer
  • ktimetracker
  • libkdepim
  • libkleo
  • libkpgp
  • mailcommon
  • messagelist
  • messageviewer

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal