croswil_markuno 1.0.95 → 1.0.97
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 +3 -3
- package/bin/mu.js +29 -36
- package/package.json +1 -1
package/bin/mu-convcad.js
CHANGED
|
@@ -10,7 +10,7 @@ import{init,database}from"croswil_lib";import fs from"fs";import path from"path"
|
|
|
10
10
|
* Converte una stringa in array di colonne, gestendo diversi formati
|
|
11
11
|
* @param {string} value - Stringa da convertire
|
|
12
12
|
* @returns {string[]} Array di colonne
|
|
13
|
-
*/function getcolonne(value,keepquote=!1){value=String(value||"");const pp=/^(\d+)\.\.(\d+)$/.exec(value);if(pp){
|
|
13
|
+
*/function getcolonne(value,keepquote=!1){value=String(value||"");const pp=/^(\d+)\.\.(\d+)$/.exec(value);if(pp){let n1=parseInt(pp[1]),n2=parseInt(pp[2]);const cl=[];n1>n2&&([n1,n2]=[n2,n1]);for(let i=n1;i<=n2;i++)cl.push(i+"");return cl}if(!/["({[]/.test(value))return value.split(/[,;]/).map((e=>e.trim()));const risultato=[];let buffer="",livelloParentesi=0,inVirgolette=!1;for(let i=0;i<value.length;i++){const char=value[i];if(0===livelloParentesi&&'"'===char&&(0!==i&&"\\"===value[i-1]||(inVirgolette=!inVirgolette)),inVirgolette||("("===char||"["===char||"{"===char?livelloParentesi++:")"!==char&&"]"!==char&&"}"!==char||(livelloParentesi=Math.max(0,livelloParentesi-1))),","!==char&&";"!==char||0!==livelloParentesi||inVirgolette)buffer+=char;else{const trimmed=buffer.trim();risultato.push(trimmed),buffer=""}}const trimmed=buffer.trim();return trimmed&&risultato.push(trimmed),risultato.map((e=>(e=e.trim(),!keepquote&&(e.startsWith('"')&&e.endsWith('"')||e.startsWith("(")&&e.endsWith(")"))?e.slice(1,-1):e)))}
|
|
14
14
|
/**
|
|
15
15
|
* Classe per la gestione degli errori con funzionalità di accumulo e formattazione
|
|
16
16
|
*/
|
|
@@ -43,10 +43,10 @@ function muClComments(codice,tienivuoti){const righe=(code=>code.replace(/("(?:\
|
|
|
43
43
|
/**
|
|
44
44
|
* Converte la lista degli errori in stringa
|
|
45
45
|
* @returns {string} Rappresentazione testuale degli errori
|
|
46
|
-
*/toString(){
|
|
46
|
+
*/toString(){const cl=[];for(const e of this.err){const m="object"==typeof e.msg?JSON.stringify(e.msg):e.msg||"";cl.push(`${e.row?e.row+":":""}${m}`)}return cl.join("\n")}};const regex=/^\s*\{(:)?(var|deriva|valid|formula|header|genera|g|v|f|h)(\s.*)?\}/i;function verificaisvar(i1,lines){let inBloccoCommento=!1;const cols=[];for(let i=i1;i<lines.length;i++){const line=lines[i].trim();let 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(":")){const cl=getcolonne(linenc);for(let j=0;j<cl.length;j++){let 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}}
|
|
47
47
|
/**
|
|
48
48
|
* Formatta il codice sorgente applicando indentazione e allineamento
|
|
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.40${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.46${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){const lines=code.split("\n"),formattedCode=[];let indentLevel=0,inBloccoCommento=!1,inAcapo=!1,cols=[],isvar=gisvar;if(isvar){const tm=verificaisvar(0,lines);isvar=tm.fl,isvar&&(cols=tm.cols)}for(let i=0;i<lines.length;i++){const ltot=lines[i];let line=ltot.trim();const tt=line.split("//");let linenc=tt[0].trim();tt.splice(0,1);const 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{const 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)){const tm=verificaisvar(i+1,lines);isvar=tm.fl,isvar&&(cols=tm.cols)}else isvar=!1;inAcapo=!1;continue}if(isvar)if(linenc.startsWith(":")&&!linenc.startsWith(":h ")||!linenc)formattedCode.push(line);else{let lba=" ";linenc.startsWith(":h ")&&(linenc=linenc.substr(3).trim(),lba=":h ");const cl=getcolonne(linenc);for(let 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{const 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.js
CHANGED
|
@@ -38,14 +38,14 @@ import fs from"fs";import path from"path";import{init,database,insertorupdate,ch
|
|
|
38
38
|
* @param {string} r - Stringa da analizzare (es: "chiave=valore")
|
|
39
39
|
* @param {string} [sep='='] - Carattere separatore
|
|
40
40
|
* @returns {{v: string, o: string, fl: boolean}} Oggetto contenente chiave (v), valore (o) e flag presenza separatore (fl)
|
|
41
|
-
*/function getcouple(r,sep="=",locase=!0){
|
|
41
|
+
*/function getcouple(r,sep="=",locase=!0){const q=(r=r||"").indexOf(sep);return q>=0?{v:clean(r.substring(0,q),locase),o:r.substring(q+sep.length).trim(),fl:!0}:{v:clean(r,locase),o:"",fl:!1}}
|
|
42
42
|
/**
|
|
43
43
|
* Valida e separa un identificatore e una categoria
|
|
44
44
|
* @param {string} id - Identificatore da validare (formato: "categoria/nome" o solo "nome")
|
|
45
45
|
* @param {string} cat - Categoria di default
|
|
46
46
|
* @throws {Error} Se manca la categoria
|
|
47
47
|
* @returns {{name: string, cat: string}} Oggetto con nome e categoria validati
|
|
48
|
-
*/function checkmu(id,cat){if((id=(id||"").trim()).indexOf("/")>0){
|
|
48
|
+
*/function checkmu(id,cat){if((id=(id||"").trim()).indexOf("/")>0){const vv=id.split("/");cat=vv[0]||"",id=vv[1]||""}if(!cat)throw new Error("manca il catalogo per "+id);return{name:id,cat:cat=checkname(cat)}}
|
|
49
49
|
/**
|
|
50
50
|
* Valida un identificatore verificando che contenga solo caratteri permessi
|
|
51
51
|
* @param {string} id - Identificatore da validare
|
|
@@ -57,7 +57,7 @@ import fs from"fs";import path from"path";import{init,database,insertorupdate,ch
|
|
|
57
57
|
* Converte una stringa in array di colonne, gestendo diversi formati
|
|
58
58
|
* @param {string} value - Stringa da convertire
|
|
59
59
|
* @returns {string[]} Array di colonne
|
|
60
|
-
*/function getcolonne(value,keepquote=!1){value=String(value||"");const pp=/^(\d+)\.\.(\d+)$/.exec(value);if(pp){
|
|
60
|
+
*/function getcolonne(value,keepquote=!1){value=String(value||"");const pp=/^(\d+)\.\.(\d+)$/.exec(value);if(pp){let n1=parseInt(pp[1]),n2=parseInt(pp[2]);const cl=[];n1>n2&&([n1,n2]=[n2,n1]);for(let i=n1;i<=n2;i++)cl.push(i+"");return cl}if(!/["({[]/.test(value))return value.split(/[,;]/).map((e=>e.trim()));const risultato=[];let buffer="",livelloParentesi=0,inVirgolette=!1;for(let i=0;i<value.length;i++){const char=value[i];if(0===livelloParentesi&&'"'===char&&(0!==i&&"\\"===value[i-1]||(inVirgolette=!inVirgolette)),inVirgolette||("("===char||"["===char||"{"===char?livelloParentesi++:")"!==char&&"]"!==char&&"}"!==char||(livelloParentesi=Math.max(0,livelloParentesi-1))),","!==char&&";"!==char||0!==livelloParentesi||inVirgolette)buffer+=char;else{const trimmed=buffer.trim();risultato.push(trimmed),buffer=""}}const trimmed=buffer.trim();return trimmed&&risultato.push(trimmed),risultato.map((e=>(e=e.trim(),!keepquote&&(e.startsWith('"')&&e.endsWith('"')||e.startsWith("(")&&e.endsWith(")"))?e.slice(1,-1):e)))}
|
|
61
61
|
/**
|
|
62
62
|
* Analizza variabili in un'espressione usando delimitatori
|
|
63
63
|
* @param {string} ex - Espressione da analizzare
|
|
@@ -66,7 +66,7 @@ import fs from"fs";import path from"path";import{init,database,insertorupdate,ch
|
|
|
66
66
|
* @param {string} endpar - Delimitatore finale (], ), })
|
|
67
67
|
* @param {boolean} [nonewline=false] - Se true, termina all'incontro di un newline
|
|
68
68
|
* @returns {{i: number, res: string[]}} Risultato dell'analisi con posizione finale e array risultati
|
|
69
|
-
*/const parsevar=(ex,k0,inipar,endpar,nonewline=!1)=>{const pars1=["[","(","{"],pars2=["]",")","}"];endpar||(endpar="["==inipar?"]":"("==inipar?")":"}");
|
|
69
|
+
*/const parsevar=(ex,k0,inipar,endpar,nonewline=!1)=>{const pars1=["[","(","{"],pars2=["]",")","}"];endpar||(endpar="["==inipar?"]":"("==inipar?")":"}");const mp=pars1.includes(inipar);let par=1,nres=0;const res=[];for(let i=k0;i<ex.length;i++)if(mp&&pars1.includes(ex[i])||ex[i]==inipar)par++;else if(mp&&pars2.includes(ex[i])||ex[i]==endpar){if(par--,0==par&&ex[i]==endpar)return res[nres]=ex.substring(k0,i),{i:i,res:res}}else if(":"==ex[i])1==par&&(res[nres]=ex.substring(k0,i),k0=i+1,nres++);else if("\n"==ex[i]&&nonewline)return{i:i,res:res};return{i:-1,res:ex.substring(k0)}};
|
|
70
70
|
/**
|
|
71
71
|
* Classe per la gestione degli errori con funzionalità di accumulo e formattazione
|
|
72
72
|
*/
|
|
@@ -112,14 +112,7 @@ function setOggetto(objDestinazione,objSorgente){"object"==typeof objDestinazion
|
|
|
112
112
|
/**
|
|
113
113
|
* Converte la lista degli errori in stringa
|
|
114
114
|
* @returns {string} Rappresentazione testuale degli errori
|
|
115
|
-
*/toString(){
|
|
116
|
-
/**
|
|
117
|
-
* Formatta una data in formato italiano breve
|
|
118
|
-
* @param {Date} date - La data da formattare
|
|
119
|
-
* @param {string} formato - Formato di output (non utilizzato)
|
|
120
|
-
* @returns {string} Data formattata (es. "01 gen 23")
|
|
121
|
-
*/
|
|
122
|
-
var toNum=(n,dec=-1)=>{const num="string"==typeof n?parseFloat(n)||0:n;if(dec<0)return num||0;const factor=Math.pow(10,dec);return Math.round(num*factor)/factor||0};const REGEX_PARENTESI=/(?<!\w)\(/g,REGEX_NUMERO=/^-?[0-9.]+$/,REGEX_FUNZIONE=/^(\w+)(!)?\[(.*)?\]$/,REGEX_RANDOM=/^(rnd|random|cas)\(/i,REGEX_CLAMP=/^clamp\(/i,REGEX_ROUND=/^(dec|round)\(/i,REGEX_DIGIT=/[0-9.]/,REGEX_OPERATOR=/[+\-*/^%]/,REGEX_ALPHA=/[a-zA-Z]/i;function valutaparentesi(expression){for(expression=(expression+"").trim();;){var tm=REGEX_PARENTESI.exec(expression);if(!tm)break;var{i:i,res:res}=parsevar(expression,tm.index+1,"(",")");if(i<=0)break;expression=expression.substring(0,tm.index)+valutaparentesi(res[0])+(i>=0?expression.substring(i+1):"")}return expression=function valutainsiemi(expression){if(expression.includes("[")){function resinisiemi(rr){let v1=rr[1],fl=!!rr[2],vv=getcolonne(rr[3]);for(var v of vv)if(v==v1)return fl?"0":"1";return fl?"1":"0"}for(;;){var rr=REGEX_FUNZIONE.exec(expression);if(!rr)break;var tm=resinisiemi(rr);expression=expression.substring(0,rr.index)+tm+expression.substring(rr.index+rr[0].length)}}return expression}(expression),function operatoricomparazione(expression){let left,right;const operators={"||":()=>valutaparentesi(left)||valutaparentesi(right)?1:0,"|":()=>valutaparentesi(left)||valutaparentesi(right)?1:0,"&&":()=>valutaparentesi(left)&&valutaparentesi(right)?1:0,"&":()=>valutaparentesi(left)&&valutaparentesi(right)?1:0,"<<=":()=>clean(left)<=clean(right),">>=":()=>clean(left)>=clean(right),"===":()=>clean(left)==clean(right),"==":()=>clean(left)==clean(right),"!!":()=>clean(left)!=clean(right),"<<":()=>clean(left)<clean(right),">>":()=>clean(left)>clean(right),"<=":()=>muCalcbase(left)<=muCalcbase(right),">=":()=>muCalcbase(left)>=muCalcbase(right),"<":()=>muCalcbase(left)<muCalcbase(right),">":()=>muCalcbase(left)>muCalcbase(right),"=":()=>muCalcbase(left)==muCalcbase(right),"!":()=>muCalcbase(left)!=muCalcbase(right)};var operatorIndex=-1,op="";for(var operator in operators)if((operatorIndex=expression.indexOf(operator))>=0){op=operator;break}return-1!==operatorIndex?(left=expression.slice(0,operatorIndex),right=expression.slice(operatorIndex+op.length),operators[op]&&operators[op]()?1:0):muCalcbase(expression)}(expression)}const mathFunctions={sqr:x=>Math.sqrt(x),sqrt:x=>Math.sqrt(x),int:x=>Math.floor(x),floor:x=>Math.floor(x),round:x=>Math.round(x),abs:x=>Math.abs(x),sin:x=>Math.sin(x*(Math.PI/180)),cos:x=>Math.cos(x*(Math.PI/180)),tan:x=>Math.tan(x*(Math.PI/180)),atan:x=>Math.atan(x*(Math.PI/180)),atan2:(x,y)=>Math.atan2(x,y)*(Math.PI/180),asin:x=>Math.asin(x*(Math.PI/180)),acos:x=>Math.acos(x*(Math.PI/180))};function muCalcbase(expression){let index=0;function parseOperator(){const op=expression[index];return REGEX_OPERATOR.test(op)?(index++,op):null}function parsePrimary(){if(REGEX_DIGIT.test(expression[index]))return function parseNumber(){const start=index;for(;index<expression.length&®EX_DIGIT.test(expression[index]);)index++;return Number(expression.slice(start,index))}();if("("===expression[index]){index++;const result=parseExpr();return")"===expression[index]&&index++,result}return REGEX_ALPHA.test(expression[index])?function parseFunctions(){var ex=expression.slice(index);if(!ex)return 0;for(const[name,func]of Object.entries(mathFunctions)){const match=new RegExp(`^(${name})\\(`,"i").exec(ex);if(match){index+=match[0].length;const result=func(parseExpr());return")"===expression[index]&&index++,result}}let fn;if(fn=REGEX_RANDOM.exec(ex),fn){index+=fn[0].length;let min=0,max=1;return")"!==expression[index]&&(min=parseExpr(),","===expression[index]?(index++,max=parseExpr()):(max=min,min=0)),")"===expression[index]&&index++,Math.random()*(max-min)+min}if(fn=REGEX_CLAMP.exec(ex),fn){index+=fn[0].length;const a=parseExpr();","===expression[index]&&index++;const b=parseExpr();","===expression[index]&&index++;const c=parseExpr();return")"===expression[index]&&index++,Math.min(Math.max(a,b),c)}if(fn=REGEX_ROUND.exec(ex),fn){index+=fn[0].length;const value=parseExpr();let decimals=0;return","===expression[index]&&(index++,decimals=parseExpr()),")"===expression[index]&&index++,parseFloat(value.toFixed(decimals))}return index++,parseExpr()}():0}function parseFactor(){let left=parsePrimary();for(;index<expression.length&&/[/*^%]/.test(expression[index]);){const op=parseOperator(),right=parsePrimary();"*"===op?left*=right:"/"===op?left=right?left/right:0:"%"===op?left=right?left%right:0:"^"===op&&(left=Math.pow(left,right))}return left}function parseExpr(){let left=parseFactor();for(;index<expression.length&&/[+-]/.test(expression[index]);){const op=parseOperator(),right=parseFactor();"+"===op?left+=right:"-"===op&&(left-=right)}return left}return expression=expression.replace(/\s/g,""),parseExpr()}
|
|
115
|
+
*/toString(){const cl=[];for(const e of this.err){const m="object"==typeof e.msg?JSON.stringify(e.msg):e.msg||"";cl.push(`${e.row?e.row+":":""}${m}`)}return cl.join("\n")}},toNum=(n,dec=-1)=>{const num="string"==typeof n?parseFloat(n)||0:n;if(dec<0)return num||0;const factor=Math.pow(10,dec);return Math.round(num*factor)/factor||0};const REGEX_PARENTESI=/(?<!\w)\(/g,REGEX_NUMERO=/^-?[0-9.]+$/,REGEX_FUNZIONE=/^(\w+)(!)?\[(.*)?\]$/,REGEX_RANDOM=/^(rnd|random|cas)\(/i,REGEX_CLAMP=/^clamp\(/i,REGEX_ROUND=/^(dec|round)\(/i,REGEX_DIGIT=/[0-9.]/,REGEX_OPERATOR=/[+\-*/^%]/,REGEX_ALPHA=/[a-zA-Z]/i;function valutaparentesi(expression){for(expression=(expression+"").trim();;){const tm=REGEX_PARENTESI.exec(expression);if(!tm)break;{const{i:i,res:res}=parsevar(expression,tm.index+1,"(",")");if(i<=0)break;expression=expression.substring(0,tm.index)+valutaparentesi(res[0])+(i>=0?expression.substring(i+1):"")}}return function operatoricomparazione(expression){let left,right;const operators={"||":()=>valutaparentesi(left)||valutaparentesi(right)?1:0,"|":()=>valutaparentesi(left)||valutaparentesi(right)?1:0,"&&":()=>valutaparentesi(left)&&valutaparentesi(right)?1:0,"&":()=>valutaparentesi(left)&&valutaparentesi(right)?1:0,"<<=":()=>clean(left)<=clean(right),">>=":()=>clean(left)>=clean(right),"===":()=>clean(left)==clean(right),"==":()=>clean(left)==clean(right),"!!":()=>clean(left)!=clean(right),"<<":()=>clean(left)<clean(right),">>":()=>clean(left)>clean(right),"<=":()=>muCalcbase(left)<=muCalcbase(right),">=":()=>muCalcbase(left)>=muCalcbase(right),"<":()=>muCalcbase(left)<muCalcbase(right),">":()=>muCalcbase(left)>muCalcbase(right),"=":()=>muCalcbase(left)==muCalcbase(right),"!":()=>muCalcbase(left)!=muCalcbase(right)};let operatorIndex=-1,op="";for(const operator in operators)if(operatorIndex=expression.indexOf(operator),operatorIndex>=0){op=operator;break}return-1!==operatorIndex?(left=expression.slice(0,operatorIndex),right=expression.slice(operatorIndex+op.length),operators[op]&&operators[op]()?1:0):muCalcbase(expression)}(expression=function valutainsiemi(expression){if(expression.includes("[")){function resinisiemi(rr){const v1=rr[1],fl=!!rr[2],vv=getcolonne(rr[3]);for(const v of vv)if(v==v1)return fl?"0":"1";return fl?"1":"0"}for(;;){const rr=REGEX_FUNZIONE.exec(expression);if(!rr)break;{const tm=resinisiemi(rr);expression=expression.substring(0,rr.index)+tm+expression.substring(rr.index+rr[0].length)}}}return expression}(expression))}const mathFunctions={sqr:x=>Math.sqrt(x),sqrt:x=>Math.sqrt(x),int:x=>Math.floor(x),floor:x=>Math.floor(x),round:x=>Math.round(x),abs:x=>Math.abs(x),sin:x=>Math.sin(x*(Math.PI/180)),cos:x=>Math.cos(x*(Math.PI/180)),tan:x=>Math.tan(x*(Math.PI/180)),atan:x=>Math.atan(x*(Math.PI/180)),atan2:(x,y)=>Math.atan2(x,y)*(Math.PI/180),asin:x=>Math.asin(x*(Math.PI/180)),acos:x=>Math.acos(x*(Math.PI/180))};function muCalcbase(expression){let index=0;function parseOperator(){const op=expression[index];return REGEX_OPERATOR.test(op)?(index++,op):null}function parsePrimary(){if(REGEX_DIGIT.test(expression[index]))return function parseNumber(){const start=index;for(;index<expression.length&®EX_DIGIT.test(expression[index]);)index++;return Number(expression.slice(start,index))}();if("("===expression[index]){index++;const result=parseExpr();return")"===expression[index]&&index++,result}return REGEX_ALPHA.test(expression[index])?function parseFunctions(){const ex=expression.slice(index);if(!ex)return 0;for(const[name,func]of Object.entries(mathFunctions)){const match=new RegExp(`^(${name})\\(`,"i").exec(ex);if(match){index+=match[0].length;const result=func(parseExpr());return")"===expression[index]&&index++,result}}let fn;if(fn=REGEX_RANDOM.exec(ex),fn){index+=fn[0].length;let min=0,max=1;return")"!==expression[index]&&(min=parseExpr(),","===expression[index]?(index++,max=parseExpr()):(max=min,min=0)),")"===expression[index]&&index++,Math.random()*(max-min)+min}if(fn=REGEX_CLAMP.exec(ex),fn){index+=fn[0].length;const a=parseExpr();","===expression[index]&&index++;const b=parseExpr();","===expression[index]&&index++;const c=parseExpr();return")"===expression[index]&&index++,Math.min(Math.max(a,b),c)}if(fn=REGEX_ROUND.exec(ex),fn){index+=fn[0].length;const value=parseExpr();let decimals=0;return","===expression[index]&&(index++,decimals=parseExpr()),")"===expression[index]&&index++,parseFloat(value.toFixed(decimals))}return index++,parseExpr()}():0}function parseFactor(){let left=parsePrimary();for(;index<expression.length&&/[/*^%]/.test(expression[index]);){const op=parseOperator(),right=parsePrimary();"*"===op?left*=right:"/"===op?left=right?left/right:0:"%"===op?left=right?left%right:0:"^"===op&&(left=Math.pow(left,right))}return left}function parseExpr(){let left=parseFactor();for(;index<expression.length&&/[+-]/.test(expression[index]);){const op=parseOperator(),right=parseFactor();"+"===op?left+=right:"-"===op&&(left-=right)}return left}return expression=expression.replace(/\s/g,""),parseExpr()}
|
|
123
116
|
/**
|
|
124
117
|
* Valuta un'espressione matematica o logica e restituisce il risultato
|
|
125
118
|
* @param {string|number} expression - L'espressione da valutare
|
|
@@ -128,7 +121,7 @@ var toNum=(n,dec=-1)=>{const num="string"==typeof n?parseFloat(n)||0:n;if(dec<0)
|
|
|
128
121
|
* Supporta operazioni matematiche di base, funzioni trigonometriche,
|
|
129
122
|
* operatori di confronto e operazioni logiche.
|
|
130
123
|
* Le funzioni supportate includono: sqrt, floor, abs, sin, cos, random, clamp, round
|
|
131
|
-
*/function muCalc(expression){if(!expression)return 0;if("number"==typeof expression)return expression||0;if("string"!=typeof expression)return 0;
|
|
124
|
+
*/function muCalc(expression){if(!expression)return 0;if("number"==typeof expression)return expression||0;if("string"!=typeof expression)return 0;const s=expression.replaceAll(",",".");return REGEX_NUMERO.test(s)?Number(s)||0:valutaparentesi(expression)||0}function valutavar(sh,res){const vv=res[0]||"";if(!vv)return"";if(sh.counter>=100)return vv;const tmps1=valuta0(sh,vv);let vx;if(sh.stl[tmps1])vx=`-- R:${tmps1} --`;else{const tmps=sh.var(tmps1);if(isObject(tmps))return tmps;sh.stl[tmps1]=!0,vx=valutabase(sh,tmps),delete sh.stl[tmps1]}if(sh.counter>=100)return vv;if(res[1]){const cols=getcolonne(vx);if("l"==res[1])return String(cols.length);const col=muCalc(valuta0(sh,res[1]));if(!(col>=0&&col<cols.length))return"";vx=valuta0(sh,cols[col])}if(res[2]){const c1=muCalc(valuta0(sh,res[2]));if(c1){let c2=0;return res[3]&&(c2=muCalc(valuta0(sh,res[3]))),c1<0?vx.slice(c1):c2?vx.substring(c1-1,c1+c2-1):vx.substring(c1-1)}}return vx}function valutaquadra(sh,res){let vv=getcolonne(res||"");const r1=clean(vv[0]);function replacecharcode(str){return"\\t"==str?"\t":"\\n"==str?"\n":(str||"").replace(/&(\d+)/g,((match,m1)=>String.fromCharCode(parseInt(m1))))}switch(r1){case"set":{const m1=valuta0(sh,vv[1]||""),m2=valuta0(sh,vv[2]||"");sh.add(m1,sh.var(m2))}break;case"ex":{const m1=valuta0(sh,vv[1]||"");let m2=valuta0(sh,vv[2]||"");m2||(m2=",");const m3=muCalc(valuta0(sh,vv[3]||"")),tm=m1.split(m2);return m3>0&&tm[m3-1]||""}case"ex2":{const sep=replacecharcode(vv[1]||""),pos=muCalc(valuta0(sh,vv[2]||""));vv.splice(0,3);return vv.join(";").split(sep)[pos>0?pos-1:0]||""}case"replace":return vv[1].replace(new RegExp(vv[2]||"x","gim"),(vv[3]||"").trim());case"replace2":case"rp2":try{let search=replacecharcode(vv[1]||"x");const replace=replacecharcode(vv[2]||"").trim();vv.splice(0,3),search=search.replace(/&(\d+)/g,((match,code)=>`\\u${parseInt(code).toString(16).padStart(4,"0")}`));return vv.join(";").replace(new RegExp(search,"im"),replace)}catch(error){return""}case"look":case"lookb":{const val=parseFloat(vv[1]||"");if(vv=vv.slice(2).map((e=>parseFloat(e)||0)),"lookb"==r1){const filtered=vv.filter((v=>v<=val));return filtered.length?Math.max(...filtered):val}{const filtered=vv.filter((v=>v>=val));return filtered.length?Math.min(...filtered):val}}case"tk":{let pos=muCalc(valuta0(sh,vv[1]||""))||0;if(!pos){pos=muCalc(valuta0(sh,vv[2]||""));const sep=vv[1]||"";return pos?vv[3].split(sep)[pos-1]:""}return vv[pos>0?pos+1:2]||""}case"totab":return vv.splice(0,1),vv.join("\t");case"tosep":{const sep=replacecharcode(vv[1]||"")||";";return vv.splice(0,2),vv.join(sep)}case"len":{let tm;return vv.length>2?(vv.shift(),tm=vv.join(";")):tm=vv[1]||"",tm.length}case"mid":{const str=valuta0(sh,vv[1]||""),pos=muCalc(valuta0(sh,vv[2]||"")),len=muCalc(valuta0(sh,vv[3]||""));return str.substring(pos-1,pos+len-1)}case"arrotonda":{const str=muCalc(vv[1]);let coeff=1;return["0","1","2","3","4","5","6"].includes(vv[2])?coeff=Math.pow(10,parseInt(vv[2])):(coeff=muCalc(vv[2]),0==coeff&&(coeff=1e3)),Math.round(str*coeff)/coeff}case"iif":return muCalc(valuta0(sh,vv[1]))?vv[2]||1:vv[3]||0;case"instr":case"instr2a":{const str1=vv[1]||"",str2=vv[2]||"";return str1.toLowerCase().indexOf(str2.toLowerCase())+1}case"instr2":{const str2=vv[1]||"";return vv.splice(0,2),vv.join(";").toLowerCase().indexOf(str2.toLowerCase())+1}default:return r1.startsWith(".")?{fun:res,pars:[]}:{fun:r1,pars:vv}}}function valuta0(sh,ex){if(ex+="",sh.counter>=100)return ex;for(;;){const rt=/\$([{(])/im.exec(ex);if(!rt)break;{const i1=rt.index,{i:i,res:res}="("==rt[1]?parsevar(ex,i1+2,"(",")"):parsevar(ex,i1+2,"{","}"),tm=valutavar(sh,res);if(isObject(tm))return tm;ex=valuta0(sh,ex.substring(0,i1))+tm+(i>=0?valuta0(sh,ex.substring(i+1)):"")}}return ex=(ex=ex.replace(/\$([a-z|][\w|.]*)/gi,((match,m1)=>{let m2="";for(;m1.length;){let tm;if(sh.stl[m1]?tm=`--R: ${m1} --`:(sh.stl[m1]=!0,tm=valutabase(sh,sh.var(m1)),delete sh.stl[m1]),tm||!(m1.length>1)){m2=tm+m2;break}m2=m1.slice(-1)+m2,m1=m1.substring(0,m1.length-1)}return m2}))).replace(/\$(\d+):(\d+)(:(\d+))?/g,((p0,p1,p2,p3,p4)=>{p4=p4?+p4:1;const cl=[];for(let i=+p1;i<=+p2;i+=p4)cl.push(i.toString());return cl.join(";")}))}function valutabase(sh,ex){return ex&&(sh.counter++,sh.counter<=100&&(ex=valuta0(sh,ex)),sh.counter--),ex}class Variabile{constructor(){this.stl={},this.dictionary={},this.vec=[],this.counter=0,this.fndotcallback=void 0}static isValidKey(key){return/^[\w][\w\d.[\]]*$/.test(key)}static sanitizeKey(key){return key.replace(/[^a-zA-Z0-9_.[\]]/g,"_")}setfndot(fndotcallback){this.fndotcallback=fndotcallback}
|
|
132
125
|
/**
|
|
133
126
|
* Salva lo stato corrente delle variabili nello stack
|
|
134
127
|
*/push(){this.vec.push({...this.dictionary})}
|
|
@@ -140,16 +133,16 @@ var toNum=(n,dec=-1)=>{const num="string"==typeof n?parseFloat(n)||0:n;if(dec<0)
|
|
|
140
133
|
*/clear(){this.vec=[],this.dictionary={}}azzera=()=>this.clear()
|
|
141
134
|
/**
|
|
142
135
|
* Recupera il valore di una variabile
|
|
143
|
-
*/;var(key){let fmt="";const pp=/^(\d+)\.\.(\d+)$/.exec(key);if(pp){
|
|
136
|
+
*/;var(key){let fmt="";const pp=/^(\d+)\.\.(\d+)$/.exec(key);if(pp){let n1=parseInt(pp[1]),n2=parseInt(pp[2]);const cl=[];n1>n2&&([n1,n2]=[n2,n1]);for(let i=n1;i<=n2;i++)cl.push(i+"");return cl}if(key.indexOf("|")>=0){const tm=key.split("|");key=tm[0],fmt=tm[1]}function toformat(val,fmt){switch(fmt.trim().toLowerCase()){case"0":return String(parseInt(val)||0);case"-":return String((parseInt(val)||1)-1);case"+":return String((parseInt(val)||0)+1);case"data":return date=parseFloat(val)||0,new Intl.DateTimeFormat("it",{day:"2-digit",month:"short",year:"2-digit"}).format(date.toDate());case"euro":return((n,valorezero="")=>{if(n){let xx=Intl.NumberFormat("en",{style:"currency",currency:"EUR"}).format(n);return xx=xx.replace(/€/g,"").replace(/\./g,";").replace(/,/g,".").replace(/;/g,",")+"€",xx}return valorezero})(parseFloat(val));case"num":return toNum(parseFloat(val));case"n":case"n0":case"n1":case"n2":case"n3":case"n4":{const dec=parseInt(fmt.slice(1))||0;return toNum(parseFloat(val),dec)}case"u":return String(val).toUpperCase();case"l":return String(val).toLowerCase();default:return val}var date}const sanitizedKey=Variabile.sanitizeKey(key);if(sanitizedKey.startsWith(".")&&this.fndotcallback){const tm=this.fndotcallback(sanitizedKey.toLowerCase());if(tm)return toformat(tm,fmt)}if(Variabile.isValidKey(sanitizedKey)){const lowercaseKey=sanitizedKey.toLowerCase(),rr=/^([\w][\w\d]*)[.[]/.exec(lowercaseKey);if(rr){const tm=this.dictionary[rr[1]];if(tm&&"object"==typeof tm)return toformat(function objval(tm,key){const parts=key.split(".");let obj=tm;for(let i=0;i<parts.length;i++){const part=parts[i],match=part.match(/(.*?)\[(\d*)\]/);if(match){if(obj=obj[match[1]],void 0===obj)return"";obj=obj[parseInt(match[2],10)||0]}else switch(part){case"_k":obj=(Object.keys(obj)||[]).join(",");break;case"_v":obj=Object.values(obj)||[];break;case"_l":obj=obj.length||0;break;default:obj=obj[part]}if(void 0===obj)return""}return"number"==typeof obj?obj+"":obj}(tm,lowercaseKey.substring(rr[0].length)),fmt)}return toformat(this.dictionary[lowercaseKey]||"",fmt)}return""}getvar(key){return this.var(key)}colonna(value,index){return getcolonne[index]||value}
|
|
144
137
|
/**
|
|
145
138
|
* Restituisce un dump delle variabili
|
|
146
|
-
*/dump(isstr=!1){
|
|
139
|
+
*/dump(isstr=!1){let cl=[];for(const t in this.dictionary)cl.push({cod:t,val:this.dictionary[t]});return cl=cl.sort(((a,b)=>a.cod>b.cod)),isstr?cl.map((e=>`${e.cod} = ${isObject(e.val)?JSON.stringify(e.val,null,2):e.val}`)):cl}
|
|
147
140
|
/**
|
|
148
141
|
* Aggiunge o rimuove una variabile
|
|
149
142
|
*/add(key,value){"number"==typeof value&&(value=String(value));const sanitizedKey=Variabile.sanitizeKey(key);if(Variabile.isValidKey(sanitizedKey)){const lowercaseKey=sanitizedKey.toLowerCase();0===value||value?this.dictionary[lowercaseKey]=value:delete this.dictionary[lowercaseKey]}else logga(`Invalid key: ${key}`)}
|
|
150
143
|
/**
|
|
151
144
|
* Valuta un'espressione con supporto per callback asincroni
|
|
152
|
-
*/valutasync(str){return valutabase(this,str)}async valuta(ex,callback){this.stl={};
|
|
145
|
+
*/valutasync(str){return valutabase(this,str)}async valuta(ex,callback){this.stl={};let tm=await async function valutafunc(sh,ex,callback){if(ex){for(let ii=0;ii<20;ii++){const i1=ex.lastIndexOf("$[");if(!(i1>=0)){ex=valutabase(sh,ex);break}{const{i:i,res:res}=parsevar(ex,i1+2,"[","]"),t1=valutabase(sh,ex.substring(0,i1)),t2=res?res[0].startsWith(".")?valutabase(sh,res.join(":")):valutabase(sh,res[0]):"",t3=i>=0?valutabase(sh,ex.substring(i+1)):"";let t4=valutaquadra(sh,t2);if("object"==typeof t4&&(t4=callback?await callback(t4?.fun,t4.pars):`** fun: ${t4.fun} ** `),isObject(t4))return t4;ex=t1+t4+t3}}return ex}return""}(this,ex,callback);return isObject(tm)||(tm=(ex=>{for(;;){const i1=ex.indexOf("{");if(!(i1>=0))break;{const{i:i,res:res}=parsevar(ex,i1+1,"{","}");if(i<0)return ex;ex=ex.substring(0,i1)+muCalc(res[0])+(i>=0?ex.substring(i+1):"")}}return ex})(tm)),tm}async parametrokeyval(p){if("string"!=typeof p)return{};if(!(p=p.trim()))return{};let k,v,q,isnum=!1;return p.startsWith("#")&&(isnum=!0,p=p.slice(1)),q=p.indexOf("="),q>0?(k=clean(p.slice(0,q)),v=p.slice(q+1)):(q=p.indexOf(":"),q>0?(k=clean(p.slice(0,q)),v=p.slice(q+1),v=this.var(v)):(k=clean(p),v=this.var(k))),v&&"string"==typeof v&&v.includes("$")&&(v=await this.valuta(v)),["l","a","p"].includes(k)&&(isnum=!0),isnum&&(v=muCalc(v)),{k:k,v:v}}}class CodiceBarra{constructor(){this.barre={}}azzera(){this.barre={}}oriented(t,l,a,p){switch(t=(t||"1").substr(0,1).toLowerCase()){case"0":break;case"l":return{t:"l",x:l};case"a":return{t:"a",x:a};case"p":return{t:"p",x:p};case"2":return{t:t,x:l,y:p,z:a};case"5":return{t:t,x:l,y:a,z:p};case"4":return{t:t,x:p,y:l,z:a};case"3":return{t:t,x:a,y:p,z:l};case"6":return{t:t,x:p,y:a,z:l};default:return{t:"1",x:a,y:l,z:p}}}async getcode(codicebarratot,l,a,p,callback){let[codicebarra,modello]=codicebarratot.split(":");modello=modello||"";const getcode0=async(codicebarra,liv)=>{let barra=this.barre[codicebarra];if(!barra&&callback&&(barra=await callback(codicebarra),barra||(barra={t:"1",r:[]}),this.barre[codicebarra]=barra,barra.coderr&&"errore"!=barra.coderr||(barra.coderr=`#err_${codicebarra}`)),!barra||0==barra.r.length)return{extra:{err:"missing codicebarra"},c:`#err_${codicebarra}`,fm:10};const{t:t,x:x,y:y,z:z}=this.oriented(codicebarra,l,a,p),extra={barra:codicebarra,fm:barra.fm,t:t,liv:liv,items:barra.r.length,err:""};let bx=barra.r;if(z){const t2=bx.filter((e=>e.z===z||!e.z));t2.length>0?bx=t2:extra.err=`spessore non coerente: ${z}`}if("l"==t||"a"==t||"p"==t){const t=bx.find((e=>e.x>=x));if(t)return{c:t.c,fm:t.x==x?0:1,x1:t.x,x:x,extra:extra}}else{let t=bx.find((e=>e.x==x&&e.y==y));if(t)return{c:t.c,fm:0,x:x,y:y,z:z,x1:t.x,y1:t.y,z1:t.z,extra:extra};if(0!=barra.fm&&(t=bx.find((e=>e.x>=x&&e.y==y)),t))return{c:t.c,fm:1,x:x,y:y,z:z,x1:t.x,y1:t.y,z1:t.z,extra:extra};if(0!=barra.fm&&2!=barra.fm&&(t=bx.find((e=>e.x>=x&&e.y>=y)),t))return{c:t.c,fm:2,x:x,y:y,z:z,x1:t.x,y1:t.y,z1:t.z,extra:extra}}return barra.codalt&&liv<5?await getcode0(barra.codalt,liv+1):{c:barra.coderr,fm:9,x:x,y:y,z:z,extra:extra}};return await getcode0(codicebarra,0)}compila(vettore,headers){headers||(headers={});const barre={};if(Array.isArray(vettore)){for(const r of vettore)if(r.cod=clean(r.cod),r.barcode=clean(r.barcode),r.barcode.length>2&&"+"==r.barcode[0]){r.barcode=r.barcode.substr(1);const tm=this.oriented(r.barcode.substr(0,1),r.l,r.a,r.p);tm.c=r.modello?{c:r.cod,m:r.modello}:r.cod,barre[r.barcode]||(barre[r.barcode]={t:r.barcode.substr(0,1),r:[]},headers[r.barcode]&&(barre[r.barcode]=Object.assign(headers[r.barcode],barre[r.barcode]))),barre[r.barcode].r.push(tm)}for(const x in barre){barre[x].r.sort(((a,b)=>a.y?1e4*(a.x-b.x)+(a.y-b.y):a.x-b.x))}}this.barre=barre}}
|
|
153
146
|
/**
|
|
154
147
|
* Costanti e espressioni regolari utilizzate nel modulo
|
|
155
148
|
*/const keys="IFDEF|IFNDEF|CACHE|CVAR|LOOK|LOOKB|SELECT|CASES|CASE|LOG|MSG|DEFAULT|ELSEIFDEF|ELSEIFNDEF|ELSEIF|ELSE|ENDIF|ENDSELECT|PUSH|POP|FUNC|MACRO|LETS|LETO|LETM|LETT|LETV|LETM|LET|DEF|DO|VARIANTE|FORVAR|FOR|LOOP|ENDFOR|BREAK|EXIT|EXITFOR|CONTINUE|IF|INC|I|F|M|J|:P".split("|");
|
|
@@ -165,16 +158,16 @@ var toNum=(n,dec=-1)=>{const num="string"==typeof n?parseFloat(n)||0:n;if(dec<0)
|
|
|
165
158
|
* @param {boolean} acapo - Se true mantiene i ritorni a capo nel contenuto
|
|
166
159
|
* @returns {Object[]} Array di oggetti rappresentanti la struttura del codice
|
|
167
160
|
* @throws {Error} Se tt non è un array
|
|
168
|
-
*/function muClean(tt,acapo=!1){if(Array.isArray(tt))
|
|
161
|
+
*/function muClean(tt,acapo=!1){if(!Array.isArray(tt))return void errori.add("muClean: expected array!");const tm=[];
|
|
169
162
|
/**
|
|
170
163
|
* Aggiunge una riga generica alla struttura
|
|
171
164
|
* @param {string} r - Riga da aggiungere
|
|
172
|
-
*/for(
|
|
165
|
+
*/function addgen(r){if(tm.length>0&&""==tm[tm.length-1].tipo){const x=tm[tm.length-1];acapo||!(!r.startsWith("!")&!r.startsWith("."))||r.startsWith("$")||r.startsWith("{")||r.startsWith("#")||x.contenuto.startsWith("!")||x.contenuto.startsWith(".")||x.contenuto.startsWith("$")||x.contenuto.startsWith("{")||x.contenuto.startsWith("#")?tm.push({tipo:"",contenuto:r}):x.contenuto=x.contenuto+"\n"+r}else tm.push({tipo:"",contenuto:r})}for(const rigaTrim of tt){const matchComando=rigaTrim.match(/^#([\w.]+)\s*(.*)$/);if(matchComando){let tipo=matchComando[1].toUpperCase().trim(),tipo2="";if(tipo.includes(".")){const vv=tipo.split(".");tipo=vv[0],tipo2=vv[1]}if(keys.includes(tipo)){const contenuto=matchComando[2];if("IF"!==tipo&&"IFDEF"!=tipo&&"IFNDEF"!=tipo||!contenuto.includes("#")){const tmx={tipo:tipo,contenuto:matchComando[2]};tipo2&&(tmx.tipo2=tipo2),tm.push(tmx)}else{let matchInline=contenuto.match(/^(.*?)\s*#\s*(\w+)\s*(.*?)\s*#\s*(\w+)\s*(.*)$/);matchInline?(tm.push({tipo:tipo,contenuto:matchInline[1].trim()}),tm.push({tipo:matchInline[2].toUpperCase(),contenuto:matchInline[3]}),tm.push({tipo:"ELSE",contenuto:""}),tm.push({tipo:matchInline[4].toUpperCase(),contenuto:matchInline[5]}),tm.push({tipo:"ENDIF",contenuto:""})):(matchInline=contenuto.match(/^(.*?)\s*#\s*(\w+)\s*(.*)$/),matchInline?(tm.push({tipo:tipo,contenuto:matchInline[1].trim()}),tm.push({tipo:matchInline[2].toUpperCase(),contenuto:matchInline[3]}),tm.push({tipo:"ENDIF",contenuto:""})):tm.push({tipo:matchComando[1].toUpperCase(),contenuto:matchComando[2]}))}}else addgen(rigaTrim)}else addgen(rigaTrim)}let nn=0,nf=0,ns=0,lev=[],lef=[],les=[];for(let i=0;i<tm.length;i++){const t=tm[i];switch(t.i=i,t.tipo){case"FOR":case"FORVAR":case"VARIANTE":case"DO":nf++,lef[nf]={pos:i,bk:[]};break;case"LOOP":case"ENDFOR":if(nf>0){const{pos:pos}=lef[nf];for(const b of lef[nf].bk)b.next=i,b.prev=pos;t.prev=pos,tm[pos].next=i,nf--}break;case"BREAK":case"EXIT":case"EXITFOR":case"CONTINUE":nf>0&&lef[nf].bk.push(t);break;case"IF":case"IFDEF":case"IFNDEF":nn++,lev[nn]={pos:i,bk:[t]};break;case"SELECT":ns++,les[ns]={pos:i,bk:[t],first:i};break;case"ELSEIF":case"ELSEIFDEF":case"ELSEIFNDEF":case"ELSE":if(nn>0){const{pos:pos}=lev[nn];lev[nn].bk.push(t),tm[pos].next=i,lev[nn].pos=i}break;case"CASE":case"CASES":case"DEFAULT":if(ns>0){const{pos:pos,first:first}=les[ns];les[ns].bk.push(t),tm[pos].next=i,t.first=first,les[ns].pos=i}break;case"ENDIF":if(nn>0){const{pos:pos,next:next}=lev[nn];tm[pos].next=i;for(const b of lev[nn].bk)b.last=i;nn--}break;case"ENDSELECT":if(ns>0){const{pos:pos,next:next}=les[ns];tm[pos].next=i;for(const b of les[ns].bk)b.last=i;ns--}}}return tm}
|
|
173
166
|
/**
|
|
174
167
|
* Analizza e processa i limiti definiti nel codice
|
|
175
168
|
* @param {string} dati - Dati contenenti le definizioni dei limiti
|
|
176
169
|
* @returns {Object[]} Array di oggetti rappresentanti i limiti processati
|
|
177
|
-
*/function muLimits(dati){
|
|
170
|
+
*/function muLimits(dati){const rr=muClComments(dati),tm=[];let tk;const parsa=v=>v?[...new Set(v.split(",").map((e=>e.trim())).sort().filter((e=>e)))]:void 0;for(const r of rr){let m=/^\s*\{(.*)?\}/im.exec(r);if(m)"limit"==clean(m[1])?(tk={},tm.push(tk)):tk=void 0;else if(tk&&(m=/^\s*:(\w+)\s*(.*)/.exec(r),m))switch(m[1].toLowerCase()){case"opz":case"o":tk.opz=parsa(m[2]);break;case"obs":case"obsolete":tk.obsolete=parsa(m[2]);break;case"scons":case"sconsigliate":tk.scons=parsa(m[2]);break;case"neutri":tk.neutri=parsa(m[2]);break;case"art":tk.art=parsa(m[2]);break;case"mod":tk.mod=parsa(m[2]);break;default:logga("missing:",m[1])}}return tm}function parselimitifromdb(rr){let c,cl=[];if(rr&&rr.length)for(const r of rr){c={},r.varfilter=fromjson(r.varfilter,[]),r.result=fromjson(r.result,[]),r.result2=fromjson(r.result2,[]),r.exclude=parseInt(r.exclude)?1:0,r.exclude2=parseInt(r.exclude2)?1:0;const{item:item,model:model,rule:rule,varfilter:varfilter,result:result,result2:result2,exclude:exclude,exclude2:exclude2,datai:datai,dataf:dataf}=r;function remap(res){return res.map((e=>clean("string"==typeof e?e:e.Value,!0))).filter((e=>e))}if(result.length||result2.length){if(result.length&&(exclude?c.ex=remap(result):c.valid=remap(result)),result2.length&&(exclude2?c.ex2=remap(result2):c.valid2=remap(result2)),item&&(c.i=clean(item).split(";")),model&&(c.m=clean(model).split(";")),rule&&(c.r=clean(rule).split(";")),(datai||dataf)&&datai<dataf&&(c.datai=parseInt(datai),c.dataf=parseInt(dataf)),varfilter&&varfilter.length){c.v=[];for(const x of varfilter){let tm=c.v.find((e=>e.v==clean(x.Variant)));tm||(tm={v:clean(x.Variant),o:[]},c.v.push(tm)),tm.o=[...tm.o,...clean(x.Value).split(";")],tm.o=[...new Set(tm.o.filter((x=>x)))]}}setlevelimite(c),cl.push(c)}}return cl=cl.sort(((a,b)=>b.l-a.l)),cl}function setlevelimite(rs){let l=0;rs.i&&rs.i.length&&(l+=5),rs.m&&rs.m.length&&(l+=3),rs.r&&rs.r.length&&(l+=2),rs.v&&rs.v.length&&(l+=3),rs.datai&&rs.dataf&&(l+=1),rs.l=l}
|
|
178
171
|
/**
|
|
179
172
|
* Classe per gestire le varianti di un prodotto.
|
|
180
173
|
* Permette di caricare, manipolare e convertire varianti di prodotto con relativi attributi e limiti.
|
|
@@ -194,80 +187,80 @@ this.amb=amb}
|
|
|
194
187
|
* @param {string} id - Identificativo univoco della variante
|
|
195
188
|
* @param {string} cat - Categoria di appartenenza
|
|
196
189
|
* @returns {Object} Oggetto contenente nome e categoria normalizzati
|
|
197
|
-
*/setheader(id,_cat){
|
|
190
|
+
*/setheader(id,_cat){const{name:name,cat:cat}=checkmu(id,_cat);return this.cat=cat,this.name=name,this.alias="",this.obbligo=!1,this.des=name,this.vdef=[],this.rows={},this.h=[],this.key=`${cat}/${name}`,{name:name,cat:cat}}
|
|
198
191
|
/**
|
|
199
192
|
* Cerca la riga con dimensione più vicina a quella richiesta
|
|
200
193
|
* @param {number|string} dim - Dimensione target da cercare
|
|
201
194
|
* @param {number} colonna - Indice della colonna (1-based) contenente la dimensione
|
|
202
195
|
* @returns {string} Riga formattata nel formato CSV
|
|
203
|
-
*/fromdim(dim,colonna=2){"number"!=typeof dim&&(dim=muCalc(dim)),colonna>0&&colonna--;
|
|
196
|
+
*/fromdim(dim,colonna=2){"number"!=typeof dim&&(dim=muCalc(dim)),colonna>0&&colonna--;let rsel,max=1e9;for(const kk in this.rows){const row=this.rows[kk];if(!row.annulla){const dd=parseFloat(row.v[colonna])||0;dd<=max&&dd>=dim&&(max=dd,rsel=row)}}return this.#torow(dim,rsel)}
|
|
204
197
|
/**
|
|
205
198
|
* Carica una variante dal database o da file
|
|
206
199
|
* @param {string} id - Identificativo della variante
|
|
207
200
|
* @param {string} cat - Categoria della variante
|
|
208
201
|
* @param {boolean} nofilter - Se true, non carica i filtri associati
|
|
209
202
|
* @returns {Promise<boolean>} Promise che risolve a true se il caricamento ha successo
|
|
210
|
-
*/async load(id,_cat,nofilter=!1){
|
|
203
|
+
*/async load(id,_cat,nofilter=!1){const{name:name,cat:cat}=this.setheader(id,_cat);if(cbGetVariante$1){const content=await cbGetVariante$1(cat,name);if(content){if(await this.loadContentExtended(content),content.filter)this.limits=parselimitifromdb(content.filter);else if(cbInfo$1&&!nofilter){const tm=await cbInfo$1("filter",cat,name);tm&&tm.length&&(this.limits=parselimitifromdb(tm))}return!0}}return!1}
|
|
211
204
|
/**
|
|
212
205
|
* Carica il contenuto della variante da array di stringhe
|
|
213
206
|
* @private
|
|
214
207
|
* @param {string[]} lines - Array di stringhe contenenti la definizione della variante
|
|
215
208
|
* @returns {Promise<boolean>} Promise che risolve a true se il caricamento ha successo
|
|
216
|
-
*/async _loadContent(lines){const regx=/^\s*[!:]\s*(\w+)\s*(.*)$/i;
|
|
209
|
+
*/async _loadContent(lines){const regx=/^\s*[!:]\s*(\w+)\s*(.*)$/i;let ky="";const limits=[];let limit,modelimit=!1;for(const currentLine of lines){const tm=currentLine.toLowerCase();if("{limit}"==tm)limit=[],limits.push(limit),modelimit=!0;else if("{:limit}"==tm)modelimit=!1;else if(modelimit)limit.push(currentLine);else{let rr=regx.exec(clean(currentLine));if(rr)if(ky&&"extra"==rr[1].toLowerCase()){const tm=getcolonne(rr[2]);for(const t of tm){const q=t.indexOf("=");if(q>0){const a=clean(t.substring(0,q));"v"!=a&&(this.rows[ky][a]=t.substring(q+1).trim())}}}else switch(rr[1].toLowerCase()){case"alias":{const vv=rr[2].toLowerCase().split(";");if(vv[0].trim()!=this.name)if(1==vv.length)this.alias=vv[0];else{let vx;if(this.amb?vx=await this.amb.getvariante(vv[0]):(vx=new Variante,await vx.load(vv[0],this.cat)),rr=vx?.rows,rr){let kky=Object.keys(rr);if(kky.length){vv.splice(0,1);const addrows=kk=>{kk&&kk.forEach((k=>this.rows[k]=rr[k]))};for(const t of vv){const rx=/([ei])\s*:\s*(.*)\s*$/im.exec(t);if(rx){const k3=rx[2].split(",");for(let i=0;i<k3.length;i++)k3[i]=k3[i].trim();kky="e"==rx[1]?kky.filter((k=>{for(const k2 of k3)if(k.startsWith(k2))return!1;return!0})):kky.filter((k=>{for(const k2 of k3)if(k.startsWith(k2))return!0;return!1}))}}addrows(kky)}}}}break;case"h":this.h=getcolonne(rr[2]).map((e=>({des:e})));break;case"t":{const tt=getcolonne(rr[2]);if(this.h)for(let i=0;i<this.h.length;i++)this.h[i].t=tt[i]||""}break;case"des":this.des=rr[2];break;case"default":case"vdef":this.vdef=getcolonne(rr[2]);break;case"obbligo":this.obbligo=!0;break;case"noerp":this.noerp=!0;break;case"noobbligo":this.obbligo=!1}else{const tm=getcolonne(currentLine),k=clean(tm[0]);k&&(ky=k,this.rows[ky]={annulla:0,v:tm})}}}const kk=Object.keys(this.rows);for(const k of kk)if(k.includes(".")){const vv=k.split(".");for(let i=0;i<vv.length-1;i++){const k1=vv.slice(0,i+1).join(".");this.rows[k1]||(this.rows[k1]={annulla:0,v:[k1]})}}return this.limits=function parselimitifromrule(limvec){function parsevettorelimiti(vec){const rs={},rx1=/^\s*[!:]\s*(\w+)\s*(.*)$/i;function addres(key,data){function addres0(key,d){(d=clean(d))&&(rs[key]||(rs[key]=[]),rs[key].includes(d)||rs[key].push(d))}if(Array.isArray(data))for(const d of data)addres0(key,d);else addres0(key,data)}for(const v of vec){const tm=rx1.exec(v);if(tm)switch(tm[1]){case"var":case"v":case"variante":{const i=(tm[2]||"").indexOf(" ");if(i>0){const v1=clean(tm[2].substring(0,i)),v2=getcolonne(tm[2].substring(i+1));if(v1&&v2&&v2.length){rs.v||(rs.v=[]);let tv=rs.v.find((e=>e.v==v1));tv||(tv={v:v1,o:[]},rs.v.push(tv));for(const o of v2)tv.o.includes(o)||tv.o.push(o)}}}break;case"d":case"dt":case"data":case"date":{const vv=tm[2].split(" "),d1=parseInt(vv[0]),d2=parseInt(vv[1]);(d1||d2)&&(rs.datai=d1,rs.dataf=d2)}break;case"rule":case"r":case"mu":addres("r",getcolonne(tm[2]));break;case"item":case"i":addres("i",getcolonne(tm[2]));break;case"model":case"m":addres("m",getcolonne(tm[2]));break;case"e":case"escludi":case"exclude":addres("ex",getcolonne(tm[2]))}else addres("valid",getcolonne(v))}return setlevelimite(rs),rs}let limits;if(limvec&&limvec.length){for(const ll of limvec){const rs=parsevettorelimiti(ll);if(rs&&(rs.valid&&rs.valid.length||rs.ex&&rs.ex.length)){let l=0;rs.i&&rs.i.length&&(l+=5),rs.m&&rs.m.length&&(l+=3),rs.r&&rs.r.length&&(l+=2),rs.v&&rs.v.length&&(l+=3),rs.datai&&rs.dataf&&(l+=1),rs.l=l,limits||(limits=[]),limits.push(rs)}}limits&&(limits=limits.sort(((a,b)=>b.l-a.l)))}return limits}(limits),!0}
|
|
217
210
|
/**
|
|
218
211
|
* Converte la variante in un vettore di righe
|
|
219
212
|
* @returns {string[]} Array di righe formattate
|
|
220
|
-
*/tovec(){
|
|
213
|
+
*/tovec(){const tm=this.rows,cl=[],xx=Object.keys(tm).sort();for(const x of xx)this.rows[x].annulla<2&&cl.push(this.#torow(x,this.rows[x]));return cl}
|
|
221
214
|
/**
|
|
222
215
|
* Converte una riga in una stringa CSV
|
|
223
216
|
* @private
|
|
224
217
|
* @param {string} cod - Codice della riga
|
|
225
218
|
* @param {Object} tm - Oggetto contenente i dati della riga
|
|
226
219
|
* @returns {string} Stringa CSV formattata
|
|
227
|
-
*/#torow(cod,tm){
|
|
220
|
+
*/#torow(cod,tm){const cl=[cod];if(tm)for(const t of tm.v)"string"==typeof t&&(t.includes(",")||t.includes(";"))?cl.push(quote(t)):cl.push(t||"");return cl.join(",")}
|
|
228
221
|
/**
|
|
229
222
|
* Converte un codice nella sua rappresentazione CSV
|
|
230
223
|
* @param {string} cod - Codice da convertire
|
|
231
224
|
* @returns {string} Stringa CSV o codice originale se non trovato
|
|
232
|
-
*/tovar(cod,vcod=""){
|
|
225
|
+
*/tovar(cod,vcod=""){const c1=clean(cod);if(!this.rows[c1])return vcod||cod;const tm=this.rows[c1];return 2==tm.annulla?"":this.#torow(vcod||cod,tm)}
|
|
233
226
|
/**
|
|
234
227
|
* Verifica se un'opzione è valida
|
|
235
228
|
* @param {string} opz - Opzione da verificare
|
|
236
229
|
* @returns {boolean} True se l'opzione è valida
|
|
237
|
-
*/isvalidopz(opz){
|
|
230
|
+
*/isvalidopz(opz){const c1=clean(opz),t=this.rows[c1];return!!t&&(1!=t.annulla&&!t.hasliv)}
|
|
238
231
|
/**
|
|
239
232
|
* Trova la prima opzione valida tra quelle disponibili
|
|
240
233
|
* @param {string} opz - Opzione da controllare per prima
|
|
241
234
|
* @returns {string|undefined} Prima opzione valida trovata o undefined
|
|
242
|
-
*/firstvalid(opz){
|
|
235
|
+
*/firstvalid(opz){const 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(const o of this.vdef)if(this.isvalidopz(o))return o;const tm=Object.keys(this.rows).sort();for(let i=0;i<tm.length;i++){const x=tm[i];if(!(i<tm.length-1&&tm[i+1].startsWith(x+"."))&&this.isvalidopz(x))return x}}
|
|
243
236
|
/**
|
|
244
237
|
* Resetta tutti i filtri applicati alla variante
|
|
245
|
-
*/resetfilter(){for(
|
|
238
|
+
*/resetfilter(){delete this._valids;for(const x in this.rows)this.rows[x].annulla=0}
|
|
246
239
|
/**
|
|
247
240
|
* Restituisce le chiavi valide ordinate alfabeticamente
|
|
248
241
|
* @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());
|
|
242
|
+
*/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());const tm=[];for(const f of filtra){const rr=/^#([iex])(\d*)\s+(.+)$/i.exec(f);if(rr){const 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(const x in this.rows){const r=this.rows[x];for(const t of tm)if("e"==t.ex){if(_check(r.v[t.col]||"",t.val)){r.annulla=1;break}}else if("x"==t.ex){const 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
243
|
/**
|
|
251
244
|
* Applica i limiti configurati alle opzioni della variante
|
|
252
245
|
* @returns {Array|void} Array di limiti applicati o void se reset
|
|
253
|
-
*/limita(filtra){if(filtra&&filtra.length)return this.limitfiltra(filtra);if(!this.limits||!this.amb)return this.resetfilter();
|
|
246
|
+
*/limita(filtra){if(filtra&&filtra.length)return this.limitfiltra(filtra);if(!this.limits||!this.amb)return this.resetfilter();const{item:item,rule:rule,model:model,vari:vari,data:data}=this.amb,valid=(v,values)=>!values||!values.length||!!v&&values.includes(v),tm=this.limits.filter((e=>{if(!valid(item,e.i))return!1;if(!valid(rule,e.r))return!1;if(!valid(model,e.m))return!1;if(data&&e.datai&&data<e.datai)return!1;if(data&&e.dataf&&data>e.dataf)return!1;if(e.v&&e.v.length)for(const v of e.v){const x=clean(vari.var(v.v).split(",")[0],!0);if(x&&!v.o.includes(x))return!1}return!0}));if(!tm||!tm.length)return this.resetfilter();const incstar=new Set,exstar=new Set,incaltri=new Set,exaltri=new Set;let isinc=!1,isex=!1;for(const t of tm){if(t.valid&&t.valid.length){isinc=!0;t.valid.filter((e=>e.indexOf("*")>0)).map((e=>e.split("*")[0])).forEach((item=>incstar.add(item))),t.valid.filter((e=>!e.includes("*"))).forEach((item=>incaltri.add(item)))}if(t.ex&&t.ex.length){isex=!0;t.ex.filter((e=>e.indexOf("*")>0)).map((e=>e.split("*")[0])).forEach((item=>exstar.add(item))),t.ex.filter((e=>!e.includes("*"))).forEach((item=>exaltri.add(item)))}}for(const x in this.rows){const r=this.rows[x];let flinc=!1,flex=!1;if(isinc){for(const i of incstar)if(x.startsWith(i)){flinc=!0;break}!flinc&&incaltri.has(x)&&(flinc=!0)}if(isex){for(const i of exstar)if(x.startsWith(i)){flex=!0;break}!flex&&exaltri.has(x)&&(flex=!0)}r.annulla=0,isinc&&!flinc&&(r.annulla=1),isex&&flex&&(r.annulla=1)}return tm}
|
|
254
247
|
/**
|
|
255
248
|
* Carica il contenuto esteso della variante
|
|
256
249
|
* @param {Object|string} content - Contenuto da caricare, può essere un oggetto o una stringa
|
|
257
250
|
* @returns {Promise<void>} Promise che si risolve al completamento del caricamento
|
|
258
|
-
*/async loadContentExtended(content){if("object"==typeof content){for(
|
|
259
|
-
/** @type {Variante} */if(head&&head.alias&&(ky=head.alias),macro&¯o.paralias&¯o.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&¶metri.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&¶metri.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,
|
|
251
|
+
*/async loadContentExtended(content){if("object"==typeof content){for(const 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}}}const _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){let 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){let tm;return tm=macro&¯o?.localvar&¯o.localvar[ky]?macro.localvar[ky]:await amb.getvariante(ky),tm}async function impostavariante(amb,macro,a,b,head){let tm,ky=a;if((b=b||"")&&"string"==typeof b){const k=b.indexOf(":");k>=0&&(k>0&&(ky=clean(b.slice(0,k))),b=b.slice(k+1))}
|
|
252
|
+
/** @type {Variante} */if(head&&head.alias&&(ky=head.alias),macro&¯o.paralias&¯o.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){let col=2;if(b.includes(":")){const xx=b.split(":");col=parseInt(xx[1]),b=xx[0]}tm.limita(x8),b=tm.fromdim(parseFloat(b),col)}else{tm.limita(x8);const 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");const vari=amb.vari;amb.maxdelays,amb.cat;const output=[];let macro,pars,xid;(new Date).valueOf();for(let ii=0;ii<codice.length;){let riga=codice[ii];switch(riga.tipo){case"IFDEF":case"IFNDEF":case"IF":{const 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;const _getvv=async()=>{let vv=await intvaluta(amb,mac,riga.contenuto);return vv=vv.includes(":")&&!vv.includes(",")?vv.split(":").map((e=>(e||"").trim())):getcolonne(vv),vv};if("CASE"==riga.tipo){tm=0,vv=await _getvv();const tmx=muCalc(riga.t1||"");vv.find((v=>muCalc(v)==tmx))&&(tm=1)}else if("CASES"==riga.tipo){tm=0,vv=await _getvv();const 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{const 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 if(({macro:macro,pars:pars,xid:xid}=await amb.getmacro(riga)||{}),macro){options._inc=!0,options._stackmacro++;const saved={},parametri=macro.parametri?._;if(parametri&¶metri.length)for(const x of parametri){const x1=clean(x.split("=")[0]||"",!0);x1&&(saved[x1]=vari.dictionary[x1])}await macro.impostaparametri(parametri,pars);const rs1=await muEval(amb,macro,macro.codice,options);for(const 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){const ismacro=!!options.grafica||["F","FUNC"].includes(riga.tipo),optid=options.id||"",parametri=macro.parametri?._,saved={};if(ismacro)vari.push();else{if(macro.head)for(const x of macro.head)saved[x.cod]=amb.vari.var(x.cod);if(parametri&¶metri.length)for(const x of parametri){const 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}`);const 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);const rs1=await muEval(amb,macro,macro.codice,options);output.push(...rs1)}options._stackmacro--}if(ismacro)vari.pop();else for(const 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){const v=riga.contenuto;if(i=v.indexOf("="),i>0){const a=await intvaluta(amb,mac,v.slice(0,i).trim());let 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{const vv=getcolonne(riga.contenuto);for(const v of vv)if(i=v.indexOf("="),i>0){const a=await intvaluta(amb,mac,v.slice(0,i));let 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":{const i=riga.contenuto.indexOf("=");if(i>0){const 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":{const 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){const rr=Object.values(ww.rows).reduce(((t,e)=>{const 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":{const tm=getcolonne(riga.contenuto);if(tm)for(const 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);const 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":{const valido=(riga.contenuto||"").trim();let 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){const tm=await intvaluta(amb,mac,elenco),xx=tm?await dammivariante(amb,mac,tm):void 0;xx?elenco=xx.tovec():(elenco=[],errori.add("getvariante not found!",riga))}else{const txx=await intvaluta(amb,mac,elenco||"");elenco=elenco?getcolonne(txx):void 0}elenco=elenco||[];const nc=0;if(riga.next){codice[riga.next].for={v:v,elenco:elenco,nc:nc,valido:valido};let voce,fl=!0;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){const{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":{const 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="";const rr=/^!(.\w+)[\s;,]\s*(.+)?$/gim.exec(tm);if(rr)if(rr[1].startsWith("."))await getcbfunc(tm,tm.slice(1),[],vari,amb),a="";else{const 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){const xgen=mac.genera[genera];if(xgen){output.counter2=0;const working_variant={};async function processavariante(liv){if(output.isTestmode&&output.counter>output.isTestmode)return;if(liv<xgen.vars.length){const xx=xgen.vars[liv];if(!working_variant[xx]){const xvar=await dammivariante(amb,mac,xx),keys=Object.keys(xvar.rows);if(keys&&keys.length>0){for(const k of keys)amb.vari.add(xvar.name,xvar.tovar(k)),working_variant[xx]=!0,await processavariante(liv+1),working_variant[xx]=!1;return}logga("manca la variante",xx)}}for(const x of xgen.calcola)mac.formula[x]&&await muEval(amb,mac,mac.formula[x],{limited:!0});for(const x of xgen.exclude)if(mac.formula[x]){const vvv=await muEval(amb,mac,mac.formula[x],{limited:!0});if(vvv)for(const v of vvv){if(muCalc(v))return}}const out1=await muEval(amb,mac,xgen.codice,{limited:!0,localvar:mac.localvar}),bb={};for(const 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(const v of vvv)if(v){const tm=getcolonne(v);bb[x]||(bb[x]=[]);const 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){let fl=!0;for(const x of out1){const tm=getcolonne(x);if(tm[0]&&!output[tm[0]]){output[tm[0]]=1,output.counter++,output.counter2++;const o={__id:output.counter};for(let i=0;i<tm.length;i++){let key=xgen.head[i]?xgen.head[i]:`c${i}`;"#"==key[0]?(key=key.substr(1),o[key]=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){const vv=str.split("\n");for(const v of vv)if(v.trim()){if(muCalc(vari.valutasync(v)))return!0}return!1}class Macro{constructor(amb,_name){const{name:name,cat:cat}=checkmu(_name,amb.cat||"");this.name=name,this.cat=cat,
|
|
260
253
|
/** @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={},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}}
|
|
254
|
+
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(){const cl=[];return this.errori.forEach((e=>cl.push({e:e}))),cl}getparametri(){const s={};if(this.dims&&DIMS.forEach((k=>{const t=muCalc(this.amb.vari.var(k));t&&(s[k]=String(t))})),this.head){for(const 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(const x of this.parametri._){const x1=(x.split("=")[0]||"").trim().toLowerCase();let tm=this.amb.vari.var[x1];tm=(tm||"").split(",")[0],s[x1]=tm}return s}async setparametri(pars){const 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(const x of this.head){const 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(const 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&&"string"==typeof value&&value.includes("$")&&(value=await intvaluta(this.amb,this,value)),this.head){const _imposta=async(riga,vv,id)=>{const nn=riga?.cod;if(riga.valid&&!riga._h1){const 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++){const 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){const 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++){const 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){const 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)}const 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;const 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(const 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(const x of[...parimposta,...parcall]){const 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(const 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(const x in this.localvar){const vv=new Variante;setOggetto(vv,this.localvar[x]),this.localvar[x]=vv}}async load(xname,xcat){let name,cat;try{let tm;if(({name:name,cat:cat}=checkmu(xname||this.name,xcat||this.cat||"")),this.name||(this.name=name),this.cat||(this.cat=cat),this.azzera(),cbGetMacro$1&&(tm=await cbGetMacro$1(cat,name),"string"==typeof tm&&(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(const 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){let res;const{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){let res;const{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]);let tm=muClComments(res);const t2=[];flin&&(tm=tm.filter((t=>!/^\{(:?(var|valid|formula|header|genera|v|f|h))[\s|}]/im.test(t))));for(const 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){const pp=getcolonne(r1[1]);if(!stak.includes(pp[0])){stak.push(pp[0]);const 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;const t2=[];let tm=muClComments(res),flin=!1;const lochead=[];for(const 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){const 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;let out=this.codice;for(const 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":{let r2=/^\s*\{(genera|g)\s+(.+)?\}/im.exec(t);if(r2){const name=checkname(getcolonne(r2[2])[0]);this.genera[name]=[],out=this.genera[name]}else out=this.errori,out.push(t)}break;case"valid":out=this.valid;break;case"var":case"v":{const r2=/^\s*\{(var|v)\s+(.+)?\}/im.exec(t);if(r2){const 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,out.push(t)}break;case"formula":case"f":{const r2=/^\s*\{(formula|f)\s+(.+)?\}/im.exec(t);if(r2){const name=checkname(r2[2]);this.formula[name]=[],out=this.formula[name]}else out=this.errori,out.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(const f in this.formula)this.formula[f]=this.cleanfiltraparametri(f,this.formula[f],acapo);for(const f in this.localvar){const vv=new Variante,v=this.localvar[f];vv.setheader(f,this.cat),vv.rows={};for(const x of v.rows){const 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(const t of tm){let p=getcouple(t,",");p={v:p.v,msg:p.o},p.v&&(p.v.startsWith("#")?this.formula[p.v.substring(1)]&&this.valid.push(p):this.valid.push(p))}tm=lochead;const head=[];for(const t of tm){const rr=/^\s*([\w\-_]+)+[;,\s]\s*(.*)?$/im.exec(t);if(rr){const pp=getcolonne(rr[2]),c=clean(rr[1]);let ht;if(c){ht=head.find((e=>e.cod==c)),ht||(ht={cod:c,t:"t"},head.push(ht));for(const tp of pp){const 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;const genera={};for(const kk in tm)if(Array.isArray(tm[kk])){const gen={codice:[],head:"",calcola:[],bom:[],vars:[],exclude:[]},regx=/^\s*[!:]\s*(\w+)\s*(.*)$/i;for(const k2 of tm[kk]){const 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){let fl=!1;const getparalias=dati=>{const cl=[],co=getcolonne(dati);for(const c of co)if(c.includes(":")){const 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++){const rr=/^:p[;,\s]+(.*)?$/im.exec(codice[i]);if(rr)codice[i]=null,fl=!0,this.parametri[key]=getparalias(rr[1]);else{const 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;const cols=[];for(let i=i1;i<lines.length;i++){const line=lines[i].trim();let 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(":")){const cl=getcolonne(linenc);for(let j=0;j<cl.length;j++){let 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
255
|
/**
|
|
263
256
|
* Formatta il codice sorgente applicando indentazione e allineamento
|
|
264
257
|
* @param {string} code - Il codice sorgente da formattare
|
|
265
258
|
* @param {boolean} gisvar - Flag che indica se formattare come variabile
|
|
266
259
|
* @returns {string} Il codice formattato
|
|
267
|
-
*/function toruleset(rs){
|
|
260
|
+
*/function toruleset(rs){const o={};if(rs&&rs.length)for(const r of rs)o[r.cod]=r;return o}function headerconvert(tt){const rr=muClComments(tt,!1);tt={};let grp={r:[]},fl=!1;for(const r of rr){const 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)){const 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){const rr=muClComments(tt.toLowerCase(),!1),tx={};for(const r of rr)if(!/^\s*:/.exec(r)){const 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
261
|
/** @type {Variabile} */
|
|
269
262
|
this.vari=new Variabile,this.ruleset={},this.fndotcallback&&this.vari.setfndot(this.fndotcallback),this.ruleheader="",mode&&(
|
|
270
263
|
/** @type {Object.<string, Macro>} */
|
|
271
264
|
this.macro={},
|
|
272
265
|
/** @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,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 checkvarianti(cat,vars){if(!cat||!vars?.length)return;cat=checkname(cat),await this.#checkelencovar(cat);let t=this.varelenco[cat],vn=[];for(let v of vars){v=clean(v,!0);let nn=`${cat}/${v}`;this.varianti[nn]||t&&t.includes(v)&&vn.push(v)}if(vn.length&&(cbGetVariante$1&&(vars=await cbGetVariante$1(cat,vn))&&vars.length))for(let x of vars){let{name:name,content:content}=x,vv=new Variante(this);vv.setheader(name,cat),content&&await vv.loadContentExtended(content),this.varianti[vv.key]=vv}}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.40${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};
|
|
266
|
+
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]){const 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(const 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){const tips=fromjson(t.value);for(const tp in tips){const 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;const 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));const pars=getcolonne(rr[2]),{name:name,cat:cat}=checkmu(macro,this.cat);this.cat=cat;const ky=`${cat}/${name}`;if(!this.macro[ky]){const 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){const{name:name,cat:cat}=checkmu(cod,this.cat);let n2=name,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;const 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){const xx=new Variante(this);if(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){const mac=new Macro(this,v);await mac.loadAndCompile(`${v}.mu`);const 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){const cc=new CodiceBarra;await cc.compila(articolibarre,titolibarre);for(const 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(const v of info.var)await this.varcompila(v,callback);for(const 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){const 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 checkvarianti(cat,vars){if(!cat||!vars?.length)return;cat=checkname(cat),await this.#checkelencovar(cat);const t=this.varelenco[cat],vn=[];for(let v of vars){v=clean(v,!0);const nn=`${cat}/${v}`;this.varianti[nn]||t&&t.includes(v)&&vn.push(v)}if(vn.length&&cbGetVariante$1){const xv=await cbGetVariante$1(cat,vn);if(xv&&xv.length)for(const x of xv){const{name:name,content:content}=x,vv=new Variante(this);vv.setheader(name,cat),content&&await vv.loadContentExtended(content),this.varianti[vv.key]=vv}}}async getheaderfromdb(name){const totale=await cbInfo$1("header",this.cat,name,!this.#deriva);let{head:head,rows:rows,macros:macros,deriva:deriva,llvars:llvars}=totale;for(const r of rows)r.cod=clean(r.cod),r.alias=clean(r.alias),r.t=clean(r.t);if(!llvars){llvars=new Set;for(const r of rows)if("p"==r.tipo);else{const 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||[];const vn=[],t=this.varelenco[this.cat];for(const nn of llvars)this.varianti[`${this.cat}/${nn}`]||t&&t.includes(nn)&&vn.push(nn);if(vn.length&&cbGetVariante$1){const vars=await cbGetVariante$1(this.cat,vn);if(vars&&vars.length)for(const x of vars){const{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){const getkey=n=>n.includes("/")?n:`${this.cat}/${n}`,cl=[];let k;if(rule&&(k=getkey(rule),this.macro[k]||cl.push(rule)),macros&&"string"==typeof macros){const vv=macros.split(";");for(const v of vv)k=getkey(v),this.macro[k]||cl.push(v)}if(cl&&cl.length>0&&cbGetMacro$1){const tm=await cbGetMacro$1(this.cat,cl);if(tm&&tm.length>0)for(const x of tm){const m=new Macro(this,x.name);for(const t in x.content){const contenuto=x.content[t];m[t]=contenuto}this.macro[m.key]=m}}}async setruleheader(rule,pars,ruleset){const{name:name,cat:cat}=checkmu(rule,this.cat);ruleset&&ruleset.length&&(this.ruleset=toruleset(ruleset));const ky=`${cat}/${name}`;if(!this.macro[ky]){const totale=await this.getheaderfromdb(name),{head:head,rows:rows,macros:macros}=totale;await this.getlinkedmacros(head.rule,macros);const tm=new Macro(this,name);if(!head)return void errori.add("Missing rule: "+rule);if(head.rule){const k2=this.macro[`${cat}/${head.rule}`];if(k2)for(const 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;const 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)}async splitteroggetti(name){let data=await this.getvariante(name),cl=[];return data?.rows&&Object.values(data.rows).forEach((v=>{cl.push({tipo:v.v[2]||"",cod:v.v[0]||"",des:v.v[1]||"",macro:v.v[4]||"",sps:parseInt(v.v[3])||0})})),cl.length||cl.push({tipo:"avob",cod:"__",des:"Vuoto",macro:"",sps:0}),cl}}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.46${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){const output={counter:0,keys:{},isTestmode:isTestmode};for(const 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){const 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){const 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){const lines=code.split("\n"),formattedCode=[];let indentLevel=0,inBloccoCommento=!1,inAcapo=!1,cols=[],isvar=gisvar;if(isvar){const tm=verificaisvar(0,lines);isvar=tm.fl,isvar&&(cols=tm.cols)}for(let i=0;i<lines.length;i++){const ltot=lines[i];let line=ltot.trim();const tt=line.split("//");let linenc=tt[0].trim();tt.splice(0,1);const 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{const 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)){const tm=verificaisvar(i+1,lines);isvar=tm.fl,isvar&&(cols=tm.cols)}else isvar=!1;inAcapo=!1;continue}if(isvar)if(linenc.startsWith(":")&&!linenc.startsWith(":h ")||!linenc)formattedCode.push(line);else{let lba=" ";linenc.startsWith(":h ")&&(linenc=linenc.substr(3).trim(),lba=":h ");const cl=getcolonne(linenc);for(let 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{const 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};
|