diff --git a/core/modules/filters/listops.js b/core/modules/filters/listops.js new file mode 100644 index 000000000..8d22b052f --- /dev/null +++ b/core/modules/filters/listops.js @@ -0,0 +1,79 @@ +/*\ +title: $:/core/modules/filters/listops.js +type: application/javascript +module-type: filteroperator + +Filter operator for manipulating lists + +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +/* +Export our filter function +*/ +exports.reverse = function(source,operator,options) { + var results = []; + // Iterate through the source tiddlers + if($tw.utils.isArray(source)) { + $tw.utils.each(source,function(title) { + results.unshift(title); + }); + } else { + $tw.utils.each(source,function(element,title) { + results.unshift(title); + }); + } + return results; +}; + +exports.first = function(source,operator,options) { + var results = []; + var count = operator.operand || 1; + // Iterate through the source tiddlers + if($tw.utils.isArray(source)) { + results = source.slice(0, Math.min(count, source.length)); + } else { + for(var title in source) { + if(count-- < 1) break; + results.push(title); + }; + } + return results; +}; + +exports.last = function(source,operator,options) { + var results = []; + var count = operator.operand || 1; + // Iterate through the source tiddlers + if($tw.utils.isArray(source)) { + results = source.slice(-count); + } else { + for(var title in source) { + results.push(title); + }; + results = results.slice(-count); + } + return results; +}; + +exports.rest = function(source,operator,options) { + var results = []; + var count = operator.operand || 1; + // Iterate through the source tiddlers + if($tw.utils.isArray(source)) { + results = source.slice(count); + } else { + for(var title in source) { + if(--count < 0) { + results.push(title); + } + }; + } + return results; +}; + +})(); diff --git a/editions/tw5.com/tiddlers/concepts/TiddlerFilters.tid b/editions/tw5.com/tiddlers/concepts/TiddlerFilters.tid index ec71c942d..00d3f0dc0 100644 --- a/editions/tw5.com/tiddlers/concepts/TiddlerFilters.tid +++ b/editions/tw5.com/tiddlers/concepts/TiddlerFilters.tid @@ -57,6 +57,10 @@ A filter string consists of one or more runs of filter operators that each look * ''sameday'': selects all the tiddlers falling into the same day as the provided date in the specified date field * ''fields'': returns the names of the fields present on the selected tiddlers * ''search'': returns all tiddlers that contain the specified text +* ''reverse'': reverses the list +* ''first'': selects the first tiddler of the list (or the first n if the operand is n) +* ''last'': selects the last tiddler of the list (or the last n if the operand is n) +* ''rest'': selects all but the first tiddler of the list (or all but the first n if the operand is n) An operator can be negated with by preceding it with `!`, for example `[!tag[Tommy]]` selects the tiddlers that are not tagged with `Tommy`.