UNPKG

tfp

Version:

A Web UI framework for TaskBuilder

318 lines (305 loc) 13 kB
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(); }