From b652238650d57bb573036867c1be1520166ba9d6 Mon Sep 17 00:00:00 2001 From: Stephan Hradek Date: Wed, 1 Jan 2014 22:38:08 +0100 Subject: [PATCH 1/2] fixed issue #241 - created first, last, rest and reverse filter functions --- core/modules/filters/listops.js | 79 +++++++++++++++++++ .../tiddlers/concepts/TiddlerFilters.tid | 4 + 2 files changed, 83 insertions(+) create mode 100644 core/modules/filters/listops.js 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`. From 103f4f6637238d48a0a14922efd203ecc7f19230 Mon Sep 17 00:00:00 2001 From: Stephan Hradek Date: Sat, 4 Jan 2014 00:01:17 +0100 Subject: [PATCH 2/2] added some more filters --- core/modules/filters/listops.js | 37 +++++++++++++++++++ .../tiddlers/concepts/TiddlerFilters.tid | 6 +++ 2 files changed, 43 insertions(+) diff --git a/core/modules/filters/listops.js b/core/modules/filters/listops.js index 8d22b052f..2c8e36631 100644 --- a/core/modules/filters/listops.js +++ b/core/modules/filters/listops.js @@ -76,4 +76,41 @@ exports.rest = function(source,operator,options) { return results; }; +exports.butfirst = exports.rest; +exports.bf = exports.rest; + +exports.butlast = 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,-count); + } else { + for(var title in source) { + results.push(title); + }; + results = results.slice(0,-count); + } + return results; +}; +exports.bl = exports.butlast; + +exports.nth = 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-1,count); + } else { + for(var title in source) { + --count; + if(count > 0) continue; + if(count < 0) break; + results.push(title); + break; + }; + } + return results; +}; + })(); diff --git a/editions/tw5.com/tiddlers/concepts/TiddlerFilters.tid b/editions/tw5.com/tiddlers/concepts/TiddlerFilters.tid index 00d3f0dc0..36ce724ed 100644 --- a/editions/tw5.com/tiddlers/concepts/TiddlerFilters.tid +++ b/editions/tw5.com/tiddlers/concepts/TiddlerFilters.tid @@ -61,6 +61,12 @@ A filter string consists of one or more runs of filter operators that each look * ''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) +* ''butfirst'': synonym for ''rest'' +* ''bf'': another synonym for ''rest'' +* ''butlast'': selects all but the last tiddler of the list (or all but the last n if the operand is n) +* ''bl'': another synonym for ''butlast'' +* ''nth'': selects the n-th tiddler of the list. Defaults to n = 1. + An operator can be negated with by preceding it with `!`, for example `[!tag[Tommy]]` selects the tiddlers that are not tagged with `Tommy`.