@jeli/compiler-cli
Version:
jeli compiler for frontend development
88 lines (78 loc) • 2.11 kB
JavaScript
const helper = require('@jeli/cli/lib/utils');
const delimeter = ['${', '}'];
const defaultTemplateExp = new RegExp(escapeRegExp(delimeter[0]) + '([\\s\\S]*?)' + escapeRegExp(delimeter[1]), 'g');;
/**
* set delimeter
*/
function escapeRegExp(s) {
return s.replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1');
}
/**
*
* @param {*} delimeter
*/
exports.getDelimeter = () => defaultTemplateExp;
/**
*
* @param {*} ast
*/
exports.parser = (ast, pipesProvider) => {
ast = this.getTemplateKeys(ast);
var binding = [ast.data];
if (ast.exprs.length) {
var once = false;
binding.push(ast.exprs.map((key, idx) => {
once = key.charAt(0) === ":";
if (once) {
key = key.slice(1);
}
return [delimeter.join(idx), exports.removeFilters(key, pipesProvider)];
}));
binding.push(once);
}
return binding;
}
/**
*
* @param {*} data
*/
exports.getTemplateKeys = (data) => {
const exprs = [];
let idx = 0;
try {
data = data.replace(defaultTemplateExp, (match, key) => {
exprs.push(key);
return delimeter.join(idx++);
});
} catch (e) {
throw new Error(`unable to parse template ${data}`);
}
return {
data,
exprs
};
};
/**
* remove filters from string
* @param {*} key
*/
exports.removeFilters = (key, pipesProvider) => {
var filter = { prop: "" };
var hasFilter = helper.removeSingleOperand(key, '[|]', '^', 'g').split('^');
filter.prop = helper.simpleArgumentParser(hasFilter[0].trim());
if (hasFilter && hasFilter.length > 1) {
filter.args = [];
filter.fns = [];
//check if filter has additional requirement;
//useful to extend filter value
//@sample : dateTime filter
var AllFilters = hasFilter.slice(1);
for (var i in AllFilters) {
pipesProvider(AllFilters[i].trim(), filter);
}
}
return filter;
};
exports.hasTemplateBinding = function(template) {
return defaultTemplateExp.test(template);
}