41 rx.setPatternSyntax(QRegExp::Wildcard);
44 for (
int p = 0; p < wcStr.length(); ++p) {
46 if (c == QLatin1Char(
'?'))
47 out += QLatin1String(
"[?]");
48 else if (c == QLatin1Char(
'['))
49 out += QLatin1String(
"[[]");
50 else if (c == QLatin1Char(
'\\'))
51 out += QLatin1String(
"[\\]");
62 QString filter = filterStr.trimmed();
63 if (filter.isEmpty()) {
68 const QChar firstChar = filter.at(0);
69 if (firstChar == QLatin1Char(
'[') || firstChar == QLatin1Char(
'!') || firstChar == QLatin1Char(
'#') || filter.contains(QLatin1Char(
'#')))
73 if (filter.startsWith(QLatin1String(
"@@"))) {
78 bool hadOptions =
false;
79 int dollar = filter.lastIndexOf(QLatin1Char(
'$'));
82 if (!filter.startsWith(QLatin1Char(
'/')) || !filter.endsWith(QLatin1Char(
'/'))) {
83 filter = filter.mid(0, dollar);
89 if (filter.length() > 2 && filter.startsWith(QLatin1Char(
'/')) && filter.endsWith(QLatin1Char(
'/'))) {
94 QString inside = filter.mid(1, filter.length()-2);
103 if (filter.length() < 2 || filter.contains(QLatin1Char(
'|')) || filter.contains(QLatin1Char(
'^'))) {
109 int last = filter.length() - 1;
111 while (first < filter.length() && filter[first] == QLatin1Char(
'*'))
114 while (last >= 0 && filter[last] == QLatin1Char(
'*'))
118 filter = QLatin1String(
"*");
120 filter = filter.mid(first, last - first + 1);
123 int aPos = filter.indexOf(
'*');
132 reFilters.append(rx);
146 for (
int c = 0; c < reFilters.size(); ++c)
148 if (url.contains(reFilters[c]))
159 if (stringFiltersMatcher.
isMatched(url, &by))
162 for (
int c = 0; c < reFilters.size(); ++c)
164 if (url.contains(reFilters[c]))
166 by = reFilters[c].pattern();
177 stringFiltersMatcher.
clear();
185 shortStringFilters.append(
pattern);
190 int ind = stringFilters.size() - 1;
199 for (
int k = len - 8; k < len; ++k)
203 WTF::HashMap<int, QVector<int> >::iterator it = stringFiltersHash.find(current + 1);
204 if (it == stringFiltersHash.end()) {
207 stringFiltersHash.add(current + 1,
list);
208 fastLookUp.setBit(current);
210 it->second.append(
ind);
217 rePrefixes.append(
prefix);
218 reFilters.append(rx);
219 int index = -rePrefixes.size();
222 for (
int k = 0; k < 8; ++k)
226 WTF::HashMap<int, QVector<int> >::iterator it = stringFiltersHash.find(current + 1);
227 if (it == stringFiltersHash.end()) {
230 stringFiltersHash.add(current + 1,
list);
231 fastLookUp.setBit(current);
233 it->second.append(index);
240 for (
int i = 0; i < shortStringFilters.size(); ++i) {
241 if (str.contains(shortStringFilters[i]))
243 if (by != 0) *by = shortStringFilters[i];
248 int len = str.length();
254 for (k = 0; k < 8 && k < len; ++k)
255 current = (current *
HASH_P + str[k].unicode()) %
HASH_Q;
257 WTF::HashMap<int, QVector<int> >::const_iterator hashEnd = stringFiltersHash.end();
259 for (k = 7; k < len; ++k, current =
next) {
265 if (!fastLookUp.testBit(current))
269 WTF::HashMap<int, QVector<int> >::const_iterator it = stringFiltersHash.find(current + 1);
273 for (
int j = 0; j < it->second.size(); ++j) {
274 int index = it->second[j];
277 int flen = stringFilters[index].length();
278 if (k - flen + 1 >= 0 && stringFilters[index] == str.midRef(k - flen + 1 , flen))
280 if (by != 0) *by = stringFilters[index];
285 int flen = rePrefixes[index].length();
286 if (k - 8 + flen < len && rePrefixes[index] == str.midRef(k - 7, flen))
288 int remStart = k - 7 + flen;
289 QString remainder = QString::fromRawData(str.unicode() + remStart,
290 str.length() - remStart);
291 if (reFilters[index].exactMatch(remainder)) {
292 if (by != 0) *by = rePrefixes[index]+reFilters[index].pattern();
306 stringFilters.clear();
307 shortStringFilters.clear();
310 stringFiltersHash.clear();
311 fastLookUp.resize(
HASH_Q);
312 fastLookUp.fill(0, 0,
HASH_Q);
void addFilter(const QString &filter)
QString urlMatchedBy(const QString &url)
bool isUrlMatched(const QString &url)
bool isMatched(const QString &str, QString *by=0) const
void addWildedString(const QString &prefix, const QRegExp &rx)
void addString(const QString &pattern)
QString pattern(Mode mode=Reading)
QStringList list(const QString &fileClass)
KAction * next(const QObject *recvr, const char *slot, QObject *parent)
static QDebug & ind(const QDebug &dbgIn, int ind)
static QRegExp fromAdBlockWildcard(const QString &wcStr)