/**
* 表达式工具类
* @author cls
* @date 2019-05-16
*/
/**
* 转换数据集字段访问表达式
* @param {*} datasets 数据集实例对象枚举{ds1:{},ds2:{}}
* @param {*} expr string 配置表达式
*
* @return string
*/
export function convertDatasetExpr(datasets, expr) {
if (datasets && expr.indexOf("}}") > 0) {
for (var key in datasets) {
let re = new RegExp(key + "\\.", "g");
expr = expr.replace(re, "datasets." + key + ".")
}
return eval("\"" + expr.replace("{{", "\"+").replace("}}", "+\"") + "\"")
}
return expr;
}
/**
* 替换变量为注入对象变量
* @param {*} scope 注入上下文对象 {key1:obj1,key2:obj2,...}
* @param {*} injectId 上下文对象变量名id
* @param {*} expr 预替换上下文对象表达式
*/
export function getScopeExpr(scope, injectId, expr) {
for (let id in scope) {
if (id.indexOf("$$") == -1) {
var reg = new RegExp(id + "\\.", "g");
expr = expr.replace(reg, injectId + "." + id + ".");
} else {
var reg = new RegExp("\\$\\$" + id.substring(2), "g");
expr = expr.replace(reg, injectId + ".$" + id)
}
}
return expr;
}
/**
* 解析表达式{{变量}}值
* @param {*} expr vue模板表达式
* @param {*} scope 上下文变量
*/
export function execVueExpr(expr, scope) {
if (scope) {
expr = getScopeExpr(scope, "scope", expr);
}
var r = new RegExp(/\{\{((?:.|\n)+?)\}\}/g);
var p = r.exec(expr);
while (p) {
var pr1 = new RegExp(
p[0].replace(/\+/g, "\\+").
replace(/\*/g, "\\*").
replace(/\(/g, "\\(").
replace(/\)/g, "\\)").
replace(/\[/g, "\\[").
replace(/\]/g, "\\]").
replace(/\$/g, "\\$"),
"g");
let p1 = p[1];
if (scope && p1.indexOf(".") == -1) {
// 临时添加scope是当前记录,表达式只有字段名时应用
p1 = "scope." + p1;
}
var va1 = eval(p1);
if (va1 == undefined) {
va1 = "";
}
expr = expr.replace(pr1, va1);
p = r.exec(expr);
// 存在匹配优先级问题,可能后面表达式先匹配
if ((p == null) && (expr.indexOf("{{") >= 0)) {
p = r.exec(expr);
}
}
if (expr === "false") {
return false
} else if (expr === "undefined") {
return;
}
return expr;
}
/**
* 判断值是否为true
* @param {} val
*/
export function isTrueVal(val) {
return !!(val && val != "0" && val !== "false")
}