muz-uni
Version:
自主开发的UniApp组件——Жидзин(Zidjin)系列组件库。
95 lines (80 loc) • 3.96 kB
JavaScript
/** 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;