tfp
Version:
A Web UI framework for TaskBuilder
318 lines (305 loc) • 13 kB
JavaScript
import TFPStatements from './TFPStatements.js'
export default class TFPGUIFuncCompiler {
constructor() {
//
}
getSMTypeInfo(categoryName, smName) {
for(let i=0;i<TFPStatements.length;i++) {
let category = TFPStatements[i];
if(category.name==categoryName) {
for(let j=0;j<category.statements.length;j++) {
let sm = category.statements[j];
if(sm.name==smName) {
return sm;
}
}
break;
}
}
return null;
}
compile(funcObj) {
if (!funcObj || !funcObj.statements || funcObj.statements.length == 0) return "";
let js = "";
for (let i = 0; i < funcObj.statements.length; i++) {
js += this.getStatementJs(funcObj.statements[i], "\t");
}
//console.log("-----------------------------------");
//console.log(js);
return js;
}
formatStrVar(str) {
var ret = str;
var patt = new RegExp("\\{([\\w|\.|%|\\u4E00-\\u9FA5]*)\\}", "g");
var result = patt.exec(ret);
while (result != null) {
let varName = result[0];
varName = varName.substring(1, varName.length - 1);
ret = ret.replace("{" + varName + "}", "'+"+varName+"+'");
patt = new RegExp("\\{([\\w|\.|%|\\u4E00-\\u9FA5]*)\\}", "g");
result = patt.exec(ret);
}
return ret;
}
formatExpress(sm) {
let smType = this.getSMTypeInfo(sm.category, sm.type);
if(!smType || !smType.format) return "";
var val = smType.format;
var patt = new RegExp("\\{([\\w|\.|%|\\u4E00-\\u9FA5]*)\\}", "g");
var result = patt.exec(val);
while (result != null) {
let argName = result[0];
argName = argName.substring(1, argName.length - 1);
let argVal = "";
if(sm.inputStatements && sm.inputStatements[argName]) {
argVal = this.getStatementJs(sm.inputStatements[argName], "", true);
} else if(sm[argName] || sm[argName]==0) {
argVal = sm[argName];
if(typeof(argVal)=="string" && argVal.indexOf("{")>=0 && argVal.indexOf("}")>0) {
argVal = this.formatStrVar(argVal);
}
}
val = val.replace("{" + argName + "}", argVal);
patt = new RegExp("\\{([\\w|\.|%|\\u4E00-\\u9FA5]*)\\}", "g");
result = patt.exec(val);
}
return val;
}
getStatementJs(sm, prefix, isArg) {
if (sm.category == "logic") {
return this.getLogicStatementJs(sm, prefix, isArg);
} else if(sm.category == "component") {
return this.getCptStatementJs(sm, prefix, isArg);
} else {
let js = "";
if(!isArg || sm.statements) js += prefix;
js += this.formatExpress(sm);
if(!isArg || sm.statements) js += ";\r\n";
return js;
}
}
getLogicStatementJs(sm, prefix, isArg) {
let js = "";
switch (sm.type.toLowerCase()) {
case "declare":
if (!sm.varName) return "";
js = prefix + "var " + sm.varName;
if(sm.inputStatements && sm.inputStatements.defaultVal) {
js += " = " + this.getStatementJs(sm.inputStatements.defaultVal, "", true);
} else if (sm.defaultVal || sm.defaultVal == 0) {
if(sm.varType && (sm.varType.toLowerCase()=="string"
|| (sm.varType.toLowerCase()=="date" && (sm.defaultVal+"").indexOf("Date(")<0))) {
js += " = " + "'" + sm.defaultVal + "'";
} else {
js += " = " + sm.defaultVal;
}
}
js += ";\r\n";
break;
case "assign":
if (!sm.varName) return "";
js = prefix + sm.varName;
js += sm.operator ? " " + sm.operator + " " : " = ";
if(sm.inputStatements && sm.inputStatements.value) {
js += this.getStatementJs(sm.inputStatements.value, "", true);
} else if (sm.value || sm.value == 0) {
if(sm.varType && (sm.varType.toLowerCase()=="string"
|| (sm.varType.toLowerCase()=="date" && (sm.value+"").indexOf("Date(")<0))) {
js += "'" + sm.value + "'";
} else {
js += sm.value;
}
}
js += ";\r\n";
break;
case "reference":
if (!sm.varName) return "";
js = " " + sm.varName + " ";
break;
case "if":
let condition = sm.condition;
if(sm.inputStatements) condition = this.getStatementJs(sm.inputStatements.condition, "", true);
js = prefix + "if(" + condition + ") {\r\n";
if (sm.statements) {
for (let i = 0; i < sm.statements.length; i++) {
js += this.getStatementJs(sm.statements[i], prefix + "\t");
}
}
js += prefix + "}\r\n";
if(sm.elseIfStatements) {
for(let i=0;i<sm.elseIfStatements.length;i++) {
let smElseIf = sm.elseIfStatements[i];
if(smElseIf.inputStatement) {
js = prefix + "else if(" + this.getStatementJs(smElseIf.inputStatement, "", true) + ") {\r\n";
} else {
js = prefix + "else if(" + smElseIf.condition + ") {\r\n";
}
if (smElseIf.statements) {
for (let j = 0; j < smElseIf.statements.length; j++) {
js += this.getStatementJs(smElseIf.statements[j], prefix + "\t");
}
}
js += prefix + "}\r\n";
}
}
if(sm.elseStatements) {
js += prefix + "else {\r\n";
for (let i = 0; i < sm.elseStatements.length; i++) {
js += this.getStatementJs(sm.elseStatements[i], prefix + "\t");
}
js += prefix + "}\r\n";
}
break;
case "iteratearray":
let attValJs = sm.arrVar;
if(sm.inputStatements && sm.inputStatements.arrVar) attValJs = this.getStatementJs(sm.inputStatements.arrVar, "", true);
js = prefix + "for(let " + sm.indexVar + " = " + sm.startIndex + "; " + sm.indexVar + "<" + attValJs + ".length; " + sm.indexVar + "++) {\r\n";
if (sm.statements) {
for (let i = 0; i < sm.statements.length; i++) {
js += this.getStatementJs(sm.statements[i], prefix + "\t");
}
}
js += prefix + "}\r\n";
break;
case "iterateobject":
let objVarJs = sm.objVar;
if(sm.inputStatements && sm.inputStatements.objVar) objVarJs = this.getStatementJs(sm.inputStatements.objVar, "", true);
js = prefix + "for(let " + sm.propVar + " in " + objVarJs + ") {\r\n";
if (sm.statements) {
for (let i = 0; i < sm.statements.length; i++) {
js += this.getStatementJs(sm.statements[i], prefix + "\t");
}
}
js += prefix + "}\r\n";
break;
case "return":
js = prefix + "return";
js += (sm.retVal || sm.retVal==0) ? " " + sm.retVal : "";
js += ";\r\n";
break;
case "callFunc":
js = this.getCallFuncJs(sm, prefix, isArg);
/*if (!sm.funcName) return "";
if(!isArg || sm.statements) js = prefix;
js += sm.funcName+ "(";
if(sm.args && sm.args.length>0) {
for(let i=0;i<args.length;i++) {
let arg = args[i];
if(i>0) js += ",";
js += " "+((arg || arg==0) ? arg : "null")+"";
}
}
js += ")";
if(sm.statements) {
js += " {\r\n";
for (let i = 0; i < sm.statements.length; i++) {
js += this.getStatementJs(sm.statements[i], prefix + "\t");
}
js += "}\r\n";
} else {
if(!isArg) js += ";\r\n";
}*/
break;
case "comment":
if (!sm.message) return "";
js += prefix+"//"+sm.message+"\r\n";
break;
case "custom":
if (!sm.content) return "";
if(!isArg) js = prefix;
js += sm.content;
if(!isArg) js += ";\r\n";
break;
default:
js += prefix + this.formatExpress(sm) + ";\r\n";
break;
}
return js;
}
getCallFuncJs(sm, prefix, isArg) {
let js = "";
if (!sm.funcName) return "";
if(!isArg || sm.statements) js = prefix;
if(sm.cptId) js += sm.cptId+".";
js += sm.funcName+ "(";
if(sm.args && sm.args.length>0) {
for(let i=0;i<sm.args.length;i++) {
let arg = sm.args[i];
if(i>0) js += ", ";
let argType = arg.type.toLowerCase();
if((!arg.value || arg.value=="") && (arg.value+"")!="0" && argType!="function") {
js += "null";
continue;
}
if(argType=="int" || argType=="float" || argType=="number" || argType=="bool"
|| argType=="array" || argType=="object" || argType=="undefined") {
js += arg.value;
} else if(argType=="px") {
let val = arg.value+"";
if(val.indexOf("px")<0 && val.indexOf("%")<0) val += "px";
js += val;
} else if(argType=="date") {
let val = arg.value+"";
if(arg.value.indexOf("Date(")<0) {
js += "'"+arg.value+"'";
} else {
js += arg.value;
}
} else if(argType=="function") {
if(arg.enabled) {
js += "function(";
if(arg.args) {
for(let j=0;j<arg.args.length;j++) {
let funcArg = arg.args[j];
if(j>0) js += ", ";
js += funcArg.value;
}
}
js += ") {\r\n";
if(sm.statements) {
for (let i = 0; i < sm.statements.length; i++) {
js += this.getStatementJs(sm.statements[i], prefix + "\t");
}
}
js += prefix + "}";
}
} else {
js += "'"+arg.value+"'";
}
}
}
js += ")";
if(!isArg || sm.statements) js += ";\r\n";
return js;
}
getCptStatementJs(sm, prefix, isArg) {
if (!sm.cptId) return "";
let js = "";
switch (sm.type) {
case "setAttrGui":
if (!sm.attrs) return "";
for(let attrName in sm.attrs) {
js += prefix+sm.cptId+".attr('"+attrName+"', "+sm.attrs[attrName]+");\r\n";
}
break;
case "setCssGui":
if (!sm.styles) return "";
for(let styleName in sm.styles) {
js += prefix+sm.cptId+".css('"+styleName+"', '"+sm.styles[styleName]+"');\r\n";
}
break;
case "callCptFunc":
js = this.getCallFuncJs(sm, prefix, isArg);
break;
default:
if(!isArg || sm.statements) js += prefix;
js += this.formatExpress(sm);
if(!isArg || sm.statements) js += ";\r\n";
break;
}
return js;
}
}
if(typeof(window)!="undefined") {
window.guiFuncCompiler = new TFPGUIFuncCompiler();
}