const wu=require("./wuLib.js"); const {VM}=require('vm2'); function catchZGroup(code,groupPreStr,cb){ const debugPre="(function(z){var a=11;function Z(ops,debugLine){"; let zArr={}; for(let preStr of groupPreStr){ let content=code.slice(code.indexOf(preStr)),z=[]; content=content.slice(content.indexOf("(function(z){var a=11;")); content=content.slice(0,content.indexOf("})(__WXML_GLOBAL__.ops_cached.$gwx"))+"})(z);"; let vm=new VM({sandbox:{z:z,debugInfo:[]}}); vm.run(content); if(content.startsWith(debugPre))for(let i=0;i=":11,"<=":11,">":11,"<":11,"<<":12,">>":12, "-":len==3?13:16 }; return priorList[op]?priorList[op]:0; } function getOp(i){ let ret=restoreNext(ops[i],true); if(ops[i] instanceof Object&&typeof ops[i][0]=="object"&&ops[i][0][0]==2){ //Add brackets if we need if(getPrior(op[1],ops.length)>getPrior(ops[i][0][1],ops[i].length))ret=enBrace(ret,'(');; } return ret; } switch(op[1]){ case"?:": ans=getOp(1)+"?"+getOp(2)+":"+getOp(3); break; case "!": case "~": ans=op[1]+getOp(1); break; case"-": if(ops.length!=3){ ans=op[1]+getOp(1); break; }//shoud not add more in there![fall through] default: ans=getOp(1)+op[1]+getOp(2); } break; } case 4://unkown-arrayStart? ans=restoreNext(ops[1],true); break; case 5://merge-array { switch (ops.length) { case 2: ans=enBrace(restoreNext(ops[1],true),'['); break; case 1: ans='[]'; break; default: { let a=restoreNext(ops[1],true); //console.log(a,a.startsWith('[')&&a.endsWith(']')); if(a.startsWith('[')&&a.endsWith(']')){ if(a!='[]'){ ans=enBrace(a.slice(1,-1).trim()+','+restoreNext(ops[2],true),'['); //console.log('-',a); }else{ ans=enBrace(restoreNext(ops[2],true),'['); } }else{ ans=enBrace('...'+a+','+restoreNext(ops[2],true),'[');//may/must not support in fact } } } break; } case 6://get value of an object { let sonName=restoreNext(ops[2],true); if(sonName._type==="var") ans=restoreNext(ops[1],true)+enBrace(sonName,'['); else{ let attach=""; if(/^[A-Za-z\_][A-Za-z\d\_]*$/.test(sonName)/*is a qualified id*/) attach='.'+sonName; else attach=enBrace(sonName,'['); ans=restoreNext(ops[1],true)+attach; } break; } case 7://get value of str { switch(ops[1][0]){ case 11: ans=enBrace("__unTestedGetValue:"+enBrace(jsoToWxon(ops),'['),'{'); break; case 3: ans=new String(ops[1][1]); ans._type="var"; break; default: throw Error("Unknown type to get value"); } break; } case 8://first object ans=enBrace(ops[1]+':'+restoreNext(ops[2],true),'{');//ops[1] have only this way to define break; case 9://object { function type(x){ if(x.startsWith('...'))return 1; if(x.startsWith('{')&&x.endsWith('}'))return 0; return 2; } let a=restoreNext(ops[1],true); let b=restoreNext(ops[2],true); let xa=type(a),xb=type(b); if(xa==2||xb==2)ans=enBrace("__unkownMerge:"+enBrace(a+","+b,'['),'{'); else{ if(!xa)a=a.slice(1,-1).trim(); if(!xb)b=b.slice(1,-1).trim(); //console.log(l,r); ans=enBrace(a+','+b,'{'); } break; } case 10://...object ans='...'+restoreNext(ops[1],true); break; case 12: { let arr=restoreNext(ops[2],true); if(arr.startsWith('[')&&arr.endsWith(']')) ans=restoreNext(ops[1],true)+enBrace(arr.slice(1,-1).trim(),'('); else ans=restoreNext(ops[1],true)+'.apply'+enBrace('null,'+arr,'('); break; } default: ans=enBrace("__unkownSpecific:"+jsoToWxon(ops),'{'); } return scope(ans); } } function restoreGroup(z){ let ans=[]; for(let g in z.mul){ let singleAns=[]; for(let e of z.mul[g])singleAns.push(restoreSingle(e,false)); ans[g]=singleAns; } let ret=[];//Keep a null array for remaining global Z array. ret.mul=ans; return ret; } function restoreAll(z){ if(z.mul)return restoreGroup(z); let ans=[]; for(let e of z)ans.push(restoreSingle(e,false)); return ans; } module.exports={getZ(code,cb){ catchZ(code,z=>cb(restoreAll(z))); }};