aboutsummaryrefslogtreecommitdiffstats
path: root/web/src
diff options
context:
space:
mode:
authorMaximilian Hils <git@maximilianhils.com>2014-12-11 16:35:50 +0100
committerMaximilian Hils <git@maximilianhils.com>2014-12-11 16:35:50 +0100
commitdbb51640d967f7857ceb70b5b697e089085b7c6b (patch)
tree9cb00a745cf43d37ae47137448d2ab119fb8ec9f /web/src
parent93e928dec4d1004d4f983ff343569f6966db9675 (diff)
downloadmitmproxy-dbb51640d967f7857ceb70b5b697e089085b7c6b.tar.gz
mitmproxy-dbb51640d967f7857ceb70b5b697e089085b7c6b.tar.bz2
mitmproxy-dbb51640d967f7857ceb70b5b697e089085b7c6b.zip
web: add filter grammar
Diffstat (limited to 'web/src')
-rw-r--r--web/src/js/filt/filt.pegjs93
1 files changed, 93 insertions, 0 deletions
diff --git a/web/src/js/filt/filt.pegjs b/web/src/js/filt/filt.pegjs
new file mode 100644
index 00000000..06e2ecb3
--- /dev/null
+++ b/web/src/js/filt/filt.pegjs
@@ -0,0 +1,93 @@
+// PEG.js filter rules - see http://pegjs.majda.cz/online
+
+/* Explain Filter */
+{
+ var or = function(first, second) {
+ return first + " or " + second;
+ };
+ var and = function(first, second) {
+ return first + " and " + second;
+ };
+ var not = function(expr) {
+ return "not " + expr;
+ };
+ var binding = function(expr) {
+ return "(" + expr + ")";
+ }
+ var assetFilter = "is asset";
+ var trueFilter = true;
+ var falseFilter = false;
+ var bodyFilter = function(s) {
+ return "body ~= '" + s + "'";
+ }
+ var urlFilter = function(s) {
+ return "url ~= '" + s + "'";
+ }
+}
+
+start "filter expression"
+ = __ orExpr:OrExpr __ { return orExpr; }
+
+ws "whitespace" = [ \t\n\r]
+cc "control character" = [|&!()~"]
+__ "optional whitespace" = ws*
+
+OrExpr
+ = first:AndExpr __ "|" __ second:OrExpr
+ { return or(first, second); }
+ / AndExpr
+
+AndExpr
+ = first:NotExpr __ "&" __ second:AndExpr
+ { return and(first, second); }
+ / first:NotExpr ws+ second:AndExpr
+ { return and(first, second); }
+ / NotExpr
+
+NotExpr
+ = "!" __ expr:NotExpr
+ { return not(expr); }
+ / BindingExpr
+
+BindingExpr
+ = "(" __ expr:OrExpr __ ")"
+ { return binding(orExpr); }
+ / Expr
+
+Expr
+ = NullaryExpr
+ / UnaryExpr
+
+NullaryExpr
+ = BooleanLiteral
+ / "~a" { return assetFilter; };
+
+BooleanLiteral
+ = "true" { return trueFilter; }
+ / "false" { return falseFilter; }
+
+UnaryExpr
+ = "~b" ws+ s:StringLiteral { return bodyFilter(s); }
+ / s:StringLiteral { return urlFilter(s); }
+
+StringLiteral "string"
+ = '"' chars:DoubleStringChar* '"' { return chars.join(""); }
+ / "'" chars:SingleStringChar* "'" { return chars.join(""); }
+ / !cc chars:UnquotedStringChar+ { return chars.join(""); }
+
+DoubleStringChar
+ = !["\\] char:. { return char; }
+ / "\\" char:EscapeSequence { return char; }
+
+SingleStringChar
+ = !['\\] char:. { return char; }
+ / "\\" char:EscapeSequence { return char; }
+
+UnquotedStringChar
+ = !ws char:. { return char; }
+
+EscapeSequence
+ = ['"\\]
+ / "n" { return "\n"; }
+ / "r" { return "\r"; }
+ / "t" { return "\t"; } \ No newline at end of file