From 300c3710c688fbc4273db08669b974855903855c Mon Sep 17 00:00:00 2001 From: harttle Date: Sun, 23 Oct 2016 00:11:22 +0800 Subject: [PATCH] feature: if the provided date is 'now', create a date (#14) --- filters.js | 10 ++++++---- src/scope.js | 6 ++++-- src/util/underscore.js | 5 +++++ test/filters.js | 20 ++++++++++++++------ test/util/underscore.js | 17 +++++++++++++++++ 5 files changed, 46 insertions(+), 12 deletions(-) create mode 100644 src/util/underscore.js create mode 100644 test/util/underscore.js diff --git a/filters.js b/filters.js index 9ddf0712b..727459a76 100644 --- a/filters.js +++ b/filters.js @@ -1,5 +1,5 @@ -//const strftime = require('strftime').timezone(-(new Date()).getTimezoneOffset()); const strftime = require('./src/strftime.js'); +const _ = require('./src/util/underscore.js'); module.exports = function(liquid) { liquid.registerFilter('abs', v => Math.abs(v)); @@ -8,8 +8,10 @@ module.exports = function(liquid) { stringify(str).charAt(0).toUpperCase() + str.slice(1)); liquid.registerFilter('ceil', v => Math.ceil(v)); - //liquid.registerFilter('date', (v, arg) => strftime(arg, v)); - liquid.registerFilter('date', (v, arg) => strftime(v, arg)); + liquid.registerFilter('date', (v, arg) => { + if (v === 'now') v = new Date(); + return strftime(v, arg); + }); liquid.registerFilter('default', (v, arg) => arg || v); liquid.registerFilter('divided_by', (v, arg) => Math.floor(v / arg)); @@ -108,7 +110,7 @@ function getMaxFixed(l, r) { return Math.max(getFixed(l), getFixed(r)); } -function stringify(obj){ +function stringify(obj) { obj = obj || ""; return obj + ''; } diff --git a/src/scope.js b/src/scope.js index 84c6d1f77..3741ebe3a 100644 --- a/src/scope.js +++ b/src/scope.js @@ -1,3 +1,5 @@ +const _ = require('./util/underscore.js'); + var Scope = { safeGet: function(str) { var i; @@ -41,7 +43,7 @@ var Scope = { }; function setPropertyByPath(obj, path, val) { - if (path instanceof String || typeof path === 'string') { + if (_.isString(path)) { var paths = path.replace(/\[/g, '.').replace(/\]/g, '').split('.'); for (var i = 0; i < paths.length; i++) { var key = paths[i]; @@ -58,7 +60,7 @@ function setPropertyByPath(obj, path, val) { } function getPropertyByPath(obj, path) { - if (path instanceof String || typeof path === 'string') { + if (_.isString(path)) { var paths = path.replace(/\[/g, '.').replace(/\]/g, '').split('.'); paths.forEach(p => obj = obj && obj[p]); return obj; diff --git a/src/util/underscore.js b/src/util/underscore.js new file mode 100644 index 000000000..d558e25f3 --- /dev/null +++ b/src/util/underscore.js @@ -0,0 +1,5 @@ +function isString(value){ + return value instanceof String || typeof value === 'string'; +} + +exports.isString = isString; diff --git a/test/filters.js b/test/filters.js index c8d0768c7..370c16355 100644 --- a/test/filters.js +++ b/test/filters.js @@ -1,8 +1,9 @@ const chai = require("chai"); -const chaiAsPromised = require("chai-as-promised"); +const expect = chai.expect; +chai.use(require("chai-as-promised")); + var liquid = require('..')(), ctx; -chai.use(chaiAsPromised); function test(src, dst) { ctx = { @@ -19,7 +20,7 @@ function test(src, dst) { category: 'bar' }] }; - return liquid.parseAndRender(src, ctx).should.eventually.equal(dst); + return expect(liquid.parseAndRender(src, ctx)).to.eventually.equal(dst); } describe('filters', function() { @@ -36,9 +37,16 @@ describe('filters', function() { it('should support ceil 3', () => test('{{ "3.5" | ceil }}', '4')); it('should support ceil 4', () => test('{{ 183.357 | ceil }}', '184')); - it('should support date: %a %b %d %Y', function() { - var str = ctx.date.toDateString(); - return test('{{ date | date:"%a %b %d %Y"}}', str); + describe('date', function(){ + it('should support %a %b %d %Y', function() { + var str = ctx.date.toDateString(); + return test('{{ date | date:"%a %b %d %Y"}}', str); + }); + it('should support "now"', function() { + var year = (new Date()).getFullYear(); + var src = '{{ "now" | date: "%Y"}}'; + return expect(liquid.parseAndRender(src)).to.eventually.match(/\d{4}/); + }); }); it('should support default', () => test('{{false |default: "a"}}', 'a')); diff --git a/test/util/underscore.js b/test/util/underscore.js new file mode 100644 index 000000000..83a622acd --- /dev/null +++ b/test/util/underscore.js @@ -0,0 +1,17 @@ +const chai = require("chai"); +const expect = chai.expect; +const _ = require('../../src/util/underscore.js'); + +describe('util/underscore', function() { + describe('.isString()', function(){ + it('should return true for literal string', function(){ + expect(_.isString('foo')).to.be.true; + }); + it('should return true String instance', function(){ + expect(_.isString(new String('foo'))).to.be.true; + }); + it('should return false for 123 ', function(){ + expect(_.isString(123)).to.be.false; + }); + }); +});