From dbb51640d967f7857ceb70b5b697e089085b7c6b Mon Sep 17 00:00:00 2001 From: Maximilian Hils Date: Thu, 11 Dec 2014 16:35:50 +0100 Subject: web: add filter grammar --- web/src/js/filt/filt.pegjs | 93 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 web/src/js/filt/filt.pegjs (limited to 'web/src') 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 -- cgit v1.2.3