mirror of
https://github.com/Jermolene/TiddlyWiki5
synced 2024-06-28 08:13:14 +00:00
Allow suffixes for filter runs (#5252)
* Make filter run prefixes extensible * Make filter run prefixes extensible * Support rich suffixes for filter runs * merged conflicts * Pass suffixes to filterrunprefix
This commit is contained in:
parent
ac15334bb0
commit
8203ee06c3
|
@ -137,7 +137,7 @@ exports.parseFilter = function(filterString) {
|
||||||
p = 0, // Current position in the filter string
|
p = 0, // Current position in the filter string
|
||||||
match;
|
match;
|
||||||
var whitespaceRegExp = /(\s+)/mg,
|
var whitespaceRegExp = /(\s+)/mg,
|
||||||
operandRegExp = /((?:\+|\-|~|=|\:(\w+))?)(?:(\[)|(?:"([^"]*)")|(?:'([^']*)')|([^\s\[\]]+))/mg;
|
operandRegExp = /((?:\+|\-|~|=|\:(\w+)(?:\:([\w\:, ]*))?)?)(?:(\[)|(?:"([^"]*)")|(?:'([^']*)')|([^\s\[\]]+))/mg;
|
||||||
while(p < filterString.length) {
|
while(p < filterString.length) {
|
||||||
// Skip any whitespace
|
// Skip any whitespace
|
||||||
whitespaceRegExp.lastIndex = p;
|
whitespaceRegExp.lastIndex = p;
|
||||||
|
@ -162,15 +162,27 @@ exports.parseFilter = function(filterString) {
|
||||||
if(match[2]) {
|
if(match[2]) {
|
||||||
operation.namedPrefix = match[2];
|
operation.namedPrefix = match[2];
|
||||||
}
|
}
|
||||||
|
if(match[3]) {
|
||||||
|
operation.suffixes = [];
|
||||||
|
$tw.utils.each(match[3].split(":"),function(subsuffix) {
|
||||||
|
operation.suffixes.push([]);
|
||||||
|
$tw.utils.each(subsuffix.split(","),function(entry) {
|
||||||
|
entry = $tw.utils.trim(entry);
|
||||||
|
if(entry) {
|
||||||
|
operation.suffixes[operation.suffixes.length -1].push(entry);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if(match[3]) { // Opening square bracket
|
if(match[4]) { // Opening square bracket
|
||||||
p = parseFilterOperation(operation.operators,filterString,p);
|
p = parseFilterOperation(operation.operators,filterString,p);
|
||||||
} else {
|
} else {
|
||||||
p = match.index + match[0].length;
|
p = match.index + match[0].length;
|
||||||
}
|
}
|
||||||
if(match[4] || match[5] || match[6]) { // Double quoted string, single quoted string or unquoted title
|
if(match[5] || match[6] || match[7]) { // Double quoted string, single quoted string or unquoted title
|
||||||
operation.operators.push(
|
operation.operators.push(
|
||||||
{operator: "title", operands: [{text: match[4] || match[5] || match[6]}]}
|
{operator: "title", operands: [{text: match[5] || match[6] || match[7]}]}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
results.push(operation);
|
results.push(operation);
|
||||||
|
@ -280,7 +292,7 @@ exports.compileFilter = function(filterString) {
|
||||||
var filterRunPrefixes = self.getFilterRunPrefixes();
|
var filterRunPrefixes = self.getFilterRunPrefixes();
|
||||||
// Wrap the operator functions in a wrapper function that depends on the prefix
|
// Wrap the operator functions in a wrapper function that depends on the prefix
|
||||||
operationFunctions.push((function() {
|
operationFunctions.push((function() {
|
||||||
var options = {wiki: self};
|
var options = {wiki: self, suffixes: operation.suffixes || []};
|
||||||
switch(operation.prefix || "") {
|
switch(operation.prefix || "") {
|
||||||
case "": // No prefix means that the operation is unioned into the result
|
case "": // No prefix means that the operation is unioned into the result
|
||||||
return filterRunPrefixes["or"](operationSubFunction, options);
|
return filterRunPrefixes["or"](operationSubFunction, options);
|
||||||
|
|
|
@ -18,6 +18,199 @@ describe("general filter prefix tests", function() {
|
||||||
var results = wiki.filterTiddlers("[tag[A]] :nonexistent[tag[B]]");
|
var results = wiki.filterTiddlers("[tag[A]] :nonexistent[tag[B]]");
|
||||||
expect(results).toEqual(["Filter Error: Unknown prefix for filter run"]);
|
expect(results).toEqual(["Filter Error: Unknown prefix for filter run"]);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Test filter run prefix parsing
|
||||||
|
it("should parse filter run prefix suffixes", function() {
|
||||||
|
|
||||||
|
// two runs, one with a named prefix but no suffix
|
||||||
|
expect($tw.wiki.parseFilter("[[Sparkling water]tags[]] :intersection[[Red wine]tags[]]")).toEqual(
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"prefix": "",
|
||||||
|
"operators": [
|
||||||
|
{
|
||||||
|
"operator": "title",
|
||||||
|
"operands": [
|
||||||
|
{
|
||||||
|
"text": "Sparkling water"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"operator": "tags",
|
||||||
|
"operands": [
|
||||||
|
{
|
||||||
|
"text": ""
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"prefix": ":intersection",
|
||||||
|
"operators": [
|
||||||
|
{
|
||||||
|
"operator": "title",
|
||||||
|
"operands": [
|
||||||
|
{
|
||||||
|
"text": "Red wine"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"operator": "tags",
|
||||||
|
"operands": [
|
||||||
|
{
|
||||||
|
"text": ""
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"namedPrefix": "intersection"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
);
|
||||||
|
|
||||||
|
// named prefix with no suffix
|
||||||
|
expect($tw.wiki.parseFilter(":reduce[multiply<accumulator>]")).toEqual(
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"prefix": ":reduce",
|
||||||
|
"operators": [
|
||||||
|
{
|
||||||
|
"operator": "multiply",
|
||||||
|
"operands": [
|
||||||
|
{
|
||||||
|
"variable": true,
|
||||||
|
"text": "accumulator"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"namedPrefix": "reduce"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
);
|
||||||
|
|
||||||
|
//named prefix with one simple suffix
|
||||||
|
expect($tw.wiki.parseFilter(":reduce:1[multiply<accumulator>]")).toEqual(
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"prefix": ":reduce:1",
|
||||||
|
"operators": [
|
||||||
|
{
|
||||||
|
"operator": "multiply",
|
||||||
|
"operands": [
|
||||||
|
{
|
||||||
|
"variable": true,
|
||||||
|
"text": "accumulator"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"namedPrefix": "reduce",
|
||||||
|
"suffixes": [
|
||||||
|
[
|
||||||
|
"1"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
);
|
||||||
|
|
||||||
|
//named prefix with two simple suffixes
|
||||||
|
expect($tw.wiki.parseFilter(":reduce:1:hello[multiply<accumulator>]")).toEqual(
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"prefix": ":reduce:1:hello",
|
||||||
|
"operators": [
|
||||||
|
{
|
||||||
|
"operator": "multiply",
|
||||||
|
"operands": [
|
||||||
|
{
|
||||||
|
"variable": true,
|
||||||
|
"text": "accumulator"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"namedPrefix": "reduce",
|
||||||
|
"suffixes": [
|
||||||
|
[
|
||||||
|
"1"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"hello",
|
||||||
|
]
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
);
|
||||||
|
|
||||||
|
//named prefix with two rich (comma separated) suffixes
|
||||||
|
expect($tw.wiki.parseFilter(":reduce:1,one:hello,there[multiply<accumulator>]")).toEqual(
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"prefix": ":reduce:1,one:hello,there",
|
||||||
|
"operators": [
|
||||||
|
{
|
||||||
|
"operator": "multiply",
|
||||||
|
"operands": [
|
||||||
|
{
|
||||||
|
"variable": true,
|
||||||
|
"text": "accumulator"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"namedPrefix": "reduce",
|
||||||
|
"suffixes": [
|
||||||
|
[
|
||||||
|
"1",
|
||||||
|
"one"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"hello",
|
||||||
|
"there"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
);
|
||||||
|
|
||||||
|
// suffixes with spaces
|
||||||
|
expect($tw.wiki.parseFilter(":reduce: 1, one:hello, there [multiply<accumulator>]")).toEqual(
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"prefix": ":reduce: 1, one:hello, there ",
|
||||||
|
"operators": [
|
||||||
|
{
|
||||||
|
"operator": "multiply",
|
||||||
|
"operands": [
|
||||||
|
{
|
||||||
|
"variable": true,
|
||||||
|
"text": "accumulator"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"namedPrefix": "reduce",
|
||||||
|
"suffixes": [
|
||||||
|
[
|
||||||
|
"1",
|
||||||
|
"one"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"hello",
|
||||||
|
"there"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
);
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
describe("'reduce' and 'intersection' filter prefix tests", function() {
|
describe("'reduce' and 'intersection' filter prefix tests", function() {
|
||||||
|
@ -80,6 +273,10 @@ describe("'reduce' and 'intersection' filter prefix tests", function() {
|
||||||
// Empty input should become empty output
|
// Empty input should become empty output
|
||||||
expect(wiki.filterTiddlers("[tag[non-existent]] :reduce[get[price]multiply{!!quantity}add<accumulator>]").length).toBe(0);
|
expect(wiki.filterTiddlers("[tag[non-existent]] :reduce[get[price]multiply{!!quantity}add<accumulator>]").length).toBe(0);
|
||||||
expect(wiki.filterTiddlers("[tag[non-existent]] :reduce[get[price]multiply{!!quantity}add<accumulator>] :else[[0]]").join(",")).toBe("0");
|
expect(wiki.filterTiddlers("[tag[non-existent]] :reduce[get[price]multiply{!!quantity}add<accumulator>] :else[[0]]").join(",")).toBe("0");
|
||||||
|
|
||||||
|
expect(wiki.filterTiddlers("[tag[non-existent]] :reduce:11,22[get[price]multiply{!!quantity}add<accumulator>] :else[[0]]").join(",")).toBe("0");
|
||||||
|
|
||||||
|
expect(wiki.filterTiddlers("[tag[non-existent]] :reduce:11[get[price]multiply{!!quantity}add<accumulator>] :else[[0]]").join(",")).toBe("0");
|
||||||
});
|
});
|
||||||
|
|
||||||
it("should handle the reduce operator", function() {
|
it("should handle the reduce operator", function() {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user