diff options
Diffstat (limited to 'lib/urlfilter/matcher.h')
-rw-r--r-- | lib/urlfilter/matcher.h | 109 |
1 files changed, 0 insertions, 109 deletions
diff --git a/lib/urlfilter/matcher.h b/lib/urlfilter/matcher.h deleted file mode 100644 index 6696958..0000000 --- a/lib/urlfilter/matcher.h +++ /dev/null @@ -1,109 +0,0 @@ -/* - * This file is part of smolbote. It's copyrighted by the contributors recorded - * in the version control history of the file, available from its original - * location: https://neueland.iserlohn-fortress.net/gitea/aqua/smolbote - * - * SPDX-License-Identifier: GPL-3.0 - */ - -#ifndef SMOLBOTE_URLFILTER_MATCHER -#define SMOLBOTE_URLFILTER_MATCHER - -#include <QUrl> -#include <QString> -#include <utility> -#include <QRegularExpression> -#include <QStringMatcher> -#include <QWebEngineUrlRequestInfo> - -/** An interface class so we can use templated ContentsMatcher interchangeably - */ -class Matcher -{ -public: - virtual ~Matcher() = default; - - virtual void setCaseSensitive(bool matchCase) = 0; - virtual bool hasMatch(const QString &where) const = 0; -}; - -template <typename T> -class ContentsMatcher : public Matcher -{ -public: - ContentsMatcher(const QString &pattern, UrlFilter::MatchType type) - : patternLength(pattern.length()) - , matchType(type) - { - if constexpr(std::is_same_v<T, QRegularExpression>) { - matcher.setPatternOptions(matcher.patternOptions() | QRegularExpression::CaseInsensitiveOption); - matcher.setPattern(pattern); - } else if constexpr(std::is_same_v<T, QStringMatcher>) { - matcher.setCaseSensitivity(Qt::CaseInsensitive); - matcher.setPattern(pattern); - } else if constexpr(std::is_same_v<T, QString>) { - matcher = QUrl::fromUserInput(pattern).host(); - } - } - ~ContentsMatcher() = default; - - void setCaseSensitive(bool matchCase) override - { - if constexpr(std::is_same_v<T, QRegularExpression>) { - auto options = matcher.patternOptions(); - options.setFlag(QRegularExpression::CaseInsensitiveOption, !matchCase); - matcher.setPatternOptions(options); - - } else if constexpr(std::is_same_v<T, QStringMatcher>) { - matcher.setCaseSensitivity(matchCase ? Qt::CaseSensitive : Qt::CaseInsensitive); - } - } - - bool hasMatch(const QString &where) const override - { - if constexpr(std::is_same_v<T, QStringMatcher>) { - switch (matchType) { - case UrlFilter::InvalidMatch: - case UrlFilter::RegularExpressionMatch: - case UrlFilter::DomainMatch: - qWarning("ContentsMatcher is a String Matcher, but not doing string matching!"); - return false; - - case UrlFilter::StringContains: - return (matcher.indexIn(where) != -1); - - case UrlFilter::StringStartsWith: - return (matcher.indexIn(where) == 0); - - case UrlFilter::StringEndsWith: - return (matcher.indexIn(where) == where.length() - patternLength); - - case UrlFilter::StringEquals: - return (matcher.indexIn(where) == 0) && (patternLength == where.length()); - } - - } else if constexpr(std::is_same_v<T, QRegularExpression>) { - if(matchType != UrlFilter::RegularExpressionMatch) - qWarning("ContentsMatcher is a regular expression, but not doing a regular expression match!"); - return matcher.match(where).hasMatch(); - } else if constexpr(std::is_same_v<T, QString>) { - // TODO: fix - if(matchType == UrlFilter::DomainMatch) { -// qDebug("matching %s", qUtf8Printable(QUrl(where).host())); - return QUrl(where).host().endsWith(matcher); - } else - return matcher == where; - } - - qWarning("Matcher has no backend, returning false"); - return false; - } - -private: - const int patternLength; - const UrlFilter::MatchType matchType; - T matcher; -}; - -#endif // SMOLBOTE_URLFILTER_MATCHER - |