28 #define HASH_Q (17509)
30 #define HASH_MOD (523)
39 static QRegExp fromAdBlockWildcard(
const QString& wcStr) {
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(
"[\\]");
65 QChar firstChar = filter.at(0);
66 if (firstChar == QLatin1Char(
'[') || firstChar == QLatin1Char(
'!') || firstChar == QLatin1Char(
'&') || firstChar == QLatin1Char(
'#') || filter.contains(QLatin1Char(
'#')))
71 int last = filter.length() - 1;
72 if (filter.startsWith(QLatin1String(
"@@")))
76 int dollar = filter.lastIndexOf(QLatin1Char(
'$'));
80 if (first == last && firstChar == QLatin1Char(
'*'))
88 filter = filter.mid(first, last - first + 1);
91 if (filter.length()>2 && filter.startsWith(QLatin1Char(
'/')) && filter.endsWith(QLatin1Char(
'/')))
93 QString inside = filter.mid(1, filter.length()-2);
105 last = filter.length() - 1;
107 while (first < filter.length() && filter[first] == QLatin1Char(
'*'))
110 while (last >= 0 && filter[last] == QLatin1Char(
'*'))
114 filter = QLatin1String(
"*");
116 filter = filter.mid(first, last - first + 1);
119 if (filter.contains(
"*"))
122 int aPos = filter.indexOf(
'*');
124 aPos = filter.length();
126 QRegExp rx = fromAdBlockWildcard(filter.mid(aPos) + QLatin1Char(
'*'));
130 QRegExp rx = fromAdBlockWildcard(filter);
131 reFilters.append(rx);
147 for (
int c = 0; c < reFilters.size(); ++c)
149 if (url.contains(reFilters[c]))
160 if (stringFiltersMatcher.
isMatched(url, &by))
163 for (
int c = 0; c < reFilters.size(); ++c)
165 if (url.contains(reFilters[c]))
167 by = reFilters[c].pattern();
178 stringFiltersMatcher.
clear();
184 if (pattern.length() < 8) {
186 shortStringFilters.append(pattern);
190 stringFilters.append(pattern);
191 int ind = stringFilters.size() - 1;
199 int len = pattern.length();
200 for (
int k = len - 8; k < len; ++k)
201 current = (current *
HASH_P + pattern[k].unicode()) %
HASH_Q;
204 WTF::HashMap<int, QVector<int> >::iterator it = stringFiltersHash.find(current + 1);
205 if (it == stringFiltersHash.end()) {
208 stringFiltersHash.add(current + 1, list);
209 fastLookUp.setBit(current);
211 it->second.append(ind);
218 rePrefixes.append(prefix);
219 reFilters.append(rx);
220 int index = -rePrefixes.size();
223 for (
int k = 0; k < 8; ++k)
224 current = (current *
HASH_P + prefix[k].unicode()) %
HASH_Q;
227 WTF::HashMap<int, QVector<int> >::iterator it = stringFiltersHash.find(current + 1);
228 if (it == stringFiltersHash.end()) {
231 stringFiltersHash.add(current + 1, list);
232 fastLookUp.setBit(current);
234 it->second.append(index);
241 for (
int i = 0; i < shortStringFilters.size(); ++i) {
242 if (str.contains(shortStringFilters[i]))
244 if (by != 0) *by = shortStringFilters[i];
249 int len = str.length();
255 for (k = 0; k < 8 && k < len; ++k)
256 current = (current *
HASH_P + str[k].unicode()) %
HASH_Q;
258 WTF::HashMap<int, QVector<int> >::const_iterator hashEnd = stringFiltersHash.end();
260 for (k = 7; k < len; ++k, current = next) {
266 if (!fastLookUp.testBit(current))
270 WTF::HashMap<int, QVector<int> >::const_iterator it = stringFiltersHash.find(current + 1);
274 for (
int j = 0; j < it->second.size(); ++j) {
275 int index = it->second[j];
278 int flen = stringFilters[index].length();
279 if (k - flen + 1 >= 0 && stringFilters[index] == str.midRef(k - flen + 1 , flen))
281 if (by != 0) *by = stringFilters[index];
286 int flen = rePrefixes[index].length();
287 if (k - 8 + flen < len && rePrefixes[index] == str.midRef(k - 7, flen))
289 int remStart = k - 7 + flen;
290 QString remainder = QString::fromRawData(str.unicode() + remStart,
291 str.length() - remStart);
292 if (reFilters[index].exactMatch(remainder)) {
293 if (by != 0) *by = rePrefixes[index]+reFilters[index].pattern();
307 stringFilters.clear();
308 shortStringFilters.clear();
311 stringFiltersHash.clear();
312 fastLookUp.resize(
HASH_Q);
313 fastLookUp.fill(0, 0,
HASH_Q);
bool isUrlMatched(const QString &url)
void addFilter(const QString &filter)
void addWildedString(const QString &prefix, const QRegExp &rx)
void addString(const QString &pattern)
QString urlMatchedBy(const QString &url)
KAction * next(const QObject *recvr, const char *slot, QObject *parent)
bool isMatched(const QString &str, QString *by=0) const
QStringList list(const QString &fileClass)