UNPKG

muz-uni

Version:

自主开发的UniApp组件——Жидзин(Zidjin)系列组件库。

95 lines (80 loc) 3.96 kB
/** x-format-string V1.0 自动格式化字符串,支持双花括号 20230213 by Sieyoo, 赵向明 */ import XTakeAt from "./x-take-at.js" const XTemplateString = function() {}; /** * function XTemplateString::format 对模板字符串进行编译,格式化为结果字符串 * @param {object} item 给定需要格式化的Key-Value对象。 * @param {string} text 要格式化的字符串文本 * @desc * @return {string} 格式化完成后字符串 * @example * 模板语法糖: * 一、基础版——直接引用值:{{key}} * 例子: * param={category_id: 35, category_value: "杭州西湖区"}; * str="类别ID:{{category_id}},类别值:{{category_value}}。"; * XTemplateString.format(param, str); * 结果 ==> "类别ID:35,类别值:杭州西湖区。" * 二、高级版——选项引用值。即指定列表对象、标签键、值键,找到引用值:{{value_key:key|options[label_key]}} * 例子: * param={category_id: 35, category_list: [{value: 27, label: "杭州上城区"}, {value: 35, label: "杭州西湖区"}]}; * str="类别:{{value: category_id | category_list[label]}}" * XTemplateString.format(param, str); * 结果 ==> "类别:杭州西湖区。" */ XTemplateString.format = function(item, text){ // console.log("XTemplateString.format:", item, text) if(!text){ return ''; } // typeof(formData[it.field]) === 'object' ? JSON.stringify(formData[it.field]) : formData[it.field] // 暂时弃用,小程序不支持evla语法 // let expression = text.replace(/(\{\{(.*?)\}\})/g, "$${item.$2}"); // let result = eval('`'+expression+'`').replaceAll('"null"', '""'); let result = text; const re = new RegExp("(\{\{(.*?)\}\})"); while(re.test(result)){ const key = re.exec(result)[2]; const value = XTakeAt.getValue(item, key, ''); // 注意:如果key是高级模版语法,是匹配不出value值的。 const label = XTemplateString.matchOptions(item, key); // console.log("XTemplateString.format k-v:", key, '=', value, '==>', label); result = result.replace(re, label || value ); } return result; } // 作用:"value:category_id|category_list[label]" ==> "杭州西湖区" XTemplateString.matchOptions = function(item, expression_string){ // console.log("XTemplateString.matchOptions:", expression_string, item) if (!expression_string){ return null; } const re = (/([_\w]*?)\s*:?\s*([_\w]*?)\s*\|\s*([_\w]*?)\[\s*([_\w]*?)\s*\]/); // 本段代码支持高级版 if(re.test(expression_string)){ // console.log("XTemplateString.matchOptions re:", re.exec(expression_string)); const match = re.exec(expression_string); const item_key = match[2]; const value_key = match[1] || item_key; const options_key = match[3]; const label_key = match[4]; const options = XTakeAt.getValue(item, options_key, ''); // item[options_key]; const value = XTakeAt.getValue(item, item_key, ''); // item[item_key]; if(!options || !label_key || !value_key){ return value; } // 查找到当前匹配的对象, let current = options.find(it => it[value_key] == value); let label = current && current[label_key]; // 因为JSON反序列化不支持\r\n,所以只能强制替换掉 if( typeof label === 'string'){ label = label.replaceAll('\n', '').replaceAll('\r', ''); } // console.log("XTemplateString.matchOptions label 2:", {key: label}); if(!label){ return value; } return label; } return null; } export default XTemplateString;