enhancement: robust filters

This commit is contained in:
harttle
2016-10-08 23:55:45 +08:00
parent 8b4b89cf82
commit 0dcdadc971
5 changed files with 53 additions and 41 deletions
+20 -15
View File
@@ -12,7 +12,7 @@ module.exports = function (liquid) {
return v + arg;
});
liquid.registerFilter('capitalize', function (str) {
return (str || '').charAt(0).toUpperCase() + str.slice(1);
return stringify(str).charAt(0).toUpperCase() + str.slice(1);
});
liquid.registerFilter('ceil', function (v) {
return Math.ceil(v);
@@ -42,7 +42,7 @@ module.exports = function (liquid) {
};
function escape(str) {
return (str || '').replace(/&|<|>|"|'/g, function (m) {
return stringify(str).replace(/&|<|>|"|'/g, function (m) {
return escapeMap[m];
});
}
@@ -57,7 +57,7 @@ module.exports = function (liquid) {
};
function unescape(str) {
return (str || '').replace(/&(amp|lt|gt|#34|#39);/g, function (m) {
return stringify(str).replace(/&(amp|lt|gt|#34|#39);/g, function (m) {
return unescapeMap[m];
});
}
@@ -77,7 +77,7 @@ module.exports = function (liquid) {
return v[v.length - 1];
});
liquid.registerFilter('lstrip', function (v) {
return (v || '').replace(/^\s+/, '');
return stringify(v).replace(/^\s+/, '');
});
liquid.registerFilter('map', function (arr, arg) {
return arr.map(function (v) {
@@ -106,20 +106,20 @@ module.exports = function (liquid) {
return v.replace(l, '');
});
liquid.registerFilter('replace', function (v, pattern, replacement) {
return (v || '').split(pattern).join(replacement);
return stringify(v).split(pattern).join(replacement);
});
liquid.registerFilter('replace_first', function (v, arg1, arg2) {
return (v || '').replace(arg1, arg2);
return stringify(v).replace(arg1, arg2);
});
liquid.registerFilter('reverse', function (v) {
return (v || '').reverse();
return v.reverse();
});
liquid.registerFilter('round', function (v, arg) {
var amp = Math.pow(10, arg || 0);
return Math.round(v * amp, arg) / amp;
});
liquid.registerFilter('rstrip', function (str) {
return (str || '').replace(/\s+$/, '');
return stringify(str).replace(/\s+$/, '');
});
liquid.registerFilter('size', function (v) {
return v.length;
@@ -128,25 +128,25 @@ module.exports = function (liquid) {
return v.substr(begin, length === undefined ? 1 : length);
});
liquid.registerFilter('sort', function (v, arg) {
return (v || '').sort(arg);
return v.sort(arg);
});
liquid.registerFilter('split', function (v, arg) {
return (v || '').split(arg);
return stringify(v).split(arg);
});
liquid.registerFilter('strip', function (v) {
return (v || '').trim();
return stringify(v).trim();
});
liquid.registerFilter('strip_html', function (v) {
return (v || '').replace(/<\/?\s*\w+\s*\/?>/g, '');
return stringify(v).replace(/<\/?\s*\w+\s*\/?>/g, '');
});
liquid.registerFilter('strip_newlines', function (v) {
return (v || '').replace(/\n/g, '');
return stringify(v).replace(/\n/g, '');
});
liquid.registerFilter('times', function (v, arg) {
return v * arg;
});
liquid.registerFilter('truncate', function (v, l, o) {
v = v || '';
v = stringify(v);
o = o === undefined ? '...' : o;
l = l || 16;
if (v.length <= l) return v;
@@ -170,7 +170,7 @@ module.exports = function (liquid) {
});
});
liquid.registerFilter('upcase', function (str) {
return (str || '').toUpperCase();
return stringify(str).toUpperCase();
});
liquid.registerFilter('url_encode', encodeURIComponent);
};
@@ -184,6 +184,11 @@ function getMaxFixed(l, r) {
return Math.max(getFixed(l), getFixed(r));
}
function stringify(obj) {
obj = obj || "";
return obj + '';
}
function bindFixed(cb) {
return function (l, r) {
var f = getMaxFixed(l, r);
+1 -1
View File
File diff suppressed because one or more lines are too long
+20 -15
View File
@@ -5,7 +5,7 @@ module.exports = function(liquid) {
liquid.registerFilter('abs', v => Math.abs(v));
liquid.registerFilter('append', (v, arg) => v + arg);
liquid.registerFilter('capitalize', str =>
(str || '').charAt(0).toUpperCase() + str.slice(1));
stringify(str).charAt(0).toUpperCase() + str.slice(1));
liquid.registerFilter('ceil', v => Math.ceil(v));
//liquid.registerFilter('date', (v, arg) => strftime(arg, v));
@@ -24,7 +24,7 @@ module.exports = function(liquid) {
};
function escape(str) {
return (str || '').replace(/&|<|>|"|'/g, m => escapeMap[m]);
return stringify(str).replace(/&|<|>|"|'/g, m => escapeMap[m]);
}
liquid.registerFilter('escape', escape);
@@ -37,14 +37,14 @@ module.exports = function(liquid) {
};
function unescape(str) {
return (str || '').replace(/&(amp|lt|gt|#34|#39);/g, m => unescapeMap[m]);
return stringify(str).replace(/&(amp|lt|gt|#34|#39);/g, m => unescapeMap[m]);
}
liquid.registerFilter('escape_once', str => escape(unescape(str)));
liquid.registerFilter('first', v => v[0]);
liquid.registerFilter('floor', v => Math.floor(v));
liquid.registerFilter('join', (v, arg) => v.join(arg));
liquid.registerFilter('last', v => v[v.length - 1]);
liquid.registerFilter('lstrip', v => (v || '').replace(/^\s+/, ''));
liquid.registerFilter('lstrip', v => stringify(v).replace(/^\s+/, ''));
liquid.registerFilter('map', (arr, arg) => arr.map(v => v[arg]));
liquid.registerFilter('minus', bindFixed((v, arg) => v - arg));
liquid.registerFilter('modulo', bindFixed((v, arg) => v % arg));
@@ -54,25 +54,25 @@ module.exports = function(liquid) {
liquid.registerFilter('remove', (v, arg) => v.split(arg).join(''));
liquid.registerFilter('remove_first', (v, l) => v.replace(l, ''));
liquid.registerFilter('replace', (v, pattern, replacement) =>
(v || '').split(pattern).join(replacement));
liquid.registerFilter('replace_first', (v, arg1, arg2) => (v || '').replace(arg1, arg2));
liquid.registerFilter('reverse', v => (v || '').reverse());
stringify(v).split(pattern).join(replacement));
liquid.registerFilter('replace_first', (v, arg1, arg2) => stringify(v).replace(arg1, arg2));
liquid.registerFilter('reverse', v => v.reverse());
liquid.registerFilter('round', (v, arg) => {
var amp = Math.pow(10, arg || 0);
return Math.round(v * amp, arg) / amp;
});
liquid.registerFilter('rstrip', str => (str || '').replace(/\s+$/, ''));
liquid.registerFilter('rstrip', str => stringify(str).replace(/\s+$/, ''));
liquid.registerFilter('size', v => v.length);
liquid.registerFilter('slice', (v, begin, length) =>
v.substr(begin, length === undefined ? 1 : length));
liquid.registerFilter('sort', (v, arg) => (v || '').sort(arg));
liquid.registerFilter('split', (v, arg) => (v || '').split(arg));
liquid.registerFilter('strip', (v) => (v || '').trim());
liquid.registerFilter('strip_html', v => (v || '').replace(/<\/?\s*\w+\s*\/?>/g, ''));
liquid.registerFilter('strip_newlines', v => (v || '').replace(/\n/g, ''));
liquid.registerFilter('sort', (v, arg) => v.sort(arg));
liquid.registerFilter('split', (v, arg) => stringify(v).split(arg));
liquid.registerFilter('strip', (v) => stringify(v).trim());
liquid.registerFilter('strip_html', v => stringify(v).replace(/<\/?\s*\w+\s*\/?>/g, ''));
liquid.registerFilter('strip_newlines', v => stringify(v).replace(/\n/g, ''));
liquid.registerFilter('times', (v, arg) => v * arg);
liquid.registerFilter('truncate', (v, l, o) => {
v = v || '';
v = stringify(v);
o = (o === undefined) ? '...' : o;
l = l || 16;
if (v.length <= l) return v;
@@ -95,7 +95,7 @@ module.exports = function(liquid) {
return true;
});
});
liquid.registerFilter('upcase', str => (str || '').toUpperCase());
liquid.registerFilter('upcase', str => stringify(str).toUpperCase());
liquid.registerFilter('url_encode', encodeURIComponent);
};
@@ -108,6 +108,11 @@ function getMaxFixed(l, r) {
return Math.max(getFixed(l), getFixed(r));
}
function stringify(obj){
obj = obj || "";
return obj + '';
}
function bindFixed(cb) {
return (l, r) => {
var f = getMaxFixed(l, r);
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "shopify-liquid",
"version": "1.2.3",
"version": "1.2.4",
"description": "Liquid template engine in Node.js (Shopify compliant)",
"main": "index.js",
"scripts": {
+11 -9
View File
@@ -1,7 +1,5 @@
const chai = require("chai");
const chaiAsPromised = require("chai-as-promised");
const should = chai.should();
const expect = chai.expect;
var liquid = require('..')(),
ctx;
chai.use(chaiAsPromised);
@@ -14,6 +12,7 @@ function test(src, dst) {
obj: {
foo: 'bar'
},
func: function() {},
posts: [{
category: 'foo'
}, {
@@ -38,7 +37,7 @@ describe('filters', function() {
it('should support ceil 4', () => test('{{ 183.357 | ceil }}', '184'));
it('should support date: %a %b %d %Y', function() {
str = ctx.date.toDateString();
var str = ctx.date.toDateString();
return test('{{ date | date:"%a %b %d %Y"}}', str);
});
@@ -58,12 +57,15 @@ describe('filters', function() {
it('should support escape 2', function() {
return test('{{ "Tetsuro Takara" | escape }}', 'Tetsuro Takara');
});
it('should support excape function', function() {
return test('{{ func | escape }}', 'function () {}');
});
it('should support escape_once 1', () => test('{{ "1 < 2 & 3" | escape_once }}', '1 &lt; 2 &amp; 3'));
it('should support escape_once 2', () => test('{{ "1 &lt; 2 &amp; 3" | escape_once }}', '1 &lt; 2 &amp; 3'));
it('should support split/first', function() {
src = '{% assign my_array = "apples, oranges, peaches, plums" | split: ", " %}' +
var src = '{% assign my_array = "apples, oranges, peaches, plums" | split: ", " %}' +
'{{ my_array | first }}';
return test(src, 'apples');
});
@@ -74,19 +76,19 @@ describe('filters', function() {
it('should support floor 4', () => test('{{ "3.5" | floor }}', '3'));
it('should support join', function() {
src = '{% assign beatles = "John, Paul, George, Ringo" | split: ", " %}' +
var src = '{% assign beatles = "John, Paul, George, Ringo" | split: ", " %}' +
'{{ beatles | join: " and " }}';
return test(src, 'John and Paul and George and Ringo');
});
it('should support split/last', function() {
src = '{% assign my_array = "zebra, octopus, giraffe, tiger" | split: ", " %}' +
var src = '{% assign my_array = "zebra, octopus, giraffe, tiger" | split: ", " %}' +
'{{ my_array|last }}';
return test(src, 'tiger');
});
it('should support lstrip', function() {
src = '{{ " So much room for activities! " | lstrip }}';
var src = '{{ " So much room for activities! " | lstrip }}';
return test(src, 'So much room for activities! ');
});
@@ -103,12 +105,12 @@ describe('filters', function() {
it('should support modulo 3', () => test('{{ 183.357 | modulo: 12 }}', '3.357'));
it('should support string_with_newlines', function() {
src = '{% capture string_with_newlines %}\n' +
var src = '{% capture string_with_newlines %}\n' +
'Hello\n' +
'there\n' +
'{% endcapture %}' +
'{{ string_with_newlines | newline_to_br }}';
dst = '<br />' +
var dst = '<br />' +
'Hello<br />' +
'there<br />';
return test(src, dst);