diff options
author | Benjamin Poulain <benjamin.poulain@nokia.com> | 2010-08-18 03:32:50 +0200 |
---|---|---|
committer | Benjamin Poulain <benjamin.poulain@nokia.com> | 2010-08-18 05:04:39 +0200 |
commit | d9028baf5c8261cbad540893465965730386a1cf (patch) | |
tree | 2c8f21d2d2dcdd1b74f21f146cd8c6094cb155fc /src/adblock/adblockrule.cpp | |
parent | Remove the method pattern() from AdBlockRule (diff) | |
download | rekonq-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.cpp | 77 |
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)); } |