kstpl
Version:
Ksike Template Engine
56 lines (53 loc) • 2.06 kB
JavaScript
const Driver = require('../Driver');
class Str extends Driver {
/**
* @description Interpolate all the options into data string
* @param {String} content
* @param {Object} [params]
* @param {String} [params.flow]
* @param {Object} [options]
* @param {String} [options.flow]
* @param {String} [options.delimiter]
* @param {String} [options.openDelimiter]
* @param {String} [options.closeDelimiter]
* @param {String} [options.escape]
* @param {Boolean} [options.deep]
* @returns {String}
*/
compile(content, params = {}, options = {}) {
function rex(val, opt = "g") {
try {
return new RegExp(val, opt);
} catch (e) {
return val;
}
}
try {
const deep = options?.deep ?? this.deep;
const open = options?.openDelimiter || this.openDelimiter || "{{";
const close = options?.closeDelimiter || this.closeDelimiter || "}}";
if (params) {
for (let i in params) {
if (!rex(open + ".*" + close).test(content)) {
break;
}
let value = params[i];
if (deep && rex(open + ".*" + close).test(value) && rex(open + i + close).test(content)) {
value = this.compile(value, params, options);
}
content = content.replace(rex(open + i + close), value);
}
}
return options?.escape || options?.escape === undefined ? content.replace(/[\r\n]/g, "") : content;
} catch (error) {
this.logger?.error({
flow: params?.flow || options?.flow,
src: "KsTpl:Str:compile",
error: { message: error?.message || error, stack: error?.stack },
data: { content, params, options }
});
return null;
}
}
}
exports = module.exports = Str;