croswil_markuno 1.0.87 → 1.0.89

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/bin/mu-convcad.js CHANGED
@@ -23,7 +23,7 @@ import{init,database}from"croswil_lib";import fs from"fs";import path from"path"
23
23
  * @param {boolean} tienivuoti - Se true mantiene le righe vuote
24
24
  * @returns {string[]} Array di righe di codice senza commenti
25
25
  */
26
- function muClComments(codice,tienivuoti){const righe=(code=>code.replace(/("(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*')|\/\*[\s\S]*?\*\//g,((match,quoted)=>quoted||"")))(codice).split(/\r?\n/),tm=[];let rigaContinua="";for(const riga of righe){let rigaTrim=riga.trim();if(/(^|[^:])\/\/.*/.test(rigaTrim)&&(rigaTrim=rigaTrim.replace(/(^|[^:])\/\/.*/,((match,p1)=>p1.trim()))),0!==rigaTrim.length)if(rigaContinua.length>0&&(rigaTrim=rigaContinua+" "+rigaTrim,rigaContinua=""),rigaTrim.endsWith("\\")){rigaTrim=rigaTrim.slice(0,-1);const indiceCommento=rigaTrim.lastIndexOf("//");-1!==indiceCommento&&(rigaTrim=rigaTrim.slice(0,indiceCommento).trim()),rigaContinua=rigaTrim}else tm.push(rigaTrim)}return tm}new class Errori{constructor(){this.azzera()}
26
+ function muClComments(codice,tienivuoti){const righe=(code=>code.replace(/("(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*')|\/\*[\s\S]*?\*\//g,((match,quoted)=>quoted||"")))(codice).split(/\r?\n/),tm=[];let rigaContinua="";for(const riga of righe){let rigaTrim=riga;if(/(^|[^:])\/\/.*/.test(rigaTrim)&&(rigaTrim=rigaTrim.replace(/(^|[^:])\/\/.*/,((match,p1)=>p1.trim()))),rigaTrim=rigaTrim.trim(),0!==rigaTrim.length)if(rigaContinua.length>0&&(rigaTrim=rigaContinua+" "+rigaTrim,rigaContinua=""),rigaTrim.endsWith("\\")){rigaTrim=rigaTrim.slice(0,-1);const indiceCommento=rigaTrim.lastIndexOf("//");-1!==indiceCommento&&(rigaTrim=rigaTrim.slice(0,indiceCommento).trim()),rigaContinua=rigaTrim}else tm.push(rigaTrim)}return tm}new class Errori{constructor(){this.azzera()}
27
27
  /**
28
28
  * Azzera la lista degli errori
29
29
  */azzera(){this.err=[]}
@@ -49,4 +49,4 @@ function muClComments(codice,tienivuoti){const righe=(code=>code.replace(/("(?:\
49
49
  * @param {string} code - Il codice sorgente da formattare
50
50
  * @param {boolean} gisvar - Flag che indica se formattare come variabile
51
51
  * @returns {string} Il codice formattato
52
- */Date.prototype.toInt||(Date.prototype.toInt=function(){return this.getDate()+100*(this.getMonth()+1)+1e4*this.getFullYear()}),Date.prototype.toFloat||(Date.prototype.toFloat=function(){return Math.floor(1e4*this.getDate()+1e6*(this.getMonth()+1)+1e8*this.getFullYear()+100*this.getHours()+this.getMinutes()+.5)/1e4});const{Clear:Clear,Reset:Reset,Bold:Bold,Reverse:Reverse,Red:Red,Green:Green,Yellow:Yellow,Blue:Blue,Magenta:Magenta,Cyan:Cyan,White:White}=init();var inidata={FOLDERBASE:"./",DBWORK:"./data/app.db",FOLDERCAT:"./data/mu",FOLDEROUT:"./out",CAT:"cat"};const fini=".lasts.markuno";fs.existsSync(fini)&&(inidata=JSON.parse(fs.readFileSync(fini))),inidata.FOLDERCAD||(inidata.FOLDERCAD="./cat3cad");var mi=minimist(process.argv);console.log(`----------------------------------------------------------------------------------------\n${Bold}${Cyan}${Bold}mu-convcad:${Reset} Convert data from 3CAD (c) Croswil 2024 v. ${Yellow}2.0.33${Reset}\n----------------------------------------------------------------------------------------`);const INI=`uso: ${Bold} mu-convcad <nomecatalogo> [opzioni]\n${Green}Opzioni:${Reset}\n ${White} -h, --help${Reset}${Green} mostra l'help\n ${White} -i, --init <folder>${Reset}${Green} cartella di lavoro (default='${inidata.FOLDERCAT}' ) \n ${White} -c, --cad <folder>${Reset}${Green} cartella cad (default='${inidata.FOLDERCAD}' ) \n ${White} -r, --reset${Reset}${Green} Cancella tutti i dati precedenti\n ${White} -t, --tipologie${Reset}${Green} Tipologie e Macro tip\n ${White} -a, --abilita${Reset}${Green} Processa abilitazioni\n`;inidata.FOLDERCAT=mi.i||mi.init||inidata.FOLDERCAT,inidata.FOLDERCAD=mi.c||mi.cad||inidata.FOLDERCAD;const catname=mi._[2]||void 0;(mi.h||mi.help||!catname)&&(console.log(INI),process.exit(0)),inidata.CAT=catname;const folder=path.join(inidata.FOLDERCAT,catname),folder2=path.join(inidata.FOLDERCAD,catname);var dborig=path.join(folder2,`${catname}.ddb`);fs.existsSync(dborig)||(console.log("manca il database di origine: "+catname),process.exit(1)),fs.writeFileSync(fini,JSON.stringify(inidata,null,2));const logdata=[],logga=v=>logdata.push(v),sql="select cod cod,des des,memo info from speciali where cat='pro'";function unisciriga(c1){var c=[];for(var x of c1)!x.startsWith('"')&&x.includes(",")&&(x=`"${x}"`),c.push(x);return c.join(",")}function parsecodecad(text,db){var vv=(text=text.replaceAll("\t",",").replaceAll("\r","").replace(/\#vb/gim,"/* VB !not supported").replace(/#endvb/gim,"*/").replace(/\#msg /gim,"!msg ")).split("\n"),cl=[],inBloccoCommento=!1;return vv.forEach(((v,i)=>{v.startsWith("/*")&&(inBloccoCommento=!0),inBloccoCommento?cl.push(v):/^\s*$/.test(v)||(db?(v=v.replace(/\s*\#m\s+(\w+)/im,((m0,m1)=>"#m ++"+m1)),cl.push(v)):(/^\s*\d+/.test(v)?v="!t "+v.trim():/^\s*\!parametri/i.test(v)?v=v.replace(/\!parametri /gi,":p "):/^\s*\w+/.test(v)&&(v="#m +"+v.replace(/\s*\_*/,"")),cl.push(v))),inBloccoCommento&&v.trim().endsWith("*/")&&(inBloccoCommento=!1)})),function muFormatcode(code,gisvar){let lines=code.split("\n"),formattedCode=[],indentLevel=0,inBloccoCommento=!1,inAcapo=!1,cols=[];var isvar=gisvar;if(isvar){let tm=verificaisvar(0,lines);(isvar=tm.fl)&&(cols=tm.cols)}for(let i=0;i<lines.length;i++){let ltot=lines[i],line=ltot.trim();var tt=line.split("//");let linenc=tt[0].trim();tt.splice(0,1);let commento=tt.length?` // ${tt.join("//").trim()} `:"";if(line.startsWith("/*"))inBloccoCommento=!0,formattedCode.push(line);else if(inBloccoCommento&&line.endsWith("*/"))inBloccoCommento=!1,formattedCode.push(line);else if(inBloccoCommento)formattedCode.push(ltot);else{var rr=regex.exec(line);if(rr){if(formattedCode.push(line),indentLevel=rr[1]?0:1,/^\s*\{(var|deriva|header|v|h)(\s.*)?\}/i.test(line)){let tm=verificaisvar(i+1,lines);(isvar=tm.fl)&&(cols=tm.cols)}else isvar=!1;inAcapo=!1;continue}if(isvar)if(linenc.startsWith(":")&&!linenc.startsWith(":h ")||!linenc)formattedCode.push(line);else{var lba=" ";linenc.startsWith(":h ")&&(linenc=linenc.substr(3).trim(),lba=":h ");for(var cl=getcolonne(linenc),j=0;j<cl.length;j++)cl[j].includes(",")&&(cl[j]=`"${cl[j]}"`),cl[j]=cl[j].padEnd(cols[j]," ");formattedCode.push(`${lba}${cl.join(" , ")} ${commento}`)}else{let indent=" ".repeat(indentLevel>=0?indentLevel:0);if(inAcapo)formattedCode.push(`${indent} ${line}`);else{let command="";line.startsWith("#")&&(command=line.substring(1).split(" ")[0].toUpperCase(),line="#"+command+line.substring(command.length+1)),["IF","IFDEF","IFNDEF"].includes(command)?line.indexOf("#",2)<0?(formattedCode.push(`${indent}${line}`),indentLevel++):(line=line.replace(/#([\w]+)/g,((match,m1)=>"#"+m1.toUpperCase())),formattedCode.push(`${indent}${line}`)):["FOR","SELECT","FORVAR","VARIANTE","DO"].includes(command)?(formattedCode.push(`${indent}${line}`),indentLevel++):["ELSEIF","ELSE","ELSEIFDEF","ELSEIFNDEF","CASE","CASES","DEFAULT"].includes(command)&&indentLevel>0?formattedCode.push(" ".repeat(indentLevel>0?indentLevel-1:0)+line):["ENDIF","ENDSELECT","LOOP","ENDFOR"].includes(command)?(formattedCode.push(" ".repeat(indentLevel>0?indentLevel-1:0)+line),indentLevel--,indentLevel<0&&(indentLevel=0)):line.startsWith("_ ")||line.startsWith(":")?formattedCode.push(line):formattedCode.push(indent+line)}inAcapo=linenc.endsWith("\\")}}}return formattedCode.join("\n")}(cl.join("\n"))}const tipi={"-":"sep",T:"var",M:"num",S:"str",C:"yn",L:"hidden",Z:"ny"};function torowtipo(x){var cl=[];if(!x)return"";for(var t in x)"cod"!=t&&cl.push(`${t}=${x[t]}`);return`${x.cod} ${cl.join(",")}`}function gettipo(row){var v=row.split(",");if(v[1]||v[2]){var x={};return x.cod=(v[2]||v[1]).trim().toLowerCase(),v[2]&&(x.alias=v[2].trim().toLowerCase()),v[3]&&(x.valid=v[3].trim().toLowerCase()),v[4]&&(x.des=v[4].trim()),v[5]&&(x.visible=v[5].trim().toLowerCase()),tipi[v[0]]?x.tipo=tipi[v[0]]:"D"==v[0]?x.tipo="sp."+v[6]:x.tipo=v[0].trim().toUpperCase(),x}}mi.r||mi.reset?console.log("-> crea catalogo e copia"):console.log("-> aggiorna catalogo");var dbxfile=`${inidata.FOLDERCAT}/mu_${catname}.db`;(mi.r||mi.reset)&&(fs.existsSync(folder)&&fs.rmSync(folder,{recursive:!0}),fs.existsSync(dbxfile)&&fs.unlinkSync(dbxfile)),fs.existsSync(folder)||fs.mkdirSync(folder,{recursive:!0}),fs.copyFileSync(dborig,folder+"/"+catname+".db");var db=database.db(dborig),dtx=(new Date).valueOf(),xalias=[],rr=db.all("select cod cod,des des ,codmet alias,obbl obbligo, memo info from codvar ");for(var r of(console.log("-> varianti",rr.length),rr)){for(var xx=r.info.split(""),cl=[],c1=[],i=1;i<xx.length&&xx[i];i+=2)c1.push(xx[i]);if(cl.push(`:des ${r.des.trim().toLowerCase()}`),r.obbl&&cl.push(":obbligo"),r.alias)xalias.push(`${r.cod.trim().toLowerCase()} , ${r.alias.trim().toLowerCase()}`);else{cl.push(""),cl.push(":h "+unisciriga(c1));var vv=db.all("select codopz cod,des des,memo info from varianti where codvar=? order by ordinamento,codopz",r.cod);for(var v of vv){c1=unisciriga([v.cod.trim().toLowerCase(),v.des.trim().toLowerCase(),...v.info.trim().toLowerCase().split("\t")]);cl.push(" "+c1)}r.cod=r.cod.trim().toLowerCase(),logga("var: "+r.cod),fs.writeFileSync(`${folder}/${r.cod}.var`,cl.join("\n"))}}rr=db.all("select cod cod,des des,fldef defs from modelli order by cod"),cl=[];for(var r of(cl.push(":des Modelli\n\n:h Cod, Descrizione\n"),rr))cl.push(" "+unisciriga([r.cod.trim().toLowerCase(),r.des]));fs.writeFileSync(`${folder}/modelli.var`,cl.join("\n")),xalias=["// Alias Varianti\n\n{v __aliasvar}\n:h variante, alias",...xalias.sort()],fs.writeFileSync(`${folder}/_alias.inc`,xalias.join("\n")),console.log("-> gruppi.ini");var file=path.join(folder2,"gruppi.ini");if(fs.existsSync(file)){rr=muClComments(data=fs.readFileSync(file).toString().replaceAll("�","'"));var grps={},cgroup=[];for(var r of rr){if(m=/^\s*\[(\w+)\]/i.exec(r))cgroup=[],grps[m[1].trim().toLowerCase()]=cgroup;else(x=gettipo(r))&&cgroup.push(torowtipo(x))}}var kk=Object.keys(grps).sort();cl=[];for(var k of(cl.push("// includes headers"),kk))cl.push(""),cl.push(`{h ${k}}`),cl.push(...grps[k]);if(fs.writeFileSync(path.join(folder,"_headers.inc"),cl.join("\n")),console.log("-> deriva"),(r=db.get(`${sql} and cod='deriva'`)).cod&&r.info){r.info=r.info.trim().toLowerCase().replaceAll("","\n");var tm=r.info.split("\n").map((t=>t.trim())).sort();fs.writeFileSync(path.join(folder,"_deriva.inc"),`// derivazione varianti \n{v deriva}\n:des deriva delle varianti\n :h var=opz,-> var=opz\n \n${tm.join("\n")}`)}rr=db.all(`${sql} and cod like ?`,">>%");for(var r of(console.log("-> macro",rr.length),rr)){logga("mac "+(cod=(cod=r.cod.substr(2).trim().toLowerCase()).replace(/^_*/,"")));var mac=parsecodecad(r.info.toLowerCase());cl=`// ${r.des}\n${mac} \n `;fs.writeFileSync(path.join(folder,`+${cod}.mu`),cl)}var regole=fs.readdirSync(folder2);regole=regole.filter((r=>r.toLowerCase().endsWith(".erg")));var ii=0;for(var rr of(console.log("-> regole",regole.length),regole)){var data=fs.readFileSync(path.join(folder2,rr)).toString().replaceAll("\r",""),ext=path.extname(rr),basename=path.basename(rr,ext).trim().toLowerCase();if(!basename.includes(".")&&"gene"!=basename){var info={cod:basename,des:"",codice:[],header:[],formule:{}},formula=[],status=(cl=data.split("\n"),-1);for(var c of cl){var m;if(m=/^\s*\[(\w+)\]/.exec(c)){var mm=m[1].toLowerCase();switch(mm){case"info":status=0;break;case"gene":status=1;break;case"grafica":status=2;break;default:formula=[],info.formule[mm]=formula,status=3}}else 0==status?/^\s*descrizione\s*=/i.test(c)&&(info.des=c.split("=")[1].trim().toLowerCase()):1==status?c.trim()&&info.header.push(c):2==status?info.codice.push(c):formula.push(c)}if(info.tm=muClComments(info.codice.join("\n")),info.tm.length){cl=[`// rule ${info.cod}\n :des ${info.des||info.cod}\n `];if(info.header.length){for(var r of(cl.push("{header}"),info.header)){var x;(x=gettipo(r))&&("G"==x.tipo?(delete x.tipo,cl.push(`:g ${torowtipo(x)}`)):x.tipo.length>1&&cl.push(torowtipo(x)))}cl.push("{:header}")}for(var ff in info.formule){tm=parsecodecad((righe=info.formule[ff]).join("\n"));cl.push(`\n{f ${ff}}\n${tm}\n{:f}`)}var righe=info.codice.join("\n");cl.push(parsecodecad(righe)),fs.writeFileSync(path.join(folder,basename+".mu"),cl.join("\n")),logga(`reg ${++ii}: ${info.cod} - ${info.des}`)}}}if(mi.t||mi.tipologie){rr=(r=db.get(`${sql} and cod=?`,"tipologie")).info.split("").sort();console.log("-> tipologie",rr.length);var tp={};for(var riga of rr){if(c=(v=riga.trim().toLowerCase()).split(",")[0].trim())if(c.includes("."))tp[(r=c.split("."))[0]]?tp[r[0]][r[1]]=v:console.log("errore tipo",c);else tp[c]={v:v},(r=db.get(`${sql} and cod=?`,`db_${c}`)).info&&(tp[c].db=parsecodecad(r.info.trim().toLowerCase().replaceAll("","\n"),!0)),(r=db.get(`${sql} and cod=?`,`ll_${c}`)).info&&(tp[c].list=parsecodecad(r.info.trim().toLowerCase().replaceAll("","\n"),!0))}fs.writeFileSync(folder+"/typos.json",JSON.stringify(tp,null,2));rr=db.all(`${sql} and cod like ?`,"M>%");for(var r of(console.log("-> macro tip",rr.length),rr)){var cod;logga("macdb "+(cod=r.cod.substr(2).trim().toLowerCase()));mac=parsecodecad(r.info.toLowerCase(),!0),cl=`// ${r.des}\n${mac} \n `;fs.writeFileSync(path.join(folder,`++${cod}.mu`),cl)}}if(mi.a||mi.abilita){function parseacapo(str){var cl=[];for(var spaces="";;){var i=str.lastIndexOf(",",100);if(str.length<100||i<0){cl.push(spaces+str),spaces.length&&cl.push("");break}cl.push(spaces+str.substr(0,i)+", \\"),spaces=" ",str=str.substr(i+1)}return cl.join("\n")}function normalizeopt(kk){var vv=kk.toLowerCase().split(";"),parsa=v=>v?[...new Set(v.split("*").sort().filter((e=>e.trim())))].join(","):"";return{abilit:parsa(vv[0]),scons:parsa(vv[1]),obs:parsa(vv[2])}}console.log("-> abilitazioni");kk={};var cx1=(rr=db.all("select var var,abilit abilit,codart codart from valartopz order by var,abilit")).length;for(var r of rr)if(r.var&&r.abilit&&r.codart){var xv=r.var.trim().toLowerCase(),{abilit:abilit,scons:scons,obs:obs}=normalizeopt(r.abilit),code=r.codart.trim().toLowerCase();kk[xv]||(kk[xv]={}),(k2=kk[xv])[abilit]||(k2[abilit]={scons:scons,obs:obs,neutri:[],art:[],mod:[]}),k2[abilit].neutri.push(code)}var cx2=(rr=db.all("select var var,abilit abilit,codmod codart from valmodopz order by var,abilit")).length;for(var r of rr)if(r.var&&r.abilit&&r.codart){xv=r.var.trim().toLowerCase();var{abilit:abilit,scons:scons,obs:obs}=normalizeopt(r.abilit);code=r.codart.trim().toLowerCase();kk[xv]||(kk[xv]={}),(k2=kk[xv])[abilit]||(k2[abilit]={scons:scons,obs:obs,neutri:[],art:[],mod:[]}),k2[abilit].mod.push(code)}var cx3=(rr=db.all("select var var,abilit abilit,cod codart from valmodartopz order by var,abilit")).length;for(var r of rr)if(r.var&&r.abilit&&r.codart){xv=r.var.trim().toLowerCase();var k2,{abilit:abilit,scons:scons,obs:obs}=normalizeopt(r.abilit);code=r.codart.trim().toLowerCase();kk[xv]||(kk[xv]={}),(k2=kk[xv])[abilit]||(k2[abilit]={scons:scons,obs:obs,neutri:[],art:[],mod:[]}),k2[abilit].art.push(code)}for(var xv in console.log("-> ab trasforma",cx1,cx2,cx3),kk)if(fs.existsSync(path.join(folder,xv+".var"))){cl=[];var variant=kk[xv];for(var x1 in variant){tm=variant[x1];cl.push("\n\n{limit}"),tm.neutri.length&&cl.push(parseacapo(":neutri "+tm.neutri.join(","))),tm.art.length&&cl.push(parseacapo(":art "+tm.art.join(","))),tm.mod.length&&cl.push(parseacapo(":mod "+tm.mod.join(","))),tm.obs&&cl.push(parseacapo(":obs "+tm.obs)),tm.scons&&cl.push(parseacapo(":scons "+tm.obs)),cl.push(parseacapo(":opz "+x1))}fs.writeFileSync(path.join(folder,xv+".var.txt"),cl.join("\n"))}}dtx=(new Date).valueOf()-dtx,console.log("Tempo: ",dtx+"ms"),db.chiudi();
52
+ */Date.prototype.toInt||(Date.prototype.toInt=function(){return this.getDate()+100*(this.getMonth()+1)+1e4*this.getFullYear()}),Date.prototype.toFloat||(Date.prototype.toFloat=function(){return Math.floor(1e4*this.getDate()+1e6*(this.getMonth()+1)+1e8*this.getFullYear()+100*this.getHours()+this.getMinutes()+.5)/1e4});const{Clear:Clear,Reset:Reset,Bold:Bold,Reverse:Reverse,Red:Red,Green:Green,Yellow:Yellow,Blue:Blue,Magenta:Magenta,Cyan:Cyan,White:White}=init();var inidata={FOLDERBASE:"./",DBWORK:"./data/app.db",FOLDERCAT:"./data/mu",FOLDEROUT:"./out",CAT:"cat"};const fini=".lasts.markuno";fs.existsSync(fini)&&(inidata=JSON.parse(fs.readFileSync(fini))),inidata.FOLDERCAD||(inidata.FOLDERCAD="./cat3cad");var mi=minimist(process.argv);console.log(`----------------------------------------------------------------------------------------\n${Bold}${Cyan}${Bold}mu-convcad:${Reset} Convert data from 3CAD (c) Croswil 2024 v. ${Yellow}2.0.34${Reset}\n----------------------------------------------------------------------------------------`);const INI=`uso: ${Bold} mu-convcad <nomecatalogo> [opzioni]\n${Green}Opzioni:${Reset}\n ${White} -h, --help${Reset}${Green} mostra l'help\n ${White} -i, --init <folder>${Reset}${Green} cartella di lavoro (default='${inidata.FOLDERCAT}' ) \n ${White} -c, --cad <folder>${Reset}${Green} cartella cad (default='${inidata.FOLDERCAD}' ) \n ${White} -r, --reset${Reset}${Green} Cancella tutti i dati precedenti\n ${White} -t, --tipologie${Reset}${Green} Tipologie e Macro tip\n ${White} -a, --abilita${Reset}${Green} Processa abilitazioni\n`;inidata.FOLDERCAT=mi.i||mi.init||inidata.FOLDERCAT,inidata.FOLDERCAD=mi.c||mi.cad||inidata.FOLDERCAD;const catname=mi._[2]||void 0;(mi.h||mi.help||!catname)&&(console.log(INI),process.exit(0)),inidata.CAT=catname;const folder=path.join(inidata.FOLDERCAT,catname),folder2=path.join(inidata.FOLDERCAD,catname);var dborig=path.join(folder2,`${catname}.ddb`);fs.existsSync(dborig)||(console.log("manca il database di origine: "+catname),process.exit(1)),fs.writeFileSync(fini,JSON.stringify(inidata,null,2));const logdata=[],logga=v=>logdata.push(v),sql="select cod cod,des des,memo info from speciali where cat='pro'";function unisciriga(c1){var c=[];for(var x of c1)!x.startsWith('"')&&x.includes(",")&&(x=`"${x}"`),c.push(x);return c.join(",")}function parsecodecad(text,db){var vv=(text=text.replaceAll("\t",",").replaceAll("\r","").replace(/\#vb/gim,"/* VB !not supported").replace(/#endvb/gim,"*/").replace(/\#msg /gim,"!msg ")).split("\n"),cl=[],inBloccoCommento=!1;return vv.forEach(((v,i)=>{v.startsWith("/*")&&(inBloccoCommento=!0),inBloccoCommento?cl.push(v):/^\s*$/.test(v)||(db?(v=v.replace(/\s*\#m\s+(\w+)/im,((m0,m1)=>"#m ++"+m1)),cl.push(v)):(/^\s*\d+/.test(v)?v="!t "+v.trim():/^\s*\!parametri/i.test(v)?v=v.replace(/\!parametri /gi,":p "):/^\s*\w+/.test(v)&&(v="#m +"+v.replace(/\s*\_*/,"")),cl.push(v))),inBloccoCommento&&v.trim().endsWith("*/")&&(inBloccoCommento=!1)})),function muFormatcode(code,gisvar){let lines=code.split("\n"),formattedCode=[],indentLevel=0,inBloccoCommento=!1,inAcapo=!1,cols=[];var isvar=gisvar;if(isvar){let tm=verificaisvar(0,lines);(isvar=tm.fl)&&(cols=tm.cols)}for(let i=0;i<lines.length;i++){let ltot=lines[i],line=ltot.trim();var tt=line.split("//");let linenc=tt[0].trim();tt.splice(0,1);let commento=tt.length?` // ${tt.join("//").trim()} `:"";if(line.startsWith("/*"))inBloccoCommento=!0,formattedCode.push(line);else if(inBloccoCommento&&line.endsWith("*/"))inBloccoCommento=!1,formattedCode.push(line);else if(inBloccoCommento)formattedCode.push(ltot);else{var rr=regex.exec(line);if(rr){if(formattedCode.push(line),indentLevel=rr[1]?0:1,/^\s*\{(var|deriva|header|v|h)(\s.*)?\}/i.test(line)){let tm=verificaisvar(i+1,lines);(isvar=tm.fl)&&(cols=tm.cols)}else isvar=!1;inAcapo=!1;continue}if(isvar)if(linenc.startsWith(":")&&!linenc.startsWith(":h ")||!linenc)formattedCode.push(line);else{var lba=" ";linenc.startsWith(":h ")&&(linenc=linenc.substr(3).trim(),lba=":h ");for(var cl=getcolonne(linenc),j=0;j<cl.length;j++)cl[j].includes(",")&&(cl[j]=`"${cl[j]}"`),cl[j]=cl[j].padEnd(cols[j]," ");formattedCode.push(`${lba}${cl.join(" , ")} ${commento}`)}else{let indent=" ".repeat(indentLevel>=0?indentLevel:0);if(inAcapo)formattedCode.push(`${indent} ${line}`);else{let command="";line.startsWith("#")&&(command=line.substring(1).split(" ")[0].toUpperCase(),line="#"+command+line.substring(command.length+1)),["IF","IFDEF","IFNDEF"].includes(command)?line.indexOf("#",2)<0?(formattedCode.push(`${indent}${line}`),indentLevel++):(line=line.replace(/#([\w]+)/g,((match,m1)=>"#"+m1.toUpperCase())),formattedCode.push(`${indent}${line}`)):["FOR","SELECT","FORVAR","VARIANTE","DO"].includes(command)?(formattedCode.push(`${indent}${line}`),indentLevel++):["ELSEIF","ELSE","ELSEIFDEF","ELSEIFNDEF","CASE","CASES","DEFAULT"].includes(command)&&indentLevel>0?formattedCode.push(" ".repeat(indentLevel>0?indentLevel-1:0)+line):["ENDIF","ENDSELECT","LOOP","ENDFOR"].includes(command)?(formattedCode.push(" ".repeat(indentLevel>0?indentLevel-1:0)+line),indentLevel--,indentLevel<0&&(indentLevel=0)):line.startsWith("_ ")||line.startsWith(":")?formattedCode.push(line):formattedCode.push(indent+line)}inAcapo=linenc.endsWith("\\")}}}return formattedCode.join("\n")}(cl.join("\n"))}const tipi={"-":"sep",T:"var",M:"num",S:"str",C:"yn",L:"hidden",Z:"ny"};function torowtipo(x){var cl=[];if(!x)return"";for(var t in x)"cod"!=t&&cl.push(`${t}=${x[t]}`);return`${x.cod} ${cl.join(",")}`}function gettipo(row){var v=row.split(",");if(v[1]||v[2]){var x={};return x.cod=(v[2]||v[1]).trim().toLowerCase(),v[2]&&(x.alias=v[2].trim().toLowerCase()),v[3]&&(x.valid=v[3].trim().toLowerCase()),v[4]&&(x.des=v[4].trim()),v[5]&&(x.visible=v[5].trim().toLowerCase()),tipi[v[0]]?x.tipo=tipi[v[0]]:"D"==v[0]?x.tipo="sp."+v[6]:x.tipo=v[0].trim().toUpperCase(),x}}mi.r||mi.reset?console.log("-> crea catalogo e copia"):console.log("-> aggiorna catalogo");var dbxfile=`${inidata.FOLDERCAT}/mu_${catname}.db`;(mi.r||mi.reset)&&(fs.existsSync(folder)&&fs.rmSync(folder,{recursive:!0}),fs.existsSync(dbxfile)&&fs.unlinkSync(dbxfile)),fs.existsSync(folder)||fs.mkdirSync(folder,{recursive:!0}),fs.copyFileSync(dborig,folder+"/"+catname+".db");var db=database.db(dborig),dtx=(new Date).valueOf(),xalias=[],rr=db.all("select cod cod,des des ,codmet alias,obbl obbligo, memo info from codvar ");for(var r of(console.log("-> varianti",rr.length),rr)){for(var xx=r.info.split(""),cl=[],c1=[],i=1;i<xx.length&&xx[i];i+=2)c1.push(xx[i]);if(cl.push(`:des ${r.des.trim().toLowerCase()}`),r.obbl&&cl.push(":obbligo"),r.alias)xalias.push(`${r.cod.trim().toLowerCase()} , ${r.alias.trim().toLowerCase()}`);else{cl.push(""),cl.push(":h "+unisciriga(c1));var vv=db.all("select codopz cod,des des,memo info from varianti where codvar=? order by ordinamento,codopz",r.cod);for(var v of vv){c1=unisciriga([v.cod.trim().toLowerCase(),v.des.trim().toLowerCase(),...v.info.trim().toLowerCase().split("\t")]);cl.push(" "+c1)}r.cod=r.cod.trim().toLowerCase(),logga("var: "+r.cod),fs.writeFileSync(`${folder}/${r.cod}.var`,cl.join("\n"))}}rr=db.all("select cod cod,des des,fldef defs from modelli order by cod"),cl=[];for(var r of(cl.push(":des Modelli\n\n:h Cod, Descrizione\n"),rr))cl.push(" "+unisciriga([r.cod.trim().toLowerCase(),r.des]));fs.writeFileSync(`${folder}/modelli.var`,cl.join("\n")),xalias=["// Alias Varianti\n\n{v __aliasvar}\n:h variante, alias",...xalias.sort()],fs.writeFileSync(`${folder}/_alias.inc`,xalias.join("\n")),console.log("-> gruppi.ini");var file=path.join(folder2,"gruppi.ini");if(fs.existsSync(file)){rr=muClComments(data=fs.readFileSync(file).toString().replaceAll("�","'"));var grps={},cgroup=[];for(var r of rr){if(m=/^\s*\[(\w+)\]/i.exec(r))cgroup=[],grps[m[1].trim().toLowerCase()]=cgroup;else(x=gettipo(r))&&cgroup.push(torowtipo(x))}}var kk=Object.keys(grps).sort();cl=[];for(var k of(cl.push("// includes headers"),kk))cl.push(""),cl.push(`{h ${k}}`),cl.push(...grps[k]);if(fs.writeFileSync(path.join(folder,"_headers.inc"),cl.join("\n")),console.log("-> deriva"),(r=db.get(`${sql} and cod='deriva'`)).cod&&r.info){r.info=r.info.trim().toLowerCase().replaceAll("","\n");var tm=r.info.split("\n").map((t=>t.trim())).sort();fs.writeFileSync(path.join(folder,"_deriva.inc"),`// derivazione varianti \n{v deriva}\n:des deriva delle varianti\n :h var=opz,-> var=opz\n \n${tm.join("\n")}`)}rr=db.all(`${sql} and cod like ?`,">>%");for(var r of(console.log("-> macro",rr.length),rr)){logga("mac "+(cod=(cod=r.cod.substr(2).trim().toLowerCase()).replace(/^_*/,"")));var mac=parsecodecad(r.info.toLowerCase());cl=`// ${r.des}\n${mac} \n `;fs.writeFileSync(path.join(folder,`+${cod}.mu`),cl)}var regole=fs.readdirSync(folder2);regole=regole.filter((r=>r.toLowerCase().endsWith(".erg")));var ii=0;for(var rr of(console.log("-> regole",regole.length),regole)){var data=fs.readFileSync(path.join(folder2,rr)).toString().replaceAll("\r",""),ext=path.extname(rr),basename=path.basename(rr,ext).trim().toLowerCase();if(!basename.includes(".")&&"gene"!=basename){var info={cod:basename,des:"",codice:[],header:[],formule:{}},formula=[],status=(cl=data.split("\n"),-1);for(var c of cl){var m;if(m=/^\s*\[(\w+)\]/.exec(c)){var mm=m[1].toLowerCase();switch(mm){case"info":status=0;break;case"gene":status=1;break;case"grafica":status=2;break;default:formula=[],info.formule[mm]=formula,status=3}}else 0==status?/^\s*descrizione\s*=/i.test(c)&&(info.des=c.split("=")[1].trim().toLowerCase()):1==status?c.trim()&&info.header.push(c):2==status?info.codice.push(c):formula.push(c)}if(info.tm=muClComments(info.codice.join("\n")),info.tm.length){cl=[`// rule ${info.cod}\n :des ${info.des||info.cod}\n `];if(info.header.length){for(var r of(cl.push("{header}"),info.header)){var x;(x=gettipo(r))&&("G"==x.tipo?(delete x.tipo,cl.push(`:g ${torowtipo(x)}`)):x.tipo.length>1&&cl.push(torowtipo(x)))}cl.push("{:header}")}for(var ff in info.formule){tm=parsecodecad((righe=info.formule[ff]).join("\n"));cl.push(`\n{f ${ff}}\n${tm}\n{:f}`)}var righe=info.codice.join("\n");cl.push(parsecodecad(righe)),fs.writeFileSync(path.join(folder,basename+".mu"),cl.join("\n")),logga(`reg ${++ii}: ${info.cod} - ${info.des}`)}}}if(mi.t||mi.tipologie){rr=(r=db.get(`${sql} and cod=?`,"tipologie")).info.split("").sort();console.log("-> tipologie",rr.length);var tp={};for(var riga of rr){if(c=(v=riga.trim().toLowerCase()).split(",")[0].trim())if(c.includes("."))tp[(r=c.split("."))[0]]?tp[r[0]][r[1]]=v:console.log("errore tipo",c);else tp[c]={v:v},(r=db.get(`${sql} and cod=?`,`db_${c}`)).info&&(tp[c].db=parsecodecad(r.info.trim().toLowerCase().replaceAll("","\n"),!0)),(r=db.get(`${sql} and cod=?`,`ll_${c}`)).info&&(tp[c].list=parsecodecad(r.info.trim().toLowerCase().replaceAll("","\n"),!0))}fs.writeFileSync(folder+"/typos.json",JSON.stringify(tp,null,2));rr=db.all(`${sql} and cod like ?`,"M>%");for(var r of(console.log("-> macro tip",rr.length),rr)){var cod;logga("macdb "+(cod=r.cod.substr(2).trim().toLowerCase()));mac=parsecodecad(r.info.toLowerCase(),!0),cl=`// ${r.des}\n${mac} \n `;fs.writeFileSync(path.join(folder,`++${cod}.mu`),cl)}}if(mi.a||mi.abilita){function parseacapo(str){var cl=[];for(var spaces="";;){var i=str.lastIndexOf(",",100);if(str.length<100||i<0){cl.push(spaces+str),spaces.length&&cl.push("");break}cl.push(spaces+str.substr(0,i)+", \\"),spaces=" ",str=str.substr(i+1)}return cl.join("\n")}function normalizeopt(kk){var vv=kk.toLowerCase().split(";"),parsa=v=>v?[...new Set(v.split("*").sort().filter((e=>e.trim())))].join(","):"";return{abilit:parsa(vv[0]),scons:parsa(vv[1]),obs:parsa(vv[2])}}console.log("-> abilitazioni");kk={};var cx1=(rr=db.all("select var var,abilit abilit,codart codart from valartopz order by var,abilit")).length;for(var r of rr)if(r.var&&r.abilit&&r.codart){var xv=r.var.trim().toLowerCase(),{abilit:abilit,scons:scons,obs:obs}=normalizeopt(r.abilit),code=r.codart.trim().toLowerCase();kk[xv]||(kk[xv]={}),(k2=kk[xv])[abilit]||(k2[abilit]={scons:scons,obs:obs,neutri:[],art:[],mod:[]}),k2[abilit].neutri.push(code)}var cx2=(rr=db.all("select var var,abilit abilit,codmod codart from valmodopz order by var,abilit")).length;for(var r of rr)if(r.var&&r.abilit&&r.codart){xv=r.var.trim().toLowerCase();var{abilit:abilit,scons:scons,obs:obs}=normalizeopt(r.abilit);code=r.codart.trim().toLowerCase();kk[xv]||(kk[xv]={}),(k2=kk[xv])[abilit]||(k2[abilit]={scons:scons,obs:obs,neutri:[],art:[],mod:[]}),k2[abilit].mod.push(code)}var cx3=(rr=db.all("select var var,abilit abilit,cod codart from valmodartopz order by var,abilit")).length;for(var r of rr)if(r.var&&r.abilit&&r.codart){xv=r.var.trim().toLowerCase();var k2,{abilit:abilit,scons:scons,obs:obs}=normalizeopt(r.abilit);code=r.codart.trim().toLowerCase();kk[xv]||(kk[xv]={}),(k2=kk[xv])[abilit]||(k2[abilit]={scons:scons,obs:obs,neutri:[],art:[],mod:[]}),k2[abilit].art.push(code)}for(var xv in console.log("-> ab trasforma",cx1,cx2,cx3),kk)if(fs.existsSync(path.join(folder,xv+".var"))){cl=[];var variant=kk[xv];for(var x1 in variant){tm=variant[x1];cl.push("\n\n{limit}"),tm.neutri.length&&cl.push(parseacapo(":neutri "+tm.neutri.join(","))),tm.art.length&&cl.push(parseacapo(":art "+tm.art.join(","))),tm.mod.length&&cl.push(parseacapo(":mod "+tm.mod.join(","))),tm.obs&&cl.push(parseacapo(":obs "+tm.obs)),tm.scons&&cl.push(parseacapo(":scons "+tm.obs)),cl.push(parseacapo(":opz "+x1))}fs.writeFileSync(path.join(folder,xv+".var.txt"),cl.join("\n"))}}dtx=(new Date).valueOf()-dtx,console.log("Tempo: ",dtx+"ms"),db.chiudi();
package/bin/mu-glb.js CHANGED
@@ -35,8 +35,8 @@ function errore(e, par) {
35
35
  console.log(`${Red}${Bold}ERRORE! ${e}: ${White}${par || ''}${Reset}`);
36
36
  process.exit(1);
37
37
  }
38
- async function infoglb(buffer) {
39
- const doc = await io.readBinary(buffer);
38
+ async function infoglb(file) {
39
+ const doc = await io.read(file);
40
40
  const root = doc.getRoot();
41
41
 
42
42
  const scenes = root.listScenes();
@@ -78,8 +78,9 @@ async function infoglb(buffer) {
78
78
  console.log('');
79
79
  }
80
80
 
81
- async function compressglb(buffer, size, tex = true) {
82
- const doc = await io.readBinary(buffer);
81
+ async function compressglb(file, size, tex = true) {
82
+ const doc = await io.read(file);
83
+ //const doc = await io.readBinary(buffer);
83
84
  let errore = false;
84
85
  const tryTransform = async (name, fn) => {
85
86
  try {
@@ -109,14 +110,16 @@ async function compressglb(buffer, size, tex = true) {
109
110
 
110
111
  async function processaglb(percorso, file) {
111
112
  let nomefile = path.join(percorso, file);
112
- let buffer = fs.readFileSync(nomefile);
113
+ let insize = fs.statSync(nomefile).size;
114
+
115
+ //let buffer = fs.readFileSync(nomefile);
113
116
  if (!(mi.c || mi.compress)) {
114
117
  console.log(`${Cyan}${nomefile}:${Reset}`);
115
- await infoglb(buffer);
118
+ await infoglb(nomefile);
116
119
  } else {
117
- let b2 = await compressglb(buffer, SIZE);
120
+ let b2 = await compressglb(nomefile, SIZE);
118
121
  fs.writeFileSync(nomefile, b2);
119
- console.log(`${Yellow}${file} ${White}${Math.round(buffer.length / 1024)}M => ${Math.round(b2.length / 1024)}M`);
122
+ console.log(`${Yellow}${file} ${White}${Math.round(insize / 1024)}M => ${Math.round(b2.length / 1024)}M`);
120
123
  }
121
124
  }
122
125
 
package/bin/mu.js CHANGED
@@ -158,7 +158,7 @@ var toNum=(n,dec=-1)=>{const num="string"==typeof n?parseFloat(n)||0:n;if(dec<0)
158
158
  * @param {string} codice - Il codice sorgente da processare
159
159
  * @param {boolean} tienivuoti - Se true mantiene le righe vuote
160
160
  * @returns {string[]} Array di righe di codice senza commenti
161
- */function muClComments(codice,tienivuoti){const righe=(code=codice,code.replace(/("(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*')|\/\*[\s\S]*?\*\//g,((match,quoted)=>quoted||""))).split(/\r?\n/);var code;const tm=[];let rigaContinua="";for(const riga of righe){let rigaTrim=riga.trim();if(/(^|[^:])\/\/.*/.test(rigaTrim)&&(rigaTrim=rigaTrim.replace(/(^|[^:])\/\/.*/,((match,p1)=>p1.trim()))),0!==rigaTrim.length||tienivuoti)if(rigaContinua.length>0&&(rigaTrim=rigaContinua+" "+rigaTrim,rigaContinua=""),rigaTrim.endsWith("\\")){rigaTrim=rigaTrim.slice(0,-1);const indiceCommento=rigaTrim.lastIndexOf("//");-1!==indiceCommento&&(rigaTrim=rigaTrim.slice(0,indiceCommento).trim()),rigaContinua=rigaTrim}else tm.push(rigaTrim)}return tm}
161
+ */function muClComments(codice,tienivuoti){const righe=(code=codice,code.replace(/("(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*')|\/\*[\s\S]*?\*\//g,((match,quoted)=>quoted||""))).split(/\r?\n/);var code;const tm=[];let rigaContinua="";for(const riga of righe){let rigaTrim=riga;if(/(^|[^:])\/\/.*/.test(rigaTrim)&&(rigaTrim=rigaTrim.replace(/(^|[^:])\/\/.*/,((match,p1)=>p1.trim()))),rigaTrim=rigaTrim.trim(),0!==rigaTrim.length||tienivuoti)if(rigaContinua.length>0&&(rigaTrim=rigaContinua+" "+rigaTrim,rigaContinua=""),rigaTrim.endsWith("\\")){rigaTrim=rigaTrim.slice(0,-1);const indiceCommento=rigaTrim.lastIndexOf("//");-1!==indiceCommento&&(rigaTrim=rigaTrim.slice(0,indiceCommento).trim()),rigaContinua=rigaTrim}else tm.push(rigaTrim)}return tm}
162
162
  /**
163
163
  * Analizza e organizza il codice in una struttura dati gerarchica
164
164
  * @param {string[]} tt - Array di righe di codice da analizzare
@@ -239,14 +239,14 @@ this.amb=amb}
239
239
  * Trova la prima opzione valida tra quelle disponibili
240
240
  * @param {string} opz - Opzione da controllare per prima
241
241
  * @returns {string|undefined} Prima opzione valida trovata o undefined
242
- */firstvalid(opz){let i=opz.indexOf(",");if(i>0&&(opz=opz.slice(0,i).trim()),opz&&this.isvalidopz(opz))return opz;if(this.vdef&&this.vdef.length)for(var o of this.vdef)if(this.isvalidopz(o))return o;for(var x in this.rows)if(this.isvalidopz(x))return x}
242
+ */firstvalid(opz){let i=opz.indexOf(",");if(i>0&&(opz=opz.slice(0,i).trim()),opz&&this.isvalidopz(opz))return opz;if(this.vdef&&this.vdef.length)for(var o of this.vdef)if(this.isvalidopz(o))return o;let tm=Object.keys(this.rows).sort();for(let i=0;i<tm.length;i++){let x=tm[i];if(!(i<tm.length-1&&tm[i+1].startsWith(x+"."))&&this.isvalidopz(x))return x}}
243
243
  /**
244
244
  * Resetta tutti i filtri applicati alla variante
245
245
  */resetfilter(){for(var x in delete this._valids,this.rows)this.rows[x].annulla=0}
246
246
  /**
247
247
  * Restituisce le chiavi valide ordinate alfabeticamente
248
248
  * @returns {string[]} Array di chiavi valide
249
- */validkeys(){let kk=Object.keys(this.rows)||[];return kk=kk.filter((k=>0==this.rows[k].annulla)).sort(),kk}limitfiltra(filtra){if(this.resetfilter(),!filtra)return;filtra=muClComments(filtra.toLowerCase());let tm=[];for(var f of filtra){let rr=/^#([ie])(\d*)\s+(.+)$/i.exec(f);if(rr){let t={ex:"e"==rr[1],col:(parseInt(rr[2])||1)-1,val:getcolonne(rr[3])};t.val.length&&tm.push(t)}}if(tm.length)for(var x in this.rows){let r=this.rows[x];for(var t of tm)if(t.ex){if(_check(r.v[t.col]||"",t.val)){r.annulla=1;break}}else if(!_check(r.v[t.col]||"",t.val)){r.annulla=1;break}}function _check(value,valori){return!!valori.find((e=>e.startsWith(value)))}}
249
+ */validkeys(){let kk=Object.keys(this.rows)||[];return kk=kk.filter((k=>0==this.rows[k].annulla)).sort(),kk}limitfiltra(filtra){if(this.resetfilter(),!filtra)return;filtra=muClComments(filtra.toLowerCase());let tm=[];for(var f of filtra){let rr=/^#([iex])(\d*)\s+(.+)$/i.exec(f);if(rr){let t={ex:rr[1],col:(parseInt(rr[2])||1)-1,val:"x"==rr[1]?rr[3]:getcolonne(rr[3])};t.val.length&&tm.push(t)}}if(tm.length)for(var x in this.rows){let r=this.rows[x];for(var t of tm)if("e"==t.ex){if(_check(r.v[t.col]||"",t.val)){r.annulla=1;break}}else if("x"==t.ex){let vt=(r.v[t.col]||"").toLowerCase().split(/[,;]/).map((e=>e.trim()));if(!_check(t.val||"",vt)){r.annulla=1;break}}else if(!_check(r.v[t.col]||"",t.val)){r.annulla=1;break}}function _check(value,valori){return!!valori.find((e=>e.startsWith(value)))}}
250
250
  /**
251
251
  * Applica i limiti configurati alle opzioni della variante
252
252
  * @returns {Array|void} Array di limiti applicati o void se reset
@@ -258,16 +258,16 @@ this.amb=amb}
258
258
  */async loadContentExtended(content){if("object"==typeof content){for(var x in content)["rows","des","h","alias","obbligo"].includes(x)&&(this[x]=content[x]);"string"==typeof content.def&&content.def.length&&(this.vdef=getcolonne(content.def.trim().toLowerCase())),content.filter&&content.filter.length&&(this.limits=parselimitifromdb(content.filter))}else await this._loadContent(muClComments(content,!1))}todata(){return{name:this.name,des:this.des,alias:this.alias,obbligo:this.obbligo,h:this.h,rows:this.rows,limits:this.limits,key:this.key}}}let _nofunc={};async function getcbfunc(tm,cmd,pars,vari,amb,output){if(cbFunc$1){if(_nofunc[cmd])return"";let a=await cbFunc$1(cmd,pars,vari,amb,output);return isObject(a)||(a=(a||"").trim(),"!"==a&&(_nofunc[cmd]=!0,a="")),a}return tm}async function intvaluta(amb,mac,str){return await amb.vari.valuta(str,(async(fun,pars)=>{if("dim"===fun){var dm=muCalc(pars[1]),vv=await dammivariante(amb,mac,pars[2]),col=parseInt(pars[3])||2;return vv&&vv.fromdim?vv.fromdim(dm,col):dm}return await getcbfunc(`**fun:${fun}**`,fun,pars,amb.vari,amb)}))}async function dammivariante(amb,macro,ky){return macro&&macro?.localvar&&macro.localvar[ky]?macro.localvar[ky]:await amb.getvariante(ky)}async function impostavariante(amb,macro,a,b,head){let tm,ky=a;if((b=b||"")&&"string"==typeof b){var k=b.indexOf(":");k>=0&&(k>0&&(ky=clean(b.slice(0,k))),b=b.slice(k+1))}
259
259
  /** @type {Variante} */if(head&&head.alias&&(ky=head.alias),macro&&macro.paralias&&macro.paralias[a]&&(ky=macro.paralias[a]),tm=await dammivariante(amb,macro,ky),tm)if(head&&head.t){head.des||(head.des=tm.des);let x8=head?.filtra||"";if(x8.includes("$")&&(x8=await amb.vari.valuta(x8)),"m"===head.t){var col=2;if(b.includes(":")){var xx=b.split(":");col=parseInt(xx[1]),b=xx[0]}tm.limita(x8),b=tm.fromdim(parseFloat(b),col)}else{tm.limita(x8);let b1=tm.firstvalid(b);b=tm.tovar(b1)}}else tm.resetfilter(),b=tm.firstvalid(b),b=tm.tovar(b);else head&&head.t&&head.t;return amb.vari.add(a,b),b}const outpush=(output,a)=>{null!=a&&null!=a&&("string"==typeof a&&a.startsWith("_ ")&&output.length>0&&"string"==typeof output[output.length-1]?output[output.length-1]+=a.slice(2):output.push(...a.split("\n")))};async function muEval(amb,mac,codice,options){if(!Array.isArray(codice))return errori.add("codice is not a valid parsed array"),[];options||(options={}),options.id||(options.id="_"),options._stackmacro||(options._stackmacro=0),options.limited||(options.limited=!1),amb||errori.add("amb deve essere definito");let vari=amb.vari;amb.maxdelays,amb.cat;let output=[];(new Date).valueOf();for(let ii=0;ii<codice.length;){var riga=codice[ii];switch(riga.tipo){case"IFDEF":case"IFNDEF":case"IF":{let tm="IF"==riga.tipo?muCalc(await intvaluta(amb,mac,riga.contenuto)):"IFDEF"==riga.tipo?""!=await intvaluta(amb,mac,riga.contenuto):""==await intvaluta(amb,mac,riga.contenuto);riga.next?(codice[riga.next].jlast=tm?1:0,tm||(ii=riga.next-1)):errori.add("Troppo tempo",riga)}break;case"SELECT":riga.next?(codice[riga.next].t1=await intvaluta(amb,mac,riga.contenuto),ii=riga.next-1):errori.add("manca endselect",riga);break;case"CASE":case"CASES":case"DEFAULT":if(riga.next)if(riga.jlast)riga.jlast=0,ii=riga.last-1;else{let vv,tm=1;var _getvv=async()=>{var vv=await intvaluta(amb,mac,riga.contenuto);return vv=vv.includes(":")&&!vv.includes(",")?vv.split(":").map((e=>(e||"").trim())):getcolonne(vv)};if("CASE"==riga.tipo){tm=0,vv=await _getvv();let tmx=muCalc(riga.t1||"");vv.find((v=>muCalc(v)==tmx))&&(tm=1)}else if("CASES"==riga.tipo){tm=0,vv=await _getvv();let tmx=riga.t1||"";vv.find((v=>v==tmx))&&(tm=1)}codice[riga.next].jlast=tm?1:0,codice[riga.next].t1=riga.t1,tm||(ii=riga.next-1)}else errori.add("manca select",riga);break;case"ELSEIF":case"ELSEIFDEF":case"ELSEIFNDEF":case"ELSE":if(riga.next)if(riga.jlast)riga.jlast=0,ii=riga.last-1;else{let tm="ELSE"==riga.tipo?1:"ELSEIF"==riga.tipo?muCalc(await intvaluta(amb,mac,riga.contenuto)):"ELSEIFDEF"==riga.tipo?""!=await intvaluta(amb,mac,riga.contenuto):""==await intvaluta(amb,mac,riga.contenuto);codice[riga.next].jlast=tm?1:0,tm||(ii=riga.next-1)}else errori.add("manca endif",riga);break;case"ENDIF":case"ENDSELECT":case"CACHE":case"CVAR":break;case"PUSH":vari.push();break;case"POP":vari.pop();break;case"INC":case"I":if(options._stackmacro>500)errori.add("stack chiamate macro troppo profondo!",riga);else{var{macro:macro,pars:pars,xid:xid}=await amb.getmacro(riga)||{};if(macro){options._inc=!0,options._stackmacro++;let saved={},parametri=macro.parametri?._;if(parametri&&parametri.length)for(let x of parametri){let x1=clean(x.split("=")[0]||"",!0);x1&&(saved[x1]=vari.dictionary[x1])}await macro.impostaparametri(parametri,pars);let rs1=await muEval(amb,macro,macro.codice,options);for(let v in saved)saved[v]?vari.dictionary[v]=saved[v]:delete vari.dictionary[v];output.push(...rs1),options._stackmacro--,options._inc=!1}}break;case"MACRO":case"M":case"FUNC":case"F":if(options._stackmacro>500)errori.add("stack chiamate macro troppo profondo!",riga);else{let{macro:macro,pars:pars,xid:xid}=await amb.getmacro(riga)||{};if(macro){let ismacro=!!options.grafica||["F","FUNC"].includes(riga.tipo),optid=options.id||"",parametri=macro.parametri?._,saved={};if(ismacro)vari.push();else{if(macro.head)for(let x of macro.head)saved[x.cod]=amb.vari.var(x.cod);if(parametri&&parametri.length)for(let x of parametri){let x1=(x.split("=")[0]||"").trim().toLowerCase();x1&&(saved[x1]=vari.dictionary[x1])}}if(macro.codice.length){if(options._stackmacro++,options.grafica&&"function"==typeof options.grafica){let f="",xid="";pars&&pars.length?(f=pars.find((e=>e.startsWith("#id"))),f?(f=await vari.valuta(f.slice(3)),options.id=hash(`${ii}${macro.name}${optid}${f}`),pars=pars.filter((e=>!e.startsWith("#id"))),xid=options.id):options.id=hash(`z${optid}${ii}`)):options.id=hash(`z${optid}${ii}`);let out=await options.grafica({tipo:riga.tipo,id:xid,pars:pars,parametri:parametri,macro:macro,options:options,vari:amb.vari,amb:amb});output.push(out)}else{await macro.impostaparametri(parametri,pars);let rs1=await muEval(amb,macro,macro.codice,options);output.push(...rs1)}options._stackmacro--}if(ismacro)vari.pop();else for(let v in saved)saved[v]?vari.dictionary[v]=saved[v]:delete vari.dictionary[v];options.id=optid}else errori.add("Macro non trovata!",riga)}break;case"LET":case"LETS":{let i=riga.contenuto.indexOf("="),j=-1;if(i>=0&&(j=riga.contenuto.indexOf("=",i+1)),j<0){var v=riga.contenuto;if(i=v.indexOf("="),i>0){let a=await intvaluta(amb,mac,v.slice(0,i).trim()),b=v.slice(i+1).trim();b="LET"==riga.tipo?muCalc(await intvaluta(amb,mac,b))||"":await intvaluta(amb,mac,b),vari.add(a,b)}}else{var vv=getcolonne(riga.contenuto);for(let v of vv)if(i=v.indexOf("="),i>0){let a=await intvaluta(amb,mac,v.slice(0,i)),b=v.slice(i+1).trim();b="LET"==riga.tipo?muCalc(await intvaluta(amb,mac,b))||"":await intvaluta(amb,mac,b),vari.add(a,b)}}}break;case"LETT":{let i=riga.contenuto.indexOf("=");if(i>0){let a=await intvaluta(amb,mac,riga.contenuto.slice(0,i).trim()),b=await intvaluta(amb,mac,riga.contenuto.slice(i+1).trim());vari.add(a,b)}}break;case"LOOK":case"LOOKB":{let cc=getcolonne(await intvaluta(amb,mac,riga.contenuto)),base=muCalc(cc[1]),col=muCalc(cc[3]),ww=await dammivariante(amb,macro,cc[2]);if(ww&&ww.rows){let rr=Object.values(ww.rows).reduce(((t,e)=>{let val=parseInt(e.v[col?col-1:0]);return val&&("LOOKB"==riga.tipo?val<=base&&val>t.v&&(t.v=val,t.c=e.v[0]):val>=base&&val<t.v&&(t.v=val,t.c=e.v[0])),t}),{v:"LOOKB"==riga.tipo?0:1/0,c:""});rr&&rr.c&&(amb.vari.add(cc[0],ww.tovar(rr.c)),options.checkheader&&"function"==typeof options.checkheader&&await options.checkheader({variante:cc[0],valore:ww.tovar(rr.c),riga:riga}))}else amb.vari.add(cc[0],`${base},no,no`)}break;case"LETV":case"LETM":case"DEF":{let tm=getcolonne(riga.contenuto);if(tm)for(let x of tm){let{v:v,o:o,fl:fl}=getcouple(x);if(fl){v=await vari.valuta(v),o=await intvaluta(amb,mac,o);let valore=await impostavariante(amb,mac,v.trim().toLowerCase(),o.trim().toLowerCase(),"LETM"==riga.tipo?{t:"m"}:{t:"v"});options._stackmacro<=0&&options.checkheader&&"function"==typeof options.checkheader&&await options.checkheader({variante:v,valore:valore,riga:riga})}}}break;case"DO":var valido=(riga.contenuto||"").trim(),fl=!0;valido&&!muCalc(await intvaluta(amb,mac,valido))&&(fl=!1),riga.next&&(fl||(ii=riga.next+1));break;case"VARIANTE":case"FORVAR":case"FOR":{let vv,valido,elenco,v;if(options.oldstyle?(vv=riga.contenuto.split(","),v=vv[2]||"i",elenco=vv[0],valido=vv[1]):(vv=getcolonne(riga.contenuto||""),v=vv[0]||"",elenco=clean(vv[1],!0),valido=vv[2]||""),v=v.includes("$")?await intvaluta(amb,mac,v):v||"","FORVAR"==riga.tipo||"VARIANTE"==riga.tipo){let tm=await intvaluta(amb,mac,elenco);var xx=tm?await dammivariante(amb,mac,tm):void 0;xx?elenco=xx.tovec():(elenco=[],errori.add("getvariante not found!",riga))}else{var txx=await intvaluta(amb,mac,elenco||"");elenco=elenco?getcolonne(txx):void 0}elenco=elenco||[];let nc=0;if(riga.next){codice[riga.next].for={v:v,elenco:elenco,nc:nc,valido:valido};let fl=!0;var voce;v&&elenco.length>0?nc>=elenco.length?fl=!1:(voce=elenco[nc],vari.add(v,voce),valido&&(fl=!muCalc(await intvaluta(amb,mac,valido)))):fl=!1,fl||(ii=riga.next-1)}else errori.add("manca endfor/loop",riga)}break;case"LOOP":{let fl=!0;riga.contenuto&&!muCalc(await intvaluta(amb,mac,riga.contenuto))&&(fl=!1),fl&&(ii=riga.prev-1);break}case"ENDFOR":if(!riga.contenuto||muCalc(await intvaluta(amb,mac,riga.contenuto)))if(riga.for){let{v:v,elenco:elenco,valido:valido}=riga.for;if(v&&elenco.length>0&&riga.for.nc<500)for(;;){if(riga.for.nc++,riga.for.nc<elenco.length){if(vari.add(v,elenco[riga.for.nc]),valido&&muCalc(await intvaluta(amb,mac,valido)))continue;ii=riga.prev;break}break}}else errori.add("manca istruzione for",riga);break;case"BREAK":case"EXIT":case"EXITFOR":riga.next?riga.contenuto.trim()?muCalc(await intvaluta(amb,mac,riga.contenuto))&&(ii=riga.next):ii=riga.next:errori.add("break outside loop",riga);break;case"CONTINUE":riga.next?riga.contenuto&&!muCalc(await intvaluta(amb,mac,riga.contenuto))||(ii=riga.next-1):errori.add("continue outside loop",riga);break;case"MSG":case"LOG":{let tm99=await intvaluta(amb,mac,riga.contenuto);logga(tm99),errori.add(tm99)}break;default:{let tm;if(riga.contenuto.startsWith("!")){tm=await intvaluta(amb,mac,riga.contenuto);let a="",rr=/^!(.\w+)[\s;,]\s*(.+)?$/gim.exec(tm);if(rr)if(rr[1].startsWith("."))await getcbfunc(tm,tm.slice(1),[],vari,amb),a="";else{let cmd=rr[1].toLowerCase(),pars=getcolonne(rr[2]||"");a=await getcbfunc(tm,cmd,pars,vari,amb)}a&&outpush(output,a)}else options.parsefnpunto&&"function"==typeof options.parsefnpunto&&riga.contenuto.startsWith(".")?await options.parsefnpunto({dati:riga.contenuto,output:output,id:options.id,vari:amb.vari,amb:amb}):(tm=await intvaluta(amb,mac,riga.contenuto),outpush(output,tm))}}ii++}return output}async function muGenerate_0(mac,amb,genera,callback,output){var xgen=mac.genera[genera];if(xgen){output.counter2=0;var working_variant={},levels=[];async function processavariante(liv){if(!(output.isTestmode&&output.counter>output.isTestmode)){if(liv<xgen.vars.length){var xx=xgen.vars[liv];if(!working_variant[xx]){var xvar=await dammivariante(amb,mac,xx),keys=Object.keys(xvar.rows);if(keys&&keys.length>0){for(let k of keys)levels.push(k),amb.vari.add(xvar.name,xvar.tovar(k)),working_variant[xx]=!0,await processavariante(liv+1),working_variant[xx]=!1,levels.pop();return}logga("manca la variante",xx)}}for(let x of xgen.calcola)mac.formula[x]&&await muEval(amb,mac,mac.formula[x],{limited:!0});for(let x of xgen.exclude)if(mac.formula[x]){let vvv=await muEval(amb,mac,mac.formula[x],{limited:!0});if(vvv)for(let v of vvv){if(muCalc(v))return}}var out1=await muEval(amb,mac,xgen.codice,{limited:!0,localvar:mac.localvar}),bb={};for(let x of xgen.bom)if(mac.formula[x]){let vvv=await muEval(amb,mac,mac.formula[x],{limited:!0});vvv=vvv.join("\n").split("\n");for(let v of vvv)if(v){var tm=getcolonne(v);bb[x]||(bb[x]=[]);var t={};for(let i=0;i<tm.length;i++)t[`c${i}`]=tm[i];bb[x].push(t)}}await async function docallback(callback,out1,bom,xgen,genera,output){var fl=!0;for(let x of out1){var tm=getcolonne(x);if(tm[0]&&!output[tm[0]]){output[tm[0]]=1,output.counter++,output.counter2++;var o={__id:output.counter};for(let i=0;i<tm.length;i++){var key=xgen.head[i]?xgen.head[i]:`c${i}`;"#"==key[0]?o[key=key.substr(1)]=muCalc(tm[i]):o[key]=tm[i]}await callback(genera,o,fl?bom:void 0,output.counter,output.counter2),fl=!1}}}(callback,out1,bb,xgen,genera,output)}}await processavariante(0)}}const DIMS=["l","a","p"],rx1=/^\{(:?(var|valid|formula|genera|header|v|f|g|h))[\s|}]/im,tipifree=["s","g","h","p","q"];function valutaCondizioniTestata(vari,str){var vv=str.split("\n");for(let v of vv)if(v.trim()){if(muCalc(vari.valutasync(v)))return!0}return!1}class Macro{constructor(amb,_name){let{name:name,cat:cat}=checkmu(_name,amb.cat||"");this.name=name,this.cat=cat,
260
260
  /** @type {Ambiente} */
261
- this.amb=amb,this.azzera()}azzera(){this.key=`${this.cat}/${this.name}`,this.localvar={},this.head=[],this.frontend=!1,this.valid=[],this.parametri={},this.paralias={},this.formula={},this.settings={},this.errori=[],this.codice=[],this.genera={}}get isgenera(){return Object.keys(this.genera).length||0}get iscodice(){return this.codice.length||0}get isheader(){return this.head?.length||0}geterrori(){var cl=[];return this.errori.forEach((e=>cl.push({e:e}))),cl}getparametri(){let s={};if(this.dims&&DIMS.forEach((k=>{let t=muCalc(this.amb.vari.var(k));t&&(s[k]=String(t))})),this.head){for(let x of this.head)if(!x._h){let tm=this.amb.vari.var(x.cod);tipifree.includes(x.t)||"string"==typeof tm&&(tm=tm.split(",")[0]),s[x.cod]=tm}}else if(this.parametri?._)for(let x of this.parametri._){let x1=(x.split("=")[0]||"").trim().toLowerCase(),tm=this.amb.vari.var[x1];tm=(tm||"").split(",")[0],s[x1]=tm}return s}async setparametri(pars){let ff={};pars||(pars={}),this.dims&&DIMS.forEach((e=>{let t=pars[e]||this.dims[e].val;t=parseFloat(t)||0,this.dims[e].visible&&(t<this.dims[e].min&&(t=this.dims[e].min),t>this.dims[e].max&&(t=this.dims[e].max)),pars[e]=String(t)}));for(let x of this.head)"g"!=x.t&&("z"!=x.t||pars[x.cod]||(pars[x.cod]="1"),x._v=pars[x.cod]||"",ff[x.cod]=!0);for(let x in pars)ff[x]||(ff[x]=!0,await impostavariante(this.amb,this,x,pars[x]));return this.head?.length>0&&await this.setparametro(this.head[0].cod,pars[this.head[0].cod]||void 0,!0),this.getparametri()}async setparametro(name,value,propaga=!1){if(value&&value.includes("$")&&(value=await intvaluta(this.amb,this,value)),this.head){const _imposta=async(riga,vv,id)=>{let nn=riga?.cod;if(riga.valid&&!riga._h1){let t0=!valutaCondizioniTestata(this.amb.vari,riga.valid);if(riga._h!=t0&&(riga._h=t0,["g","g1","g2"].includes(riga.t)))for(let i=id+1;i<this.head.length;i++){let tm1=this.head[i];if(tm1){if(["g","g1","g2"].includes(tm1.t))break;tm1._h1=riga._h}}}if(riga._h||riga._h1)return this.amb.vari.add(nn,""),riga._v=void 0,"";{if(delete riga._h2,riga.visible){let t0=!valutaCondizioniTestata(this.amb.vari,riga.visible);if(t0&&(riga._h2=t0),["g","g1","g2"].includes(riga.t))for(let i=id+1;i<this.head.length;i++){let tm1=this.head[i];if(tm1){if(["g","g1","g2"].includes(tm1.t))break;riga._h2?tm1._h3=riga._h2:delete tm1._h3}}}let tx=this.amb.vari.var(nn)||"";if("string"==typeof tx&&(tx=tx.split(",")[0]),"z"!=riga.t||tx||(this.amb.vari.add(nn,"1"),tx="1"),"m"==riga.t&&riga.spars){let vspars=getcolonne(riga.spars);tx=parseFloat(tx||vspars[0])||0,vspars[1]&&parseFloat(tx)<vspars[1]&&(tx=parseFloat(vspars[1])||0),vspars[2]&&parseFloat(tx)>vspars[2]&&(tx=parseFloat(vspars[2])||0),tx=String(tx),this.amb.vari.add(nn,tx)}let tmimposta=await impostavariante(this.amb,this,nn,vv||riga._v||tx,riga);return riga._v=void 0,tx=this.amb.vari.var(nn)||"",this.amb&&this.amb.deriva&&this.amb.deriva.length>0&&this.amb.deriva.filter((e=>e.cod==nn&&((!e.item||e.item==this.amb.item)&&((!e.model||e.model==this.amb.model)&&((!e.rule||e.rule==this.amb.rule)&&(!e.opz||e.opz==vv)))))),tmimposta}};let tm,i0=-1;if("#dim"==name)propaga=1;else{if(i0=this.head.findIndex((e=>e.cod===name)),i0<0)return;let hh=this.head[i0];tm=await _imposta(hh,value,i0),delete hh._d}if(propaga)for(let i=i0+1;i<this.head.length;i++)await _imposta(this.head[i],void 0,i);return tm}return await impostavariante(this.amb,this,name,value)}async impostaparametri(parimposta,parcall,ismacro=!1){if(this.head){this.paralias||(this.paralias={}),Array.isArray(this.head)||(this.head=[]);for(let i of this.head)i._v="",delete i._h,delete i._h1,delete i._h2,i.alias&&(this.paralias[i.cod]=i.alias)}parimposta||(parimposta=[]),parcall||(parcall=[]);for(let x of[...parimposta,...parcall]){var i=x.indexOf("=");if(i>0){let a=clean(x.substr(0,i));a.includes("$")&&(a=await intvaluta(this.amb,this,a));let t,b=x.substr(i+1);b.includes("$")&&(b=await intvaluta(this.amb,this,b)),this.head&&(t=this.head.find((e=>e.cod==a)))?t._v=b:await impostavariante(this.amb,this,a,b)}}if(this.head){let fl=!0;for(let h of this.head){let fl2=await this.checkvalid(h.valid);ismacro&&(fl2=!0),["g","g1","g2"].includes(h.t)?fl=fl2:fl&&fl2&&await this.setparametro(h.cod,h._v)}}}async checkvalid(formula){if(!formula)return!0;return!!muCalc(await intvaluta(this.amb,this,formula))}getmacrostr(){return JSON.stringify(this.getmacro())}getmacro(){return getOggetto(this,["amb"])}setmacro(vv){if(setOggetto(this,fromjson(vv,{})),this.localvar)for(let x in this.localvar){let vv=new Variante;setOggetto(vv,this.localvar[x]),this.localvar[x]=vv}}async load(xname,xcat){try{var tm,{name:name,cat:cat}=checkmu(xname||this.name,xcat||this.cat||"");if(this.name||(this.name=name),this.cat||(this.cat=cat),this.azzera(),cbGetMacro$1&&("string"==typeof(tm=await cbGetMacro$1(cat,name))&&(tm.startsWith("{")||tm.startsWith("["))&&(tm=fromjson(tm)),tm&&tm.head&&!Array.isArray(tm.head)&&(tm.head=[]),tm.head&&(tm.dims=function getheaddims(dims){let res;try{res="object"==typeof dims&&dims?dims:JSON.parse(dims||"{}")}catch(error){res={}}return res||(res={}),res.l||(res.l={visible:1,val:1e3,min:0,max:1e4}),res.a||(res.a={visible:1,val:1e3,min:0,max:1e4}),res.p||(res.p={visible:1,val:1e3,min:0,max:1e4}),res}(tm.dims))),tm){if("string"==typeof tm)await this.parsedata(tm);else for(let x in tm)this[x]=tm[x];return!0}errori.add(`missing cbGetFile: ${cat}/${name}`)}catch(error){errori.add(geterrdes(error),`macro.load: ${name}/${cat}`)}}async loadAndCompile(file,_cat,acapo=!1){var res,{name:name,cat:cat}=checkmu(file,this.cat||_cat);return this.azzera(),cbGetFile$1&&(res=await cbGetFile$1(cat,name)),res?(await this.parsedata(res,acapo),this.getmacro()):void errori.add(`missing cbGetFile: ${name}/${cat}`)}async#loadinclude(file,flin,stak,pp){var res,{name:name,cat:cat}=checkmu(file,this.cat);if(cbGetFile$1&&(res=await cbGetFile$1(cat,name)),!res)return[];if(res.includes("$1")&&pp&&pp.length>0)for(let i=1;i<pp.length;i++)res=res.replaceAll(`$${i}`,pp[i]);var tm=muClComments(res),t2=[];flin&&(tm=tm.filter((t=>!/^\{(:?(var|valid|formula|header|genera|v|f|h))[\s|}]/im.test(t))));for(let t of tm){const rr=rx1.exec(t);if(rr)flin=!rr[1].startsWith(":"),t2.push(t);else{const r1=/^\s*\{i\s(.+)?\}/im.exec(t);if(r1){let pp=getcolonne(r1[1]);if(!stak.includes(pp[0])){stak.push(pp[0]);var t3=await this.loadinclude(pp[0],flin,stak,pp);Array.isArray(t3)&&t2.push(...t3),stak.pop()}}else t2.push(t)}}return t2}async parsedata(res,acapo=!1){if(this.azzera(),!res)return;var t2=[];let tm=muClComments(res);var flin=!1;let lochead=[];for(let t of tm){const rr=rx1.exec(t);if(rr)flin=!rr[1].startsWith(":"),t2.push(t);else{const r1=/^\s*\{i\s(.+)?\}/im.exec(t);if(r1){var pp=getcolonne(r1[1]),t3=await this.#loadinclude(pp[0],flin,[pp[0]],pp);Array.isArray(t3)&&t2.push(...t3)}else t2.push(t)}}flin=!1;var out=this.codice;for(let t of t2){const rr=rx1.exec(t);if(rr)if(rr[1].startsWith(":"))out=this.codice;else switch(rr[1]){case"genera":case"g":var r2=/^\s*\{(genera|g)\s+(.+)?\}/im.exec(t);if(r2){var name=checkname(getcolonne(r2[2])[0]);this.genera[name]=[],out=this.genera[name]}else(out=this.errori).push(t);break;case"valid":out=this.valid;break;case"var":case"v":{let r2=/^\s*\{(var|v)\s+(.+)?\}/im.exec(t);if(r2){let nn=getcolonne(r2[2]),name=checkname(nn[0]);this.localvar[name]={name:name,des:nn[1]||"",rows:[]},out=this.localvar[name].rows}else(out=this.errori).push(t)}break;case"formula":case"f":{let r2=/^\s*\{(formula|f)\s+(.+)?\}/im.exec(t);if(r2){let name=checkname(r2[2]);this.formula[name]=[],out=this.formula[name]}else(out=this.errori).push(t)}break;case"h":case"header":out=lochead;break;default:this.errori.push(t),out=this.errori}else t.startsWith("{")&&(out=this.codice),out.push(t)}this.parametri={},this.codice=this.cleanfiltraparametri("_",this.codice,acapo);for(let f in this.formula)this.formula[f]=this.cleanfiltraparametri(f,this.formula[f],acapo);for(let f in this.localvar){var vv=new Variante,v=this.localvar[f];vv.setheader(f,this.cat),vv.rows={};for(let x of v.rows){var c=getcolonne(x),k=c[0].trim().toLowerCase();vv.rows[k]={annulla:0,v:c}}v.des&&(vv.des=v.des),this.localvar[f]=vv}tm=this.valid,this.valid=[];for(let t of tm){var p=getcouple(t,",");(p={v:p.v,msg:p.o}).v&&(p.v.startsWith("#")?this.formula[p.v.substring(1)]&&this.valid.push(p):this.valid.push(p))}tm=lochead;var head=[];for(let t of tm){var rr=/^\s*([\w\-_]+)+[;,\s]\s*(.*)?$/im.exec(t);if(rr){let ht,pp=getcolonne(rr[2]),c=clean(rr[1]);if(c){ht=head.find((e=>e.cod==c)),ht||(ht={cod:c,t:"t"},head.push(ht));for(let tp of pp){let p=getcouple(tp);switch(p.v){case"t":ht.t=p.o;break;case"def":case"default":ht.def=p.o;break;case"valid":case"colonna":case"hidden":p.o.startsWith("#")?this.formula[p.o.substring(1)]&&(ht[p.v]=p.o):ht[p.v]=p.o;break;default:ht[p.v]=p.o}}}}}this.head=head,tm=this.genera;var genera={};for(let kk in tm)if(Array.isArray(tm[kk])){var gen={codice:[],head:"",calcola:[],bom:[],vars:[],exclude:[]};const regx=/^\s*[!:]\s*(\w+)\s*(.*)$/i;for(let k2 of tm[kk]){let rr=regx.exec(clean(k2));if(rr)switch(rr[1]){case"calcola":case"c":gen.calcola=[...gen.calcola,...getcolonne(rr[2])];break;case"exclude":case"e":case"escludi":gen.exclude=[...gen.exclude,...getcolonne(rr[2])];break;case"bom":case"db":gen.bom=[...gen.bom,...getcolonne(rr[2])];break;case"vars":case"v":gen.vars=[...gen.vars,...getcolonne(rr[2])];break;case"head":case"h":gen.head=getcolonne(rr[2]);break;default:this.errori.push(`genera ${kk} => ${k2}`)}else gen.codice.push(k2)}gen.codice=muClean(gen.codice,!0),genera[kk]=gen}this.genera=genera}cleanfiltraparametri(key,codice,acapo){if(this.paralias||(this.paralias={}),codice&&codice.length){var fl=!1;const getparalias=dati=>{let cl=[],co=getcolonne(dati);for(let c of co)if(c.includes(":")){let v=c.split(":");this.paralias[v[0]]=v[1],cl.push(v[0])}else cl.push(c);return cl};for(let i=0;i<codice.length;i++){let rr=/^:p[;,\s]+(.*)?$/im.exec(codice[i]);if(rr)codice[i]=null,fl=!0,this.parametri[key]=getparalias(rr[1]);else{let rr=/^!(parametri|pars|p)[;,\s]+(.*)?$/im.exec(codice[i]);rr&&(codice[i]=null,fl=!0,this.parametri[key]=getparalias(rr[2]))}}fl&&(codice=codice.filter((e=>null!=e)))}return codice=muClean(codice,acapo)}}const regex=/^\s*\{(:)?(var|deriva|valid|formula|header|genera|g|v|f|h)(\s.*)?\}/i;function verificaisvar(i1,lines){let inBloccoCommento=!1;for(var cols=[],i=i1;i<lines.length;i++){let line=lines[i].trim(),linenc=line.split("//")[0].trim();if(line.startsWith("/*"))inBloccoCommento=!0;else if(inBloccoCommento&&line.endsWith("*/"))inBloccoCommento=!1;else if(!inBloccoCommento){if(regex.test(line))return{fl:!0,i2:i-1,cols:cols};if(linenc.endsWith("\\"))return{fl:!1};if(line.startsWith(":h ")&&(linenc=linenc.substr(3).trim()),!linenc.startsWith(":"))for(var cl=getcolonne(linenc),j=0;j<cl.length;j++){var l=cl[j].length;cl[j].includes(",")&&(l+=2),(!cols[j]||cols[j]<l)&&(cols[j]=l)}}}return{fl:!0,i2:lines.length-1,cols:cols}}
261
+ this.amb=amb,this.azzera()}azzera(){this.key=`${this.cat}/${this.name}`,this.localvar={},this.head=[],this.frontend=!1,this.valid=[],this.parametri={},this.paralias={},this.formula={},this.settings={},this.errori=[],this.codice=[],this.genera={}}get isgenera(){return Object.keys(this.genera).length||0}get iscodice(){return this.codice.length||0}get isheader(){return this.head?.length||0}geterrori(){var cl=[];return this.errori.forEach((e=>cl.push({e:e}))),cl}getparametri(){let s={};if(this.dims&&DIMS.forEach((k=>{let t=muCalc(this.amb.vari.var(k));t&&(s[k]=String(t))})),this.head){for(let x of this.head)if(!x._h){let tm=this.amb.vari.var(x.cod);tipifree.includes(x.t)||"string"==typeof tm&&(tm=tm.split(",")[0]),s[x.cod]=tm}}else if(this.parametri?._)for(let x of this.parametri._){let x1=(x.split("=")[0]||"").trim().toLowerCase(),tm=this.amb.vari.var[x1];tm=(tm||"").split(",")[0],s[x1]=tm}return s}async setparametri(pars){let ff={},ruleset=this.amb.ruleset||{};pars||(pars={}),this.dims&&DIMS.forEach((e=>{let t=pars[e]||this.dims[e].val;t=parseFloat(t)||0,this.dims[e].visible&&(t<this.dims[e].min&&(t=this.dims[e].min),t>this.dims[e].max&&(t=this.dims[e].max)),pars[e]=String(t)}));for(let x of this.head){let tm=ruleset[x.cod];tm&&(tm.islock?(x.visible="0",pars[x.cod]=tm.opz,x._islock=!0):pars[x.cod]||(pars[x.cod]=tm.opz)),"g"!=x.t&&("z"!=x.t||pars[x.cod]||(pars[x.cod]="1"),x._v=pars[x.cod]||"",ff[x.cod]=!0)}for(let x in pars)ff[x]||(ff[x]=!0,await impostavariante(this.amb,this,x,pars[x]));return this.head?.length>0&&await this.setparametro(this.head[0].cod,pars[this.head[0].cod]||void 0,!0),this.getparametri()}async setparametro(name,value,propaga=!1){if(value&&value.includes("$")&&(value=await intvaluta(this.amb,this,value)),this.head){const _imposta=async(riga,vv,id)=>{let nn=riga?.cod;if(riga.valid&&!riga._h1){let t0=!valutaCondizioniTestata(this.amb.vari,riga.valid);if(riga._h!=t0&&(riga._h=t0,["g","g1","g2"].includes(riga.t)))for(let i=id+1;i<this.head.length;i++){let tm1=this.head[i];if(tm1){if(["g","g1","g2"].includes(tm1.t))break;tm1._h1=riga._h}}}if(riga._h||riga._h1)return this.amb.vari.add(nn,""),riga._v=void 0,"";{if(delete riga._h2,riga.visible){let t0=!valutaCondizioniTestata(this.amb.vari,riga.visible);if(t0&&(riga._h2=t0),["g","g1","g2"].includes(riga.t))for(let i=id+1;i<this.head.length;i++){let tm1=this.head[i];if(tm1){if(["g","g1","g2"].includes(tm1.t))break;riga._h2?tm1._h3=riga._h2:delete tm1._h3}}}let tx=this.amb.vari.var(nn)||"";if("string"==typeof tx&&(tx=tx.split(",")[0]),"z"!=riga.t||tx||(this.amb.vari.add(nn,"1"),tx="1"),"m"==riga.t&&riga.spars){let vspars=getcolonne(riga.spars);tx=parseFloat(tx||vspars[0])||0,vspars[1]&&parseFloat(tx)<vspars[1]&&(tx=parseFloat(vspars[1])||0),vspars[2]&&parseFloat(tx)>vspars[2]&&(tx=parseFloat(vspars[2])||0),tx=String(tx),this.amb.vari.add(nn,tx)}let tmimposta=await impostavariante(this.amb,this,nn,vv||riga._v||tx,riga);return riga._v=void 0,tx=this.amb.vari.var(nn)||"",this.amb&&this.amb.deriva&&this.amb.deriva.length>0&&this.amb.deriva.filter((e=>e.cod==nn&&((!e.item||e.item==this.amb.item)&&((!e.model||e.model==this.amb.model)&&((!e.rule||e.rule==this.amb.rule)&&(!e.opz||e.opz==vv)))))),tmimposta}};let tm,i0=-1;if("#dim"==name)propaga=1;else{if(i0=this.head.findIndex((e=>e.cod===name)),i0<0)return;let hh=this.head[i0];tm=await _imposta(hh,value,i0),delete hh._d}if(propaga)for(let i=i0+1;i<this.head.length;i++)await _imposta(this.head[i],void 0,i);return tm}return await impostavariante(this.amb,this,name,value)}async impostaparametri(parimposta,parcall,ismacro=!1){if(this.head){this.paralias||(this.paralias={}),Array.isArray(this.head)||(this.head=[]);for(let i of this.head)i._v="",delete i._h,delete i._h1,delete i._h2,i.alias&&(this.paralias[i.cod]=i.alias)}parimposta||(parimposta=[]),parcall||(parcall=[]);for(let x of[...parimposta,...parcall]){var i=x.indexOf("=");if(i>0){let a=clean(x.substr(0,i));a.includes("$")&&(a=await intvaluta(this.amb,this,a));let t,b=x.substr(i+1);b.includes("$")&&(b=await intvaluta(this.amb,this,b)),this.head&&(t=this.head.find((e=>e.cod==a)))?t._v=b:await impostavariante(this.amb,this,a,b)}}if(this.head){let fl=!0;for(let h of this.head){let fl2=await this.checkvalid(h.valid);ismacro&&(fl2=!0),["g","g1","g2"].includes(h.t)?fl=fl2:fl&&fl2&&await this.setparametro(h.cod,h._v)}}}async checkvalid(formula){if(!formula)return!0;return!!muCalc(await intvaluta(this.amb,this,formula))}getmacrostr(){return JSON.stringify(this.getmacro())}getmacro(){return getOggetto(this,["amb"])}setmacro(vv){if(setOggetto(this,fromjson(vv,{})),this.localvar)for(let x in this.localvar){let vv=new Variante;setOggetto(vv,this.localvar[x]),this.localvar[x]=vv}}async load(xname,xcat){try{var tm,{name:name,cat:cat}=checkmu(xname||this.name,xcat||this.cat||"");if(this.name||(this.name=name),this.cat||(this.cat=cat),this.azzera(),cbGetMacro$1&&("string"==typeof(tm=await cbGetMacro$1(cat,name))&&(tm.startsWith("{")||tm.startsWith("["))&&(tm=fromjson(tm)),tm&&tm.head&&!Array.isArray(tm.head)&&(tm.head=[]),tm.head&&(tm.dims=function getheaddims(dims){let res;try{res="object"==typeof dims&&dims?dims:JSON.parse(dims||"{}")}catch(error){res={}}return res||(res={}),res.l||(res.l={visible:1,val:1e3,min:0,max:1e4}),res.a||(res.a={visible:1,val:1e3,min:0,max:1e4}),res.p||(res.p={visible:1,val:1e3,min:0,max:1e4}),res}(tm.dims))),tm){if("string"==typeof tm)await this.parsedata(tm);else for(let x in tm)this[x]=tm[x];return!0}errori.add(`missing cbGetFile: ${cat}/${name}`)}catch(error){errori.add(geterrdes(error),`macro.load: ${name}/${cat}`)}}async loadAndCompile(file,_cat,acapo=!1){var res,{name:name,cat:cat}=checkmu(file,this.cat||_cat);return this.azzera(),cbGetFile$1&&(res=await cbGetFile$1(cat,name)),res?(await this.parsedata(res,acapo),this.getmacro()):void errori.add(`missing cbGetFile: ${name}/${cat}`)}async#loadinclude(file,flin,stak,pp){var res,{name:name,cat:cat}=checkmu(file,this.cat);if(cbGetFile$1&&(res=await cbGetFile$1(cat,name)),!res)return[];if(res.includes("$1")&&pp&&pp.length>0)for(let i=1;i<pp.length;i++)res=res.replaceAll(`$${i}`,pp[i]);var tm=muClComments(res),t2=[];flin&&(tm=tm.filter((t=>!/^\{(:?(var|valid|formula|header|genera|v|f|h))[\s|}]/im.test(t))));for(let t of tm){const rr=rx1.exec(t);if(rr)flin=!rr[1].startsWith(":"),t2.push(t);else{const r1=/^\s*\{i\s(.+)?\}/im.exec(t);if(r1){let pp=getcolonne(r1[1]);if(!stak.includes(pp[0])){stak.push(pp[0]);var t3=await this.loadinclude(pp[0],flin,stak,pp);Array.isArray(t3)&&t2.push(...t3),stak.pop()}}else t2.push(t)}}return t2}async parsedata(res,acapo=!1){if(this.azzera(),!res)return;var t2=[];let tm=muClComments(res);var flin=!1;let lochead=[];for(let t of tm){const rr=rx1.exec(t);if(rr)flin=!rr[1].startsWith(":"),t2.push(t);else{const r1=/^\s*\{i\s(.+)?\}/im.exec(t);if(r1){var pp=getcolonne(r1[1]),t3=await this.#loadinclude(pp[0],flin,[pp[0]],pp);Array.isArray(t3)&&t2.push(...t3)}else t2.push(t)}}flin=!1;var out=this.codice;for(let t of t2){const rr=rx1.exec(t);if(rr)if(rr[1].startsWith(":"))out=this.codice;else switch(rr[1]){case"genera":case"g":var r2=/^\s*\{(genera|g)\s+(.+)?\}/im.exec(t);if(r2){var name=checkname(getcolonne(r2[2])[0]);this.genera[name]=[],out=this.genera[name]}else(out=this.errori).push(t);break;case"valid":out=this.valid;break;case"var":case"v":{let r2=/^\s*\{(var|v)\s+(.+)?\}/im.exec(t);if(r2){let nn=getcolonne(r2[2]),name=checkname(nn[0]);this.localvar[name]={name:name,des:nn[1]||"",rows:[]},out=this.localvar[name].rows}else(out=this.errori).push(t)}break;case"formula":case"f":{let r2=/^\s*\{(formula|f)\s+(.+)?\}/im.exec(t);if(r2){let name=checkname(r2[2]);this.formula[name]=[],out=this.formula[name]}else(out=this.errori).push(t)}break;case"h":case"header":out=lochead;break;default:this.errori.push(t),out=this.errori}else t.startsWith("{")&&(out=this.codice),out.push(t)}this.parametri={},this.codice=this.cleanfiltraparametri("_",this.codice,acapo);for(let f in this.formula)this.formula[f]=this.cleanfiltraparametri(f,this.formula[f],acapo);for(let f in this.localvar){var vv=new Variante,v=this.localvar[f];vv.setheader(f,this.cat),vv.rows={};for(let x of v.rows){var c=getcolonne(x),k=c[0].trim().toLowerCase();vv.rows[k]={annulla:0,v:c}}v.des&&(vv.des=v.des),this.localvar[f]=vv}tm=this.valid,this.valid=[];for(let t of tm){var p=getcouple(t,",");(p={v:p.v,msg:p.o}).v&&(p.v.startsWith("#")?this.formula[p.v.substring(1)]&&this.valid.push(p):this.valid.push(p))}tm=lochead;var head=[];for(let t of tm){var rr=/^\s*([\w\-_]+)+[;,\s]\s*(.*)?$/im.exec(t);if(rr){let ht,pp=getcolonne(rr[2]),c=clean(rr[1]);if(c){ht=head.find((e=>e.cod==c)),ht||(ht={cod:c,t:"t"},head.push(ht));for(let tp of pp){let p=getcouple(tp);switch(p.v){case"t":ht.t=p.o;break;case"def":case"default":ht.def=p.o;break;case"valid":case"colonna":case"hidden":p.o.startsWith("#")?this.formula[p.o.substring(1)]&&(ht[p.v]=p.o):ht[p.v]=p.o;break;default:ht[p.v]=p.o}}}}}this.head=head,tm=this.genera;var genera={};for(let kk in tm)if(Array.isArray(tm[kk])){var gen={codice:[],head:"",calcola:[],bom:[],vars:[],exclude:[]};const regx=/^\s*[!:]\s*(\w+)\s*(.*)$/i;for(let k2 of tm[kk]){let rr=regx.exec(clean(k2));if(rr)switch(rr[1]){case"calcola":case"c":gen.calcola=[...gen.calcola,...getcolonne(rr[2])];break;case"exclude":case"e":case"escludi":gen.exclude=[...gen.exclude,...getcolonne(rr[2])];break;case"bom":case"db":gen.bom=[...gen.bom,...getcolonne(rr[2])];break;case"vars":case"v":gen.vars=[...gen.vars,...getcolonne(rr[2])];break;case"head":case"h":gen.head=getcolonne(rr[2]);break;default:this.errori.push(`genera ${kk} => ${k2}`)}else gen.codice.push(k2)}gen.codice=muClean(gen.codice,!0),genera[kk]=gen}this.genera=genera}cleanfiltraparametri(key,codice,acapo){if(this.paralias||(this.paralias={}),codice&&codice.length){var fl=!1;const getparalias=dati=>{let cl=[],co=getcolonne(dati);for(let c of co)if(c.includes(":")){let v=c.split(":");this.paralias[v[0]]=v[1],cl.push(v[0])}else cl.push(c);return cl};for(let i=0;i<codice.length;i++){let rr=/^:p[;,\s]+(.*)?$/im.exec(codice[i]);if(rr)codice[i]=null,fl=!0,this.parametri[key]=getparalias(rr[1]);else{let rr=/^!(parametri|pars|p)[;,\s]+(.*)?$/im.exec(codice[i]);rr&&(codice[i]=null,fl=!0,this.parametri[key]=getparalias(rr[2]))}}fl&&(codice=codice.filter((e=>null!=e)))}return codice=muClean(codice,acapo)}}const regex=/^\s*\{(:)?(var|deriva|valid|formula|header|genera|g|v|f|h)(\s.*)?\}/i;function verificaisvar(i1,lines){let inBloccoCommento=!1;for(var cols=[],i=i1;i<lines.length;i++){let line=lines[i].trim(),linenc=line.split("//")[0].trim();if(line.startsWith("/*"))inBloccoCommento=!0;else if(inBloccoCommento&&line.endsWith("*/"))inBloccoCommento=!1;else if(!inBloccoCommento){if(regex.test(line))return{fl:!0,i2:i-1,cols:cols};if(linenc.endsWith("\\"))return{fl:!1};if(line.startsWith(":h ")&&(linenc=linenc.substr(3).trim()),!linenc.startsWith(":"))for(var cl=getcolonne(linenc),j=0;j<cl.length;j++){var l=cl[j].length;cl[j].includes(",")&&(l+=2),(!cols[j]||cols[j]<l)&&(cols[j]=l)}}}return{fl:!0,i2:lines.length-1,cols:cols}}
262
262
  /**
263
263
  * Formatta il codice sorgente applicando indentazione e allineamento
264
264
  * @param {string} code - Il codice sorgente da formattare
265
265
  * @param {boolean} gisvar - Flag che indica se formattare come variabile
266
266
  * @returns {string} Il codice formattato
267
- */function headerconvert(tt){var rr=muClComments(tt,!1);tt={};var grp={r:[]},fl=!1;for(let r of rr){var m=/^\s*\{(h|head|header)\s+(\w+)\}/im.exec(r);if(m)grp={cod:m[2],des:m[2],r:[]},fl=!1,tt[m[2]]=grp;else if(!/^\s*:/.exec(r)){var v=r.split(","),t={cod:clean(v[0])};let tm;tm=(v[1]||"").trim(),tm&&(t.des=tm),tm=clean(v[2]),tm&&(t.tipo=tm),tm=clean(v[3]),tm&&(t.alias=tm),tm=clean(v[4]),tm&&(t.valid=tm),tm=clean(v[5]),tm&&(t.visible=tm),t.cod&&(fl||"sep"!=t.tipo?grp.r.push(t):(grp.des=t.des,grp.valid=t.valid,grp.visible=t.visible,fl=!0))}}return tt}function aliasconvert(tt){var rr=muClComments(tt.toLowerCase(),!1),tx={};for(let r of rr)if(!/^\s*:/.exec(r)){var v=getcolonne(r);v[0]&&v[1]&&(tx[v[0]]={cod:v[1]})}return tx}class Ambiente{#headers=void 0;#alias=void 0;#deriva=void 0;#typos=void 0;constructor(cat=".",maxdelays=100,righevuote=!1){this.righevuote=righevuote,this.maxdelays=maxdelays,this.setcatalog(cat),this.fndotcallback=void 0}setcatalog(cat){return cat=clean(cat),this.cat!=cat&&(this.cat=cat,this.item=this.rule=this.model="",this.azzera(!0)),cat}get muvalutatore(){return{getcolonne:getcolonne,muCalc:muCalc,muEval:muEval,tipifree:tipifree}}azzera(mode=!1){
267
+ */function toruleset(rs){let o={};if(rs&&rs.length)for(let r of rs)o[r.cod]=r;return o}function headerconvert(tt){var rr=muClComments(tt,!1);tt={};var grp={r:[]},fl=!1;for(let r of rr){var m=/^\s*\{(h|head|header)\s+(\w+)\}/im.exec(r);if(m)grp={cod:m[2],des:m[2],r:[]},fl=!1,tt[m[2]]=grp;else if(!/^\s*:/.exec(r)){var v=r.split(","),t={cod:clean(v[0])};let tm;tm=(v[1]||"").trim(),tm&&(t.des=tm),tm=clean(v[2]),tm&&(t.tipo=tm),tm=clean(v[3]),tm&&(t.alias=tm),tm=clean(v[4]),tm&&(t.valid=tm),tm=clean(v[5]),tm&&(t.visible=tm),t.cod&&(fl||"sep"!=t.tipo?grp.r.push(t):(grp.des=t.des,grp.valid=t.valid,grp.visible=t.visible,fl=!0))}}return tt}function aliasconvert(tt){var rr=muClComments(tt.toLowerCase(),!1),tx={};for(let r of rr)if(!/^\s*:/.exec(r)){var v=getcolonne(r);v[0]&&v[1]&&(tx[v[0]]={cod:v[1]})}return tx}class Ambiente{#headers=void 0;#alias=void 0;#deriva=void 0;#typos=void 0;constructor(cat=".",maxdelays=100,righevuote=!1){this.righevuote=righevuote,this.maxdelays=maxdelays,this.setcatalog(cat),this.fndotcallback=void 0}setcatalog(cat){return cat=clean(cat),this.cat!=cat&&(this.cat=cat,this.item=this.rule=this.model="",this.azzera(!0)),cat}get muvalutatore(){return{getcolonne:getcolonne,muCalc:muCalc,muEval:muEval,tipifree:tipifree}}azzera(mode=!1){
268
268
  /** @type {Variabile} */
269
- this.vari=new Variabile,this.fndotcallback&&this.vari.setfndot(this.fndotcallback),this.ruleheader="",mode&&(
269
+ this.vari=new Variabile,this.ruleset={},this.fndotcallback&&this.vari.setfndot(this.fndotcallback),this.ruleheader="",mode&&(
270
270
  /** @type {Object.<string, Macro>} */
271
271
  this.macro={},
272
272
  /** @type {Object.<string, Variante>} */
273
- this.varianti={},this.varelenco={},this.macroelenco={},this.scripts={},this.#headers=void 0,this.#alias=void 0,this.#deriva=void 0,this.#typos=void 0)}setfndot(fndotcallback){this.fndotcallback=fndotcallback,this.vari.setfndot(fndotcallback)}async#checkelencovar(cat){if(cbInfo$1&&!this.varelenco[cat]){let tm=await cbInfo$1("headers",cat,"_varianti");Array.isArray(tm)?this.varelenco[cat]=tm:tm.vars&&(this.varelenco[cat]=tm.vars,tm.alias&&(this.#alias=tm.alias)),this.varelenco[cat]||(this.varelenco[cat]=[])}}parseheaderfrominfo(tm){if(tm&&tm.length>0)for(let t of tm)switch(t.tipo){case"_headers":"string"==typeof t.value&&(t.value=headerconvert(t.value)),this.#headers=t.value||{};break;case"_alias":"string"==typeof t.value&&(t.value=aliasconvert(t.value)),this.#alias=t.value||{};break;case"_typos":if("string"==typeof t.value){var tips=fromjson(t.value);for(let tp in tips){var tq=tips[tp];tq.db&&(tq.db=muClean(muClComments(tq.db))),tq.list&&(tq.list=muClean(muClComments(tq.list)))}t.value=tips}this.#typos=t.value||{}}}setitem(item,rule,model,datadelgiorno){this.item=clean(item,!0),this.rule=clean(rule,!0),this.model=clean(model,!0),this.data=datadelgiorno||(new Date).toInt()}async getheader(cod){let tm;return!this.#headers&&cbInfo$1&&(tm=await cbInfo$1("headers",this.cat,"_headers"),this.parseheaderfrominfo(tm)),this.#headers||(this.#headers={}),this.#headers[cod]}async getalias(){let tm;return!this.#alias&&cbInfo$1&&(tm=await cbInfo$1("headers",this.cat,"_alias"),this.parseheaderfrominfo(tm)),this.#alias||(this.#alias={}),this.#alias}get deriva(){return this.#deriva,this.#deriva||[]}async getmacro(riga){try{if("string"==typeof riga&&(riga={tipo:"M",contenuto:riga}),!riga||!riga.contenuto)return;var rr=/^([({}):$\w.\\/]+)[\s;,]*(.*)?$/im.exec(riga.contenuto);if(!rr)return void errori.add("Macro non valida:"+riga.contenuto,riga);let macro=clean(rr[1],!0);macro.includes("$")&&(macro=await this.vari.valuta(macro));var pars=getcolonne(rr[2]),{name:name,cat:cat}=checkmu(macro,this.cat);this.cat=cat;var ky=`${cat}/${name}`;if(!this.macro[ky]){var tm=new Macro(this,name);await tm.load()?this.macro[ky]=tm:errori.add(`macro fail to load ${ky}`,riga)}return macro=this.macro[ky],macro?{macro:macro,pars:pars}:(errori.add(`macro non trovata ${ky}`,riga),{})}catch(error){errori.add(geterrdes(error),`ambiente.getmacro: ${riga?.contenuto}`)}}async getvariante(cod){var{name:name,cat:cat}=checkmu(cod,this.cat),n2=name;let altri={};if(cat==this.cat&&this.#alias&&this.#alias[name]&&(altri=this.#alias[name]||{},n2=altri.cod),await this.#checkelencovar(cat),this.varelenco[cat]&&!this.varelenco[cat].includes(name))return;var key=`${cat}/${n2}`;let vv;return this.varianti[key]?vv=this.varianti[key]:(vv=new Variante(this),await vv.load(key,cat),this.varianti[key]=vv),altri&&(altri.des&&(vv.des=altri.des),altri.vdef&&(vv.vdef=altri.vdef)),vv}async varcompila(v,callback){var xx=new Variante(this);(await xx.load(v,this.cat,!0),xx.alias)&&((await this.getalias())[v]=xx.alias);callback("variants",{cod:v,des:xx.des||"",alias:xx.alias,info:xx.alias?"":JSON.stringify(getOggetto(xx,["amb"]))})}async macrocompila(v,callback){var mac=new Macro(this,v);await mac.loadAndCompile(`${v}.mu`);var t=mac.getmacro();callback("macros",{cod:v,info:JSON.stringify(t),isgenera:mac.isgenera,isheader:mac.isheader,iscodice:mac.iscodice})}async barrecompila(articolibarre,titolibarre,callback){var cc=new CodiceBarra;await cc.compila(articolibarre,titolibarre);for(let x in cc.barre){callback("barcodes",{cod:x,des:"",info:JSON.stringify(cc.barre[x])})}return cc}async tojson(d){let tm;return cbFunc$1&&(tm=await cbFunc$1("json",d)),tm}async compila(info,callback){if(callback){for(let v of info.var)await this.varcompila(v,callback);for(let v of info.mu)await this.macrocompila(v,callback);if(callback("infos",{cod:"info",des:info.cat,info:JSON.stringify({cat:info.cat,md:info.info})}),this.#headers=void 0,this.#alias=void 0,this.#deriva=void 0,this.#typos=void 0,cbInfo$1){var tm=await cbInfo$1("headers",this.cat,["_headers","_alias","_deriva","_typos"]);this.parseheaderfrominfo(tm)}this.#headers?callback("infos",{cod:"headers",des:"",info:JSON.stringify(this.#headers)}):logga("missing headers"),this.#alias&&callback("infos",{cod:"alias",des:"",info:JSON.stringify(this.#alias)}),this.#deriva&&callback("infos",{cod:"deriva",des:"",info:JSON.stringify(this.#deriva)}),this.#typos&&callback("infos",{cod:"typos",des:"tipologie",info:JSON.stringify(this.#typos)})}}async getheaderfromdb(name){let totale=await cbInfo$1("header",this.cat,name,!this.#deriva),{head:head,rows:rows,macros:macros,deriva:deriva,llvars:llvars}=totale;for(let r of rows)r.cod=clean(r.cod),r.alias=clean(r.alias),r.t=clean(r.t);if(!llvars){llvars=new Set;for(let r of rows){let nn=r.alias?r.alias:r.cod;llvars.add(nn)}llvars=[...llvars]}this.#deriva||(this.#deriva=deriva),await this.#checkelencovar(this.cat),head.cod=clean(head.cod),head.rule=clean(head.rule),head.ruledef=head.ruledef||[];let vn=[],t=this.varelenco[this.cat];for(let nn of llvars)this.varianti[`${this.cat}/${nn}`]||t&&t.includes(nn)&&vn.push(nn);if(vn.length&&cbGetVariante$1){var vars=await cbGetVariante$1(this.cat,vn);if(vars&&vars.length)for(let x of vars){let{name:name,content:content}=x,vv=new Variante(this);vv.setheader(name,this.cat),content&&await vv.loadContentExtended(content),this.varianti[vv.key]=vv}}return{head:head,rows:rows,macros:macros}}async getlinkedmacros(rule,macros){var getkey=n=>n.includes("/")?n:`${this.cat}/${n}`;let k,cl=[];if(rule&&(k=getkey(rule),this.macro[k]||cl.push(rule)),macros&&"string"==typeof macros){let vv=macros.split(";");for(let v of vv)k=getkey(v),this.macro[k]||cl.push(v)}if(cl&&cl.length>0&&cbGetMacro$1){let tm=await cbGetMacro$1(this.cat,cl);if(tm&&tm.length>0)for(let x of tm){let m=new Macro(this,x.name);for(let t in x.content){let contenuto=x.content[t];m[t]=contenuto}this.macro[m.key]=m}}}async setruleheader(rule,pars){var{name:name,cat:cat}=checkmu(rule,this.cat),ky=`${cat}/${name}`;if(!this.macro[ky]){let totale=await this.getheaderfromdb(name),{head:head,rows:rows,macros:macros}=totale;await this.getlinkedmacros(head.rule,macros);var tm=new Macro(this,name);if(!head)return void errori.add("Missing rule: "+rule);if(head.rule){let k2=this.macro[`${cat}/${head.rule}`];if(k2)for(let x in k2)["cat","name","key"].includes(x)||(tm[x]=k2[x])}rows&&rows.length&&(tm.head=rows),this.macro[ky]=tm}this.ruleheader=ky;let mc=this.macro[ky];return errori.azzera(),await mc.setparametri(pars),mc}getruleheader(){return this.macro[this.ruleheader]}async setvariante(cod,opz){return await impostavariante(this,null,cod,opz)}async valuta(codice){let output;return"string"==typeof codice&&(codice=muClean(muClComments(codice,this.righevuote))),Array.isArray(codice)&&(logga("m1",codice),output=await muEval(this,null,codice)),output}setinfos(tm){tm&&(this.#headers=tm.headers,this.#alias=tm.alias,this.#deriva=void 0,this.#typos=tm.typos)}}Date.prototype.toInt||(Date.prototype.toInt=function(){return this.getDate()+100*(this.getMonth()+1)+1e4*this.getFullYear()}),Date.prototype.toFloat||(Date.prototype.toFloat=function(){return Math.floor(1e4*this.getDate()+1e6*(this.getMonth()+1)+1e8*this.getFullYear()+100*this.getHours()+this.getMinutes()+.5)/1e4});const mustr={mus:{variants:{cod:"s",des:"s",alias:"s",info:"s",md:"s",__pk:"cod"},extras:{tipo:"s",cod:"s",info:"s",__pk:"tipo, cod"},macros:{cod:"s",des:"s",info:"s",md:"s",def:"s",isgenera:"i",iscodice:"i",isheader:"i",__pk:"cod"},infos:{cod:"s",des:"s",info:"s",__pk:"cod"},barcodes:{cod:"s",des:"s",info:"s",__pk:"cod"}}},{Clear:Clear,Reset:Reset,Bold:Bold,Reverse:Reverse,Red:Red,Green:Green,Yellow:Yellow,Blue:Blue,Magenta:Magenta,Cyan:Cyan,White:White}=init();var mi=minimist(process.argv);console.log("----------------------------------------------------------------------------------------"),console.log(`${Bold}${Cyan}${Bold}Markuno:${Reset} command line utility del linguaggio (c) Croswil 2024 v. ${Yellow}2.0.33${Reset}`),console.log("----------------------------------------------------------------------------------------");var inidata={FOLDERBASE:"./",DBWORK:"./data/app.db",FOLDERCAT:"./data/mu",FOLDEROUT:"./out",CAT:"cat"};const fini=".lasts.markuno";fs.existsSync(fini)&&(inidata=JSON.parse(fs.readFileSync(fini)));var pars=mi._;(mi.h||mi.help||!pars[2])&&(console.log(`Uso: ${Bold}markuno <funzioni> <[catalogo/]markuno> [opzioni]${Reset} \n${Bold}${Cyan}Funzioni:${Reset} (seleziona una tra le seguenti)\n ${White} c, compila ${Reset}${Green} compila un catalogo/Markuno + Codici Barra\n ${White} d, dump ${Reset}${Green} compila e salva il compilato in formato json\n ${White} e, esegui ${Reset}${Green} esegui un file markuno \n ${White} f, formatta ${Reset}${Green} Formattazione di un file .mu o .var\n ${White} g, genera${Reset}${Green} generatore di codice \n ${White} w, watch ${Reset}${Green} abilita il watch su un file markuno \n ${White} gw <markuno> <maxele> ${Reset}${Green} Genera con wath (solo i primi maxele=20 elementi senza salvare\n${Bold}${Cyan}Opzioni:${Reset}${Green}\n ${White} -h, --help${Reset}${Green} mostra l'help\n ${White} -c, --cat <cat>${Reset}${Green} catalogo (default='${inidata.CAT}' ) \n ${White} -d, --dbwork ${Reset}${Green} database principale (default='${inidata.DBWORK}')\n ${White} -i, --init <folder>${Reset}${Green} cartella di lavoro (default='${inidata.FOLDERCAT}' ) \n ${White} -o, --out <folder>${Reset}${Green} cartella di output (default='${inidata.FOLDEROUT}' ) \n ${White} -x, --xlsx${Reset}${Green} output in formato excel (generatore)\n `),process.exit(0));let counter=0;const DBWORK=mi.d||mi.dbwork||inidata.DBWORK,FOLDERCAT=mi.i||mi.init||inidata.FOLDERCAT,FOLDEROUT=mi.o||mi.out||inidata.FOLDEROUT,CAT=mi.c||mi.cat||inidata.CAT;var dberp=void 0,erp3cad=!1;fs.existsSync(FOLDERCAT)||writeerror(`Manca la cartella di lavoro: ${FOLDERCAT}`),inidata=Object.assign(inidata,{FOLDERBASE:"./",DBWORK:DBWORK,FOLDERCAT:FOLDERCAT,FOLDEROUT:FOLDEROUT,CAT:CAT}),fs.writeFileSync(fini,JSON.stringify(inidata,null,2)),fs.existsSync(FOLDERCAT)||fs.mkdirSync(FOLDERCAT,{recursive:!0});const ISXLS=mi.x||mi.xlsx;function writeerror(err){var tm=err.stack.toString().split("\n");tm.splice(0,1),tm=tm.filter((e=>!/module/.test(e)&&!/node\:/.test(e))),console.log(`${Red}${err.message}${Reset}\n${tm.join("\n")}`),process.exit(1)}function dbmu(cat){var ff=path.join(FOLDERCAT,`mu_${cat}.db`);fs.existsSync(ff)||checkdb(ff,mustr,"mus");var d=database.db(ff);return setstruttura(mustr),d}function getinfofile(file){var def="",md="",f2=`${file}.txt`;fs.existsSync(f2)&&(def=fs.readFileSync(f2).toString());f2=`${file}.md`;return fs.existsSync(f2)&&(md=fs.readFileSync(f2).toString()),{def:def,md:md}}function getinfo(cat,folder){var vv=fs.readdirSync(folder),out={cat:cat,info:"",mu:[],var:[],inc:[]};for(var v of vv){var f=path.join(folder,v),extname=path.extname(v),basename=path.basename(v,extname);"__info.md"==v?out.info=fs.readFileSync(f).toString():".mu"==extname?out.mu.push(basename):".var"==extname?out.var.push(basename):".inc"==extname&&out.inc.push(basename)}return out}async function xlsexport(rq,f2,file){const XLSX=await import("xlsx"),worksheet=XLSX.utils.json_to_sheet(rq),workbook=XLSX.utils.book_new();XLSX.utils.book_append_sheet(workbook,worksheet,f2),XLSX.writeFile(workbook,`${file}.xlsx`,{compression:!0})}async function xlsimport(file,r0){const XLSX=await import("xlsx");var ws=XLSX.readFile(file).Sheets[r0];return XLSX.utils.sheet_to_json(ws)}async function cbGetMacro(cat,name){var file=`${FOLDERCAT}/${cat}/${name}.mu`;return fs.existsSync(file)?fs.readFileSync(file).toString():""}async function cbGetVariante(cat,name){var file=`${FOLDERCAT}/${cat}/${name}.var`;return fs.existsSync(file)?fs.readFileSync(file).toString():(errori.add(`missing var: ${cat}, ${name}`,{t:"cbGetVariante"}),"")}async function cbFunc(cmd,pars,vars){errori.add(`missing fun: ${cmd}`,{t:"cbFunc"})}async function cbInfo(tipo,cat,name){if(Array.isArray(name)){var tt=[];for(var n of name){var value=await cbInfo(tipo,cat,n);value&&tt.push({tipo:n,value:value})}return tt}switch(tipo){case"filter":if(!dberp||!name&&!name[0])return[];if(erp3cad)return[];var rr=dberp.all("select item,model,rule,varfilter,result,result2,exclude,exclude2 from limits where variant=?",name[0]);for(var r of rr)r.valfilter=JSON.parse(r.varfilter||"{}"),r.result=JSON.parse(r.result||"[]"),r.result2=JSON.parse(r.result2||"[]");return rr;case"headers":var f;return f="_typos"==name?`${FOLDERCAT}/${cat}/typos.json`:`${FOLDERCAT}/${cat}/${name}.inc`,fs.existsSync(f)?fs.readFileSync(f).toString():""}}async function cbGetFile(cat,file){if(fs.existsSync(path.join("./",file)))return fs.readFileSync(path.join("./",file)).toString();const ff=`${FOLDERCAT}/${cat}/${file}`;if(fs.existsSync(ff))return fs.readFileSync(ff).toString();errori.add(`missing file: ${ff}`,{t:"cbGetFile"})}function checkfilemu(cat,file){var ext=path.extname(file);[".mu",".var",".inc"].includes(ext)||(ext=".mu",file+=".mu");var folder=path.join(FOLDERCAT,cat||CAT),ff=path.join("./",file);if(fs.existsSync(ff))return{file:ff,folder:folder,diversi:!0};var i=file.indexOf("/");if(i>0&&(cat=file.substr(0,i),file=file.substr(i+1),folder=path.join(FOLDERCAT,cat||CAT),!fs.existsSync(folder)))throw new Error("missing folder: "+folder);if(ff=path.join(folder,file),fs.existsSync(ff))return{file:ff,folder:folder,diversi:!1,ext:ext};throw new Error(`non trovato il file: ${file} su ${folder}`)}async function dowatch(amb,funzione){var{file:file,folder:folder,diversi:diversi}=checkfilemu(amb.cat,pars[3]||""),maxele=parseInt(pars[4]||"10");console.log(`Start Watching: ${Cyan}${Bold}${file}${Reset}`),fs.watch(folder,(async(eventType,filename)=>{filename&&await funzione(amb,maxele)})),diversi&&fs.watch(file,(async(eventType,filename)=>{filename&&await funzione(amb,maxele)})),await funzione(amb,maxele)}async function genera(amb,maxele){var{file:file,folder:folder,diversi:diversi}=checkfilemu(amb.cat,pars[3]||"");if(!fs.existsSync(file))throw new Error("Manca il file: "+file);var tm=path.extname(file),base=path.basename(file,tm),mac=new Macro(amb,base),dt=(new Date).valueOf();await mac.loadAndCompile(`${base}${tm}`);var dt1=(new Date).valueOf(),tot={},issort={},tm2=[],ll2=[],tmh=[];if(await async function muGenerate(macro,amb,genera,callback,isTestmode=0){if(macro.isgenera&&callback){var output={counter:0,keys:{},isTestmode:isTestmode};for(let gg in macro.genera)await muGenerate_0(macro,amb,gg,callback,output);return!0}}(mac,amb,0,((generator,out,db,cc1,cc2)=>{if(maxele){var cl=[];for(var i in out){var t=out[i];if("number"==typeof t&&(t=Math.round(1e4*t)/1e4+""),"__id"!=i){var l=cl.length;tmh[l]||(tmh[l]=i,ll2[l]=i.length),ll2[l]<t.length&&(ll2[l]=t.length),cl.push(t)}}tm2.push(cl)}else{var gen=generator.split("_")[0]||gen;if(tot[gen]||(tot[gen]=[]),tot[gen].push(out),out.cod&&(issort[gen]=!0,db))for(var x in db){var ky=`${gen}_${x}`;tot[ky]||(tot[ky]=[]);var dblist=db[x];for(i=0;i<dblist.length;i++){var d=dblist[i];tot[ky].push({padre:out.cod,i:i,comp:d.c0,qt:muCalc(d.c1),des:d.c2})}}}}),maxele),maxele){for(var i=0;i<tmh.length;i++)tmh[i]=tmh[i].padEnd(ll2[i]," ");for(var tt of(console.log(`${Yellow}${tmh.join(" | ")}${Reset}`),tm2)){for(i=0;i<tt.length;i++)tt[i]=tt[i].padEnd(ll2[i]," ");console.log(tt.join(" | "))}}else{var dt2=(new Date).valueOf(),count=0;for(var ss in issort)count+=tot[ss].length,tot[ss].sort(((a,b)=>(a.cod||"").localeCompare(b.cod||"")));tot._errori=mac.geterrori(),fs.writeFileSync(path.join(FOLDEROUT,`gen_${base}.json`),JSON.stringify(tot,null,2));const fex=path.join(FOLDEROUT,`gen_${base}.xlsx`);var dt3=(new Date).valueOf();if(ISXLS){const XLSX=await import("xlsx"),wb=XLSX.utils.book_new();for(var ky in tot){const ws=XLSX.utils.json_to_sheet(tot[ky]);XLSX.utils.book_append_sheet(wb,ws,ky)}XLSX.writeFile(wb,fex,{compression:!0})}else fs.existsSync(fex)&&fs.unlinkSync(fex);var dt4=(new Date).valueOf();console.log(`${Yellow}${Bold}EVAL........: ${count}${Reset}${Cyan} rows\n${Cyan}load/compile: ${Bold}${Yellow}${dt1-dt}${Reset}${Cyan} ms.\n${Cyan}generate....: ${Bold}${Yellow}${dt2-dt1}${Reset}${Cyan} ms.\n${Cyan}save JSON...: ${Bold}${Yellow}${dt3-dt2}${Reset}${Cyan} ms.\n${Cyan}save XLSX...: ${Bold}${Yellow}${dt4-dt3}${Reset}${Cyan} ms.\n--------------------------------\n${Cyan}${Bold}TOTALE......: ${Yellow}${dt4-dt}${Reset}${Cyan} ms.`)}}async function doesegui(amb){var{file:file,folder:folder,diversi:diversi}=checkfilemu(amb.cat,pars[3]||""),dt=(new Date).valueOf(),data=fs.readFileSync(file).toString(),mac=new Macro(amb,pars[3]||"");counter++,mac.parsedata(data);var dt1=(new Date).valueOf(),out=await muEval(amb,mac,mac.codice,{limited:!1,oldstyle:!0,localvar:mac.localvar}),dt2=(new Date).valueOf();console.log(`${out.join("\n")}`),console.log(`${Yellow}${Bold}EVAL ${counter}${Reset}: ${file} => ${Cyan}load:${Bold}${Yellow}${dt1-dt}${Reset}${Cyan}ms. -- exec:${Bold}${Yellow}${dt2-dt1}${Reset}${Cyan}ms.${Reset}\n----------------------------------------------\n${errori.toString()}`),fs.writeFileSync(path.join(FOLDEROUT,"logs.json"),JSON.stringify({loadandcompile:dt1-dt,execute:dt2-dt1,vari:amb.vari.dump(),codice:mac.codice,errori:mac.errori},null,2)),fs.writeFileSync(path.join(FOLDEROUT,"out.txt"),out.join("\n"))}await async function main(){try{var amb=function muInit(cat,cbGetMacro,cbGetVariante,cbFunc,cbInfo,cbGetFile,cbLogga){var mu=new Ambiente(cat);return setcallbacks(cbGetMacro,cbGetVariante,cbFunc,cbInfo,cbGetFile,cbLogga),mu}(CAT,cbGetMacro,cbGetVariante,cbFunc,cbInfo,cbGetFile),fcat=path.join(FOLDERCAT,CAT);if(fs.mkdirSync(FOLDEROUT,{recursive:!0}),!fs.existsSync(fcat))throw new Error(`Manca il catalogo: ${CAT} su ${FOLDERCAT}`);var dt=(new Date).valueOf();switch(pars[2].trim().toLowerCase()){case"g":case"genera":await genera(amb,0);break;case"d":case"dump":await async function dump(amb){var{file:file,folder:folder,diversi:diversi}=checkfilemu(amb.cat,pars[3]||"");if(!fs.existsSync(file))throw new Error("Manca il file: "+file);var xx,fileout,tm=path.extname(file),base=path.basename(file,tm);if(console.log(base,tm),".mu"==tm){var mac=new Macro(amb,base);await mac.loadAndCompile(`${base}${tm}`),xx=mac.getmacro(),fileout=path.join(FOLDEROUT,base+".json")}else".var"==tm&&(xx=await async function newVariante(cod,cat,amb){var xx=new Variante(amb);return await xx.load(cod,cat),xx}(base,CAT,amb),fileout=path.join(FOLDEROUT,base+".var.json"));xx&&(fs.writeFileSync(fileout,JSON.stringify(xx,null,2)),console.log(`${Cyan}${Bold}Dump: ${Reset}${Yellow}${fileout}`))}(amb);break;case"gw":await dowatch(amb,genera);break;case"c":case"compila":await async function compila(amb){var articolibarre,titolibarre,folder=path.join(FOLDERCAT,CAT);if(!fs.existsSync(folder))throw new Error("Manca il catalogo "+CAT);if(!fs.existsSync(DBWORK))throw new Error("Manca il database di lavoro: "+DBWORK);if(fs.existsSync(DBWORK))if((dberp=database.db(DBWORK)).esisteTabella("artbarre")){erp3cad=!0;var rr=dberp.all("select cod cod,des des,flfm fm,coderr coderr,codalt codalt from artbarre order by cod ");for(var r of(titolibarre={},rr)){(tm=r.cod.trim().toLowerCase().substr(1))&&(titolibarre[tm]={des:r.des,fm:r.fm,coderr:r.coderr.trim().toLowerCase(),codalt:r.codalt.trim().toLowerCase()})}articolibarre=dberp.all("select codicebarra barcode,diml l,dima a,dimp p,cod cod from articoli where codicebarra like ? order by codicebarra","+%")}else articolibarre=dberp.all("select barcode,l,a,p,cod from items where barcode>'' order by barcode"),titolibarre={};else console.warn("MISSING DBWORK (barre e limits)");var db=dbmu(CAT);db.begin(),db.run("delete from variants"),db.run("delete from macros"),db.run("delete from barcodes"),db.run("delete from extras");var info=getinfo(CAT,folder);for(var x of(await amb.compila(info,((table,data)=>{if(data){if("macros"===table){var{def:def,md:md}=getinfofile(`${data.cod}.mu`);data.def=def,data.md=md}insertorupdate(db,table,data,"mus")}})),info.var)){var tm,ff=`${folder}/${x}.var.txt`;if(fs.existsSync(ff))(tm=muLimits(fs.readFileSync(ff).toString()))&&tm.length&&insertorupdate(db,"extras",{tipo:"l",cod:x,info:JSON.stringify(tm)},"mus")}await amb.barrecompila(articolibarre,titolibarre,((table,data)=>{insertorupdate(db,table,data,"mus")})),insertorupdate(db,"infos",{cod:"info",des:info.cat,info:JSON.stringify({cat:info.cat,md:info.info})},"mus"),dberp&&dberp.chiudi();db.commit(),db.chiudi()}(amb),console.log(`Compilazione catalogo: ${Red}${Bold}${CAT}${Reset}: ${Yellow}${(new Date).valueOf()-dt}ms.`);break;case"x":case"e":case"esegui":await doesegui(amb);break;case"f":case"format":!function formatta(amb){var{file:file,folder:folder,diversi:diversi,ext:ext}=checkfilemu(amb.cat,pars[3]||"");if(fs.existsSync(file)){var data=fs.readFileSync(file).toString(),isvar=".var"==ext;data=function muFormatcode(code,gisvar){let lines=code.split("\n"),formattedCode=[],indentLevel=0,inBloccoCommento=!1,inAcapo=!1,cols=[];var isvar=gisvar;if(isvar){let tm=verificaisvar(0,lines);(isvar=tm.fl)&&(cols=tm.cols)}for(let i=0;i<lines.length;i++){let ltot=lines[i],line=ltot.trim();var tt=line.split("//");let linenc=tt[0].trim();tt.splice(0,1);let commento=tt.length?` // ${tt.join("//").trim()} `:"";if(line.startsWith("/*"))inBloccoCommento=!0,formattedCode.push(line);else if(inBloccoCommento&&line.endsWith("*/"))inBloccoCommento=!1,formattedCode.push(line);else if(inBloccoCommento)formattedCode.push(ltot);else{var rr=regex.exec(line);if(rr){if(formattedCode.push(line),indentLevel=rr[1]?0:1,/^\s*\{(var|deriva|header|v|h)(\s.*)?\}/i.test(line)){let tm=verificaisvar(i+1,lines);(isvar=tm.fl)&&(cols=tm.cols)}else isvar=!1;inAcapo=!1;continue}if(isvar)if(linenc.startsWith(":")&&!linenc.startsWith(":h ")||!linenc)formattedCode.push(line);else{var lba=" ";linenc.startsWith(":h ")&&(linenc=linenc.substr(3).trim(),lba=":h ");for(var cl=getcolonne(linenc),j=0;j<cl.length;j++)cl[j].includes(",")&&(cl[j]=`"${cl[j]}"`),cl[j]=cl[j].padEnd(cols[j]," ");formattedCode.push(`${lba}${cl.join(" , ")} ${commento}`)}else{let indent=" ".repeat(indentLevel>=0?indentLevel:0);if(inAcapo)formattedCode.push(`${indent} ${line}`);else{let command="";line.startsWith("#")&&(command=line.substring(1).split(" ")[0].toUpperCase(),line="#"+command+line.substring(command.length+1)),["IF","IFDEF","IFNDEF"].includes(command)?line.indexOf("#",2)<0?(formattedCode.push(`${indent}${line}`),indentLevel++):(line=line.replace(/#([\w]+)/g,((match,m1)=>"#"+m1.toUpperCase())),formattedCode.push(`${indent}${line}`)):["FOR","SELECT","FORVAR","VARIANTE","DO"].includes(command)?(formattedCode.push(`${indent}${line}`),indentLevel++):["ELSEIF","ELSE","ELSEIFDEF","ELSEIFNDEF","CASE","CASES","DEFAULT"].includes(command)&&indentLevel>0?formattedCode.push(" ".repeat(indentLevel>0?indentLevel-1:0)+line):["ENDIF","ENDSELECT","LOOP","ENDFOR"].includes(command)?(formattedCode.push(" ".repeat(indentLevel>0?indentLevel-1:0)+line),indentLevel--,indentLevel<0&&(indentLevel=0)):line.startsWith("_ ")||line.startsWith(":")?formattedCode.push(line):formattedCode.push(indent+line)}inAcapo=linenc.endsWith("\\")}}}return formattedCode.join("\n")}(data,isvar),fs.writeFileSync(file,data),console.log(`formatted: ${isvar} ${Cyan}${Bold}${file}${Reset}`)}}(amb);break;case"w":case"watch":await dowatch(amb,doesegui);break;default:throw new Error("Funzione non contemplata (g,c,b,x)")}}catch(e){writeerror(e)}}();export{dbmu,getinfo,getinfofile,xlsexport,xlsimport};
273
+ this.varianti={},this.varelenco={},this.macroelenco={},this.scripts={},this.#headers=void 0,this.#alias=void 0,this.#deriva=void 0,this.#typos=void 0)}setfndot(fndotcallback){this.fndotcallback=fndotcallback,this.vari.setfndot(fndotcallback)}async#checkelencovar(cat){if(cbInfo$1&&!this.varelenco[cat]){let tm=await cbInfo$1("headers",cat,"_varianti");Array.isArray(tm)?this.varelenco[cat]=tm:tm.vars&&(this.varelenco[cat]=tm.vars,tm.alias&&(this.#alias=tm.alias)),this.varelenco[cat]||(this.varelenco[cat]=[])}}parseheaderfrominfo(tm){if(tm&&tm.length>0)for(let t of tm)switch(t.tipo){case"_headers":"string"==typeof t.value&&(t.value=headerconvert(t.value)),this.#headers=t.value||{};break;case"_alias":"string"==typeof t.value&&(t.value=aliasconvert(t.value)),this.#alias=t.value||{};break;case"_typos":if("string"==typeof t.value){var tips=fromjson(t.value);for(let tp in tips){var tq=tips[tp];tq.db&&(tq.db=muClean(muClComments(tq.db))),tq.list&&(tq.list=muClean(muClComments(tq.list)))}t.value=tips}this.#typos=t.value||{}}}setitem(item,rule,model,ruleset=[],datadelgiorno=0){this.item=clean(item,!0),this.rule=clean(rule,!0),this.model=clean(model,!0),this.ruleset=toruleset(ruleset),this.data=datadelgiorno||(new Date).toInt()}async getheader(cod){let tm;return!this.#headers&&cbInfo$1&&(tm=await cbInfo$1("headers",this.cat,"_headers"),this.parseheaderfrominfo(tm)),this.#headers||(this.#headers={}),this.#headers[cod]}async getalias(){let tm;return!this.#alias&&cbInfo$1&&(tm=await cbInfo$1("headers",this.cat,"_alias"),this.parseheaderfrominfo(tm)),this.#alias||(this.#alias={}),this.#alias}get deriva(){return this.#deriva,this.#deriva||[]}async getmacro(riga){try{if("string"==typeof riga&&(riga={tipo:"M",contenuto:riga}),!riga||!riga.contenuto)return;var rr=/^([({}):$\w.\\/]+)[\s;,]*(.*)?$/im.exec(riga.contenuto);if(!rr)return void errori.add("Macro non valida:"+riga.contenuto,riga);let macro=clean(rr[1],!0);macro.includes("$")&&(macro=await this.vari.valuta(macro));var pars=getcolonne(rr[2]),{name:name,cat:cat}=checkmu(macro,this.cat);this.cat=cat;var ky=`${cat}/${name}`;if(!this.macro[ky]){var tm=new Macro(this,name);await tm.load()?this.macro[ky]=tm:errori.add(`macro fail to load ${ky}`,riga)}return macro=this.macro[ky],macro?{macro:macro,pars:pars}:(errori.add(`macro non trovata ${ky}`,riga),{})}catch(error){errori.add(geterrdes(error),`ambiente.getmacro: ${riga?.contenuto}`)}}async getvariante(cod){var{name:name,cat:cat}=checkmu(cod,this.cat),n2=name;let altri={};if(cat==this.cat&&this.#alias&&this.#alias[name]&&(altri=this.#alias[name]||{},n2=altri.cod),await this.#checkelencovar(cat),this.varelenco[cat]&&!this.varelenco[cat].includes(name))return;var key=`${cat}/${n2}`;let vv;return this.varianti[key]?vv=this.varianti[key]:(vv=new Variante(this),await vv.load(key,cat),this.varianti[key]=vv),altri&&(altri.des&&(vv.des=altri.des),altri.vdef&&(vv.vdef=altri.vdef)),vv}async varcompila(v,callback){var xx=new Variante(this);(await xx.load(v,this.cat,!0),xx.alias)&&((await this.getalias())[v]=xx.alias);callback("variants",{cod:v,des:xx.des||"",alias:xx.alias,info:xx.alias?"":JSON.stringify(getOggetto(xx,["amb"]))})}async macrocompila(v,callback){var mac=new Macro(this,v);await mac.loadAndCompile(`${v}.mu`);var t=mac.getmacro();callback("macros",{cod:v,info:JSON.stringify(t),isgenera:mac.isgenera,isheader:mac.isheader,iscodice:mac.iscodice})}async barrecompila(articolibarre,titolibarre,callback){var cc=new CodiceBarra;await cc.compila(articolibarre,titolibarre);for(let x in cc.barre){callback("barcodes",{cod:x,des:"",info:JSON.stringify(cc.barre[x])})}return cc}async tojson(d){let tm;return cbFunc$1&&(tm=await cbFunc$1("json",d)),tm}async compila(info,callback){if(callback){for(let v of info.var)await this.varcompila(v,callback);for(let v of info.mu)await this.macrocompila(v,callback);if(callback("infos",{cod:"info",des:info.cat,info:JSON.stringify({cat:info.cat,md:info.info})}),this.#headers=void 0,this.#alias=void 0,this.#deriva=void 0,this.#typos=void 0,cbInfo$1){var tm=await cbInfo$1("headers",this.cat,["_headers","_alias","_deriva","_typos"]);this.parseheaderfrominfo(tm)}this.#headers?callback("infos",{cod:"headers",des:"",info:JSON.stringify(this.#headers)}):logga("missing headers"),this.#alias&&callback("infos",{cod:"alias",des:"",info:JSON.stringify(this.#alias)}),this.#deriva&&callback("infos",{cod:"deriva",des:"",info:JSON.stringify(this.#deriva)}),this.#typos&&callback("infos",{cod:"typos",des:"tipologie",info:JSON.stringify(this.#typos)})}}async getheaderfromdb(name){let totale=await cbInfo$1("header",this.cat,name,!this.#deriva),{head:head,rows:rows,macros:macros,deriva:deriva,llvars:llvars}=totale;for(let r of rows)r.cod=clean(r.cod),r.alias=clean(r.alias),r.t=clean(r.t);if(!llvars){llvars=new Set;for(let r of rows){let nn=r.alias?r.alias:r.cod;llvars.add(nn)}llvars=[...llvars]}this.#deriva||(this.#deriva=deriva),await this.#checkelencovar(this.cat),head.cod=clean(head.cod),head.rule=clean(head.rule),head.ruledef=head.ruledef||[];let vn=[],t=this.varelenco[this.cat];for(let nn of llvars)this.varianti[`${this.cat}/${nn}`]||t&&t.includes(nn)&&vn.push(nn);if(vn.length&&cbGetVariante$1){var vars=await cbGetVariante$1(this.cat,vn);if(vars&&vars.length)for(let x of vars){let{name:name,content:content}=x,vv=new Variante(this);vv.setheader(name,this.cat),content&&await vv.loadContentExtended(content),this.varianti[vv.key]=vv}}return{head:head,rows:rows,macros:macros}}async getlinkedmacros(rule,macros){var getkey=n=>n.includes("/")?n:`${this.cat}/${n}`;let k,cl=[];if(rule&&(k=getkey(rule),this.macro[k]||cl.push(rule)),macros&&"string"==typeof macros){let vv=macros.split(";");for(let v of vv)k=getkey(v),this.macro[k]||cl.push(v)}if(cl&&cl.length>0&&cbGetMacro$1){let tm=await cbGetMacro$1(this.cat,cl);if(tm&&tm.length>0)for(let x of tm){let m=new Macro(this,x.name);for(let t in x.content){let contenuto=x.content[t];m[t]=contenuto}this.macro[m.key]=m}}}async setruleheader(rule,pars,ruleset){var{name:name,cat:cat}=checkmu(rule,this.cat);ruleset&&ruleset.length&&(this.ruleset=toruleset(ruleset));var ky=`${cat}/${name}`;if(!this.macro[ky]){let totale=await this.getheaderfromdb(name),{head:head,rows:rows,macros:macros}=totale;await this.getlinkedmacros(head.rule,macros);var tm=new Macro(this,name);if(!head)return void errori.add("Missing rule: "+rule);if(head.rule){let k2=this.macro[`${cat}/${head.rule}`];if(k2)for(let x in k2)["cat","name","key"].includes(x)||(tm[x]=k2[x])}rows&&rows.length&&(tm.head=rows),this.macro[ky]=tm}this.ruleheader=ky;let mc=this.macro[ky];return errori.azzera(),await mc.setparametri(pars),mc}getruleheader(){return this.macro[this.ruleheader]}async setvariante(cod,opz){return await impostavariante(this,null,cod,opz)}async valuta(codice){let output;return"string"==typeof codice&&(codice=muClean(muClComments(codice,this.righevuote))),Array.isArray(codice)&&(logga("m1",codice),output=await muEval(this,null,codice)),output}setinfos(tm){tm&&(this.#headers=tm.headers,this.#alias=tm.alias,this.#deriva=void 0,this.#typos=tm.typos)}}Date.prototype.toInt||(Date.prototype.toInt=function(){return this.getDate()+100*(this.getMonth()+1)+1e4*this.getFullYear()}),Date.prototype.toFloat||(Date.prototype.toFloat=function(){return Math.floor(1e4*this.getDate()+1e6*(this.getMonth()+1)+1e8*this.getFullYear()+100*this.getHours()+this.getMinutes()+.5)/1e4});const mustr={mus:{variants:{cod:"s",des:"s",alias:"s",info:"s",md:"s",__pk:"cod"},extras:{tipo:"s",cod:"s",info:"s",__pk:"tipo, cod"},macros:{cod:"s",des:"s",info:"s",md:"s",def:"s",isgenera:"i",iscodice:"i",isheader:"i",__pk:"cod"},infos:{cod:"s",des:"s",info:"s",__pk:"cod"},barcodes:{cod:"s",des:"s",info:"s",__pk:"cod"}}},{Clear:Clear,Reset:Reset,Bold:Bold,Reverse:Reverse,Red:Red,Green:Green,Yellow:Yellow,Blue:Blue,Magenta:Magenta,Cyan:Cyan,White:White}=init();var mi=minimist(process.argv);console.log("----------------------------------------------------------------------------------------"),console.log(`${Bold}${Cyan}${Bold}Markuno:${Reset} command line utility del linguaggio (c) Croswil 2024 v. ${Yellow}2.0.34${Reset}`),console.log("----------------------------------------------------------------------------------------");var inidata={FOLDERBASE:"./",DBWORK:"./data/app.db",FOLDERCAT:"./data/mu",FOLDEROUT:"./out",CAT:"cat"};const fini=".lasts.markuno";fs.existsSync(fini)&&(inidata=JSON.parse(fs.readFileSync(fini)));var pars=mi._;(mi.h||mi.help||!pars[2])&&(console.log(`Uso: ${Bold}markuno <funzioni> <[catalogo/]markuno> [opzioni]${Reset} \n${Bold}${Cyan}Funzioni:${Reset} (seleziona una tra le seguenti)\n ${White} c, compila ${Reset}${Green} compila un catalogo/Markuno + Codici Barra\n ${White} d, dump ${Reset}${Green} compila e salva il compilato in formato json\n ${White} e, esegui ${Reset}${Green} esegui un file markuno \n ${White} f, formatta ${Reset}${Green} Formattazione di un file .mu o .var\n ${White} g, genera${Reset}${Green} generatore di codice \n ${White} w, watch ${Reset}${Green} abilita il watch su un file markuno \n ${White} gw <markuno> <maxele> ${Reset}${Green} Genera con wath (solo i primi maxele=20 elementi senza salvare\n${Bold}${Cyan}Opzioni:${Reset}${Green}\n ${White} -h, --help${Reset}${Green} mostra l'help\n ${White} -c, --cat <cat>${Reset}${Green} catalogo (default='${inidata.CAT}' ) \n ${White} -d, --dbwork ${Reset}${Green} database principale (default='${inidata.DBWORK}')\n ${White} -i, --init <folder>${Reset}${Green} cartella di lavoro (default='${inidata.FOLDERCAT}' ) \n ${White} -o, --out <folder>${Reset}${Green} cartella di output (default='${inidata.FOLDEROUT}' ) \n ${White} -x, --xlsx${Reset}${Green} output in formato excel (generatore)\n `),process.exit(0));let counter=0;const DBWORK=mi.d||mi.dbwork||inidata.DBWORK,FOLDERCAT=mi.i||mi.init||inidata.FOLDERCAT,FOLDEROUT=mi.o||mi.out||inidata.FOLDEROUT,CAT=mi.c||mi.cat||inidata.CAT;var dberp=void 0,erp3cad=!1;fs.existsSync(FOLDERCAT)||writeerror(`Manca la cartella di lavoro: ${FOLDERCAT}`),inidata=Object.assign(inidata,{FOLDERBASE:"./",DBWORK:DBWORK,FOLDERCAT:FOLDERCAT,FOLDEROUT:FOLDEROUT,CAT:CAT}),fs.writeFileSync(fini,JSON.stringify(inidata,null,2)),fs.existsSync(FOLDERCAT)||fs.mkdirSync(FOLDERCAT,{recursive:!0});const ISXLS=mi.x||mi.xlsx;function writeerror(err){var tm=err.stack.toString().split("\n");tm.splice(0,1),tm=tm.filter((e=>!/module/.test(e)&&!/node\:/.test(e))),console.log(`${Red}${err.message}${Reset}\n${tm.join("\n")}`),process.exit(1)}function dbmu(cat){var ff=path.join(FOLDERCAT,`mu_${cat}.db`);fs.existsSync(ff)||checkdb(ff,mustr,"mus");var d=database.db(ff);return setstruttura(mustr),d}function getinfofile(file){var def="",md="",f2=`${file}.txt`;fs.existsSync(f2)&&(def=fs.readFileSync(f2).toString());f2=`${file}.md`;return fs.existsSync(f2)&&(md=fs.readFileSync(f2).toString()),{def:def,md:md}}function getinfo(cat,folder){var vv=fs.readdirSync(folder),out={cat:cat,info:"",mu:[],var:[],inc:[]};for(var v of vv){var f=path.join(folder,v),extname=path.extname(v),basename=path.basename(v,extname);"__info.md"==v?out.info=fs.readFileSync(f).toString():".mu"==extname?out.mu.push(basename):".var"==extname?out.var.push(basename):".inc"==extname&&out.inc.push(basename)}return out}async function xlsexport(rq,f2,file){const XLSX=await import("xlsx"),worksheet=XLSX.utils.json_to_sheet(rq),workbook=XLSX.utils.book_new();XLSX.utils.book_append_sheet(workbook,worksheet,f2),XLSX.writeFile(workbook,`${file}.xlsx`,{compression:!0})}async function xlsimport(file,r0){const XLSX=await import("xlsx");var ws=XLSX.readFile(file).Sheets[r0];return XLSX.utils.sheet_to_json(ws)}async function cbGetMacro(cat,name){var file=`${FOLDERCAT}/${cat}/${name}.mu`;return fs.existsSync(file)?fs.readFileSync(file).toString():""}async function cbGetVariante(cat,name){var file=`${FOLDERCAT}/${cat}/${name}.var`;return fs.existsSync(file)?fs.readFileSync(file).toString():(errori.add(`missing var: ${cat}, ${name}`,{t:"cbGetVariante"}),"")}async function cbFunc(cmd,pars,vars){errori.add(`missing fun: ${cmd}`,{t:"cbFunc"})}async function cbInfo(tipo,cat,name){if(Array.isArray(name)){var tt=[];for(var n of name){var value=await cbInfo(tipo,cat,n);value&&tt.push({tipo:n,value:value})}return tt}switch(tipo){case"filter":if(!dberp||!name&&!name[0])return[];if(erp3cad)return[];var rr=dberp.all("select item,model,rule,varfilter,result,result2,exclude,exclude2 from limits where variant=?",name[0]);for(var r of rr)r.valfilter=JSON.parse(r.varfilter||"{}"),r.result=JSON.parse(r.result||"[]"),r.result2=JSON.parse(r.result2||"[]");return rr;case"headers":var f;return f="_typos"==name?`${FOLDERCAT}/${cat}/typos.json`:`${FOLDERCAT}/${cat}/${name}.inc`,fs.existsSync(f)?fs.readFileSync(f).toString():""}}async function cbGetFile(cat,file){if(fs.existsSync(path.join("./",file)))return fs.readFileSync(path.join("./",file)).toString();const ff=`${FOLDERCAT}/${cat}/${file}`;if(fs.existsSync(ff))return fs.readFileSync(ff).toString();errori.add(`missing file: ${ff}`,{t:"cbGetFile"})}function checkfilemu(cat,file){var ext=path.extname(file);[".mu",".var",".inc"].includes(ext)||(ext=".mu",file+=".mu");var folder=path.join(FOLDERCAT,cat||CAT),ff=path.join("./",file);if(fs.existsSync(ff))return{file:ff,folder:folder,diversi:!0};var i=file.indexOf("/");if(i>0&&(cat=file.substr(0,i),file=file.substr(i+1),folder=path.join(FOLDERCAT,cat||CAT),!fs.existsSync(folder)))throw new Error("missing folder: "+folder);if(ff=path.join(folder,file),fs.existsSync(ff))return{file:ff,folder:folder,diversi:!1,ext:ext};throw new Error(`non trovato il file: ${file} su ${folder}`)}async function dowatch(amb,funzione){var{file:file,folder:folder,diversi:diversi}=checkfilemu(amb.cat,pars[3]||""),maxele=parseInt(pars[4]||"10");console.log(`Start Watching: ${Cyan}${Bold}${file}${Reset}`),fs.watch(folder,(async(eventType,filename)=>{filename&&await funzione(amb,maxele)})),diversi&&fs.watch(file,(async(eventType,filename)=>{filename&&await funzione(amb,maxele)})),await funzione(amb,maxele)}async function genera(amb,maxele){var{file:file,folder:folder,diversi:diversi}=checkfilemu(amb.cat,pars[3]||"");if(!fs.existsSync(file))throw new Error("Manca il file: "+file);var tm=path.extname(file),base=path.basename(file,tm),mac=new Macro(amb,base),dt=(new Date).valueOf();await mac.loadAndCompile(`${base}${tm}`);var dt1=(new Date).valueOf(),tot={},issort={},tm2=[],ll2=[],tmh=[];if(await async function muGenerate(macro,amb,genera,callback,isTestmode=0){if(macro.isgenera&&callback){var output={counter:0,keys:{},isTestmode:isTestmode};for(let gg in macro.genera)await muGenerate_0(macro,amb,gg,callback,output);return!0}}(mac,amb,0,((generator,out,db,cc1,cc2)=>{if(maxele){var cl=[];for(var i in out){var t=out[i];if("number"==typeof t&&(t=Math.round(1e4*t)/1e4+""),"__id"!=i){var l=cl.length;tmh[l]||(tmh[l]=i,ll2[l]=i.length),ll2[l]<t.length&&(ll2[l]=t.length),cl.push(t)}}tm2.push(cl)}else{var gen=generator.split("_")[0]||gen;if(tot[gen]||(tot[gen]=[]),tot[gen].push(out),out.cod&&(issort[gen]=!0,db))for(var x in db){var ky=`${gen}_${x}`;tot[ky]||(tot[ky]=[]);var dblist=db[x];for(i=0;i<dblist.length;i++){var d=dblist[i];tot[ky].push({padre:out.cod,i:i,comp:d.c0,qt:muCalc(d.c1),des:d.c2})}}}}),maxele),maxele){for(var i=0;i<tmh.length;i++)tmh[i]=tmh[i].padEnd(ll2[i]," ");for(var tt of(console.log(`${Yellow}${tmh.join(" | ")}${Reset}`),tm2)){for(i=0;i<tt.length;i++)tt[i]=tt[i].padEnd(ll2[i]," ");console.log(tt.join(" | "))}}else{var dt2=(new Date).valueOf(),count=0;for(var ss in issort)count+=tot[ss].length,tot[ss].sort(((a,b)=>(a.cod||"").localeCompare(b.cod||"")));tot._errori=mac.geterrori(),fs.writeFileSync(path.join(FOLDEROUT,`gen_${base}.json`),JSON.stringify(tot,null,2));const fex=path.join(FOLDEROUT,`gen_${base}.xlsx`);var dt3=(new Date).valueOf();if(ISXLS){const XLSX=await import("xlsx"),wb=XLSX.utils.book_new();for(var ky in tot){const ws=XLSX.utils.json_to_sheet(tot[ky]);XLSX.utils.book_append_sheet(wb,ws,ky)}XLSX.writeFile(wb,fex,{compression:!0})}else fs.existsSync(fex)&&fs.unlinkSync(fex);var dt4=(new Date).valueOf();console.log(`${Yellow}${Bold}EVAL........: ${count}${Reset}${Cyan} rows\n${Cyan}load/compile: ${Bold}${Yellow}${dt1-dt}${Reset}${Cyan} ms.\n${Cyan}generate....: ${Bold}${Yellow}${dt2-dt1}${Reset}${Cyan} ms.\n${Cyan}save JSON...: ${Bold}${Yellow}${dt3-dt2}${Reset}${Cyan} ms.\n${Cyan}save XLSX...: ${Bold}${Yellow}${dt4-dt3}${Reset}${Cyan} ms.\n--------------------------------\n${Cyan}${Bold}TOTALE......: ${Yellow}${dt4-dt}${Reset}${Cyan} ms.`)}}async function doesegui(amb){var{file:file,folder:folder,diversi:diversi}=checkfilemu(amb.cat,pars[3]||""),dt=(new Date).valueOf(),data=fs.readFileSync(file).toString(),mac=new Macro(amb,pars[3]||"");counter++,mac.parsedata(data);var dt1=(new Date).valueOf(),out=await muEval(amb,mac,mac.codice,{limited:!1,oldstyle:!0,localvar:mac.localvar}),dt2=(new Date).valueOf();console.log(`${out.join("\n")}`),console.log(`${Yellow}${Bold}EVAL ${counter}${Reset}: ${file} => ${Cyan}load:${Bold}${Yellow}${dt1-dt}${Reset}${Cyan}ms. -- exec:${Bold}${Yellow}${dt2-dt1}${Reset}${Cyan}ms.${Reset}\n----------------------------------------------\n${errori.toString()}`),fs.writeFileSync(path.join(FOLDEROUT,"logs.json"),JSON.stringify({loadandcompile:dt1-dt,execute:dt2-dt1,vari:amb.vari.dump(),codice:mac.codice,errori:mac.errori},null,2)),fs.writeFileSync(path.join(FOLDEROUT,"out.txt"),out.join("\n"))}await async function main(){try{var amb=function muInit(cat,cbGetMacro,cbGetVariante,cbFunc,cbInfo,cbGetFile,cbLogga){var mu=new Ambiente(cat);return setcallbacks(cbGetMacro,cbGetVariante,cbFunc,cbInfo,cbGetFile,cbLogga),mu}(CAT,cbGetMacro,cbGetVariante,cbFunc,cbInfo,cbGetFile),fcat=path.join(FOLDERCAT,CAT);if(fs.mkdirSync(FOLDEROUT,{recursive:!0}),!fs.existsSync(fcat))throw new Error(`Manca il catalogo: ${CAT} su ${FOLDERCAT}`);var dt=(new Date).valueOf();switch(pars[2].trim().toLowerCase()){case"g":case"genera":await genera(amb,0);break;case"d":case"dump":await async function dump(amb){var{file:file,folder:folder,diversi:diversi}=checkfilemu(amb.cat,pars[3]||"");if(!fs.existsSync(file))throw new Error("Manca il file: "+file);var xx,fileout,tm=path.extname(file),base=path.basename(file,tm);if(console.log(base,tm),".mu"==tm){var mac=new Macro(amb,base);await mac.loadAndCompile(`${base}${tm}`),xx=mac.getmacro(),fileout=path.join(FOLDEROUT,base+".json")}else".var"==tm&&(xx=await async function newVariante(cod,cat,amb){var xx=new Variante(amb);return await xx.load(cod,cat),xx}(base,CAT,amb),fileout=path.join(FOLDEROUT,base+".var.json"));xx&&(fs.writeFileSync(fileout,JSON.stringify(xx,null,2)),console.log(`${Cyan}${Bold}Dump: ${Reset}${Yellow}${fileout}`))}(amb);break;case"gw":await dowatch(amb,genera);break;case"c":case"compila":await async function compila(amb){var articolibarre,titolibarre,folder=path.join(FOLDERCAT,CAT);if(!fs.existsSync(folder))throw new Error("Manca il catalogo "+CAT);if(!fs.existsSync(DBWORK))throw new Error("Manca il database di lavoro: "+DBWORK);if(fs.existsSync(DBWORK))if((dberp=database.db(DBWORK)).esisteTabella("artbarre")){erp3cad=!0;var rr=dberp.all("select cod cod,des des,flfm fm,coderr coderr,codalt codalt from artbarre order by cod ");for(var r of(titolibarre={},rr)){(tm=r.cod.trim().toLowerCase().substr(1))&&(titolibarre[tm]={des:r.des,fm:r.fm,coderr:r.coderr.trim().toLowerCase(),codalt:r.codalt.trim().toLowerCase()})}articolibarre=dberp.all("select codicebarra barcode,diml l,dima a,dimp p,cod cod from articoli where codicebarra like ? order by codicebarra","+%")}else articolibarre=dberp.all("select barcode,l,a,p,cod from items where barcode>'' order by barcode"),titolibarre={};else console.warn("MISSING DBWORK (barre e limits)");var db=dbmu(CAT);db.begin(),db.run("delete from variants"),db.run("delete from macros"),db.run("delete from barcodes"),db.run("delete from extras");var info=getinfo(CAT,folder);for(var x of(await amb.compila(info,((table,data)=>{if(data){if("macros"===table){var{def:def,md:md}=getinfofile(`${data.cod}.mu`);data.def=def,data.md=md}insertorupdate(db,table,data,"mus")}})),info.var)){var tm,ff=`${folder}/${x}.var.txt`;if(fs.existsSync(ff))(tm=muLimits(fs.readFileSync(ff).toString()))&&tm.length&&insertorupdate(db,"extras",{tipo:"l",cod:x,info:JSON.stringify(tm)},"mus")}await amb.barrecompila(articolibarre,titolibarre,((table,data)=>{insertorupdate(db,table,data,"mus")})),insertorupdate(db,"infos",{cod:"info",des:info.cat,info:JSON.stringify({cat:info.cat,md:info.info})},"mus"),dberp&&dberp.chiudi();db.commit(),db.chiudi()}(amb),console.log(`Compilazione catalogo: ${Red}${Bold}${CAT}${Reset}: ${Yellow}${(new Date).valueOf()-dt}ms.`);break;case"x":case"e":case"esegui":await doesegui(amb);break;case"f":case"format":!function formatta(amb){var{file:file,folder:folder,diversi:diversi,ext:ext}=checkfilemu(amb.cat,pars[3]||"");if(fs.existsSync(file)){var data=fs.readFileSync(file).toString(),isvar=".var"==ext;data=function muFormatcode(code,gisvar){let lines=code.split("\n"),formattedCode=[],indentLevel=0,inBloccoCommento=!1,inAcapo=!1,cols=[];var isvar=gisvar;if(isvar){let tm=verificaisvar(0,lines);(isvar=tm.fl)&&(cols=tm.cols)}for(let i=0;i<lines.length;i++){let ltot=lines[i],line=ltot.trim();var tt=line.split("//");let linenc=tt[0].trim();tt.splice(0,1);let commento=tt.length?` // ${tt.join("//").trim()} `:"";if(line.startsWith("/*"))inBloccoCommento=!0,formattedCode.push(line);else if(inBloccoCommento&&line.endsWith("*/"))inBloccoCommento=!1,formattedCode.push(line);else if(inBloccoCommento)formattedCode.push(ltot);else{var rr=regex.exec(line);if(rr){if(formattedCode.push(line),indentLevel=rr[1]?0:1,/^\s*\{(var|deriva|header|v|h)(\s.*)?\}/i.test(line)){let tm=verificaisvar(i+1,lines);(isvar=tm.fl)&&(cols=tm.cols)}else isvar=!1;inAcapo=!1;continue}if(isvar)if(linenc.startsWith(":")&&!linenc.startsWith(":h ")||!linenc)formattedCode.push(line);else{var lba=" ";linenc.startsWith(":h ")&&(linenc=linenc.substr(3).trim(),lba=":h ");for(var cl=getcolonne(linenc),j=0;j<cl.length;j++)cl[j].includes(",")&&(cl[j]=`"${cl[j]}"`),cl[j]=cl[j].padEnd(cols[j]," ");formattedCode.push(`${lba}${cl.join(" , ")} ${commento}`)}else{let indent=" ".repeat(indentLevel>=0?indentLevel:0);if(inAcapo)formattedCode.push(`${indent} ${line}`);else{let command="";line.startsWith("#")&&(command=line.substring(1).split(" ")[0].toUpperCase(),line="#"+command+line.substring(command.length+1)),["IF","IFDEF","IFNDEF"].includes(command)?line.indexOf("#",2)<0?(formattedCode.push(`${indent}${line}`),indentLevel++):(line=line.replace(/#([\w]+)/g,((match,m1)=>"#"+m1.toUpperCase())),formattedCode.push(`${indent}${line}`)):["FOR","SELECT","FORVAR","VARIANTE","DO"].includes(command)?(formattedCode.push(`${indent}${line}`),indentLevel++):["ELSEIF","ELSE","ELSEIFDEF","ELSEIFNDEF","CASE","CASES","DEFAULT"].includes(command)&&indentLevel>0?formattedCode.push(" ".repeat(indentLevel>0?indentLevel-1:0)+line):["ENDIF","ENDSELECT","LOOP","ENDFOR"].includes(command)?(formattedCode.push(" ".repeat(indentLevel>0?indentLevel-1:0)+line),indentLevel--,indentLevel<0&&(indentLevel=0)):line.startsWith("_ ")||line.startsWith(":")?formattedCode.push(line):formattedCode.push(indent+line)}inAcapo=linenc.endsWith("\\")}}}return formattedCode.join("\n")}(data,isvar),fs.writeFileSync(file,data),console.log(`formatted: ${isvar} ${Cyan}${Bold}${file}${Reset}`)}}(amb);break;case"w":case"watch":await dowatch(amb,doesegui);break;default:throw new Error("Funzione non contemplata (g,c,b,x)")}}catch(e){writeerror(e)}}();export{dbmu,getinfo,getinfofile,xlsexport,xlsimport};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "croswil_markuno",
3
- "version": "1.0.87",
3
+ "version": "1.0.89",
4
4
  "private": false,
5
5
  "dependencies": {
6
6
  "croswil_lib": "^5.0.46",