mirror of
https://github.com/harttle/liquidjs.git
synced 2026-09-15 12:20:40 -07:00
enhancement: robust filters
This commit is contained in:
Vendored
+20
-15
@@ -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);
|
||||
|
||||
Vendored
+1
-1
File diff suppressed because one or more lines are too long
+20
-15
@@ -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
@@ -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
@@ -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 < 2 & 3'));
|
||||
it('should support escape_once 2', () => test('{{ "1 < 2 & 3" | escape_once }}', '1 < 2 & 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);
|
||||
|
||||
Reference in New Issue
Block a user