twig
Version:
JS port of the Twig templating language.
88 lines (78 loc) • 2.37 kB
JavaScript
// ## twig.tests.js
//
// This file handles expression tests. (is empty, is not defined, etc...)
module.exports = function (Twig) {
'use strict';
Twig.tests = {
empty(value) {
// Handle boolean true
if (value === true) {
return false;
}
// Handle null or undefined
if (value === null || value === undefined) {
return true;
}
// Handler numbers
if (typeof value === 'number') {
return false;
} // Numbers are never "empty"
// Handle strings and arrays
if (value.length > 0) {
return false;
}
// Handle objects
for (const key in value) {
if (Object.hasOwnProperty.call(value, key)) {
return false;
}
}
return true;
},
odd(value) {
return value % 2 === 1;
},
even(value) {
return value % 2 === 0;
},
'divisible by'(value, params) {
return value % params[0] === 0;
},
divisibleby(value, params) {
console.warn('`divisibleby` is deprecated use `divisible by`');
return Twig.tests['divisible by'](value, params);
},
defined(value) {
return value !== undefined;
},
none(value) {
return value === null;
},
null(value) {
return this.none(value); // Alias of none
},
'same as'(value, params) {
return value === params[0];
},
sameas(value, params) {
console.warn('`sameas` is deprecated use `same as`');
return Twig.tests['same as'](value, params);
},
iterable(value) {
return value && (Twig.lib.is('Array', value) || Twig.lib.is('Object', value));
}
/*
Constant ?
*/
};
Twig.test = function (test, value, params) {
if (!Twig.tests[test]) {
throw Twig.Error('Test ' + test + ' is not defined.');
}
return Twig.tests[test](value, params);
};
Twig.test.extend = function (test, definition) {
Twig.tests[test] = definition;
};
return Twig;
};