Index: compiled/ElemHideBase.cpp |
=================================================================== |
new file mode 100644 |
--- /dev/null |
+++ b/compiled/ElemHideBase.cpp |
@@ -0,0 +1,117 @@ |
+#include <emscripten/bind.h> |
+ |
+#include "ElemHideBase.h" |
+#include "ElemHideFilter.h" |
+#include "ElemHideException.h" |
+ |
+namespace |
+{ |
+ class Scanner |
+ { |
+ private: |
+ const std::wstring& str; |
+ size_t pos; |
+ size_t end; |
+ public: |
+ Scanner(const std::wstring& str) : str(str), pos(0), end(str.length()) {} |
+ |
+ bool done() |
+ { |
+ return pos >= end; |
+ } |
+ |
+ size_t position() |
+ { |
+ return pos - 1; |
+ } |
+ |
+ wchar_t next() |
+ { |
+ return done() ? L'\0' : str[pos++]; |
+ } |
+ }; |
+} |
+ |
+ElemHideBase::ElemHideBase(const std::wstring& text, size_t domainsEnd, |
+ size_t selectorStart) |
+ : ActiveFilter(text) |
+{ |
+} |
+ |
+Filter::Type ElemHideBase::Parse(const std::wstring& text, size_t* domainsEnd, |
+ size_t* selectorStart) |
+{ |
+ Scanner scanner(text); |
+ |
+ // Domains part |
+ loop: |
+ while (!scanner.done()) |
+ { |
+ wchar_t next = scanner.next(); |
+ if (next == L'#') |
+ { |
+ *domainsEnd = scanner.position(); |
+ break; |
+ } |
+ |
+ switch (next) |
+ { |
+ case L'/': |
+ case L'*': |
+ case L'|': |
+ case L'@': |
+ case L'"': |
+ case L'!': |
+ return Type::UNKNOWN; |
+ } |
+ } |
+ |
+ bool exception = false; |
+ wchar_t next = scanner.next(); |
+ if (next == L'@') |
+ { |
+ exception = true; |
+ next = scanner.next(); |
+ } |
+ |
+ if (next != L'#') |
+ return Type::UNKNOWN; |
+ |
+ // Selector part |
+ |
+ // Selector shouldn't be empty |
+ if (scanner.done()) |
+ return Type::UNKNOWN; |
+ |
+ *selectorStart = scanner.position() + 1; |
+ while (!scanner.done()) |
+ { |
+ switch (scanner.next()) |
+ { |
+ case L'{': |
+ case L'}': |
+ return Type::UNKNOWN; |
+ } |
+ } |
+ |
+ return exception ? Type::ELEMHIDEEXCEPTION : Type::ELEMHIDE; |
+} |
+ |
+ElemHideBase* ElemHideBase::Create(const std::wstring& text) |
+{ |
+ size_t domainsEnd; |
+ size_t selectorStart; |
+ Type type = Parse(text, &domainsEnd, &selectorStart); |
+ if (type == Type::UNKNOWN) |
+ return nullptr; |
+ else if (type == Type::ELEMHIDEEXCEPTION) |
+ return new ElemHideException(text, domainsEnd, selectorStart); |
+ else |
+ return new ElemHideFilter(text, domainsEnd, selectorStart); |
+} |
+ |
+EMSCRIPTEN_BINDINGS(elemhidebase) |
+{ |
+ using namespace emscripten; |
+ class_<ElemHideBase,base<ActiveFilter>>("ElemHideBase"); |
+} |