From 228c6256ae82a8c8cc859afeb858a6ad400cb757 Mon Sep 17 00:00:00 2001 From: Alexey Date: Sun, 29 Mar 2020 12:33:21 +0300 Subject: [PATCH 1/6] Add `select` filter --- nunjucks/src/filters.js | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/nunjucks/src/filters.js b/nunjucks/src/filters.js index 84bffa04..3c59ff37 100644 --- a/nunjucks/src/filters.js +++ b/nunjucks/src/filters.js @@ -2,6 +2,7 @@ var lib = require('./lib'); var r = require('./runtime'); +var tests = require('./tests'); var exports = module.exports = {}; @@ -272,6 +273,20 @@ function rejectattr(arr, attr) { exports.rejectattr = rejectattr; +function select(arr, testName = 'truthy', secondArg) { + const test = tests[testName]; + + return arr.filter(function applyToTest(item) { + if (test) { + return test(item, secondArg); + } + + return tests.truthy(item); + }); +} + +exports.select = select; + function selectattr(arr, attr) { return arr.filter((item) => !!item[attr]); } From 75ee50eedb358e3cefbfcf9370b554ff7b88af48 Mon Sep 17 00:00:00 2001 From: Alexey Date: Sun, 29 Mar 2020 12:40:51 +0300 Subject: [PATCH 2/6] Remove conditional --- nunjucks/src/filters.js | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/nunjucks/src/filters.js b/nunjucks/src/filters.js index 3c59ff37..c91a0e49 100644 --- a/nunjucks/src/filters.js +++ b/nunjucks/src/filters.js @@ -274,14 +274,10 @@ function rejectattr(arr, attr) { exports.rejectattr = rejectattr; function select(arr, testName = 'truthy', secondArg) { - const test = tests[testName]; + const test = tests[testName] || tests.truthy; return arr.filter(function applyToTest(item) { - if (test) { - return test(item, secondArg); - } - - return tests.truthy(item); + return test(item, secondArg); }); } From 4b9c7872dc0e67513e204b1125b33d2baa2354b9 Mon Sep 17 00:00:00 2001 From: Alexey Date: Sun, 29 Mar 2020 13:04:48 +0300 Subject: [PATCH 3/6] Add tests --- tests/filters.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/tests/filters.js b/tests/filters.js index 00e7d3c9..c21900dc 100644 --- a/tests/filters.js +++ b/tests/filters.js @@ -504,6 +504,22 @@ finish(done); }); + it('select', function(done) { + var context = { + numbers: [0, 1, 2, 3, 4, 5] + }; + + equal('{{ numbers | select("odd") | join }}', context, '135'); + + equal('{{ numbers | select("even") | join }}', context, '024'); + + equal('{{ numbers | select("divisibleby", 3) | join }}', context, '03'); + + equal('{{ numbers | select() | join }}', context, '12345'); + + finish(done); + }); + it('selectattr', function(done) { var foods = [{ tasty: true From 3a821668b913c1deb6052b0832f80782c67d71b6 Mon Sep 17 00:00:00 2001 From: Alexey Date: Sun, 29 Mar 2020 14:22:08 +0300 Subject: [PATCH 4/6] Add docs for `select` filter --- docs/templating.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/docs/templating.md b/docs/templating.md index 9f4698ec..fcae50bc 100644 --- a/docs/templating.md +++ b/docs/templating.md @@ -1572,6 +1572,33 @@ escaping enabled this variable will not be escaped. foo http://www.example.com/ bar ``` +### select + +Filters a sequence of objects by applying a test to each object, and only +selecting the objects with the test succeeding. + +If no test is specified, each object will be evaluated as a boolean. + +**Input** + +```jinja +{% set numbers=[0, 1, 2, 3, 4, 5] %} + +{{ numbers | select("odd") | join }} +{{ numbers | select("even") | join }} +{{ numbers | select("divisibleby", 3) | join }} +{{ numbers | select() | join }} +``` + +**Output** + +```jinja +135 +024 +03 +12345 +``` + ### selectattr (only the single-argument form) Filter a sequence of objects by applying a test to the specified attribute From 5bc5a189fc9c0c341d30101ad60a422dfc74c79b Mon Sep 17 00:00:00 2001 From: Alexey Date: Sun, 29 Mar 2020 14:22:50 +0300 Subject: [PATCH 5/6] Add entry to changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9402d42d..ca2c3b89 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ Changelog ========= +* Add [`select` filter](https://mozilla.github.io/nunjucks/templating.html#select). + 3.2.1 (Mar 17 2020) ------------------- * Replace yargs with commander to reduce number of dependencies. Merge of From 00f1922cd047967338a8f133ca8d2df8bd4517d0 Mon Sep 17 00:00:00 2001 From: Alexey Date: Mon, 30 Mar 2020 01:40:25 +0300 Subject: [PATCH 6/6] Get test from current context --- nunjucks/src/filters.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/nunjucks/src/filters.js b/nunjucks/src/filters.js index c91a0e49..5875dffc 100644 --- a/nunjucks/src/filters.js +++ b/nunjucks/src/filters.js @@ -2,7 +2,6 @@ var lib = require('./lib'); var r = require('./runtime'); -var tests = require('./tests'); var exports = module.exports = {}; @@ -274,10 +273,11 @@ function rejectattr(arr, attr) { exports.rejectattr = rejectattr; function select(arr, testName = 'truthy', secondArg) { - const test = tests[testName] || tests.truthy; + const context = this; + const test = context.env.getTest(testName); return arr.filter(function applyToTest(item) { - return test(item, secondArg); + return test.call(context, item, secondArg); }); }