UNPKG

vtils

Version:

一个面向业务的 JavaScript/TypeScript 实用程序库。

75 lines (73 loc) 3.33 kB
"use strict"; 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; }();