|
@@ -1,9 +1,60 @@
|
|
|
|
|
|
+//解析公式的参数
|
|
|
+function parseFormulaArguments(ele,funObj,resArr){
|
|
|
+ let fcReg = /(FC\.\S+\()(.+)\)/;
|
|
|
+ let fun = {
|
|
|
+ example:funObj.example,
|
|
|
+ name:funObj.name,
|
|
|
+ template:funObj.template,
|
|
|
+ };
|
|
|
+ let argTextArr = funObj.children;//放参数文本的数组
|
|
|
+ fun.arguments = [];
|
|
|
+
|
|
|
+ let tmpArr = fcReg.exec(funObj.template.ft);
|
|
|
+ let argList = tmpArr[2].split(",");//括号里面参数部分#1,#2..
|
|
|
+
|
|
|
+ argList.forEach((argText,index)=>{
|
|
|
+ //只用动态的
|
|
|
+ if(argText.indexOf('#')>-1){
|
|
|
+ if(argTextArr[index].type == 'Element'){
|
|
|
+ fun.arguments.push(argTextArr[index])
|
|
|
+ }else if(argTextArr[index].type == 'Function'){
|
|
|
+ fun.arguments.push(ele)
|
|
|
+ }else{
|
|
|
+ fun.arguments.push(argTextArr[index].tag)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ })
|
|
|
+
|
|
|
+ ele.children.push(fun);
|
|
|
+ if(funObj.parent){
|
|
|
+ let isTop = false;
|
|
|
+ for (let i = 0; i < funObj.parent.children.length; i++) {
|
|
|
+ if(funObj.parent.children[i].type == "Operator" ||
|
|
|
+ funObj.parent.children[i].type == "Brackets"
|
|
|
+ ){
|
|
|
+ //有这些认为就最顶层,外面的方法是放到结果那里的
|
|
|
+ isTop = true;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(!isTop){
|
|
|
+ parseFormulaArguments(ele,funObj.parent,resArr)
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ //结束之后把parent删掉
|
|
|
+ delete ele.parent;
|
|
|
+ for (let i = 0; i < resArr.length; i++) {
|
|
|
+ if(resArr[i] == funObj){
|
|
|
+ //用元素替换最顶层的方法
|
|
|
+ resArr[i] = ele;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
|
|
|
-
|
|
|
-export const formulaStringToArray = (text) => {
|
|
|
-
|
|
|
- text = "FC.pow(FC.pow(E[assa_faf],3),2)+FC.date(E[assa_aff],我的)";
|
|
|
+export const formulaStringToArray = (text,elemap,formulaMap) => {
|
|
|
|
|
|
// 匹配开始的FC.xxx(
|
|
|
const startFCRegExp = /^FC\.([a-zA-Z]+)\(/;
|
|
@@ -11,9 +62,12 @@ export const formulaStringToArray = (text) => {
|
|
|
const endBracketsReg = /^\)/;//右括号
|
|
|
const elementReg = /^E\[(.[^\]]+_.[^\]]+)\]/;//元素
|
|
|
const commaReg = /^,/;//逗号
|
|
|
- const operatorReg = /^\+|-|\*|÷/;//加减乘除
|
|
|
+ const operatorReg = /^\+|-|\*|%/;//加减乘除
|
|
|
const wordReg = /^[\u4e00-\u9fa5\w'"-]+/;//文本
|
|
|
|
|
|
+ let elementMap = JSON.parse(elemap);//元素字典
|
|
|
+ //console.log(formulaMap)
|
|
|
+
|
|
|
let resArr = [];//结果数组
|
|
|
let strIndex = 0;//位置索引
|
|
|
let nuText = text;//未处理的字符串
|
|
@@ -28,13 +82,24 @@ export const formulaStringToArray = (text) => {
|
|
|
//匹配FC开始部分FC.xxx(
|
|
|
let regRes = nuText.match(startFCRegExp);
|
|
|
let startText = regRes[0];//匹配到的文本
|
|
|
-
|
|
|
+
|
|
|
+ let obj = {};
|
|
|
+ if(formulaMap[startText]){
|
|
|
+ Object.assign(obj,formulaMap[startText]);
|
|
|
+ Object.assign(obj,{
|
|
|
+ type:'Function',
|
|
|
+ children:[],
|
|
|
+ tag:startText
|
|
|
+ });
|
|
|
+ }else{
|
|
|
+ obj = {
|
|
|
+ type:'Function',
|
|
|
+ children:[],
|
|
|
+ tag:startText
|
|
|
+ }
|
|
|
+ }
|
|
|
//startStack.push(startText);
|
|
|
- contentStack.push({
|
|
|
- type:'Function',
|
|
|
- children:[],
|
|
|
- tag:startText
|
|
|
- });
|
|
|
+ contentStack.push(obj);
|
|
|
|
|
|
strIndex += startText.length;//索引移动
|
|
|
}else if(endBracketsReg.test(nuText)){
|
|
@@ -61,6 +126,7 @@ export const formulaStringToArray = (text) => {
|
|
|
contentStack.push({
|
|
|
type:'Brackets',
|
|
|
children:[],
|
|
|
+ selected:false,
|
|
|
tag:startBrackets
|
|
|
});
|
|
|
|
|
@@ -69,12 +135,25 @@ export const formulaStringToArray = (text) => {
|
|
|
//console.log('匹配元素')
|
|
|
//匹配元素
|
|
|
let eleArr = nuText.match(elementReg);
|
|
|
- let obj = {
|
|
|
- type:'Element',
|
|
|
- tableElementKey:eleArr[1],
|
|
|
- children:[],
|
|
|
- tag:eleArr[0]
|
|
|
+ let obj = {};
|
|
|
+ if(elementMap[eleArr[1]]){
|
|
|
+ Object.assign(obj,elementMap[eleArr[1]]);
|
|
|
+ Object.assign(obj,{
|
|
|
+ selected:false,
|
|
|
+ children:[],
|
|
|
+ tag:eleArr[0]
|
|
|
+ });
|
|
|
+ }else{
|
|
|
+ obj = {
|
|
|
+ type:'Element',
|
|
|
+ name:eleArr[1].split('_')[1],
|
|
|
+ tableElementKey:eleArr[1],
|
|
|
+ children:[],
|
|
|
+ selected:false,
|
|
|
+ tag:eleArr[0]
|
|
|
+ }
|
|
|
}
|
|
|
+
|
|
|
let content =contentStack[contentStack.length - 1];
|
|
|
obj.parent = content;
|
|
|
content.children.push(obj);
|
|
@@ -87,10 +166,11 @@ export const formulaStringToArray = (text) => {
|
|
|
//匹配逗号
|
|
|
let comma = nuText.match(commaReg)[0];
|
|
|
|
|
|
- contentStack[contentStack.length - 1].children.push({
|
|
|
- type:'Comma',
|
|
|
- tag:comma
|
|
|
- });
|
|
|
+ // 方法体里面的逗号忽略
|
|
|
+ // contentStack[contentStack.length - 1].children.push({
|
|
|
+ // type:'Comma',
|
|
|
+ // tag:comma
|
|
|
+ // });
|
|
|
|
|
|
strIndex += comma.length;//索引移动
|
|
|
}else if(operatorReg.test(nuText)){
|
|
@@ -100,8 +180,14 @@ export const formulaStringToArray = (text) => {
|
|
|
let obj = {
|
|
|
type:'Operator',
|
|
|
name:operator,
|
|
|
+ selected:false,
|
|
|
tag:operator,
|
|
|
+ };
|
|
|
+ if(formulaMap[operator]){
|
|
|
+ obj.example = formulaMap[operator].example;
|
|
|
+ obj.template = formulaMap[operator].template;
|
|
|
}
|
|
|
+
|
|
|
if(contentStack.length > 0){
|
|
|
//不然就在方法体或括号里面
|
|
|
contentStack[contentStack.length - 1].children.push(obj);
|
|
@@ -130,7 +216,39 @@ export const formulaStringToArray = (text) => {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ //数组清理到最后能显示的元素
|
|
|
+ for (let i = elementArr.length-1; i >0; i--) {
|
|
|
+ //判断当前元素是不是最底层
|
|
|
+ let isBottom = true;
|
|
|
+ let childrenEles = [];
|
|
|
+ let chs = elementArr[i].parent.children;
|
|
|
+ for (let j = 0; j < chs.length; j++) {
|
|
|
+ if(chs[j].type == "Function"){
|
|
|
+ isBottom = false;
|
|
|
+ }else if(chs[j].type == "Element"){
|
|
|
+ childrenEles.push(chs[j]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(isBottom){
|
|
|
+ //认为最底层的参数第一个元素就是显示在页面的那个元素
|
|
|
+ if(childrenEles[0] != elementArr[i]){
|
|
|
+ elementArr.splice(i,1);
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ elementArr.splice(i,1);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ elementArr.forEach((ele)=>{
|
|
|
+ parseFormulaArguments(ele,ele.parent,resArr);
|
|
|
+ })
|
|
|
+
|
|
|
console.log(contentStack)
|
|
|
console.log(resArr);
|
|
|
- return resArr;
|
|
|
+ console.log(elementArr);
|
|
|
+
|
|
|
+ return {
|
|
|
+ processFormula:resArr,
|
|
|
+ resultFormulaChildren:[],
|
|
|
+ };
|
|
|
}
|