27 #include "articlefilter.h"
31 #include <tdeapplication.h>
32 #include <tdeconfig.h>
41 TQString Criterion::subjectToString(Subject subj)
46 return TQString::fromLatin1(
"Title");
48 return TQString::fromLatin1(
"Link");
50 return TQString::fromLatin1(
"Author");
52 return TQString::fromLatin1(
"Description");
54 return TQString::fromLatin1(
"Status");
56 return TQString::fromLatin1(
"KeepFlag");
58 return TQString::fromLatin1(
"Description");
62 Criterion::Subject Criterion::stringToSubject(
const TQString& subjStr)
64 if (subjStr == TQString::fromLatin1(
"Title"))
66 else if (subjStr == TQString::fromLatin1(
"Link"))
68 else if (subjStr == TQString::fromLatin1(
"Description"))
70 else if (subjStr == TQString::fromLatin1(
"Author"))
72 else if (subjStr == TQString::fromLatin1(
"Status"))
74 else if (subjStr == TQString::fromLatin1(
"KeepFlag"))
81 TQString Criterion::predicateToString(Predicate pred)
86 return TQString::fromLatin1(
"Contains");
88 return TQString::fromLatin1(
"Equals");
90 return TQString::fromLatin1(
"Matches");
92 return TQString::fromLatin1(
"Negation");
94 return TQString::fromLatin1(
"Contains");
98 Criterion::Predicate Criterion::stringToPredicate(
const TQString& predStr)
100 if (predStr == TQString::fromLatin1(
"Contains"))
102 else if (predStr == TQString::fromLatin1(
"Equals"))
104 else if (predStr == TQString::fromLatin1(
"Matches"))
106 else if (predStr == TQString::fromLatin1(
"Negation"))
113 Criterion::Criterion()
117 Criterion::Criterion( Subject subject, Predicate predicate,
const TQVariant &
object )
118 : m_subject( subject )
119 , m_predicate( predicate )
125 void Criterion::writeConfig(TDEConfig* config)
const
127 config->writeEntry(TQString::fromLatin1(
"subject"), subjectToString(m_subject));
129 config->writeEntry(TQString::fromLatin1(
"predicate"), predicateToString(m_predicate));
131 config->writeEntry(TQString::fromLatin1(
"objectType"), TQString(m_object.typeName()));
133 config->writeEntry(TQString::fromLatin1(
"objectValue"), m_object);
136 void Criterion::readConfig(TDEConfig* config)
138 m_subject = stringToSubject(config->readEntry(TQString::fromLatin1(
"subject")));
139 m_predicate = stringToPredicate(config->readEntry(TQString::fromLatin1(
"predicate")));
140 TQVariant::Type type = TQVariant::nameToType(config->readEntry(TQString::fromLatin1(
"objType")).ascii());
142 if (type != TQVariant::Invalid)
144 m_object = config->readPropertyEntry(TQString::fromLatin1(
"objectValue"), type);
148 bool Criterion::satisfiedBy(
const Article &article )
const
150 TQVariant concreteSubject;
152 switch ( m_subject ) {
154 concreteSubject = TQVariant(article.title());
157 concreteSubject = TQVariant(article.description());
160 concreteSubject = TQVariant(article.author());
164 concreteSubject = TQVariant(article.link().url());
167 concreteSubject = TQVariant(article.status());
170 concreteSubject = TQVariant(article.keep());
175 bool satisfied =
false;
177 const Predicate predicateType =
static_cast<Predicate
>( m_predicate & ~Negation );
178 TQString subjectType=concreteSubject.typeName();
180 switch ( predicateType ) {
182 satisfied = concreteSubject.toString().find( m_object.toString(), 0, false ) != -1;
185 if (subjectType==
"int")
186 satisfied = concreteSubject.toInt() == m_object.toInt();
188 satisfied = concreteSubject.toString() == m_object.toString();
191 satisfied = TQRegExp( m_object.toString() ).search( concreteSubject.toString() ) != -1;
194 kdDebug() <<
"Internal inconsistency; predicateType should never be Negation" << endl;
198 if ( m_predicate & Negation ) {
199 satisfied = !satisfied;
205 Criterion::Subject Criterion::subject()
const
210 Criterion::Predicate Criterion::predicate()
const
215 TQVariant Criterion::object()
const
220 ArticleMatcher::ArticleMatcher()
221 : m_association( None )
225 ArticleMatcher::~ArticleMatcher()
229 bool ArticleMatcher::matchesAll()
const
231 return m_criteria.isEmpty();
239 ArticleMatcher::ArticleMatcher(
const TQValueList<Criterion> &criteria, Association assoc)
240 : m_criteria( criteria )
241 , m_association( assoc )
245 ArticleMatcher& ArticleMatcher::operator=(
const ArticleMatcher& other)
247 m_association = other.m_association;
248 m_criteria = other.m_criteria;
252 ArticleMatcher::ArticleMatcher(
const ArticleMatcher& other) : AbstractMatcher(other)
257 bool ArticleMatcher::matches(
const Article &a )
const
259 switch ( m_association ) {
261 return anyCriterionMatches( a );
263 return allCriteriaMatch( a );
270 void ArticleMatcher::writeConfig(TDEConfig* config)
const
272 config->writeEntry(TQString::fromLatin1(
"matcherAssociation"), associationToString(m_association));
274 config->writeEntry(TQString::fromLatin1(
"matcherCriteriaCount"), m_criteria.count());
278 for (TQValueList<Criterion>::ConstIterator it = m_criteria.begin(); it != m_criteria.end(); ++it)
280 config->setGroup(config->group()+TQString::fromLatin1(
"_Criterion")+TQString::number(index));
281 (*it).writeConfig(config);
286 void ArticleMatcher::readConfig(TDEConfig* config)
289 m_association = stringToAssociation(config->readEntry(TQString::fromLatin1(
"matcherAssociation")));
291 int count = config->readNumEntry(TQString::fromLatin1(
"matcherCriteriaCount"), 0);
293 for (
int i = 0; i < count; ++i)
296 config->setGroup(config->group()+TQString::fromLatin1(
"_Criterion")+TQString::number(i));
297 c.readConfig(config);
298 m_criteria.append(c);
302 bool ArticleMatcher::operator==(
const AbstractMatcher& other)
const
304 AbstractMatcher* ptr =
const_cast<AbstractMatcher*
>(&other);
305 ArticleMatcher* o =
dynamic_cast<ArticleMatcher*
>(ptr);
309 return m_association == o->m_association && m_criteria == o->m_criteria;
311 bool ArticleMatcher::operator!=(
const AbstractMatcher& other)
const
313 return !(*
this == other);
316 bool ArticleMatcher::anyCriterionMatches(
const Article &a )
const
318 if (m_criteria.count()==0)
320 TQValueList<Criterion>::ConstIterator it = m_criteria.begin();
321 TQValueList<Criterion>::ConstIterator end = m_criteria.end();
322 for ( ; it != end; ++it ) {
323 if ( ( *it ).satisfiedBy( a ) ) {
330 bool ArticleMatcher::allCriteriaMatch(
const Article &a )
const
332 if (m_criteria.count()==0)
334 TQValueList<Criterion>::ConstIterator it = m_criteria.begin();
335 TQValueList<Criterion>::ConstIterator end = m_criteria.end();
336 for ( ; it != end; ++it ) {
337 if ( !( *it ).satisfiedBy( a ) ) {
344 ArticleMatcher::Association ArticleMatcher::stringToAssociation(
const TQString& assocStr)
346 if (assocStr == TQString::fromLatin1(
"LogicalAnd"))
348 else if (assocStr == TQString::fromLatin1(
"LogicalOr"))
354 TQString ArticleMatcher::associationToString(Association association)
359 return TQString::fromLatin1(
"LogicalAnd");
361 return TQString::fromLatin1(
"LogicalOr");
363 return TQString::fromLatin1(
"None");
368 class TagMatcher::TagMatcherPrivate
372 bool operator==(
const TagMatcherPrivate& other)
const
374 return tagID == other.tagID;
378 TagMatcher::TagMatcher(
const TQString& tagID) : d(new TagMatcherPrivate)
383 TagMatcher::TagMatcher() : d(new TagMatcherPrivate)
387 TagMatcher::~TagMatcher()
393 bool TagMatcher::matches(
const Article& article)
const
395 return article.hasTag(d->tagID);
398 TagMatcher* TagMatcher::clone()
const
400 return new TagMatcher(*
this);
404 TagMatcher::TagMatcher(
const TagMatcher& other) : AbstractMatcher(other), d(0)
409 void TagMatcher::writeConfig(TDEConfig* config)
const
411 config->writeEntry(TQString::fromLatin1(
"matcherType"), TQString::fromLatin1(
"TagMatcher"));
412 config->writeEntry(TQString::fromLatin1(
"matcherParams"), d->tagID);
415 void TagMatcher::readConfig(TDEConfig* config)
417 d->tagID = config->readEntry(TQString::fromLatin1(
"matcherParams"));
420 bool TagMatcher::operator==(
const AbstractMatcher& other)
const
422 AbstractMatcher* ptr =
const_cast<AbstractMatcher*
>(&other);
423 TagMatcher* tagFilter =
dynamic_cast<TagMatcher*
>(ptr);
424 return tagFilter ? *d == *(tagFilter->d) :
false;
427 bool TagMatcher::operator!=(
const AbstractMatcher &other)
const
429 return !(*
this == other);
432 TagMatcher& TagMatcher::operator=(
const TagMatcher& other)
434 d =
new TagMatcherPrivate;
439 void DeleteAction::exec(Article& article)
441 if (!article.isNull())
442 article.setDeleted();
445 SetStatusAction::SetStatusAction(
int status) : m_status(status)
449 void SetStatusAction::exec(Article& article)
451 if (!article.isNull())
452 article.setStatus(m_status);
455 int SetStatusAction::status()
const
460 void SetStatusAction::setStatus(
int status)
465 void SetStatusAction::writeConfig(TDEConfig* config)
const
467 config->writeEntry(TQString::fromLatin1(
"actionType"), TQString::fromLatin1(
"SetStatusAction"));
468 config->writeEntry(TQString::fromLatin1(
"actionParams"), m_status);
471 void SetStatusAction::readConfig(TDEConfig* config)
473 m_status = config->readNumEntry(TQString::fromLatin1(
"actionParams"), Article::Read);
476 bool SetStatusAction::operator==(
const AbstractAction& other)
478 AbstractAction* ptr =
const_cast<AbstractAction*
>(&other);
479 SetStatusAction* o =
dynamic_cast<SetStatusAction*
>(ptr);
483 return m_status == o->m_status;
487 AssignTagAction::AssignTagAction(
const TQString& tagID) : m_tagID(tagID)
491 void AssignTagAction::exec(Article& article)
493 if (!article.isNull())
494 article.addTag(m_tagID);
497 class ArticleFilter::ArticleFilterPrivate :
public Shared
500 AbstractAction* action;
501 AbstractMatcher* matcher;
507 ArticleFilter::ArticleFilter() : d(new ArticleFilterPrivate)
509 d->id = TDEApplication::random();
514 ArticleFilter::ArticleFilter(
const AbstractMatcher& matcher,
const AbstractAction& action) : d(new ArticleFilterPrivate)
516 d->id = TDEApplication::random();
517 d->matcher = matcher.clone();
518 d->action = action.clone();
521 ArticleFilter::ArticleFilter(
const ArticleFilter& other)
526 ArticleFilter::~ArticleFilter()
538 AbstractMatcher* ArticleFilter::matcher()
const
543 AbstractAction* ArticleFilter::action()
const
548 void ArticleFilter::setMatcher(
const AbstractMatcher& matcher)
551 d->matcher = matcher.clone();
554 void ArticleFilter::setAction(
const AbstractAction& action)
557 d->action = action.clone();
560 ArticleFilter& ArticleFilter::operator=(
const ArticleFilter& other)
572 int ArticleFilter::id()
const
577 bool ArticleFilter::operator==(
const ArticleFilter& other)
const
579 return *(d->matcher) == *(other.d->matcher) && *(d->action) == *(other.d->action) && d->name == other.d->name;
582 void ArticleFilterList::writeConfig(TDEConfig* config)
const
584 config->setGroup(TQString::fromLatin1(
"Filters"));
585 config->writeEntry(TQString::fromLatin1(
"count"), count());
587 for (ArticleFilterList::ConstIterator it = begin(); it != end(); ++it)
589 config->setGroup(TQString::fromLatin1(
"Filters_")+TQString::number(index));
590 (*it).writeConfig(config);
595 void ArticleFilterList::readConfig(TDEConfig* config)
598 config->setGroup(TQString::fromLatin1(
"Filters"));
599 int count = config->readNumEntry(TQString::fromLatin1(
"count"), 0);
600 for (
int i = 0; i < count; ++i)
602 config->setGroup(TQString::fromLatin1(
"Filters_")+TQString::number(i));
603 ArticleFilter filter;
604 filter.readConfig(config);
610 void AssignTagAction::readConfig(TDEConfig* config)
612 m_tagID = config->readEntry(TQString::fromLatin1(
"actionParams"));
615 void AssignTagAction::writeConfig(TDEConfig* config)
const
617 config->writeEntry(TQString::fromLatin1(
"actionType"), TQString::fromLatin1(
"AssignTagAction"));
618 config->writeEntry(TQString::fromLatin1(
"actionParams"), m_tagID);
621 bool AssignTagAction::operator==(
const AbstractAction& other)
623 AbstractAction* ptr =
const_cast<AbstractAction*
>(&other);
624 AssignTagAction* o =
dynamic_cast<AssignTagAction*
>(ptr);
628 return m_tagID == o->m_tagID;
631 const TQString& AssignTagAction::tagID()
const
636 void AssignTagAction::setTagID(
const TQString& tagID)
641 void DeleteAction::readConfig(TDEConfig* )
645 void DeleteAction::writeConfig(TDEConfig* config)
const
647 config->writeEntry(TQString::fromLatin1(
"actionType"), TQString::fromLatin1(
"DeleteAction"));
650 bool DeleteAction::operator==(
const AbstractAction& other)
652 AbstractAction* ptr =
const_cast<AbstractAction*
>(&other);
653 DeleteAction* o =
dynamic_cast<DeleteAction*
>(ptr);
657 void ArticleFilter::readConfig(TDEConfig* config)
664 d->name = config->readEntry(TQString::fromLatin1(
"name"));
665 d->id = config->readNumEntry(TQString::fromLatin1(
"id"), 0);
667 TQString matcherType = config->readEntry(TQString::fromLatin1(
"matcherType"));
669 if (matcherType == TQString::fromLatin1(
"TagMatcher"))
670 d->matcher =
new TagMatcher();
671 else if (matcherType == TQString::fromLatin1(
"ArticleMatcher"))
672 d->matcher =
new ArticleMatcher();
675 d->matcher->readConfig(config);
678 TQString actionType = config->readEntry(TQString::fromLatin1(
"actionType"));
680 if (actionType == TQString::fromLatin1(
"AssignTagAction"))
681 d->action =
new AssignTagAction();
682 else if (actionType == TQString::fromLatin1(
"DeleteAction"))
683 d->action =
new DeleteAction();
684 else if (actionType == TQString::fromLatin1(
"SetStatusAction"))
685 d->action =
new SetStatusAction();
688 d->action->readConfig(config);
691 void ArticleFilter::writeConfig(TDEConfig* config)
const
693 config->writeEntry(TQString::fromLatin1(
"name"), d->name);
694 config->writeEntry(TQString::fromLatin1(
"id"), d->id);
695 d->matcher->writeConfig(config);
696 d->action->writeConfig(config);
699 void ArticleFilter::setName(
const TQString& name)
711 if (d->matcher && d->action && d->matcher->matches(article))
712 d->action->exec(article);