1
0
mirror of https://github.com/Jermolene/TiddlyWiki5 synced 2024-07-03 10:43:16 +00:00
TiddlyWiki5/editions/tw5.com/tiddlers/dev/TiddlerFilter Formal Grammar.tid

80 lines
3.8 KiB
Plaintext

created: 20140210141217955
modified: 20140210141312363
tags: dev
title: TiddlerFilter Formal Grammar
type: text/vnd.tiddlywiki
TiddlerFilters follow a formal grammar:
''<filter-string>'' ::= ''<opt-whitespaces>'' ''<filter-operand>'' | ''<opt-whitespaces>'' ''<filter-operand>'' ''<filter-string>''
Whitespace is matched with javascript "\s+", which matches space, tab, carriage return, new line, vertical tab, and form feed.
''<opt-whitespaces>'' ::= ''<opt-whitespace>'' | ''<opt-whitespace>'' ''<opt-whitespaces>''
''<opt-whitespace>'' ::= " " | "\t" | "0xD" | "0xA" | "0xB" | "0xC"
''<filter-operand>'' ::= ''<opt-operation-prefix>'' ''<string-or-operator-list>''
''<opt-operation-prefix>'' ::= "+" | "-" | ""
''<string-or-operator-list>'' ::= ''<operation>'' | "\"" ''<string>'' "\"" | "'" ''<string>'' "'" | ''<string>''
''<operation>'' ::= "[" ''<operator-list>'' "]"
''<operator-list>'' ::= ''<operator>'' | ''<operator>'' ''<operator-list>''
''<operator>'' ::= ''<opt-operator-prefix>''''<operator>''''<operand>''
''<opt-operator-prefix>'' ::= "!" | ""
''<operator>'' ::= ''<operator-name>'' | ''<operator-name>'' ":" ''<opt-operator-suffix>''
''<operator-name>'' ::= "" | "is" | "has" | "each" | "field" ...
''<opt-operator-suffix>'' ::= ''<string>'' | ""
''<operand>'' ::= "[" ''<search-string>'' "]" | "{" ''<indirect-search-string>'' "}" | ''<regex>''
''<regex>'' ::= "/" ''<string>'' "/" ''<opt-regex-args>''
''<opt-regex-args>'' ::= "(" ''<regex-args>'' ")" | ""
''<regex-args>'' ::= ''<regex-arg>'' | ''<regex-arg>'' ''<regex-args>''
''<regex-arg>'' ::= "m" | "y" | "g" | "i"
''<string>'' ::= ''<string-type-1>'' | ''<string-type-2>'' | ...
At the end of parsing you end up with some or all of:
* ''<opt-operation-prefix>''
* ''<opt-operator-prefix>''
* ''<operator-name>''
* ''<opt-operator-suffix>'', and
* ''<operand>''
These are used differently by the different operators. For example, the field filter operator supports:
* ''<opt-operator-prefix>'' to negate the result
* ''<regex>'' or ''<string>'' operand (note that this must be explicitly supported by each filter operator)
* ''<opt-operator-suffix>'' to specify a fieldname against which to filter
NOTES:
* The ''<string>'' is a terminal that generally supports single- or double- quoted strings which match, respectively, strings of non-single and non-double quotes. Unquoted strings include the extra exclusion of whitespace and square bracket characters.
* In the case where the ''<string-or-operator-list>'' is NOT an ''<operation>'' it is treated as the operand passed to the default operator (see next bullet). It is not parsed as a full ''<operation>''.
* If ''<operator-name>'' is the empty string then it will be set to "title" (i.e. the title filter operator is the default operator)
* Results are collected and each operation is applied in turn. The ''<opt-operation-prefix>'' can be used to specify how the corresponding operation is used. Suppose T is the set of all tiddlers, R0 is the current set of results, and Fx is the xth operation. Then:
** No prefix (""): R0 = R0 U Fx(T) (set union)
** "-": R0 = R0 - Fx(T) (set difference)
** "+": R0 = Fx(R0)
Note that ''<filter-operand>''s are not commutative!
* The parser was simplified by treating regex "/" as a "bracket" of sorts, meaning there could only be a start and end bracket. Thus the regex arguments, like i, are included in parenthesis immediately following the trailing "/".