OLD | NEW |
(Empty) | |
| 1 #include <unordered_map> |
| 2 |
| 3 #include "Filter.h" |
| 4 #include "CommentFilter.h" |
| 5 #include "RegExpFilter.h" |
| 6 #include "ElemHideFilter.h" |
| 7 #include "ElemHideException.h" |
| 8 |
| 9 namespace |
| 10 { |
| 11 std::unordered_map<std::u16string,FilterPtr> knownFilters; |
| 12 |
| 13 void trim_spaces(std::u16string& str) |
| 14 { |
| 15 size_t pos; |
| 16 |
| 17 // Remove leading whitespace |
| 18 pos = str.find_first_not_of(u' '); |
| 19 if (pos > 0) |
| 20 str.erase(0, pos); |
| 21 |
| 22 // Remove trailing whitespace |
| 23 pos = str.find_last_not_of(u' '); |
| 24 if (pos < str.length() - 1) |
| 25 str.erase(pos + 1); |
| 26 } |
| 27 |
| 28 void remove_spaces(std::u16string& str) |
| 29 { |
| 30 for (size_t i = 0, l = str.length(); i < l; ++i) |
| 31 { |
| 32 if (str[i] == u' ') |
| 33 { |
| 34 str.erase(i, 1); |
| 35 --i; |
| 36 --l; |
| 37 } |
| 38 } |
| 39 } |
| 40 } |
| 41 |
| 42 Filter::Filter(const std::u16string& text) |
| 43 { |
| 44 this->text = text; |
| 45 } |
| 46 |
| 47 const std::u16string Filter::Serialize() |
| 48 { |
| 49 return ( |
| 50 u"[Filter]\n" |
| 51 u"text=" + text + u"\n" |
| 52 ); |
| 53 } |
| 54 |
| 55 FilterPtr Filter::FromText(const std::u16string& text) |
| 56 { |
| 57 auto it = knownFilters.find(text); |
| 58 if (it != knownFilters.end()) |
| 59 return it->second; |
| 60 |
| 61 FilterPtr filter = FilterPtr(CommentFilter::Create(text)); |
| 62 if (!filter) |
| 63 filter.reset(ElemHideBase::Create(text)); |
| 64 if (!filter) |
| 65 filter.reset(RegExpFilter::Create(text)); |
| 66 return knownFilters[text] = filter; |
| 67 } |
| 68 |
| 69 const std::u16string Filter::Normalize(const std::u16string& text) |
| 70 { |
| 71 std::u16string result(text); |
| 72 |
| 73 // Remove special characters like line breaks |
| 74 for (size_t i = 0, l = result.length(); i < l; ++i) |
| 75 { |
| 76 if (result[i] < u' ') |
| 77 { |
| 78 result.erase(i, 1); |
| 79 --i; |
| 80 --l; |
| 81 } |
| 82 } |
| 83 |
| 84 trim_spaces(result); |
| 85 |
| 86 { |
| 87 size_t domainsEnd; |
| 88 size_t selectorStart; |
| 89 Filter::Type type = ElemHideBase::Parse(result, &domainsEnd, &selectorStart)
; |
| 90 if (type != Filter::Type::UNKNOWN) |
| 91 { |
| 92 std::u16string domains = result.substr(0, domainsEnd); |
| 93 std::u16string selector = result.substr(selectorStart); |
| 94 remove_spaces(domains); |
| 95 trim_spaces(selector); |
| 96 return domains + ( |
| 97 type == Filter::Type::ELEMHIDEEXCEPTION ? u"#@#" : u"##" |
| 98 ) + selector; |
| 99 } |
| 100 } |
| 101 |
| 102 if (CommentFilter::Parse(result) == Filter::Type::UNKNOWN) |
| 103 remove_spaces(result); |
| 104 return result; |
| 105 } |
OLD | NEW |