vtils
Version:
一个面向业务的 JavaScript/TypeScript 实用程序库。
75 lines (73 loc) • 3.33 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
exports.__esModule = true;
exports.StringTemplate = void 0;
var _createForOfIteratorHelperLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/createForOfIteratorHelperLoose"));
var _toSingleLineString = require("./toSingleLineString");
/**
* 字符串模板。
*/
var StringTemplate = exports.StringTemplate = /*#__PURE__*/function () {
function StringTemplate() {}
/**
* 渲染字符串模板。语法:
*
* - 用 `{key}` 直接替换;
* - 用 `{key#10}` 直接替换,取前10个字符省略;
* - 用 `{key:param1,param2}` 执行函数替换;
* - 用 `{{key==='test'?'hi':'hello'}}` 执行代码替换(内部使用 eval 实现,需开启选项里的 `code` 参数)。
*
* @param template 要渲染的模板
* @param data 渲染数据
* @param options 渲染选项
* @returns 返回渲染后字符串
*/
StringTemplate.render = function render(template, data, options) {
var onlyCode = !!(options != null && options.onlyCode);
var enableCode = onlyCode || !!(options != null && options.code);
var beforeReplace = (options == null ? void 0 : options.beforeReplace) || function (v) {
return v;
};
var keys = Object.keys(data);
if (!onlyCode) {
var _loop = function _loop() {
var key = _step.value;
template = typeof data[key] === 'function' ? template.replace(new RegExp("\\{" + key + "(:.+?)?\\}", 'g'), function (_, params) {
var _data$key;
return beforeReplace((_data$key = data[key]).call.apply(_data$key, [null].concat((params ? params.substring(1) : '').split(','))), key);
}) : enableCode ? template.replace(new RegExp("(?<!\\$)\\{" + key + "(?:(#|@)(\\d+))?\\}", 'g'), function (_, decorator, len) {
return beforeReplace(len ? (0, _toSingleLineString.toSingleLineString)(String(data[key]), {
length: +len,
omission: decorator === '@' ? '' : '...'
}) : data[key], key);
}) : template.replace(new RegExp("{" + key + "(?:(#|@)(\\d+))?\\}", 'g'), function (_, decorator, len) {
return beforeReplace(len ? (0, _toSingleLineString.toSingleLineString)(String(data[key]), {
length: +len,
omission: decorator === '@' ? '' : '...'
}) : data[key], key);
});
};
for (var _iterator = (0, _createForOfIteratorHelperLoose2.default)(keys), _step; !(_step = _iterator()).done;) {
_loop();
}
}
if (enableCode) {
template = template.replace(/\{\{(.+?)\}\}/g, function (_, code) {
// 需在 eval 里函数两边加上括号才能返回函数
var res = eval("(function (data) {\n " + keys.map(function (key) {
return "var " + key + " = data[\"" + key + "\"];";
}).join('') + "\n return " + code + ";\n })")(data);
if (res == null || res === true || res === false) {
return beforeReplace('', '');
}
return beforeReplace(res, '');
});
}
return template;
}
/** 判断是否有代码块 */;
StringTemplate.hasCodeBlock = function hasCodeBlock(template) {
return /\{\{(.+?)\}\}/.test(template);
};
return StringTemplate;
}();
;