summaryrefslogtreecommitdiff
path: root/src/adblock/adblockrule.cpp
diff options
context:
space:
mode:
authorBenjamin Poulain <benjamin.poulain@nokia.com>2010-08-18 03:32:50 +0200
committerBenjamin Poulain <benjamin.poulain@nokia.com>2010-08-18 05:04:39 +0200
commitd9028baf5c8261cbad540893465965730386a1cf (patch)
tree2c8f21d2d2dcdd1b74f21f146cd8c6094cb155fc /src/adblock/adblockrule.cpp
parentRemove the method pattern() from AdBlockRule (diff)
downloadrekonq-d9028baf5c8261cbad540893465965730386a1cf.tar.xz
Split AdBlock rule in two classes to move the implementation out of it
In order to make special matching rules, we need specialization of the implementation depending on the type of rule. The previous AdBlockRule was entierly based on regexp. The new one is only a factory to a AdBlockRuleImpl, and delegate everything to this implementation. This will allow faster specialization of the ad block rules in the future.
Diffstat (limited to 'src/adblock/adblockrule.cpp')
-rw-r--r--src/adblock/adblockrule.cpp77
1 files changed, 2 insertions, 75 deletions
diff --git a/src/adblock/adblockrule.cpp b/src/adblock/adblockrule.cpp
index 420caab3..8236f920 100644
--- a/src/adblock/adblockrule.cpp
+++ b/src/adblock/adblockrule.cpp
@@ -55,82 +55,9 @@
// Self Includes
#include "adblockrule.h"
-// Qt Includes
-#include <QStringList>
-#include <QUrl>
-
-static inline bool isRegExpFilter(const QString &filter)
-{
- return filter.startsWith(QL1C('/')) && filter.endsWith(QL1C('/'));
-}
+#include "adblockrulefallbackimpl.h"
AdBlockRule::AdBlockRule(const QString &filter)
{
- m_regExp.setCaseSensitivity(Qt::CaseInsensitive);
- m_regExp.setPatternSyntax(QRegExp::RegExp2);
-
- QString parsedLine = filter;
-
- const int optionsNumber = parsedLine.lastIndexOf(QL1C('$'));
- if (optionsNumber >= 0 && !isRegExpFilter(parsedLine)) {
- const QStringList options(parsedLine.mid(optionsNumber + 1).split(QL1C(',')));
- if (options.contains(QL1S("match-case")))
- m_regExp.setCaseSensitivity(Qt::CaseSensitive);
- parsedLine = parsedLine.left(optionsNumber);
- }
-
- if (isRegExpFilter(parsedLine))
- parsedLine = parsedLine.mid(1, parsedLine.length() - 2);
- else
- parsedLine = convertPatternToRegExp(parsedLine);
-
- m_regExp.setPattern(parsedLine);
-}
-
-
-// here return false means that rule doesn't match,
-// so that url is allowed
-// return true means "matched rule", so stop url!
-bool AdBlockRule::match(const QString &encodedUrl) const
-{
- return m_regExp.indexIn(encodedUrl) != -1;
-}
-
-
-QString AdBlockRule::convertPatternToRegExp(const QString &wildcardPattern)
-{
- QString pattern = wildcardPattern;
-
- // remove multiple wildcards
- pattern.replace(QRegExp(QL1S("\\*+")), QL1S("*"));
-
- // remove anchors following separator placeholder
- pattern.replace(QRegExp(QL1S("\\^\\|$")), QL1S("^"));
-
- // remove leading wildcards
- pattern.replace(QRegExp(QL1S("^(\\*)")), QL1S(""));
-
- // remove trailing wildcards
- pattern.replace(QRegExp(QL1S("(\\*)$")), QL1S(""));
-
- // escape special symbols
- pattern.replace(QRegExp(QL1S("(\\W)")), QL1S("\\\\1"));
-
- // process extended anchor at expression start
- pattern.replace(QRegExp(QL1S("^\\\\\\|\\\\\\|")), QL1S("^[\\w\\-]+:\\/+(?!\\/)(?:[^\\/]+\\.)?"));
-
- // process separator placeholders
- pattern.replace(QRegExp(QL1S("\\\\\\^")), QL1S("(?:[^\\w\\d\\-.%]|$)"));
-
- // process anchor at expression start
- pattern.replace(QRegExp(QL1S("^\\\\\\|")), QL1S("^"));
-
- // process anchor at expression end
- pattern.replace(QRegExp(QL1S("\\\\\\|$")), QL1S("$"));
-
- // replace wildcards by .*
- pattern.replace(QRegExp(QL1S("\\\\\\*")), QL1S(".*"));
-
- // Finally, return...
- return pattern;
+ m_implementation = QSharedPointer<AdBlockRuleImpl>(new AdBlockRuleFallbackImpl(filter));
}