croswil_markuno 1.0.44 → 1.0.45
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 +51 -1
- package/bin/mu.js +265 -1
- package/package.json +1 -1
package/bin/mu-convcad.js
CHANGED
|
@@ -1,2 +1,52 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{init as e,database as t}from"croswil_lib";import r from"fs";import o from"path";import i from"minimist";function s(e,t=!1){e=String(e||"");const r=/^(\d+)\.\.(\d+)$/.exec(e);if(r){var o=parseInt(r[1]),i=parseInt(r[2]),s=[];o>i&&([o,i]=[i,o]);for(var a=o;a<=i;a++)s.push(a+"");return s}if(!/["({[]/.test(e))return e.split(/[,;]/).map((e=>e.trim()));const n=[];let l="",c=0,d=!1;for(let t=0;t<e.length;t++){const r=e[t];if(0===c&&'"'===r&&(0!==t&&"\\"===e[t-1]||(d=!d)),d||("("===r||"["===r||"{"===r?c++:")"!==r&&"]"!==r&&"}"!==r||(c=Math.max(0,c-1))),","!==r&&";"!==r||0!==c||d)l+=r;else{const e=l.trim();n.push(e),l=""}}const p=l.trim();return p&&n.push(p),n.map((e=>(e=e.trim(),!t&&e.startsWith('"')&&e.endsWith('"')?e.slice(1,-1):e)))}function a(e,t){const r=e.split("\n"),o=[];let i=!1,s="";for(const e of r){let t=e.trim();if(i)t.endsWith("*/")&&(i=!1);else if(t.startsWith("/*"))i=!0;else if(!i&&t.includes("//")&&(t=t.split("//")[0].trim()),0!==t.length)if(s.length>0&&(t=s+" "+t,s=""),t.endsWith("\\")){t=t.slice(0,-1);const e=t.lastIndexOf("//");-1!==e&&(t=t.slice(0,e).trim()),s=t}else o.push(t)}return o}new class{constructor(){this.azzera()}azzera(){this.err=[]}add(e,t){this.err.push({msg:e,row:t})}get(){return this.err}get length(){return this.err.length}toString(){var e=[];for(var t of this.err){let r="object"==typeof t.msg?JSON.stringify(t.msg):t.msg||"";e.push(`${t.row?t.row+":":""}${r}`)}return e.join("\n")}};const n=/^\s*\{(\:)?(var|deriva|valid|formula|header|genera|g|v|f|h)(\s.*)?\}/i;function l(e,t){let r=!1;for(var o=[],i=e;i<t.length;i++){let e=t[i].trim(),d=e.split("//")[0].trim();if(e.startsWith("/*"))r=!0;else if(r&&e.endsWith("*/"))r=!1;else if(!r){if(n.test(e))return{fl:!0,i2:i-1,cols:o};if(d.endsWith("\\"))return{fl:!1};if(e.startsWith(":h ")&&(d=d.substr(3).trim()),!d.startsWith(":"))for(var a=s(d),l=0;l<a.length;l++){var c=a[l].length;a[l].includes(",")&&(c+=2),(!o[l]||o[l]<c)&&(o[l]=c)}}}return{fl:!0,i2:t.length-1,cols:o}}Date.prototype.toInt||(Date.prototype.toInt=function(){const e=this;return e.getDate()+100*(e.getMonth()+1)+1e4*e.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:c,Reset:d,Bold:p,Reverse:h,Red:f,Green:u,Yellow:m,Blue:v,Magenta:g,Cyan:$,White:b}=e();var w={FOLDERBASE:"./",DBWORK:"./data/app.db",FOLDERCAT:"./data/mu",FOLDEROUT:"./out",CAT:"cat"};const C=".lasts.markuno";r.existsSync(C)&&(w=JSON.parse(r.readFileSync(C))),w.FOLDERCAD||(w.FOLDERCAD="./cat3cad");var L=i(process.argv);console.log(`----------------------------------------------------------------------------------------\n${p}${$}${p}mu-convcad:${d} Convert data from 3CAD (c) Croswil 2024 v. ${m}1.0.88${d}\n----------------------------------------------------------------------------------------`);const F=`uso: ${p} mu-convcad <nomecatalogo> [opzioni]\n${u}Opzioni:${d}\n ${b} -h, --help${d}${u} mostra l'help\n ${b} -i, --init <folder>${d}${u} cartella di lavoro (default='${w.FOLDERCAT}' ) \n ${b} -c, --cad <folder>${d}${u} cartella cad (default='${w.FOLDERCAD}' ) \n ${b} -r, --reset${d}${u} Cancella tutti i dati precedenti\n ${b} -t, --tipologie${d}${u} Tipologie e Macro tip\n ${b} -a, --abilita${d}${u} Processa abilitazioni\n`;w.FOLDERCAT=L.i||L.init||w.FOLDERCAT,w.FOLDERCAD=L.c||L.cad||w.FOLDERCAD,process.exit(1);const S=L._[2]||void 0;(L.h||L.help||!S)&&(console.log(F),process.exit(0)),w.CAT=S;const y=o.join(w.FOLDERCAT,S),D=o.join(w.FOLDERCAD,S);var E=o.join(D,`${S}.ddb`);r.existsSync(E)||(console.log("manca il database di origine: "+S),process.exit(1)),r.writeFileSync(C,JSON.stringify(w,null,2));const j=[],O=e=>j.push(e),A="select cod cod,des des,memo info from speciali where cat='pro'";function W(e){var t=[];for(var r of e)!r.startsWith('"')&&r.includes(",")&&(r=`"${r}"`),t.push(r);return t.join(",")}function R(e,t){var r=(e=e.replaceAll("\t",",").replaceAll("\r","").replace(/\#vb/gim,"/* VB !not supported").replace(/#endvb/gim,"*/").replace(/\#msg /gim,"!msg ")).split("\n"),o=[],i=!1;return r.forEach(((e,r)=>{e.startsWith("/*")&&(i=!0),i?o.push(e):/^\s*$/.test(e)||(t?(e=e.replace(/\s*\#m\s+(\w+)/im,((e,t)=>"#m ++"+t)),o.push(e)):(/^\s*\d+/.test(e)?e="!t "+e.trim():/^\s*\!parametri/i.test(e)?e=e.replace(/\!parametri /gi,":p "):/^\s*\w+/.test(e)&&(e="#m +"+e.replace(/\s*\_*/,"")),o.push(e))),i&&e.trim().endsWith("*/")&&(i=!1)})),function(e,t){let r=e.split("\n"),o=[],i=0,a=!1,c=!1,d=[];var p=t;p&&(p=(u=l(0,r)).fl)&&(d=u.cols);for(let e=0;e<r.length;e++){let t=r[e],$=t.trim();var h=$.split("//");let b=h[0].trim();h.splice(0,1);let w=h.length?` // ${h.join("//").trim()} `:"";if($.startsWith("/*"))a=!0,o.push($);else if(a&&$.endsWith("*/"))a=!1,o.push($);else if(a)o.push(t);else{var f=n.exec($);if(f){var u;o.push($),i=f[1]?0:1,/^\s*\{(var|deriva|header|v|h)(\s.*)?\}/i.test($)?(p=(u=l(e+1,r)).fl)&&(d=u.cols):p=!1,c=!1;continue}if(p)if(b.startsWith(":")&&!b.startsWith(":h ")||!b)o.push($);else{var m=" ";b.startsWith(":h ")&&(b=b.substr(3).trim(),m=":h ");for(var v=s(b),g=0;g<v.length;g++)v[g].includes(",")&&(v[g]=`"${v[g]}"`),v[g]=v[g].padEnd(d[g]," ");o.push(`${m}${v.join(" , ")} ${w}`)}else{let e=" ".repeat(i>=0?i:0);if(c)o.push(`${e} ${$}`);else{let t="";$.startsWith("#")&&(t=$.substring(1).split(" ")[0].toUpperCase(),$="#"+t+$.substring(t.length+1)),["IF","IFDEF","IFNDEF"].includes(t)?$.indexOf("#",2)<0?(o.push(`${e}${$}`),i++):($=$.replace(/#([\w]+)/g,((e,t)=>"#"+t.toUpperCase())),o.push(`${e}${$}`)):["FOR","SELECT","FORVAR","VARIANTE","DO"].includes(t)?(o.push(`${e}${$}`),i++):["ELSEIF","ELSE","ELSEIFDEF","ELSEIFNDEF","CASE","CASES","DEFAULT"].includes(t)&&i>0?o.push(" ".repeat(i>0?i-1:0)+$):["ENDIF","ENDSELECT","LOOP","ENDFOR"].includes(t)?(o.push(" ".repeat(i>0?i-1:0)+$),i--,i<0&&(i=0)):$.startsWith("_ ")||$.startsWith(":")?o.push($):o.push(e+$)}c=b.endsWith("\\")}}}return o.join("\n")}(o.join("\n"))}const x={"-":"sep",T:"var",M:"num",S:"str",C:"yn",L:"hidden",Z:"ny"};function z(e){var t=[];if(!e)return"";for(var r in e)"cod"!=r&&t.push(`${r}=${e[r]}`);return`${e.cod} ${t.join(",")}`}function T(e){var t=e.split(",");if(t[1]||t[2]){var r={};return r.cod=(t[2]||t[1]).trim().toLowerCase(),t[2]&&(r.alias=t[2].trim().toLowerCase()),t[3]&&(r.valid=t[3].trim().toLowerCase()),t[4]&&(r.des=t[4].trim()),t[5]&&(r.visible=t[5].trim().toLowerCase()),x[t[0]]?r.tipo=x[t[0]]:"D"==t[0]?r.tipo="sp."+t[6]:r.tipo=t[0].trim().toUpperCase(),r}}L.r||L.reset?console.log("-> crea catalogo e copia"):console.log("-> aggiorna catalogo");var I=`${w.FOLDERCAT}/mu_${S}.db`;(L.r||L.reset)&&(r.existsSync(y)&&r.rmSync(y,{recursive:!0}),r.existsSync(I)&&r.unlinkSync(I)),r.existsSync(y)||r.mkdirSync(y,{recursive:!0}),r.copyFileSync(E,y+"/"+S+".db");var _=t.db(E),k=(new Date).valueOf(),M=[],N=_.all("select cod cod,des des ,codmet alias,obbl obbligo, memo info from codvar ");for(var B of(console.log("-> varianti",N.length),N)){for(var U=B.info.split(""),J=[],V=[],Y=1;Y<U.length&&U[Y];Y+=2)V.push(U[Y]);if(J.push(`:des ${B.des.trim().toLowerCase()}`),B.obbl&&J.push(":obbligo"),B.alias)M.push(`${B.cod.trim().toLowerCase()} , ${B.alias.trim().toLowerCase()}`);else{J.push(""),J.push(":h "+W(V));var G=_.all("select codopz cod,des des,memo info from varianti where codvar=? order by ordinamento,codopz",B.cod);for(var P of G){V=W([P.cod.trim().toLowerCase(),P.des.trim().toLowerCase(),...P.info.trim().toLowerCase().split("\t")]);J.push(" "+V)}B.cod=B.cod.trim().toLowerCase(),O("var: "+B.cod),r.writeFileSync(`${y}/${B.cod}.var`,J.join("\n"))}}N=_.all("select cod cod,des des,fldef defs from modelli order by cod"),J=[];for(var B of(J.push(":des Modelli\n\n:h Cod, Descrizione\n"),N))J.push(" "+W([B.cod.trim().toLowerCase(),B.des]));r.writeFileSync(`${y}/modelli.var`,J.join("\n")),M=["// Alias Varianti\n\n{v __aliasvar}\n:h variante, alias",...M.sort()],r.writeFileSync(`${y}/_alias.inc`,M.join("\n")),console.log("-> gruppi.ini");var H=o.join(D,"gruppi.ini");if(r.existsSync(H)){N=a(oe=r.readFileSync(H).toString().replaceAll("�","'"));var K={},Z=[];for(var B of N){if(de=/^\s*\[(\w+)\]/i.exec(B))Z=[],K[de[1].trim().toLowerCase()]=Z;else(he=T(B))&&Z.push(z(he))}}var q=Object.keys(K).sort();J=[];for(var Q of(J.push("// includes headers"),q))J.push(""),J.push(`{h ${Q}}`),J.push(...K[Q]);if(r.writeFileSync(o.join(y,"_headers.inc"),J.join("\n")),console.log("-> deriva"),(B=_.get(`${A} and cod='deriva'`)).cod&&B.info){B.info=B.info.trim().toLowerCase().replaceAll("","\n");var X=B.info.split("\n").map((e=>e.trim())).sort();r.writeFileSync(o.join(y,"_deriva.inc"),`// derivazione varianti \n{v deriva}\n:des deriva delle varianti\n :h var=opz,-> var=opz\n \n${X.join("\n")}`)}N=_.all(`${A} and cod like ?`,">>%");for(var B of(console.log("-> macro",N.length),N)){O("mac "+(ge=(ge=B.cod.substr(2).trim().toLowerCase()).replace(/^_*/,"")));var ee=R(B.info.toLowerCase());J=`// ${B.des}\n${ee} \n `;r.writeFileSync(o.join(y,`+${ge}.mu`),J)}var te=r.readdirSync(D);te=te.filter((e=>e.toLowerCase().endsWith(".erg")));var re=0;for(var N of(console.log("-> regole",te.length),te)){var oe=r.readFileSync(o.join(D,N)).toString().replaceAll("\r",""),ie=o.extname(N),se=o.basename(N,ie).trim().toLowerCase();if(!se.includes(".")&&"gene"!=se){var ae={cod:se,des:"",codice:[],header:[],formule:{}},ne=[],le=(J=oe.split("\n"),-1);for(var ce of J){var de;if(de=/^\s*\[(\w+)\]/.exec(ce)){var pe=de[1].toLowerCase();switch(pe){case"info":le=0;break;case"gene":le=1;break;case"grafica":le=2;break;default:ne=[],ae.formule[pe]=ne,le=3}}else 0==le?/^\s*descrizione\s*=/i.test(ce)&&(ae.des=ce.split("=")[1].trim().toLowerCase()):1==le?ce.trim()&&ae.header.push(ce):2==le?ae.codice.push(ce):ne.push(ce)}if(ae.tm=a(ae.codice.join("\n")),ae.tm.length){J=[`// rule ${ae.cod}\n :des ${ae.des||ae.cod}\n `];if(ae.header.length){for(var B of(J.push("{header}"),ae.header)){var he;(he=T(B))&&("G"==he.tipo?(delete he.tipo,J.push(`:g ${z(he)}`)):he.tipo.length>1&&J.push(z(he)))}J.push("{:header}")}for(var fe in ae.formule){X=R((ue=ae.formule[fe]).join("\n"));J.push(`\n{f ${fe}}\n${X}\n{:f}`)}var ue=ae.codice.join("\n");J.push(R(ue)),r.writeFileSync(o.join(y,se+".mu"),J.join("\n")),O(`reg ${++re}: ${ae.cod} - ${ae.des}`)}}}if(L.t||L.tipologie){N=(B=_.get(`${A} and cod=?`,"tipologie")).info.split("").sort();console.log("-> tipologie",N.length);var me={};for(var ve of N){if(ce=(P=ve.trim().toLowerCase()).split(",")[0].trim())if(ce.includes("."))me[(B=ce.split("."))[0]]?me[B[0]][B[1]]=P:console.log("errore tipo",ce);else me[ce]={v:P},(B=_.get(`${A} and cod=?`,`db_${ce}`)).info&&(me[ce].db=R(B.info.trim().toLowerCase().replaceAll("","\n"),!0)),(B=_.get(`${A} and cod=?`,`ll_${ce}`)).info&&(me[ce].list=R(B.info.trim().toLowerCase().replaceAll("","\n"),!0))}r.writeFileSync(y+"/typos.json",JSON.stringify(me,null,2));N=_.all(`${A} and cod like ?`,"M>%");for(var B of(console.log("-> macro tip",N.length),N)){var ge;O("macdb "+(ge=B.cod.substr(2).trim().toLowerCase()));ee=R(B.info.toLowerCase(),!0),J=`// ${B.des}\n${ee} \n `;r.writeFileSync(o.join(y,`++${ge}.mu`),J)}}if(L.a||L.abilita){function Oe(e){var t=[];for(var r="";;){var o=e.lastIndexOf(",",100);if(e.length<100||o<0){t.push(r+e),r.length&&t.push("");break}t.push(r+e.substr(0,o)+", \\"),r=" ",e=e.substr(o+1)}return t.join("\n")}function Ae(e){var t=e.toLowerCase().split(";"),r=e=>e?[...new Set(e.split("*").sort().filter((e=>e.trim())))].join(","):"";return{abilit:r(t[0]),scons:r(t[1]),obs:r(t[2])}}console.log("-> abilitazioni");q={};var $e=(N=_.all("select var var,abilit abilit,codart codart from valartopz order by var,abilit")).length;for(var B of N)if(B.var&&B.abilit&&B.codart){var be=B.var.trim().toLowerCase(),{abilit:we,scons:Ce,obs:Le}=Ae(B.abilit),Fe=B.codart.trim().toLowerCase();q[be]||(q[be]={}),(De=q[be])[we]||(De[we]={scons:Ce,obs:Le,neutri:[],art:[],mod:[]}),De[we].neutri.push(Fe)}var Se=(N=_.all("select var var,abilit abilit,codmod codart from valmodopz order by var,abilit")).length;for(var B of N)if(B.var&&B.abilit&&B.codart){be=B.var.trim().toLowerCase();var{abilit:we,scons:Ce,obs:Le}=Ae(B.abilit);Fe=B.codart.trim().toLowerCase();q[be]||(q[be]={}),(De=q[be])[we]||(De[we]={scons:Ce,obs:Le,neutri:[],art:[],mod:[]}),De[we].mod.push(Fe)}var ye=(N=_.all("select var var,abilit abilit,cod codart from valmodartopz order by var,abilit")).length;for(var B of N)if(B.var&&B.abilit&&B.codart){be=B.var.trim().toLowerCase();var De,{abilit:we,scons:Ce,obs:Le}=Ae(B.abilit);Fe=B.codart.trim().toLowerCase();q[be]||(q[be]={}),(De=q[be])[we]||(De[we]={scons:Ce,obs:Le,neutri:[],art:[],mod:[]}),De[we].art.push(Fe)}for(var be in console.log("-> ab trasforma",$e,Se,ye),q)if(r.existsSync(o.join(y,be+".var"))){J=[];var Ee=q[be];for(var je in Ee){X=Ee[je];J.push("\n\n{limit}"),X.neutri.length&&J.push(Oe(":neutri "+X.neutri.join(","))),X.art.length&&J.push(Oe(":art "+X.art.join(","))),X.mod.length&&J.push(Oe(":mod "+X.mod.join(","))),X.obs&&J.push(Oe(":obs "+X.obs)),X.scons&&J.push(Oe(":scons "+X.obs)),J.push(Oe(":opz "+je))}r.writeFileSync(o.join(y,be+".var.txt"),J.join("\n"))}}k=(new Date).valueOf()-k,console.log("Tempo: ",k+"ms"),_.chiudi();
|
|
2
|
+
import{init,database}from"croswil_lib";import fs from"fs";import path from"path";import minimist from"minimist";
|
|
3
|
+
/**
|
|
4
|
+
* Esegue una semplice somma sincrona di due numeri
|
|
5
|
+
* @param {number} a - Primo numero da sommare
|
|
6
|
+
* @param {number} b - Secondo numero da sommare
|
|
7
|
+
* @returns {number} La somma dei due numeri
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Converte una stringa in array di colonne, gestendo diversi formati
|
|
11
|
+
* @param {string} value - Stringa da convertire
|
|
12
|
+
* @returns {string[]} Array di colonne
|
|
13
|
+
*/function getcolonne(value,keepquote=!1){value=String(value||"");const pp=/^(\d+)\.\.(\d+)$/.exec(value);if(pp){var n1=parseInt(pp[1]),n2=parseInt(pp[2]),cl=[];n1>n2&&([n1,n2]=[n2,n1]);for(var 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
|
+
/**
|
|
15
|
+
* Classe per la gestione degli errori con funzionalità di accumulo e formattazione
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* Costanti e espressioni regolari utilizzate nel modulo
|
|
19
|
+
*/
|
|
20
|
+
/**
|
|
21
|
+
* Rimuove i commenti dal codice sorgente mantenendo la struttura del codice
|
|
22
|
+
* @param {string} codice - Il codice sorgente da processare
|
|
23
|
+
* @param {boolean} tienivuoti - Se true mantiene le righe vuote
|
|
24
|
+
* @returns {string[]} Array di righe di codice senza commenti
|
|
25
|
+
*/
|
|
26
|
+
function muClComments(codice,tienivuoti){const righe=(code=>code.replace(/("(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*')|\/\*[\s\S]*?\*\//g,((match,quoted)=>quoted||"")))(codice).split(/\r?\n/),tm=[];let rigaContinua="";for(const riga of righe){let rigaTrim=riga.trim();if(rigaTrim.includes("//")&&(rigaTrim=rigaTrim.split("//")[0].trim()),0!==rigaTrim.length)if(rigaContinua.length>0&&(rigaTrim=rigaContinua+" "+rigaTrim,rigaContinua=""),rigaTrim.endsWith("\\")){rigaTrim=rigaTrim.slice(0,-1);const indiceCommento=rigaTrim.lastIndexOf("//");-1!==indiceCommento&&(rigaTrim=rigaTrim.slice(0,indiceCommento).trim()),rigaContinua=rigaTrim}else tm.push(rigaTrim)}return tm}new class Errori{constructor(){this.azzera()}
|
|
27
|
+
/**
|
|
28
|
+
* Azzera la lista degli errori
|
|
29
|
+
*/azzera(){this.err=[]}
|
|
30
|
+
/**
|
|
31
|
+
* Aggiunge un errore alla lista
|
|
32
|
+
* @param {string} msg - Messaggio di errore
|
|
33
|
+
* @param {Object} row - Informazioni aggiuntive sull'errore
|
|
34
|
+
*/add(msg,row){this.err.push({msg:msg,row:row})}
|
|
35
|
+
/**
|
|
36
|
+
* Restituisce la lista completa degli errori
|
|
37
|
+
* @returns {Array} Lista degli errori
|
|
38
|
+
*/get(){return this.err}
|
|
39
|
+
/**
|
|
40
|
+
* Restituisce il numero di errori presenti
|
|
41
|
+
* @returns {number} Numero di errori
|
|
42
|
+
*/get length(){return this.err.length}
|
|
43
|
+
/**
|
|
44
|
+
* Converte la lista degli errori in stringa
|
|
45
|
+
* @returns {string} Rappresentazione testuale degli errori
|
|
46
|
+
*/toString(){var cl=[];for(var e of this.err){let 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;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}}
|
|
47
|
+
/**
|
|
48
|
+
* Formatta il codice sorgente applicando indentazione e allineamento
|
|
49
|
+
* @param {string} code - Il codice sorgente da formattare
|
|
50
|
+
* @param {boolean} gisvar - Flag che indica se formattare come variabile
|
|
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}1.0.135${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;isvar&&(isvar=(tm=verificaisvar(0,lines)).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){var tm;formattedCode.push(line),indentLevel=rr[1]?0:1,/^\s*\{(var|deriva|header|v|h)(\s.*)?\}/i.test(line)?(isvar=(tm=verificaisvar(i+1,lines)).fl)&&(cols=tm.cols):isvar=!1,inAcapo=!1;continue}if(isvar)if(linenc.startsWith(":")&&!linenc.startsWith(":h ")||!linenc)formattedCode.push(line);else{var lba=" ";linenc.startsWith(":h ")&&(linenc=linenc.substr(3).trim(),lba=":h ");for(var cl=getcolonne(linenc),j=0;j<cl.length;j++)cl[j].includes(",")&&(cl[j]=`"${cl[j]}"`),cl[j]=cl[j].padEnd(cols[j]," ");formattedCode.push(`${lba}${cl.join(" , ")} ${commento}`)}else{let indent=" ".repeat(indentLevel>=0?indentLevel:0);if(inAcapo)formattedCode.push(`${indent} ${line}`);else{let command="";line.startsWith("#")&&(command=line.substring(1).split(" ")[0].toUpperCase(),line="#"+command+line.substring(command.length+1)),["IF","IFDEF","IFNDEF"].includes(command)?line.indexOf("#",2)<0?(formattedCode.push(`${indent}${line}`),indentLevel++):(line=line.replace(/#([\w]+)/g,((match,m1)=>"#"+m1.toUpperCase())),formattedCode.push(`${indent}${line}`)):["FOR","SELECT","FORVAR","VARIANTE","DO"].includes(command)?(formattedCode.push(`${indent}${line}`),indentLevel++):["ELSEIF","ELSE","ELSEIFDEF","ELSEIFNDEF","CASE","CASES","DEFAULT"].includes(command)&&indentLevel>0?formattedCode.push(" ".repeat(indentLevel>0?indentLevel-1:0)+line):["ENDIF","ENDSELECT","LOOP","ENDFOR"].includes(command)?(formattedCode.push(" ".repeat(indentLevel>0?indentLevel-1:0)+line),indentLevel--,indentLevel<0&&(indentLevel=0)):line.startsWith("_ ")||line.startsWith(":")?formattedCode.push(line):formattedCode.push(indent+line)}inAcapo=linenc.endsWith("\\")}}}return formattedCode.join("\n")}(cl.join("\n"))}const tipi={"-":"sep",T:"var",M:"num",S:"str",C:"yn",L:"hidden",Z:"ny"};function torowtipo(x){var cl=[];if(!x)return"";for(var t in x)"cod"!=t&&cl.push(`${t}=${x[t]}`);return`${x.cod} ${cl.join(",")}`}function gettipo(row){var v=row.split(",");if(v[1]||v[2]){var x={};return x.cod=(v[2]||v[1]).trim().toLowerCase(),v[2]&&(x.alias=v[2].trim().toLowerCase()),v[3]&&(x.valid=v[3].trim().toLowerCase()),v[4]&&(x.des=v[4].trim()),v[5]&&(x.visible=v[5].trim().toLowerCase()),tipi[v[0]]?x.tipo=tipi[v[0]]:"D"==v[0]?x.tipo="sp."+v[6]:x.tipo=v[0].trim().toUpperCase(),x}}mi.r||mi.reset?console.log("-> crea catalogo e copia"):console.log("-> aggiorna catalogo");var dbxfile=`${inidata.FOLDERCAT}/mu_${catname}.db`;(mi.r||mi.reset)&&(fs.existsSync(folder)&&fs.rmSync(folder,{recursive:!0}),fs.existsSync(dbxfile)&&fs.unlinkSync(dbxfile)),fs.existsSync(folder)||fs.mkdirSync(folder,{recursive:!0}),fs.copyFileSync(dborig,folder+"/"+catname+".db");var db=database.db(dborig),dtx=(new Date).valueOf(),xalias=[],rr=db.all("select cod cod,des des ,codmet alias,obbl obbligo, memo info from codvar ");for(var r of(console.log("-> varianti",rr.length),rr)){for(var xx=r.info.split(""),cl=[],c1=[],i=1;i<xx.length&&xx[i];i+=2)c1.push(xx[i]);if(cl.push(`:des ${r.des.trim().toLowerCase()}`),r.obbl&&cl.push(":obbligo"),r.alias)xalias.push(`${r.cod.trim().toLowerCase()} , ${r.alias.trim().toLowerCase()}`);else{cl.push(""),cl.push(":h "+unisciriga(c1));var vv=db.all("select codopz cod,des des,memo info from varianti where codvar=? order by ordinamento,codopz",r.cod);for(var v of vv){c1=unisciriga([v.cod.trim().toLowerCase(),v.des.trim().toLowerCase(),...v.info.trim().toLowerCase().split("\t")]);cl.push(" "+c1)}r.cod=r.cod.trim().toLowerCase(),logga("var: "+r.cod),fs.writeFileSync(`${folder}/${r.cod}.var`,cl.join("\n"))}}rr=db.all("select cod cod,des des,fldef defs from modelli order by cod"),cl=[];for(var r of(cl.push(":des Modelli\n\n:h Cod, Descrizione\n"),rr))cl.push(" "+unisciriga([r.cod.trim().toLowerCase(),r.des]));fs.writeFileSync(`${folder}/modelli.var`,cl.join("\n")),xalias=["// Alias Varianti\n\n{v __aliasvar}\n:h variante, alias",...xalias.sort()],fs.writeFileSync(`${folder}/_alias.inc`,xalias.join("\n")),console.log("-> gruppi.ini");var file=path.join(folder2,"gruppi.ini");if(fs.existsSync(file)){rr=muClComments(data=fs.readFileSync(file).toString().replaceAll("�","'"));var grps={},cgroup=[];for(var r of rr){if(m=/^\s*\[(\w+)\]/i.exec(r))cgroup=[],grps[m[1].trim().toLowerCase()]=cgroup;else(x=gettipo(r))&&cgroup.push(torowtipo(x))}}var kk=Object.keys(grps).sort();cl=[];for(var k of(cl.push("// includes headers"),kk))cl.push(""),cl.push(`{h ${k}}`),cl.push(...grps[k]);if(fs.writeFileSync(path.join(folder,"_headers.inc"),cl.join("\n")),console.log("-> deriva"),(r=db.get(`${sql} and cod='deriva'`)).cod&&r.info){r.info=r.info.trim().toLowerCase().replaceAll("","\n");var tm=r.info.split("\n").map((t=>t.trim())).sort();fs.writeFileSync(path.join(folder,"_deriva.inc"),`// derivazione varianti \n{v deriva}\n:des deriva delle varianti\n :h var=opz,-> var=opz\n \n${tm.join("\n")}`)}rr=db.all(`${sql} and cod like ?`,">>%");for(var r of(console.log("-> macro",rr.length),rr)){logga("mac "+(cod=(cod=r.cod.substr(2).trim().toLowerCase()).replace(/^_*/,"")));var mac=parsecodecad(r.info.toLowerCase());cl=`// ${r.des}\n${mac} \n `;fs.writeFileSync(path.join(folder,`+${cod}.mu`),cl)}var regole=fs.readdirSync(folder2);regole=regole.filter((r=>r.toLowerCase().endsWith(".erg")));var ii=0;for(var rr of(console.log("-> regole",regole.length),regole)){var data=fs.readFileSync(path.join(folder2,rr)).toString().replaceAll("\r",""),ext=path.extname(rr),basename=path.basename(rr,ext).trim().toLowerCase();if(!basename.includes(".")&&"gene"!=basename){var info={cod:basename,des:"",codice:[],header:[],formule:{}},formula=[],status=(cl=data.split("\n"),-1);for(var c of cl){var m;if(m=/^\s*\[(\w+)\]/.exec(c)){var mm=m[1].toLowerCase();switch(mm){case"info":status=0;break;case"gene":status=1;break;case"grafica":status=2;break;default:formula=[],info.formule[mm]=formula,status=3}}else 0==status?/^\s*descrizione\s*=/i.test(c)&&(info.des=c.split("=")[1].trim().toLowerCase()):1==status?c.trim()&&info.header.push(c):2==status?info.codice.push(c):formula.push(c)}if(info.tm=muClComments(info.codice.join("\n")),info.tm.length){cl=[`// rule ${info.cod}\n :des ${info.des||info.cod}\n `];if(info.header.length){for(var r of(cl.push("{header}"),info.header)){var x;(x=gettipo(r))&&("G"==x.tipo?(delete x.tipo,cl.push(`:g ${torowtipo(x)}`)):x.tipo.length>1&&cl.push(torowtipo(x)))}cl.push("{:header}")}for(var ff in info.formule){tm=parsecodecad((righe=info.formule[ff]).join("\n"));cl.push(`\n{f ${ff}}\n${tm}\n{:f}`)}var righe=info.codice.join("\n");cl.push(parsecodecad(righe)),fs.writeFileSync(path.join(folder,basename+".mu"),cl.join("\n")),logga(`reg ${++ii}: ${info.cod} - ${info.des}`)}}}if(mi.t||mi.tipologie){rr=(r=db.get(`${sql} and cod=?`,"tipologie")).info.split("").sort();console.log("-> tipologie",rr.length);var tp={};for(var riga of rr){if(c=(v=riga.trim().toLowerCase()).split(",")[0].trim())if(c.includes("."))tp[(r=c.split("."))[0]]?tp[r[0]][r[1]]=v:console.log("errore tipo",c);else tp[c]={v:v},(r=db.get(`${sql} and cod=?`,`db_${c}`)).info&&(tp[c].db=parsecodecad(r.info.trim().toLowerCase().replaceAll("","\n"),!0)),(r=db.get(`${sql} and cod=?`,`ll_${c}`)).info&&(tp[c].list=parsecodecad(r.info.trim().toLowerCase().replaceAll("","\n"),!0))}fs.writeFileSync(folder+"/typos.json",JSON.stringify(tp,null,2));rr=db.all(`${sql} and cod like ?`,"M>%");for(var r of(console.log("-> macro tip",rr.length),rr)){var cod;logga("macdb "+(cod=r.cod.substr(2).trim().toLowerCase()));mac=parsecodecad(r.info.toLowerCase(),!0),cl=`// ${r.des}\n${mac} \n `;fs.writeFileSync(path.join(folder,`++${cod}.mu`),cl)}}if(mi.a||mi.abilita){function parseacapo(str){var cl=[];for(var spaces="";;){var i=str.lastIndexOf(",",100);if(str.length<100||i<0){cl.push(spaces+str),spaces.length&&cl.push("");break}cl.push(spaces+str.substr(0,i)+", \\"),spaces=" ",str=str.substr(i+1)}return cl.join("\n")}function normalizeopt(kk){var vv=kk.toLowerCase().split(";"),parsa=v=>v?[...new Set(v.split("*").sort().filter((e=>e.trim())))].join(","):"";return{abilit:parsa(vv[0]),scons:parsa(vv[1]),obs:parsa(vv[2])}}console.log("-> abilitazioni");kk={};var cx1=(rr=db.all("select var var,abilit abilit,codart codart from valartopz order by var,abilit")).length;for(var r of rr)if(r.var&&r.abilit&&r.codart){var xv=r.var.trim().toLowerCase(),{abilit:abilit,scons:scons,obs:obs}=normalizeopt(r.abilit),code=r.codart.trim().toLowerCase();kk[xv]||(kk[xv]={}),(k2=kk[xv])[abilit]||(k2[abilit]={scons:scons,obs:obs,neutri:[],art:[],mod:[]}),k2[abilit].neutri.push(code)}var cx2=(rr=db.all("select var var,abilit abilit,codmod codart from valmodopz order by var,abilit")).length;for(var r of rr)if(r.var&&r.abilit&&r.codart){xv=r.var.trim().toLowerCase();var{abilit:abilit,scons:scons,obs:obs}=normalizeopt(r.abilit);code=r.codart.trim().toLowerCase();kk[xv]||(kk[xv]={}),(k2=kk[xv])[abilit]||(k2[abilit]={scons:scons,obs:obs,neutri:[],art:[],mod:[]}),k2[abilit].mod.push(code)}var cx3=(rr=db.all("select var var,abilit abilit,cod codart from valmodartopz order by var,abilit")).length;for(var r of rr)if(r.var&&r.abilit&&r.codart){xv=r.var.trim().toLowerCase();var k2,{abilit:abilit,scons:scons,obs:obs}=normalizeopt(r.abilit);code=r.codart.trim().toLowerCase();kk[xv]||(kk[xv]={}),(k2=kk[xv])[abilit]||(k2[abilit]={scons:scons,obs:obs,neutri:[],art:[],mod:[]}),k2[abilit].art.push(code)}for(var xv in console.log("-> ab trasforma",cx1,cx2,cx3),kk)if(fs.existsSync(path.join(folder,xv+".var"))){cl=[];var variant=kk[xv];for(var x1 in variant){tm=variant[x1];cl.push("\n\n{limit}"),tm.neutri.length&&cl.push(parseacapo(":neutri "+tm.neutri.join(","))),tm.art.length&&cl.push(parseacapo(":art "+tm.art.join(","))),tm.mod.length&&cl.push(parseacapo(":mod "+tm.mod.join(","))),tm.obs&&cl.push(parseacapo(":obs "+tm.obs)),tm.scons&&cl.push(parseacapo(":scons "+tm.obs)),cl.push(parseacapo(":opz "+x1))}fs.writeFileSync(path.join(folder,xv+".var.txt"),cl.join("\n"))}}dtx=(new Date).valueOf()-dtx,console.log("Tempo: ",dtx+"ms"),db.chiudi();
|
package/bin/mu.js
CHANGED
|
@@ -1,2 +1,266 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import e from"fs";import t from"path";import{init as a,database as r,insertorupdate as i,checkdb as s,setstruttura as n}from"croswil_lib";import o from"minimist";function l(e){let t="";if("string"==typeof e||"number"==typeof e)t=e+"";else if("object"==typeof e&&e){const a=Object.keys(e).sort(),r="\0";t=a.map((t=>`${t}${r}${String(e[t])}`)).join(r)}let a=2166136261,r=2218511855;for(let e=0;e<t.length;e++){const i=t.charCodeAt(e);a^=i,a+=a<<5^2779096485,r^=a,r=((r<<3)+i^2134516169)>>>0}return a>>>=0,a.toString(16)+r.toString(16)}function c(e){if(e&&"object"==typeof e){let t=e.stack?.toString().replace(/^.*?node_modules.*$/gim,"")||e.message||"";t=t.replaceAll("/","_").replaceAll(".js","").replaceAll("\n\n","\n").replace(/\;\s+/gi,"\n"),e=t}return(e=e.replace(/sqlite/gi,"SQL ")).replaceAll(";",",").trim()}let f,h,d,u,v,m;const p=(...e)=>{m?m(e):console.log(...e)};function g(e,t,a,r,i,s){h=e,f=t,d=a,u=r,v=i,m=s}function w(e,t=!1){return t?(e||"").trim().toLowerCase():(e||"").trim()}function b(e,t="=",a=!0){var r=(e=e||"").indexOf(t);return r>=0?{v:w(e.substring(0,r),a),o:e.substring(r+t.length).trim(),fl:!0}:{v:w(e,a),o:"",fl:!1}}function $(e,cat){if((e=(e||"").trim()).indexOf("/")>0){var t=e.split("/");cat=t[0]||"",e=t[1]||""}if(!cat)throw new Error("manca il catalogo per "+e);return{name:e,cat:cat=y(cat)}}function y(e){if(!(e=(e||"").trim())||!/^(?:(\w|\-|\_|\+|\.))+$/im.test(e)){throw new Error(`nome non valido: |${e}| \n deve contenere solo lettere, _, e numeri`)}return e.toLowerCase()}function x(e,t=!1){e=String(e||"");const a=/^(\d+)\.\.(\d+)$/.exec(e);if(a){var r=parseInt(a[1]),i=parseInt(a[2]),s=[];r>i&&([r,i]=[i,r]);for(var n=r;n<=i;n++)s.push(n+"");return s}if(!/["({[]/.test(e))return e.split(/[,;]/).map((e=>e.trim()));const o=[];let l="",c=0,f=!1;for(let t=0;t<e.length;t++){const a=e[t];if(0===c&&'"'===a&&(0!==t&&"\\"===e[t-1]||(f=!f)),f||("("===a||"["===a||"{"===a?c++:")"!==a&&"]"!==a&&"}"!==a||(c=Math.max(0,c-1))),","!==a&&";"!==a||0!==c||f)l+=a;else{const e=l.trim();o.push(e),l=""}}const h=l.trim();return h&&o.push(h),o.map((e=>(e=e.trim(),!t&&e.startsWith('"')&&e.endsWith('"')?e.slice(1,-1):e)))}const E=(e,t,a,r,i=!1)=>{const s=["[","(","{"],n=["]",")","}"];r||(r="["==a?"]":"("==a?")":"}");for(var o=s.includes(a),l=1,c=[],f=0,h=t;h<e.length;h++)if(o&&s.includes(e[h])||e[h]==a)l++;else if(o&&n.includes(e[h])||e[h]==r){if(0==--l&&e[h]==r)return c[f]=e.substring(t,h),{i:h,res:c}}else if(":"==e[h])1==l&&(c[f]=e.substring(t,h),t=h+1,f++);else if("\n"==e[h]&&i)return{i:h,res:c};return{i:-1,res:e.substring(t)}};function k(e,t){"object"==typeof e&&"object"==typeof t&&Object.keys(t).forEach((a=>{Object.hasOwn(e,a)&&"function"!=typeof e[a]&&(e[a]=t[a])}))}function S(e,t){return"object"==typeof e?Object.keys(e).reduce(((a,r)=>("function"!=typeof e[r]&&(t&&t.length>0&&t.includes(r)||(a[r]=e[r])),a)),{}):{}}function F(e,t){if(Array.isArray(e))return e;if("string"!=typeof e)return e;if(""==e)return t||{};try{return JSON.parse(e)}catch(a){return p(`Errore parsing JSON: ${a}\n${e}`),t||{}}}const O=new class{constructor(){this.azzera()}azzera(){this.err=[]}add(e,t){this.err.push({msg:e,row:t})}get(){return this.err}get length(){return this.err.length}toString(){var e=[];for(var t of this.err){let a="object"==typeof t.msg?JSON.stringify(t.msg):t.msg||"";e.push(`${t.row?t.row+":":""}${a}`)}return e.join("\n")}};const _=/(?<!\w)\(/g,L=/^-?[0-9.]+$/,C=/^(\w+)(\!)?\[(.*)?\]$/,I=/^(rnd|random|cas)\(/i,A=/^clamp\(/i,D=/^(dec|round)\(/i,j=/[0-9.]/,z=/[+\-*/\^\%]/,N=/[a-zA-Z]/i;function T(e){for(e=(e+"").trim();;){var t=_.exec(e);if(!t)break;var{i:a,res:r}=E(e,t.index+1,"(",")");if(a<=0)break;e=e.substring(0,t.index)+T(r[0])+(a>=0?e.substring(a+1):"")}return e=function(e){if(e.includes("[")){function r(e){let t=e[1],a=!!e[2],r=x(e[3]);for(var i of r)if(i==t)return a?"0":"1";return a?"1":"0"}for(;;){var t=C.exec(e);if(!t)break;var a=r(t);e=e.substring(0,t.index)+a+e.substring(t.index+t[0].length)}}return e}(e),function(e){let t,a;const r={"||":()=>T(t)||T(a)?1:0,"|":()=>T(t)||T(a)?1:0,"&&":()=>T(t)&&T(a)?1:0,"&":()=>T(t)&&T(a)?1:0,"<<=":()=>w(t)<=w(a),">>=":()=>w(t)>=w(a),"===":()=>w(t)==w(a),"==":()=>w(t)==w(a),"!!":()=>w(t)!=w(a),"<<":()=>w(t)<w(a),">>":()=>w(t)>w(a),"<=":()=>W(t)<=W(a),">=":()=>W(t)>=W(a),"<":()=>W(t)<W(a),">":()=>W(t)>W(a),"=":()=>W(t)==W(a),"!":()=>W(t)!=W(a)};var i=-1,s="";for(var n in r)if((i=e.indexOf(n))>=0){s=n;break}return-1!==i?(t=e.slice(0,i),a=e.slice(i+s.length),r[s]&&r[s]()?1:0):W(e)}(e)}const M={sqr:e=>Math.sqrt(e),sqrt:e=>Math.sqrt(e),int:e=>Math.floor(e),floor:e=>Math.floor(e),round:e=>Math.round(e),abs:e=>Math.abs(e),sin:e=>Math.sin(e*(Math.PI/180)),cos:e=>Math.cos(e*(Math.PI/180)),tan:e=>Math.tan(e*(Math.PI/180)),atan:e=>Math.atan(e*(Math.PI/180)),atan2:(e,t)=>Math.atan2(e,t)*(Math.PI/180),asin:e=>Math.asin(e*(Math.PI/180)),acos:e=>Math.acos(e*(Math.PI/180))};function W(e){let t=0;function a(){const a=e[t];return z.test(a)?(t++,a):null}function r(){if(j.test(e[t]))return function(){const a=t;for(;t<e.length&&j.test(e[t]);)t++;return Number(e.slice(a,t))}();if("("===e[t]){t++;const a=s();return")"===e[t]&&t++,a}return N.test(e[t])?function(){var a=e.slice(t);if(!a)return 0;for(const[r,i]of Object.entries(M)){const n=new RegExp(`^(${r})\\(`,"i").exec(a);if(n){t+=n[0].length;const a=i(s());return")"===e[t]&&t++,a}}let r;if(r=I.exec(a),r){t+=r[0].length;let a=0,i=1;return")"!==e[t]&&(a=s(),","===e[t]?(t++,i=s()):(i=a,a=0)),")"===e[t]&&t++,Math.random()*(i-a)+a}if(r=A.exec(a),r){t+=r[0].length;const a=s();","===e[t]&&t++;const i=s();","===e[t]&&t++;const n=s();return")"===e[t]&&t++,Math.min(Math.max(a,i),n)}if(r=D.exec(a),r){t+=r[0].length;const a=s();let i=0;return","===e[t]&&(t++,i=s()),")"===e[t]&&t++,parseFloat(a.toFixed(i))}return t++,s()}():0}function i(){let i=r();for(;t<e.length&&/[\/\*\^\%]/.test(e[t]);){const e=a(),t=r();"*"===e?i*=t:"/"===e?i=t?i/t:0:"%"===e?i=t?i%t:0:"^"===e&&(i=Math.pow(i,t))}return i}function s(){let r=i();for(;t<e.length&&/[+\-]/.test(e[t]);){const e=a(),t=i();"+"===e?r+=t:"-"===e&&(r-=t)}return r}return e=e.replace(/\s/g,""),s()}function R(e){if(!e)return 0;if("number"==typeof e)return e||0;if("string"!=typeof e)return 0;var t=e.replaceAll(",",".");return L.test(t)?Number(t)||0:T(e)||0}const J=500;function U(e,t){var a=t[0]||"";if(!a)return"";if(e.counter>=J)return a;var r=B(e,e.var(P(e,a)));if(e.counter>=J)return a;if(t[1]){var i=x(r);if("l"==t[1])return String(i.length);var s=R(P(e,t[1]));if(!(s>=0&&s<i.length))return"";r=P(e,i[s])}if(t[2]){var n=R(P(e,t[2]));if(n){var o=0;return t[3]&&(o=R(P(e,t[3]))),n<0?r.slice(n):o?r.substring(n-1,n+o-1):r.substring(n-1)}}return r}function V(e,t){var a=x(t||""),r=w(a[0]);function i(e){return"\\t"==e?"\t":"\\n"==e?"\n":(e||"").replace(/&(\d+)/g,((e,t)=>String.fromCharCode(parseInt(t))))}switch(r){case"set":var s=P(e,a[1]||""),n=P(e,a[2]||"");e.add(s,e.vars(n));break;case"ex":s=P(e,a[1]||"");(n=P(e,a[2]||""))||(n=",");var o=R(P(e,a[3]||"")),l=s.split(n);return o>0&&l[o-1]||"";case"ex2":var c=i(a[1]||""),f=R(P(e,a[2]||""));return a.splice(0,3),(u=a.join(";")).split(c)[f>0?f-1:0]||"";case"replace":return a[1].replace(new RegExp(a[2]||"x","im"),(a[3]||"").trim());case"replace2":case"rp2":var h=i(a[1]||"x"),d=i(a[2]||"").trim();return a.splice(0,3),a.join(";").replace(new RegExp(h,"im"),d);case"tk":return(f=R(P(e,a[1]||""))||0)?a[f>0?f+1:2]||"":(f=R(P(e,a[2]||"")),c=a[1]||"",f?a[3].split(c)[f-1]:"");case"totab":return a.splice(0,1),a.join("\t");case"tosep":c=i(a[1]||"")||";";return a.splice(0,2),a.join(c);case"len":{let e;return a.length>2?(a.shift(),e=a.join(";")):e=a[1]||"",e.length}case"mid":var u=P(e,a[1]||""),v=(f=R(P(e,a[2]||"")),R(P(e,a[3]||"")));return u.substring(f-1,f+v-1);case"arrotonda":{u=R(a[1]);let e=1;return["0","1","2","3","4","5","6"].includes(a[2])?e=Math.pow(10,parseInt(a[2])):(e=R(a[2]),0==e&&(e=1e3)),Math.round(u*e)/e}case"iif":return(u=R(P(e,a[1])))?a[2]||1:a[3]||0;case"instr":case"instr2":var m=a[1]||"",p=a[2]||"";return m.toLowerCase().indexOf(p.toLowerCase())+1;case"instr2":p=a[1]||"";return a.splice(0,2),a.join(";").toLowerCase().indexOf(p.toLowerCase())+1;default:return{fun:r,pars:a}}}function P(e,t){if(t+="",e.counter>=J)return t;for(;;){const s=/\$([\{\(])/im.exec(t);if(!s)break;var a=s.index,{i:r,res:i}="("==s[1]?E(t,a+2,"(",")"):E(t,a+2,"{","}");t=P(e,t.substring(0,a))+U(e,i)+(r>=0?P(e,t.substring(r+1)):"")}return t=(t=t.replace(/\$([a-z|][\w|\.]*)/gi,((t,a)=>{for(var r="";a.length;){var i=B(e,e.var(a));if(i||!(a.length>1)){r=i+r;break}r=a.slice(-1)+r,a=a.substring(0,a.length-1)}return r}))).replace(/\$(\d+)\:(\d+)(\:(\d+))?/g,((e,t,a,r,i)=>{i=i?+i:1;let s=[];for(let e=+t;e<=+a;e+=i)s.push(e.toString());return s.join(";")})),t}function B(e,t){return t&&(e.counter++,e.counter<=J&&(t=P(e,t)),e.counter--),t}class K{constructor(){this.dictionary={},this.vec=[],this.counter=0}static isValidKey(e){return/^[\w][\w\d\.\[\]]*$/.test(e)}static sanitizeKey(e){return e.replace(/[^a-zA-Z0-9_\.\[\]]/g,"_")}push(){this.vec.push({...this.dictionary})}pop(){this.vec.length>0&&(this.dictionary=this.vec.pop())}clear(){this.vec=[],this.dictionary={}}azzera=()=>this.clear();var(e){let t="";const a=/^(\d+)\.\.(\d+)$/.exec(e);if(a){var r=parseInt(a[1]),i=parseInt(a[2]),s=[];r>i&&([r,i]=[i,r]);for(var n=r;n<=i;n++)s.push(n+"");return s}if(e.indexOf("|")>=0){let a=e.split("|");e=a[0],t=a[1]}function o(e,t){switch(t.trim().toLowerCase()){case"data":return a=parseFloat(e)||0,new Intl.DateTimeFormat("it",{day:"2-digit",month:"short",year:"2-digit"}).format(a.toDate());case"euro":return((e,t="")=>{if(e){var a=Intl.NumberFormat("en",{style:"currency",currency:"EUR"}).format(e);return a.replace(/€/g,"").replace(/\./g,";").replace(/,/g,".").replace(/;/g,",")+"€"}return t})(parseFloat(e));case"num":return((e,t=-1)=>{const a="string"==typeof e?parseFloat(e)||0:e;if(t<0)return a||0;const r=Math.pow(10,t);return Math.round(a*r)/r||0})(parseFloat(e));default:return e}var a}const l=K.sanitizeKey(e);if(K.isValidKey(l)){const e=l.toLowerCase();var c=/^([\w][\w\d]*)[\.\[]/.exec(e);if(c){var f=this.dictionary[c[1]];if(f&&"object"==typeof f)return o(function(e,t){for(var a=t.split("."),r=e,i=0;i<a.length;i++){var s=a[i],n=s.match(/(.*?)\[(\d+)\]/);if(n){if(void 0===(r=r[n[1]]))return"";r=r[parseInt(n[2],10)]}else r=r[s];if(void 0===r)return""}return"number"==typeof r?r+"":r}(f,e.substring(c[0].length)),t)}return o(this.dictionary[e]||"",t)}return""}getvar(e){return this.var(e)}colonna(e,t){return x[t]||e}dump(e=!1){var t=[];for(var a in this.dictionary)t.push({cod:a,val:this.dictionary[a]});return t=t.sort(((e,t)=>e.cod>t.cod)),e?t.map((e=>`${e.cod} = ${e.val}`)):t}add(e,t){"number"==typeof t&&(t=String(t));const a=K.sanitizeKey(e);if(K.isValidKey(a)){const e=a.toLowerCase();0===t||t?this.dictionary[e]=t:delete this.dictionary[e]}else p(`Invalid key: ${e}`)}valutasync(e){return B(this,e)}async valuta(e,t){var a=await async function(e,t,a){if(t){for(var r=0;r<20;r++){var i=t.lastIndexOf("$[");if(!(i>=0)){t=B(e,t);break}var{i:s,res:n}=E(t,i+2,"[","]"),o=B(e,t.substring(0,i)),l=n?B(e,n[0]):"",c=s>=0?B(e,t.substring(s+1)):"",f=V(e,l);"object"==typeof f&&(f=a?await a(f?.fun,f.pars):`** fun: ${f.fun} ** `),t=o+(f="object"==typeof f?"**str**":f+""||"")+c}return t}return""}(this,e,t);return a=(e=>{for(;;){var t=e.indexOf("{");if(!(t>=0))break;var{i:a,res:r}=E(e,t+1,"{","}");if(a<0)return e;e=e.substring(0,t)+R(r[0])+(a>=0?e.substring(a+1):"")}return e})(a),a}async parametrokeyval(e){if(!(e=e.trim()))return{};let t,a,r,i=!1;return e.startsWith("#")&&(i=!0,e=e.slice(1)),r=e.indexOf("="),r>0?(t=w(e.slice(0,r)),a=e.slice(r+1)):(r=e.indexOf(":"),r>0?(t=w(e.slice(0,r)),a=e.slice(r+1),a=this.var(a)):(t=w(e),a=this.var(t))),a&&"string"==typeof a&&a.includes("$")&&(a=await this.valuta(a)),["l","a","p"].includes(t)&&(i=!0),i&&(a=R(a)),{k:t,v:a}}}const G="IFDEF|IFNDEF|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("|");function X(codice,e){const t=codice.split("\n"),a=[];let r=!1,i="";for(const riga of t){let t=riga.trim();if(r)t.endsWith("*/")&&(r=!1);else if(t.startsWith("/*"))r=!0;else if(!r&&t.includes("//")&&(t=t.split("//")[0].trim()),0!==t.length||e)if(i.length>0&&(t=i+" "+t,i=""),t.endsWith("\\")){t=t.slice(0,-1);const e=t.lastIndexOf("//");-1!==e&&(t=t.slice(0,e).trim()),i=t}else a.push(t)}return a}function q(e,t=!1){if(Array.isArray(e)){var a=[];for(var r of e){const e=r.match(/^#([\w\.]+)\s*(.*)$/);if(e){var i=e[1].toUpperCase().trim(),s="";if(i.includes(".")){var n=i.split(".");i=n[0],s=n[1]}if(G.includes(i)){const t=e[2];if("IF"!==i&&"IFDEF"!=i&&"IFNDEF"!=i||!t.includes("#")){let t={tipo:i,contenuto:e[2]};s&&(t.tipo2=s),a.push(t)}else{var o=t.match(/^(.*?)\s*#\s*(\w+)\s*(.*?)\s*#\s*(\w+)\s*(.*)$/);o?(a.push({tipo:i,contenuto:o[1].trim()}),a.push({tipo:o[2].toUpperCase(),contenuto:o[3]}),a.push({tipo:"ELSE",contenuto:""}),a.push({tipo:o[4].toUpperCase(),contenuto:o[5]}),a.push({tipo:"ENDIF",contenuto:""})):(o=t.match(/^(.*?)\s*#\s*(\w+)\s*(.*)$/))?(a.push({tipo:i,contenuto:o[1].trim()}),a.push({tipo:o[2].toUpperCase(),contenuto:o[3]}),a.push({tipo:"ENDIF",contenuto:""})):a.push({tipo:e[1].toUpperCase(),contenuto:e[2]})}}else $(r)}else $(r)}for(var l=0,c=0,f=0,h=[],d=[],u=[],v=0;v<a.length;v++){var m=a[v];switch(m.i=v,m.tipo){case"FOR":case"FORVAR":case"VARIANTE":case"DO":d[++c]={pos:v,bk:[]};break;case"LOOP":case"ENDFOR":if(c>0){var{pos:p}=d[c];for(var g of d[c].bk)g.next=v,g.prev=p;m.prev=p,a[p].next=v,c--}break;case"BREAK":case"EXIT":case"EXITFOR":case"CONTINUE":c>0&&d[c].bk.push(m);break;case"IF":case"IFDEF":case"IFNDEF":h[++l]={pos:v,bk:[m]};break;case"SELECT":u[++f]={pos:v,bk:[m],first:v};break;case"ELSEIF":case"ELSEIFDEF":case"ELSEIFNDEF":case"ELSE":if(l>0){var{pos:p}=h[l];h[l].bk.push(m),a[p].next=v,h[l].pos=v}break;case"CASE":case"CASES":case"DEFAULT":if(f>0){var{pos:p,first:w}=u[f];u[f].bk.push(m),a[p].next=v,m.first=w,u[f].pos=v}break;case"ENDIF":if(l>0){var{pos:p,next:b}=h[l];for(var g of(a[p].next=v,h[l].bk))g.last=v;l--}break;case"ENDSELECT":if(f>0){var{pos:p,next:b}=u[f];for(var g of(a[p].next=v,u[f].bk))g.last=v;f--}}}return a}function $(e){if(a.length>0&&""==a[a.length-1].tipo){var r=a[a.length-1];t||!(!e.startsWith("!")&!e.startsWith("."))||e.startsWith("$")||e.startsWith("{")||e.startsWith("#")||r.contenuto.startsWith("!")||r.contenuto.startsWith(".")||r.contenuto.startsWith("$")||r.contenuto.startsWith("{")||r.contenuto.startsWith("#")?a.push({tipo:"",contenuto:e}):r.contenuto=r.contenuto+"\n"+e}else a.push({tipo:"",contenuto:e})}O.add("muClean: expected array!")}function H(e){var t,a=X(e),r=[],i=e=>e?[...new Set(e.split(",").map((e=>e.trim())).sort().filter((e=>e)))]:void 0;for(var s of a){var n=/^\s*\{(.*)?\}/im.exec(s);if(n)"limit"==w(n[1])?(t={},r.push(t)):t=void 0;else if(t&&(n=/^\s*\:(\w+)\s*(.*)/.exec(s)))switch(n[1].toLowerCase()){case"opz":case"o":t.opz=i(n[2]);break;case"obs":case"obsolete":t.obsolete=i(n[2]);break;case"scons":case"sconsigliate":t.scons=i(n[2]);break;case"neutri":t.neutri=i(n[2]);break;case"art":t.art=i(n[2]);break;case"mod":t.mod=i(n[2]);break;default:p("missing:",n[1])}}return r}function Y(e){let t,a=[];if(e&&e.length)for(var r of e){t={},r.varfilter=F(r.varfilter,[]),r.result=F(r.result,[]),r.result2=F(r.result2,[]),r.exclude=parseInt(r.exclude)?1:0,r.exclude2=parseInt(r.exclude2)?1:0;let{item:item,model:model,rule:i,varfilter:s,result:n,result2:o,exclude:l,exclude2:c,datai:f,dataf:h}=r;function d(e){return e.map((e=>w("string"==typeof e?e:e.Value)))}if(n.length||o.length){if(n.length&&(l?t.ex=d(n):t.valid=d(n)),o.length&&(c?t.ex2=d(o):t.valid2=d(o)),item&&(t.i=w(item).split(";")),model&&(t.m=w(model).split(";")),i&&(t.r=w(i).split(";")),(f||h)&&f<h&&(t.datai=parseInt(f),t.dataf=parseInt(h)),s&&s.length){t.v=[];for(let u of s){let v=t.v.find((e=>e.v==w(u.Variant)));v||(v={v:w(u.Variant),o:[]},t.v.push(v)),v.o=[...v.o,w(u.Value).split(";")]}}Z(t),a.push(t)}}return a=a.sort(((e,t)=>t.l-e.l)),a}function Z(e){let t=0;e.i&&e.i.length&&(t+=5),e.m&&e.m.length&&(t+=3),e.r&&e.r.length&&(t+=2),e.v&&e.v.length&&(t+=3),e.datai&&e.dataf&&(t+=1),e.l=t}class Q{constructor(amb){this.rows={},this.name="$",this.key="$",this.amb=amb}setheader(e,cat){var{name:t,cat:cat}=$(e,cat);return this.cat=cat,this.name=t,this.alias="",this.obbligo=!1,this.des=t,this.vdef=[],this.rows={},this.h=[],this.key=`${cat}/${t}`,{name:t,cat:cat}}fromdim(dim,e=2){"number"!=typeof dim&&(dim=R(dim)),e>0&&e--;var t,a=1e9;for(var r in this.rows){var i=this.rows[r];if(!i.annulla){var s=parseFloat(i.v[e])||0;s<=a&&s>=dim&&(a=s,t=i)}}return this.#e(dim,t)}async load(e,cat,t=!1){var{name:a,cat:cat}=this.setheader(e,cat);if(f){var r=await f(cat,a);if(r){if(await this.loadContentExtended(r),r.filter)this.limits=Y(r.filter);else if(u&&!t){let e=await u("filter",cat,a);e&&e.length&&(this.limits=Y(e))}return!0}}return!1}async _loadContent(lines){const e=/^\s*[\!\:]\s*(\w+)\s*(.*)$/i;var t="";let a,r=[],i=!1;for(var s of lines){if("{limit}"==(n=s.toLowerCase()))a=[],r.push(a),i=!0;else if("{:limit}"==n)i=!1;else if(i)a.push(s);else{if(h=e.exec(w(s)))if(t&&"extra"==h[1].toLowerCase()){var n=x(h[2]);for(var o of n){var l=o.indexOf("=");if(l>0){var c=w(o.substring(0,l));"v"!=c&&(this.rows[t][c]=o.substring(l+1).trim())}}}else switch(h[1].toLowerCase()){case"alias":if((b=h[2].toLowerCase().split(";"))[0].trim()!=this.name)if(1==b.length)this.alias=b[0];else{var f;this.amb?f=await this.amb.getvariante(b[0]):(f=new Q,await f.load(b[0],this.cat));var h=f?.rows;if(h){var d=Object.keys(h);if(d.length){b.splice(0,1);const e=e=>{e&&e.forEach((e=>this.rows[e]=h[e]))};for(var o of b){var u=/([ei])\s*:\s*(.*)\s*$/im.exec(o);if(u){for(var v=u[2].split(","),m=0;m<v.length;m++)v[m]=v[m].trim();d="e"==u[1]?d.filter((e=>{for(var t of v)if(e.startsWith(t))return!1;return!0})):d.filter((e=>{for(var t of v)if(e.startsWith(t))return!0;return!1}))}}e(d)}}}break;case"h":this.h=x(h[2]).map((e=>({des:e})));break;case"t":let e=x(h[2]);if(this.h)for(let t=0;t<this.h.length;t++)this.h[t].t=e[t]||"";break;case"des":this.des=h[2];break;case"default":case"vdef":this.vdef=x(h[2]);break;case"obbligo":this.obbligo=!0;break;case"noerp":this.noerp=!0;break;case"noobbligo":this.obbligo=!1}else(g=w((n=x(s))[0]))&&(t=g,this.rows[t]={annulla:0,v:n})}}var p=Object.keys(this.rows);for(var g of p)if(g.includes(".")){var b=g.split(".");for(m=0;m<b.length-1;m++){var $=b.slice(0,m+1).join(".");this.rows[$]||(this.rows[$]={annulla:0,v:[$]})}}return this.limits=function(e){function t(e){let t={};const a=/^\s*[\!\:]\s*(\w+)\s*(.*)$/i;function r(e,a){function r(e,a){(a=w(a))&&(t[e]||(t[e]=[]),t[e].includes(a)||t[e].push(a))}if(Array.isArray(a))for(var i of a)r(e,i);else r(e,a)}for(var i of e){var s=a.exec(i);if(s)switch(s[1]){case"var":case"v":case"variante":let e=(s[2]||"").indexOf(" ");if(e>0){let a=w(s[2].substring(0,e)),r=x(s[2].substring(e+1));if(a&&r&&r.length){t.v||(t.v=[]);let e=t.v.find((e=>e.v==a));for(var n of(e||(e={v:a,o:[]},t.v.push(e)),r))e.o.includes(n)||e.o.push(n)}}break;case"d":case"dt":case"data":case"date":let a=s[2].split(" "),i=parseInt(a[0]),o=parseInt(a[1]);(i||o)&&(t.datai=i,t.dataf=o);break;case"rule":case"r":case"mu":r("r",x(s[2]));break;case"item":case"i":r("i",x(s[2]));break;case"model":case"m":r("m",x(s[2]));break;case"e":case"escludi":case"exclude":r("ex",x(s[2]))}else r("valid",x(i))}return Z(t),t}let a;if(e&&e.length){for(var r of e){let e=t(r);if(e&&(e.valid&&e.valid.length||e.ex&&e.ex.length)){let t=0;e.i&&e.i.length&&(t+=5),e.m&&e.m.length&&(t+=3),e.r&&e.r.length&&(t+=2),e.v&&e.v.length&&(t+=3),e.datai&&e.dataf&&(t+=1),e.l=t,a||(a=[]),a.push(e)}}a&&(a=a.sort(((e,t)=>t.l-e.l)))}return a}(r),!0}tovec(){var e=this.rows,t=[],a=Object.keys(e).sort();for(var r of a)this.rows[r].annulla<2&&t.push(this.#e(r,this.rows[r]));return t}#e(cod,e){var t=[cod];if(e)for(var a of e.v)a.indexOf(",")>=0?t.push(a.indexOf('"')>=0?`'${a}'`:`"${a}"`):t.push(a);return t.join(",")}tovar(cod){var e=w(cod);if(!this.rows[e])return cod;var t=this.rows[e];return 2==t.annulla?"":this.#e(cod,t)}isvalidopz(e){let t=w(e),a=this.rows[t];return!!a&&(1!=a.annulla&&!a.hasliv)}firstvalid(e){if(e&&this.isvalidopz(e))return e;if(this.vdef&&this.vdef.length)for(var t of this.vdef)if(this.isvalidopz(t))return t;for(var a in this.rows)if(this.isvalidopz(a))return a}resetfilter(){for(var e in delete this._valids,this.rows)this.rows[e].annulla=0}validkeys(){let e=Object.keys(this.rows)||[];return e=e.filter((e=>0==this.rows[e].annulla)).sort(),e}limitfiltra(e){if(this.resetfilter(),!e)return;e=X(e.toLowerCase());let t=[];for(var a of e){let e=/^\#([ie])(\d*)\s+(.+)$/i.exec(a);if(e){let a={ex:"e"==e[1],col:(parseInt(e[2])||1)-1,val:x(e[3])};a.val.length&&t.push(a)}}if(t.length)for(var r in this.rows){let e=this.rows[r];for(var i of t)if(i.ex){if(s(e.v[i.col]||"",i.val)){e.annulla=1;break}}else if(!s(e.v[i.col]||"",i.val)){e.annulla=1;break}}function s(e,t){return!!t.find((t=>t.startsWith(e)))}}limita(e){if(e&&e.length)return this.limitfiltra(e);if(!this.limits||!this.amb)return this.resetfilter();let{item:item,rule:t,model:model,vari:vari,data:a}=this.amb,r=this.limits.filter((e=>{if(!item&&e.i&&e.i.length)return!1;if(!t&&e.r&&e.r.length)return!1;if(!model&&e.m&&e.m.length)return!1;if(e.i&&!e.i.includes(item))return!1;if(e.r&&!e.r.includes(t))return!1;if(e.m&&!e.m.includes(model))return!1;if(a&&e.datai&&a<e.datai)return!1;if(a&&e.dataf&&a>e.dataf)return!1;if(e.v&&e.v.length)for(var r of e.v){let e=w(vari.var(r.v).split(",")[0]);if(e&&!r.o.includes(e))return!1}return!0}));if(!r||!r.length)return this.resetfilter();let i=new Set,s=new Set,n=new Set,o=new Set,l=!1,c=!1;for(var f of r){if(f.valid&&f.valid.length){l=!0;let e=f.valid.filter((e=>e.indexOf("*")>0)).map((e=>e.split("*")[0]));i.add(...e),n.add(...f.valid.filter((e=>!e.includes("*"))))}if(f.ex&&f.ex.length){c=!0;let e=f.ex.filter((e=>e.indexOf("*")>0)).map((e=>e.split("*")[0]));s.add(...e),o.add(...f.ex.filter((e=>!e.includes("*"))))}}for(var h in this.rows){let e=this.rows[h],t=!1,a=!1;if(l){for(let e of i)if(h.startsWith(e)){t=!0;break}!t&&n.has(h)&&(t=!0)}if(c){for(let e of s)if(h.startsWith(e)){a=!0;break}!a&&o.has(h)&&(a=!0)}e.annulla=0,l&&!t&&(e.annulla=1),c&&a&&(e.annulla=1)}return r}async loadContentExtended(e){if("object"==typeof e){for(var t in e)["rows","des","h","alias","obbligo"].includes(t)&&(this[t]=e[t]);"string"==typeof e.def&&e.def.length&&(this.vdef=x(e.def)),e.filter&&e.filter.length&&(this.limits=Y(e.filter))}else await this._loadContent(X(e,!1))}todata(){return{name:this.name,des:this.des,alias:this.alias,obbligo:this.obbligo,h:this.h,rows:this.rows,limits:this.limits,key:this.key}}}let ee={};async function te(e,t,a,vari,amb,r){if(d){if(ee[t])return"";let e=await d(t,a,vari,amb,r);return e=(e||"").trim(),"!"==e&&(ee[t]=!0,e=""),e}return e}async function ae(amb,e,t){return await amb.vari.valuta(t,(async(t,a)=>{if("dim"===t){var r=R(a[1]),i=await re(amb,e,a[2]),s=parseInt(a[3])||2;return i&&i.fromdim?i.fromdim(r,s):r}return await te(`**fun:${t}**`,t,a,amb.vari,amb)}))}async function re(amb,macro,e){return macro&¯o?.localvar&¯o.localvar[e]?macro.localvar[e]:await amb.getvariante(e)}async function ie(amb,macro,e,t,a){let r,i=e;if((t=t||"")&&"string"==typeof t){var s=t.indexOf(":");s>=0&&(s>0&&(i=w(t.slice(0,s))),t=t.slice(s+1))}if(a&&a.alias&&(i=a.alias),macro&¯o.paralias&¯o.paralias[e]&&(i=macro.paralias[e]),r=await re(amb,macro,i),r)if(a&&a.t){let e=a?.filtra||"";if(e.includes("$")&&(e=await amb.vari.valuta(e)),"m"===a.t){var n=2;if(t.includes(":")){var o=t.split(":");n=parseInt(o[1]),t=o[0]}r.limita(e),t=r.fromdim(parseFloat(t),n)}else{r.limita(e);let a=r.firstvalid(t);t=r.tovar(a)}}else r.resetfilter(),t=r.firstvalid(t),t=r.tovar(t);else a&&a.t&&a.t;return amb.vari.add(e,t),t}const se=(e,t)=>{null!=t&&null!=t&&("string"==typeof t&&t.startsWith("_ ")&&e.length>0&&"string"==typeof e[e.length-1]&&!tipo?e[e.length-1]+=t.slice(2):e.push(...t.split("\n")))};async function ne(amb,e,codice,options){if(!Array.isArray(codice))return O.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||O.add("amb deve essere definito");let vari=amb.vari;amb.maxdelays,amb.cat;let t=[];(new Date).valueOf();for(var a=0;a<codice.length;){var riga=codice[a];switch(riga.tipo){case"IFDEF":case"IFNDEF":case"IF":var r="IF"==riga.tipo?R(await ae(amb,e,riga.contenuto)):"IFDEF"==riga.tipo?""!=await ae(amb,e,riga.contenuto):""==await ae(amb,e,riga.contenuto);riga.next?(codice[riga.next].jlast=r?1:0,r||(a=riga.next-1)):O.add("Troppo tempo",riga);break;case"SELECT":riga.next?(codice[riga.next].t1=await ae(amb,e,riga.contenuto),a=riga.next-1):O.add("manca endselect",riga);break;case"CASE":case"CASES":case"DEFAULT":if(riga.next)if(riga.jlast)riga.jlast=0,a=riga.last-1;else{r=1;if("CASE"==riga.tipo){r=0;var i=R(riga.t1||""),s=x(await ae(amb,e,riga.contenuto));for(var n of s)if(R(n)==i){r=1;break}}else if("CASES"==riga.tipo){r=0;i=riga.t1||"",s=x(await ae(amb,e,riga.contenuto));for(var n of s)if(n==i){r=1;break}}codice[riga.next].jlast=r?1:0,codice[riga.next].t1=riga.t1,r||(a=riga.next-1)}else O.add("manca select",riga);break;case"ELSEIF":case"ELSEIFDEF":case"ELSEIFNDEF":case"ELSE":if(riga.next)if(riga.jlast)riga.jlast=0,a=riga.last-1;else{r="ELSE"==riga.tipo?1:"ELSEIF"==riga.tipo?R(await ae(amb,e,riga.contenuto)):"ELSEIFDEF"==riga.tipo?""!=await ae(amb,e,riga.contenuto):""==await ae(amb,e,riga.contenuto);codice[riga.next].jlast=r?1:0,r||(a=riga.next-1)}else O.add("manca endif",riga);break;case"ENDIF":case"ENDSELECT":break;case"PUSH":vari.push();break;case"POP":vari.pop();break;case"J":await te("$$","$$",await ae(amb,e,riga.contenuto),vari,amb,t);break;case"INC":case"I":if(options._stackmacro>500)O.add("stack chiamate macro troppo profondo!",riga);else if(macro?.codice?.length){var{macro:macro,pars:o,xid:c}=await amb.getmacro(riga)||{};options._inc=!0,options._stackmacro++;let e=await ne(amb,macro,macro.codice,options);t.push(...e),options._stackmacro--,options._inc=!1}break;case"MACRO":case"M":case"FUNC":case"F":var{macro:macro,pars:o,xid:c}=await amb.getmacro(riga)||{};if(options._stackmacro>500)O.add("stack chiamate macro troppo profondo!",riga);else if(macro){let e=options.grafica&&"F"!=riga.tipo&&"FUNC"==riga.tipo,r=options.id||"",i=macro.parametri?._,s={};if(e)vari.push();else{if(macro.head)for(var f in macro.head)s[f]=amb.vari.var(f);if(i&&i.length)for(var f of i){let e=(f.split("=")[0]||"").trim().toLowerCase();e&&(s[e]=vari.dictionary[e])}}if(macro.codice.length){if(options._stackmacro++,options.grafica&&"function"==typeof options.grafica){let e="",s="";o&&o.length?(e=o.find((e=>e.startsWith("#id"))),e?(e=await vari.valuta(e.slice(3)),options.id=l(`${a}${macro.name}${r}${e}`),o=o.filter((e=>!e.startsWith("#id"))),s=options.id):options.id=l(`z${r}${a}`)):options.id=l(`z${r}${a}`);let n=await options.grafica({tipo:riga.tipo,id:s,pars:o,parametri:i,macro:macro,options:options,vari:amb.vari,amb:amb});t.push(n)}else{await macro.impostaparametri(i,o);let e=await ne(amb,macro,macro.codice,options);t.push(...e)}options._stackmacro--}if(e)vari.pop();else for(var n in s)vari.dictionary[n]=s[n];options.id=r}else O.add("Macro non trovata!",riga);break;case"LET":case"LETS":var h=-1;if((v=riga.contenuto.indexOf("="))>=0&&(h=riga.contenuto.indexOf("=",v+1)),h<0){if((v=(n=riga.contenuto).indexOf("="))>0){var d=await ae(amb,e,n.slice(0,v).trim()),u=n.slice(v+1).trim();u="LET"==riga.tipo?R(await ae(amb,e,u))||"":await ae(amb,e,u),vari.add(d,u)}}else{s=x(riga.contenuto);for(var n of s){if((v=n.indexOf("="))>0){d=await ae(amb,e,n.slice(0,v)),u=n.slice(v+1).trim();u="LET"==riga.tipo?R(await ae(amb,e,u))||"":await ae(amb,e,u),vari.add(d,u)}}}break;case"LETT":var v;if((v=riga.contenuto.indexOf("="))>0){d=await ae(amb,e,riga.contenuto.slice(0,v).trim()),u=riga.contenuto.slice(v+1).trim();vari.add(d,u)}break;case"LETV":case"LETM":case"DEF":if(r=x(riga.contenuto))for(var f of r){var{v:n,o:m,fl:p}=b(f);p&&(n=await vari.valuta(n),m=await ae(amb,e,m),await ie(amb,e,n.trim().toLowerCase(),m.trim().toLowerCase(),"LETM"==riga.tipo?{t:"m"}:{t:"v"}))}break;case"DO":p=!0;(g=(riga.contenuto||"").trim())&&!R(await ae(amb,e,g))&&(p=!1),riga.next&&(p||(a=riga.next+1));break;case"VARIANTE":case"FORVAR":case"FOR":{var g,$;if(options.oldstyle)n=(s=riga.contenuto.split(","))[2]||"i",$=s[0],g=s[1];else n=(s=x(riga.contenuto||""))[0]||"",$=w(s[1],!0),g=s[2]||"";if(n=n.includes("$")?await ae(amb,e,n):n||"","FORVAR"==riga.tipo||"VARIANTE"==riga.tipo){var y=(r=await ae(amb,e,$))?await re(amb,e,r):void 0;y?$=y.tovec():($=[],O.add("getvariante not found!",riga))}else{var E=await ae(amb,e,$||"");$=$?x(E):void 0}$=$||[];let t=0;if(riga.next){(S=codice[riga.next]).for={v:n,elenco:$,nc:t,valido:g};var k;p=!0;n&&$.length>0?t>=$.length?p=!1:(k=$[t],vari.add(n,k),g&&(p=!R(await ae(amb,e,g)))):p=!1,p||(a=riga.next-1)}else O.add("manca endfor/loop",riga)}break;case"LOOP":var p=!0;riga.contenuto&&!R(await ae(amb,e,riga.contenuto))&&(p=!1),p&&(a=riga.prev-1);break;case"ENDFOR":if(!riga.contenuto||R(await ae(amb,e,riga.contenuto)))if(riga.for){var{v:n,elenco:$,valido:g}=riga.for;if(n&&$.length>0&&riga.for.nc<500)for(;;){if(riga.for.nc++,riga.for.nc<$.length){if(vari.add(n,$[riga.for.nc]),g&&R(await ae(amb,e,g)))continue;a=riga.prev;break}break}}else O.add("manca istruzione for",riga);break;case"BREAK":case"EXIT":case"EXITFOR":riga.next?riga.contenuto.trim()?R(await ae(amb,e,riga.contenuto))&&(a=riga.next):a=riga.next:O.add("break outside loop",riga);break;case"CONTINUE":riga.next?riga.contenuto&&!R(await ae(amb,e,riga.contenuto))||(a=riga.next-1):O.add("continue outside loop",riga);break;case"MSG":case"LOG":let _=await ae(amb,e,riga.contenuto);console.warn(_),O.add(_);break;default:{let a;if(riga.contenuto.startsWith("!")){a=await ae(amb,e,riga.contenuto);var S;d="";if(S=/^\!(\w+)[\s;,]\s*(.+)?$/gim.exec(a)){var F=S[1].toLowerCase(),o=x(S[2]||"");d=await te(a,F,o,vari,amb)}d&&se(t,d)}else options.parsefnpunto&&"function"==typeof options.parsefnpunto&&riga.contenuto.startsWith(".")?await options.parsefnpunto({dati:riga.contenuto,output:t,id:options.id,vari:amb.vari,amb:amb}):(a=await ae(amb,e,riga.contenuto),se(t,a))}}a++}return t}async function oe(e,amb,t,a,r){var i=e.genera[t];if(i){r.counter2=0;var s={},n=[];async function o(l){if(!(r.isTestmode&&r.counter>r.isTestmode)){if(l<i.vars.length){var c=i.vars[l];if(!s[c]){var f=await re(amb,e,c),h=Object.keys(f.rows);if(h&&h.length>0){for(var d of h)n.push(d),amb.vari.add(f.name,f.tovar(d)),s[c]=!0,await o(l+1),s[c]=!1,n.pop();return}p("manca la variante",c)}}for(var u of i.calcola)e.formula[u]&&await ne(amb,e,e.formula[u],{limited:!0});for(var u of i.exclude){if(e.formula[u])if(w=await ne(amb,e,e.formula[u],{limited:!0}))for(var v of w){if(R(v))return}}var m=await ne(amb,e,i.codice,{limited:!0,localvar:e.localvar}),g={};for(var u of i.bom)if(e.formula[u]){var w=await ne(amb,e,e.formula[u],{limited:!0});for(var v of w=w.join("\n").split("\n"))if(v){var b=x(v);g[u]||(g[u]=[]);for(var $={},y=0;y<b.length;y++)$[`c${y}`]=b[y];g[u].push($)}}await async function(e,t,a,r,i,s){var n=!0;for(var o of t){var l=x(o);if(l[0]&&!s[l[0]]){s[l[0]]=1,s.counter++,s.counter2++;for(var c={__id:s.counter},f=0;f<l.length;f++){var h=r.head[f]?r.head[f]:`c${f}`;"#"==h[0]?c[h=h.substr(1)]=R(l[f]):c[h]=l[f]}await e(i,c,n?a:void 0,s.counter,s.counter2),n=!1}}}(a,m,g,i,t,r)}}await o(0)}}const le=/^\s*\{(\:)?(var|deriva|valid|formula|header|genera|g|v|f|h)(\s.*)?\}/i;function ce(e,lines){let t=!1;for(var a=[],r=e;r<lines.length;r++){let e=lines[r].trim(),o=e.split("//")[0].trim();if(e.startsWith("/*"))t=!0;else if(t&&e.endsWith("*/"))t=!1;else if(!t){if(le.test(e))return{fl:!0,i2:r-1,cols:a};if(o.endsWith("\\"))return{fl:!1};if(e.startsWith(":h ")&&(o=o.substr(3).trim()),!o.startsWith(":"))for(var i=x(o),s=0;s<i.length;s++){var n=i[s].length;i[s].includes(",")&&(n+=2),(!a[s]||a[s]<n)&&(a[s]=n)}}}return{fl:!0,i2:lines.length-1,cols:a}}const fe=["l","a","p"],he=/^\{(\:?(var|valid|formula|genera|header|v|f|g|h))[\s|\}]/im,de=["s","g","h","p","q"];function ue(vari,e){var t=e.split("\n");for(var a of t)if(a.trim()){if(R(vari.valutasync(a)))return!0}return!1}class ve{constructor(amb,e){var{name:e,cat:cat}=$(e,amb.cat||"");this.name=e,this.cat=cat,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 e=[];return this.errori.forEach((t=>e.push({e:t}))),e}getparametri(){let e={};if(this.dims&&fe.forEach((t=>{let a=R(this.amb.vari.var(t));a&&(e[t]=String(a))})),this.head){for(var t of this.head)if(!t._h){var a=this.amb.vari.var(t.cod);de.includes(t.t)||"string"==typeof a&&(a=a.split(",")[0]),e[t.cod]=a}}else if(this.parametri?._)for(var t of this.parametri._){let r=(t.split("=")[0]||"").trim().toLowerCase();a=((a=this.amb.vari.var[r])||"").split(",")[0],e[r]=a}return e}async setparametri(e){let t={};for(var a of(e||(e={}),this.dims&&fe.forEach((t=>{let a=e[t]||this.dims[t].val;a=parseFloat(a)||0,this.dims[t].visible&&(a<this.dims[t].min&&(a=this.dims[t].min),a>this.dims[t].max&&(a=this.dims[t].max)),e[t]=String(a)})),this.head))"g"!=a.t&&("z"!=a.t||e[a.cod]||(e[a.cod]="1"),a._v=e[a.cod],t[a.cod]=!0);for(var a in e)t[a]||(t[a]=!0,await ie(this.amb,this,a,e[a]));return this.head?.length>0&&await this.setparametro(this.head[0].cod,e[this.head[0].cod]||void 0,!0),this.getparametri()}async setparametro(e,t,a=!1){if(t&&t.includes("$")&&(t=await ae(this.amb,this,t)),this.head){const r=async(riga,e,t)=>{let a=riga?.cod;if(riga.valid&&!riga._h1){let e=!ue(this.amb.vari,riga.valid);if(riga._h!=e&&(riga._h=e,["g","g1","g2"].includes(riga.t)))for(let e=t+1;e<this.head.length;e++){let t=this.head[e];if(t){if(["g","g1","g2"].includes(t.t))break;t._h1=riga._h}}}if(riga._h||riga._h1)return this.amb.vari.add(a,""),riga._v=void 0,"";{if(delete riga._h2,riga.visible){let e=!ue(this.amb.vari,riga.visible);if(e&&(riga._h2=e),["g","g1","g2"].includes(riga.t))for(let e=t+1;e<this.head.length;e++){let t=this.head[e];if(t){if(["g","g1","g2"].includes(t.t))break;riga._h2?t._h3=riga._h2:delete t._h3}}}let r=this.amb.vari.var(a)||"";if("string"==typeof r&&(r=r.split(",")[0]),"z"!=riga.t||r||(this.amb.vari.add(a,"1"),r="1"),"m"==riga.t&&riga.spars){let e=x(riga.spars);r=parseFloat(r||e[0])||0,e[1]&&parseFloat(r)<e[1]&&(r=parseFloat(e[1])||0),e[2]&&parseFloat(r)>e[2]&&(r=parseFloat(e[2])||0),r=String(r),this.amb.vari.add(a,r)}let i=await ie(this.amb,this,a,e||riga._v||r,riga);return riga._v=void 0,r=this.amb.vari.var(a)||"",this.amb&&this.amb.deriva&&this.amb.deriva.length>0&&this.amb.deriva.filter((t=>t.cod==a&&((!t.item||t.item==this.amb.item)&&((!t.model||t.model==this.amb.model)&&((!t.rule||t.rule==this.amb.rule)&&(!t.opz||t.opz==e)))))),i}};let i,s=-1;if("#dim"==e)a=1;else{if(s=this.head.findIndex((t=>t.cod===e)),s<0)return;let a=this.head[s];i=await r(a,t,s),delete a._d}if(a)for(let e=s+1;e<this.head.length;e++)await r(this.head[e],void 0,e);return i}return await ie(this.amb,this,e,t)}async impostaparametri(e,t,a=!1){if(this.head)for(var r of(this.paralias||(this.paralias={}),Array.isArray(this.head)||(this.head=[]),this.head))r._v="",delete r._h,delete r._h1,delete r._h2,r.alias&&(this.paralias[r.cod]=r.alias);for(var i of(e||(e=[]),t||(t=[]),[...e,...t])){if((r=i.indexOf("="))>0){let e=w(i.substr(0,r));e.includes("$")&&(e=await ae(this.amb,this,e));let t,a=i.substr(r+1);a.includes("$")&&(a=await ae(this.amb,this,a)),this.head&&(t=this.head.find((t=>t.cod==e)))?t._v=a:await ie(this.amb,this,e,a)}}if(this.head){let e=!0;for(var s of this.head){let t=await this.checkvalid(s.valid);a&&(t=!0),["g","g1","g2"].includes(s.t)?e=t:e&&t&&await this.setparametro(s.cod,s._v)}}}async checkvalid(e){if(!e)return!0;return!!R(await ae(this.amb,this,e))}getmacrostr(){return JSON.stringify(this.getmacro())}getmacro(){return S(this,["amb"])}setmacro(e){if(k(this,F(e,{})),this.localvar)for(var t in this.localvar){k(e=new Q,this.localvar[t]),this.localvar[t]=e}}async load(e,t){try{var a,{name:r,cat:cat}=$(e||this.name,t||this.cat||"");if(this.name||(this.name=r),this.cat||(this.cat=cat),this.azzera(),h&&("string"==typeof(a=await h(cat,r))&&(a.startsWith("{")||a.startsWith("["))&&(a=F(a)),a&&a.head&&!Array.isArray(a.head)&&(a.head=[]),a.head&&(a.dims=function(dims){let e;try{e="object"==typeof dims&&dims?dims:JSON.parse(dims||"{}")}catch(e){}return e||(e={}),e.l||(e.l={visible:1,val:1e3,min:0,max:1e4}),e.a||(e.a={visible:1,val:1e3,min:0,max:1e4}),e.p||(e.p={visible:1,val:1e3,min:0,max:1e4}),e}(a.dims))),a){if("string"==typeof a)await this.parsedata(a);else for(var i in a)this[i]=a[i];return!0}O.add(`missing cbGetFile: ${cat}/${r}`)}catch(e){O.add(c(e),`macro.load: ${r}/${cat}`)}}async loadAndCompile(e,cat,t=!1){var a,{name:r,cat:cat}=$(e,this.cat||cat);return this.azzera(),v&&(a=await v(cat,r)),a?(await this.parsedata(a,t),this.getmacro()):void O.add(`missing cbGetFile: ${r}/${cat}`)}async#t(e,t,a,r){var i,{name:s,cat:cat}=$(e,this.cat);if(v&&(i=await v(cat,s)),!i)return[];if(i.includes("$1")&&r&&r.length>0)for(var n=1;n<r.length;n++)i=i.replaceAll(`$${n}`,r[n]);var o=X(i),l=[];for(var c of(t&&(o=o.filter((e=>!/^\{(\:?(var|valid|formula|header|genera|v|f|h))[\s|\}]/im.test(e)))),o)){const e=he.exec(c);if(e)t=!e[1].startsWith(":"),l.push(c);else{const e=/^\s*\{i\s(.+)?\}/im.exec(c);if(e){r=x(e[1]);if(!a.includes(r[0])){a.push(r[0]);var f=await this.loadinclude(r[0],t,a,r);Array.isArray(f)&&l.push(...f),a.pop()}}else l.push(c)}}return l}async parsedata(e,t=!1){if(this.azzera(),!e)return;var a=[],r=X(e),i=!1;let s=[];for(var n of r){const e=he.exec(n);if(e)i=!e[1].startsWith(":"),a.push(n);else{const e=/^\s*\{i\s(.+)?\}/im.exec(n);if(e){var o=x(e[1]),l=await this.#t(o[0],i,[o[0]],o);Array.isArray(l)&&a.push(...l)}else a.push(n)}}i=!1;var c=this.codice;for(var n of a){const e=he.exec(n);if(e)if(e[1].startsWith(":"))c=this.codice;else switch(e[1]){case"genera":case"g":if(d=/^\s*\{(genera|g)\s+(.+)?\}/im.exec(n)){var f=y(x(d[2])[0]);this.genera[f]=[],c=this.genera[f]}else(c=this.errori).push(n);break;case"valid":c=this.valid;break;case"var":case"v":if(d=/^\s*\{(var|v)\s+(.+)?\}/im.exec(n)){var h=x(d[2]);f=y(h[0]);this.localvar[f]={name:f,des:h[1]||"",rows:[]},c=this.localvar[f].rows}else(c=this.errori).push(n);break;case"formula":case"f":var d;if(d=/^\s*\{(formula|f)\s+(.+)?\}/im.exec(n)){f=y(d[2]);this.formula[f]=[],c=this.formula[f]}else(c=this.errori).push(n);break;case"h":case"header":c=s;break;default:this.errori.push(n),c=this.errori}else n.startsWith("{")&&(c=this.codice),c.push(n)}for(var u in this.parametri={},this.codice=this.cleanfiltraparametri("_",this.codice,t),this.formula)this.formula[u]=this.cleanfiltraparametri(u,this.formula[u],t);for(var u in this.localvar){var v=new Q,m=this.localvar[u];for(var p of(v.setheader(u,this.cat),v.rows={},m.rows)){var g=(E=x(p))[0].trim().toLowerCase();v.rows[g]={annulla:0,v:E}}m.des&&(v.des=m.des),this.localvar[u]=v}r=this.valid;for(var n of(this.valid=[],r)){(S={v:(S=b(n,",")).v,msg:S.o}).v&&(S.v.startsWith("#")?this.formula[S.v.substring(1)]&&this.valid.push(S):this.valid.push(S))}r=s;var $=[];for(var n of r){if(C=/^\s*([\w\-\_]+)+[\;\,\s]\s*(.*)?$/im.exec(n)){var E;o=x(C[2]);let e;if(E=w(C[1]))for(var k of(e=$.find((e=>e.cod==E)),e||(e={cod:E,t:"t"},$.push(e)),o)){var S;switch((S=b(k)).v){case"t":e.t=S.o;break;case"def":case"default":e.def=S.o;break;case"valid":case"colonna":case"hidden":S.o.startsWith("#")?this.formula[S.o.substring(1)]&&(e[S.v]=S.o):e[S.v]=S.o;break;default:e[S.v]=S.o}}}}this.head=$;r=this.genera;var F={};for(var O in r)if(Array.isArray(r[O])){var _={codice:[],head:"",calcola:[],bom:[],vars:[],exclude:[]};const e=/^\s*[\!\:]\s*(\w+)\s*(.*)$/i;for(var L of r[O]){var C;if(C=e.exec(w(L)))switch(C[1]){case"calcola":case"c":_.calcola=[..._.calcola,...x(C[2])];break;case"exclude":case"e":case"escludi":_.exclude=[..._.exclude,...x(C[2])];break;case"bom":case"db":_.bom=[..._.bom,...x(C[2])];break;case"vars":case"v":_.vars=[..._.vars,...x(C[2])];break;case"head":case"h":_.head=x(C[2]);break;default:this.errori.push(`genera ${O} => ${L}`)}else _.codice.push(L)}_.codice=q(_.codice,!0),F[O]=_}this.genera=F}cleanfiltraparametri(e,codice,t){if(this.paralias||(this.paralias={}),codice&&codice.length){var a=!1;const t=e=>{let t=[],a=x(e);for(var r of a)if(r.includes(":")){let e=r.split(":");this.paralias[e[0]]=e[1],t.push(e[0])}else t.push(r);return t};for(var r=0;r<codice.length;r++){let i=/^\:p[;,\s]+(.*)?$/im.exec(codice[r]);if(i)codice[r]=null,a=!0,this.parametri[e]=t(i[1]);else{let i=/^!(parametri|pars|p)[;,\s]+(.*)?$/im.exec(codice[r]);i&&(codice[r]=null,a=!0,this.parametri[e]=t(i[2]))}}a&&(codice=codice.filter((e=>null!=e)))}return codice=q(codice,t)}}class me{constructor(){this.barre={}}azzera(){this.barre={}}oriented(e,t,a,r){switch(e=(e||"1").substr(0,1).toLowerCase()){case"0":break;case"l":return{t:"l",x:t};case"a":return{t:"a",x:a};case"p":return{t:"p",x:r};case"2":return{t:e,x:t,y:r,z:a};case"5":return{t:e,x:t,y:a,z:r};case"4":return{t:e,x:r,y:t,z:a};case"3":return{t:e,x:a,y:r,z:t};case"6":return{t:e,x:r,y:a,z:t};default:return{t:"1",x:a,y:t,z:r}}}async getcode(e,t,a,r,i){let[s,n]=e.split(":");n=n||"";var o=async(e,s)=>{var n=this.barre[e];if(!n&&i&&((n=await i(e))||(n={t:"1",r:[]}),this.barre[e]=n,n.coderr&&"errore"!=n.coderr||(n.coderr=`#err_${e}`)),!n||0==n.r.length)return{extra:{err:"missing codicebarra"},c:`#err_${e}`,fm:10};var{t:l,x:c,y:f,z:h}=this.oriented(e,t,a,r),d={barra:e,fm:n.fm,t:l,liv:s,items:n.r.length,err:""},u=n.r;if(h){var v=u.filter((e=>e.z===h||!e.z));v.length>0?u=v:d.err=`spessore non coerente: ${h}`}if("l"==l||"a"==l||"p"==l){if(l=u.find((e=>e.x>=c)))return{c:l.c,fm:l.x==c?0:1,x1:l.x,x:c,extra:d}}else{var l;if(l=u.find((e=>e.x==c&&e.y==f)))return{c:l.c,fm:0,x:c,y:f,z:h,x1:l.x,y1:l.y,z1:l.z,extra:d};if(0!=n.fm&&(l=u.find((e=>e.x>=c&&e.y==f))))return{c:l.c,fm:1,x:c,y:f,z:h,x1:l.x,y1:l.y,z1:l.z,extra:d};if(0!=n.fm&&2!=n.fm&&(l=u.find((e=>e.x>=c&&e.y>=f))))return{c:l.c,fm:2,x:c,y:f,z:h,x1:l.x,y1:l.y,z1:l.z,extra:d}}return n.codalt&&s<5?await o(n.codalt,s+1):{c:n.coderr,fm:9,x:c,y:f,z:h,extra:d}};return await o(s,0)}compila(e,t){t||(t={});var a={};if(Array.isArray(e)){for(var r of e)if(r.cod=w(r.cod),r.barcode=w(r.barcode),r.barcode.length>2&&"+"==r.barcode[0]){r.barcode=r.barcode.substr(1);var i=this.oriented(r.barcode.substr(0,1),r.l,r.a,r.p);i.c=r.modello?{c:r.cod,m:r.modello}:r.cod,a[r.barcode]||(a[r.barcode]={t:r.barcode.substr(0,1),r:[]},t[r.barcode]&&(a[r.barcode]=Object.assign(t[r.barcode],a[r.barcode]))),a[r.barcode].r.push(i)}for(var s in a){a[s].r.sort(((e,t)=>e.y?1e4*(e.x-t.x)+(e.y-t.y):e.x-t.x))}}this.barre=a}}function pe(e){var t=X(e,!1),a=(e={},{r:[]}),r=!1;for(var i of t){var s=/^\s*\{(h|head|header)\s+(\w+)\}/im.exec(i);if(s)a={cod:s[2],des:s[2],r:[]},r=!1,e[s[2]]=a;else if(!/^\s*\:/.exec(i)){var n,o=i.split(","),l={cod:w(o[0])};(n=(o[1]||"").trim())&&(l.des=n),(n=w(o[2]))&&(l.tipo=n),(n=w(o[3]))&&(l.alias=n),(n=w(o[4]))&&(l.valid=n),(n=w(o[5]))&&(l.visible=n),l.cod&&(r||"sep"!=l.tipo?a.r.push(l):(a.des=l.des,a.valid=l.valid,a.visible=l.visible,r=!0))}}return e}function ge(e){var t=X(e.toLowerCase(),!1),a={};for(var r of t)if(!/^\s*\:/.exec(r)){var i=x(r);i[0]&&i[1]&&(a[i[0]]=i[1])}return a}class we{#a=void 0;#r=void 0;#i=void 0;#s=void 0;constructor(cat=".",e=100,t=!1){this.righevuote=t,this.maxdelays=e,this.setcatalog(cat)}setcatalog(cat){return cat=w(cat),this.cat!=cat&&(this.cat=cat,this.item=this.rule=this.model="",this.azzera(!0)),cat}get muvalutatore(){return{getcolonne:x,muCalc:R,muEval:ne,tipifree:de}}azzera(e=!1){this.vari=new K,this.ruleheader="",e&&(this.macro={},this.varianti={},this.varelenco={},this.macroelenco={},this.scripts={},this.#a=void 0,this.#r=void 0,this.#i=void 0,this.#s=void 0)}async#n(cat){u&&(this.varelenco[cat]||(this.varelenco[cat]=await u("headers",cat,"_varianti"),this.varelenco[cat]||(this.varelenco[cat]=[])))}parseheaderfrominfo(e){if(e&&e.length>0)for(var t of e)switch(t.tipo){case"_headers":t.value,t.value=pe(t.value),this.#a=t.value||{};break;case"_alias":t.value,t.value=ge(t.value),this.#r=t.value||{};break;case"_typos":t.value;var a=F(t.value);for(var r in a){var i=a[r];i.db&&(i.db=q(X(i.db))),i.list&&(i.list=q(X(i.list)))}t.value=a,this.#s=t.value||{}}}setitem(item,e,model,t){this.item=w(item,!0),this.rule=w(e,!0),this.model=w(model,!0),this.data=t||(new Date).toInt()}async getheader(cod){if(!this.#a&&u){var e=await u("headers",this.cat,"_headers");this.parseheaderfrominfo(e)}return this.#a||(this.#a={}),this.#a[cod]}async getalias(){if(!this.#r&&u){var e=await u("headers",this.cat,"_alias");this.parseheaderfrominfo(e)}return this.#r||(this.#r={}),this.#r}get deriva(){return this.#i,this.#i||[]}async getmacro(riga){try{if("string"==typeof riga&&(riga={tipo:"M",contenuto:riga}),!riga||!riga.contenuto)return;var e=/^([\(\{\}\)\:\$\w\.\\\/]+)[\s\;\,]*(.*)?$/im.exec(riga.contenuto);if(!e)return void O.add("Macro non valida:"+riga.contenuto,riga);(macro=w(e[1])).includes("$")&&(macro=await this.vari.valuta(macro));var t=x(e[2]),{name:a,cat:cat}=$(macro,this.cat);this.cat=cat;var macro,r=`${cat}/${a}`;if(!this.macro[r]){var i=new ve(this,a);await i.load()?this.macro[r]=i:O.add(`macro fail to load ${r}`,riga)}return(macro=this.macro[r])?{macro:macro,pars:t}:(O.add(`macro non trovata ${r}`,riga),{})}catch(e){O.add(c(e),`ambiente.getmacro: ${riga?.contenuto}`)}}async varcompila(e,t){var a=new Q(this);(await a.load(e,this.cat,!0),a.alias)&&((await this.getalias())[e]=a.alias);t("variants",{cod:e,des:a.des||"",alias:a.alias,info:a.alias?"":JSON.stringify(S(a,["amb"]))})}async macrocompila(e,t){var a=new ve(this,e);await a.loadAndCompile(`${e}.mu`);var r=a.getmacro();t("macros",{cod:e,info:JSON.stringify(r),isgenera:a.isgenera,isheader:a.isheader,iscodice:a.iscodice})}async barrecompila(e,t,a){var r=new me;for(var i in r.compila(e,t),r.barre){a("barcodes",{cod:i,des:"",info:JSON.stringify(r.barre[i])})}return r}async tojson(e){let t;return d&&(t=await d("json",e)),t}async compila(e,t){if(t){for(var a of e.var)await this.varcompila(a,t);for(var a of e.mu)await this.macrocompila(a,t);if(t("infos",{cod:"info",des:e.cat,info:JSON.stringify({cat:e.cat,md:e.info})}),this.#a=void 0,this.#r=void 0,this.#i=void 0,this.#s=void 0,u){var r=await u("headers",this.cat,["_headers","_alias","_deriva","_typos"]);this.parseheaderfrominfo(r)}this.#a?t("infos",{cod:"headers",des:"",info:JSON.stringify(this.#a)}):p("missing headers"),this.#r&&t("infos",{cod:"alias",des:"",info:JSON.stringify(this.#r)}),this.#i&&t("infos",{cod:"deriva",des:"",info:JSON.stringify(this.#i)}),this.#s&&t("infos",{cod:"typos",des:"tipologie",info:JSON.stringify(this.#s)})}}async getvariante(cod){var{name:e,cat:cat}=$(cod,this.cat),t=e;if(cat==this.cat&&this.#r&&this.#r[e]&&(t=this.#r[e]),await this.#n(cat),!this.varelenco[cat]||this.varelenco[cat].includes(e)){var a=`${cat}/${t}`;if(!this.varianti[a]){var r=new Q(this);await r.load(a,cat),this.varianti[a]=r}return this.varianti[a]}}async getheaderfromdb(e){let{head:t,rows:a,macros:r,deriva:i}=await u("header",this.cat,e,!this.#i);this.#i||(this.#i=i),await this.#n(this.cat),t.cod=w(t.cod),t.rule=w(t.rule),t.ruledef=t.ruledef||[];let s=new Set;for(var n of a){n.cod=w(n.cod),n.alias=w(n.alias),n.t=w(n.t);let e=n.alias?n.alias:n.cod;if(!this.varianti[`${this.cat}/${e}`]){let t=this.varelenco[this.cat];t&&t.includes(e)&&s.add(e)}}if(s=[...s],s.length&&f){var o=await f(this.cat,s);if(o&&o.length)for(var l of o){let{name:e,content:t}=l,a=new Q(this);a.setheader(e,this.cat),t&&await a.loadContentExtended(t),this.varianti[a.key]=a}}return{head:t,rows:a,macros:r}}async getlinkedmacros(e,t){var a=e=>e.includes("/")?e:`${this.cat}/${e}`;let r,i=[];if(e&&(r=a(e),this.macro[r]||i.push(e)),t&&"string"==typeof t){let e=t.split(";");for(var s of e)r=a(s),this.macro[r]||i.push(s)}if(i&&i.length>0&&h){let e=await h(this.cat,i);if(e&&e.length>0)for(var n of e){let e=new ve(this,n.name);for(var o in n.content){let t=n.content[o];e[o]=t}this.macro[e.key]=e}}}async setruleheader(e,t){var{name:a,cat:cat}=$(e,this.cat),r=`${cat}/${a}`;if(!this.macro[r]){let{head:t,rows:n,macros:o}=await this.getheaderfromdb(a);await this.getlinkedmacros(t.rule,o);var i=new ve(this,a);if(!t)return void O.add("Missing rule: "+e);if(t.rule){let e=this.macro[`${cat}/${t.rule}`];if(e)for(var s in e)["cat","name","key"].includes(s)||(i[s]=e[s])}n&&n.length&&(i.head=n),this.macro[r]=i}this.ruleheader=r;let n=this.macro[r];return O.azzera(),await n.setparametri(t),n}getruleheader(){return this.macro[this.ruleheader]}async setvariante(cod,e){return await ie(this,null,cod,e)}async valuta(codice){let e;return"string"==typeof codice&&(codice=q(X(codice,this.righevuote))),Array.isArray(codice)&&(p("m1",codice),e=await ne(this,null,codice)),e}setinfos(e){e&&(this.#a=e.headers,this.#r=e.alias,this.#i=void 0,this.#s=e.typos)}}Date.prototype.toInt||(Date.prototype.toInt=function(){const e=this;return e.getDate()+100*(e.getMonth()+1)+1e4*e.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 be={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:$e,Reset:ye,Bold:xe,Reverse:Ee,Red:ke,Green:Se,Yellow:Fe,Blue:Oe,Magenta:_e,Cyan:Le,White:Ce}=a();var Ie=o(process.argv);console.log("----------------------------------------------------------------------------------------"),console.log(`${xe}${Le}${xe}Markuno:${ye} command line utility del linguaggio (c) Croswil 2024 v. ${Fe}1.0.88${ye}`),console.log("----------------------------------------------------------------------------------------");var Ae={FOLDERBASE:"./",DBWORK:"./data/app.db",FOLDERCAT:"./data/mu",FOLDEROUT:"./out",CAT:"cat"};const De=".lasts.markuno";e.existsSync(De)&&(Ae=JSON.parse(e.readFileSync(De)));var je=Ie._;(Ie.h||Ie.help||!je[2])&&(console.log(`Uso: ${xe}markuno <funzioni> <[catalogo/]markuno> [opzioni]${ye} \n${xe}${Le}Funzioni:${ye} (seleziona una tra le seguenti)\n ${Ce} c, compila ${ye}${Se} compila un catalogo/Markuno + Codici Barra\n ${Ce} d, dump ${ye}${Se} compila e salva il compilato in formato json\n ${Ce} e, esegui ${ye}${Se} esegui un file markuno \n ${Ce} f, formatta ${ye}${Se} Formattazione di un file .mu o .var\n ${Ce} g, genera${ye}${Se} generatore di codice \n ${Ce} w, watch ${ye}${Se} abilita il watch su un file markuno \n ${Ce} gw <markuno> <maxele> ${ye}${Se} Genera con wath (solo i primi maxele=20 elementi senza salvare\n${xe}${Le}Opzioni:${ye}${Se}\n ${Ce} -h, --help${ye}${Se} mostra l'help\n ${Ce} -c, --cat <cat>${ye}${Se} catalogo (default='${Ae.CAT}' ) \n ${Ce} -d, --dbwork ${ye}${Se} database principale (default='${Ae.DBWORK}')\n ${Ce} -i, --init <folder>${ye}${Se} cartella di lavoro (default='${Ae.FOLDERCAT}' ) \n ${Ce} -o, --out <folder>${ye}${Se} cartella di output (default='${Ae.FOLDEROUT}' ) \n ${Ce} -x, --xlsx${ye}${Se} output in formato excel (generatore)\n `),process.exit(0));let ze=0;const Ne="./",Te=Ie.d||Ie.dbwork||Ae.DBWORK,Me=Ie.i||Ie.init||Ae.FOLDERCAT,We=Ie.o||Ie.out||Ae.FOLDEROUT,Re=Ie.c||Ie.cat||Ae.CAT;var Je=void 0,Ue=!1;e.existsSync(Me)||Pe(`Manca la cartella di lavoro: ${Me}`),Ae=Object.assign(Ae,{FOLDERBASE:Ne,DBWORK:Te,FOLDERCAT:Me,FOLDEROUT:We,CAT:Re}),e.writeFileSync(De,JSON.stringify(Ae,null,2)),e.existsSync(Me)||e.mkdirSync(Me,{recursive:!0});const Ve=Ie.x||Ie.xlsx;function Pe(e){var t=e.stack.toString().split("\n");t.splice(0,1),t=t.filter((e=>!/module/.test(e)&&!/node\:/.test(e))),console.log(`${ke}${e.message}${ye}\n${t.join("\n")}`),process.exit(1)}function Be(cat){var a=t.join(Me,`mu_${cat}.db`);e.existsSync(a)||s(a,be,"mus"),console.log("DB",a);var i=r.db(a);return n(be),i}function Ke(t){var a="",r="",i=`${t}.txt`;e.existsSync(i)&&(a=e.readFileSync(i).toString());i=`${t}.md`;return e.existsSync(i)&&(r=e.readFileSync(i).toString()),{def:a,md:r}}function Ge(cat,a){var r=e.readdirSync(a),i={cat:cat,info:"",mu:[],var:[],inc:[]};for(var s of r){var n=t.join(a,s),o=t.extname(s),l=t.basename(s,o);"__info.md"==s?i.info=e.readFileSync(n).toString():".mu"==o?i.mu.push(l):".var"==o?i.var.push(l):".inc"==o&&i.inc.push(l)}return i}async function Xe(e,t,a){const r=await import("xlsx"),i=r.utils.json_to_sheet(e),s=r.utils.book_new();r.utils.book_append_sheet(s,i,t),r.writeFile(s,`${a}.xlsx`,{compression:!0})}async function qe(e,t){const a=await import("xlsx");var r=a.readFile(e).Sheets[t];return a.utils.sheet_to_json(r)}async function cbGetMacro(cat,t){var a=`${Me}/${cat}/${t}.mu`;return e.existsSync(a)?e.readFileSync(a).toString():""}async function cbGetVariante(cat,t){var a=`${Me}/${cat}/${t}.var`;return e.existsSync(a)?e.readFileSync(a).toString():(O.add(`missing var: ${cat}, ${t}`,{t:"cbGetVariante"}),"")}async function cbFunc(e,t,a){O.add(`missing fun: ${e}`,{t:"cbFunc"})}async function cbInfo(t,cat,a){if(Array.isArray(a)){var r=[];for(var i of a){var s=await cbInfo(t,cat,i);s&&r.push({tipo:i,value:s})}return r}switch(t){case"filter":if(!Je||!a&&!a[0])return[];if(Ue)return[];var n=Je.all("select item,model,rule,varfilter,result,result2,exclude,exclude2 from limits where variant=?",a[0]);for(var o of n)o.valfilter=JSON.parse(o.varfilter||"{}"),o.result=JSON.parse(o.result||"[]"),o.result2=JSON.parse(o.result2||"[]");return n;case"headers":var l;return l="_typos"==a?`${Me}/${cat}/typos.json`:`${Me}/${cat}/${a}.inc`,e.existsSync(l)?e.readFileSync(l).toString():""}}async function cbGetFile(cat,a){if(e.existsSync(t.join(Ne,a)))return e.readFileSync(t.join(Ne,a)).toString();const r=`${Me}/${cat}/${a}`;if(e.existsSync(r))return e.readFileSync(r).toString();O.add(`missing file: ${r}`,{t:"cbGetFile"})}function He(cat,a){var r=t.extname(a);[".mu",".var",".inc"].includes(r)||(r=".mu",a+=".mu");var i=t.join(Me,cat||Re),s=t.join(Ne,a);if(e.existsSync(s))return{file:s,folder:i,diversi:!0};var n=a.indexOf("/");if(n>0&&(cat=a.substr(0,n),a=a.substr(n+1),i=t.join(Me,cat||Re),!e.existsSync(i)))throw new Error("missing folder: "+i);if(s=t.join(i,a),e.existsSync(s))return{file:s,folder:i,diversi:!1,ext:r};throw new Error(`non trovato il file: ${a} su ${i}`)}async function Ye(amb,t){var{file:a,folder:r,diversi:i}=He(amb.cat,je[3]||""),s=parseInt(je[4]||"10");console.log(`Start Watching: ${Le}${xe}${a}${ye}`),e.watch(r,(async(e,a)=>{a&&await t(amb,s)})),i&&e.watch(a,(async(e,a)=>{a&&await t(amb,s)})),await t(amb,s)}async function Ze(amb,a){var{file:r,folder:i,diversi:s}=He(amb.cat,je[3]||"");if(!e.existsSync(r))throw new Error("Manca il file: "+r);var n=t.extname(r),o=t.basename(r,n),l=new ve(amb,o),c=(new Date).valueOf();await l.loadAndCompile(`${o}${n}`);var f=(new Date).valueOf(),h={},d={},u=[],v=[],m=[];if(await async function(macro,amb,e,t,a=0){if(macro.isgenera&&t){var r={counter:0,keys:{},isTestmode:a};for(var i in macro.genera)await oe(macro,amb,i,t,r);return!0}}(l,amb,0,((e,t,r,i,s)=>{if(a){var n=[];for(var o in t){var l=t[o];if("number"==typeof l&&(l=Math.round(1e4*l)/1e4+""),"__id"!=o){var c=n.length;m[c]||(m[c]=o,v[c]=o.length),v[c]<l.length&&(v[c]=l.length),n.push(l)}}u.push(n)}else{var f=e.split("_")[0]||f;if(h[f]||(h[f]=[]),h[f].push(t),t.cod&&(d[f]=!0,r))for(var p in r){var g=`${f}_${p}`;h[g]||(h[g]=[]);var w=r[p];for(o=0;o<w.length;o++){var b=w[o];h[g].push({padre:t.cod,i:o,comp:b.c0,qt:R(b.c1),des:b.c2})}}}}),a),a){for(var p=0;p<m.length;p++)m[p]=m[p].padEnd(v[p]," ");for(var g of(console.log(`${Fe}${m.join(" | ")}${ye}`),u)){for(p=0;p<g.length;p++)g[p]=g[p].padEnd(v[p]," ");console.log(g.join(" | "))}}else{var w=(new Date).valueOf(),b=0;for(var $ in d)b+=h[$].length,h[$].sort(((e,t)=>(e.cod||"").localeCompare(t.cod||"")));h._errori=l.geterrori(),e.writeFileSync(t.join(We,`gen_${o}.json`),JSON.stringify(h,null,2));const a=t.join(We,`gen_${o}.xlsx`);var y=(new Date).valueOf();if(Ve){const e=await import("xlsx"),t=e.utils.book_new();for(var x in h){const a=e.utils.json_to_sheet(h[x]);e.utils.book_append_sheet(t,a,x)}e.writeFile(t,a,{compression:!0})}else e.existsSync(a)&&e.unlinkSync(a);var E=(new Date).valueOf();console.log(`${Fe}${xe}EVAL........: ${b}${ye}${Le} rows\n${Le}load/compile: ${xe}${Fe}${f-c}${ye}${Le} ms.\n${Le}generate....: ${xe}${Fe}${w-f}${ye}${Le} ms.\n${Le}save JSON...: ${xe}${Fe}${y-w}${ye}${Le} ms.\n${Le}save XLSX...: ${xe}${Fe}${E-y}${ye}${Le} ms.\n--------------------------------\n${Le}${xe}TOTALE......: ${Fe}${E-c}${ye}${Le} ms.`)}}async function Qe(amb){var{file:a,folder:r,diversi:i}=He(amb.cat,je[3]||""),s=(new Date).valueOf(),n=e.readFileSync(a).toString(),o=new ve(amb,je[3]||"");ze++,o.parsedata(n);var l=(new Date).valueOf(),c=await ne(amb,o,o.codice,{limited:!1,oldstyle:!0,localvar:o.localvar}),f=(new Date).valueOf();console.log(`${c.join("\n")}`),console.log(`${Fe}${xe}EVAL ${ze}${ye}: ${a} => ${Le}load:${xe}${Fe}${l-s}${ye}${Le}ms. -- exec:${xe}${Fe}${f-l}${ye}${Le}ms.${ye}\n----------------------------------------------\n${O.toString()}`),e.writeFileSync(t.join(We,"logs.json"),JSON.stringify({loadandcompile:l-s,execute:f-l,vari:amb.vari.dump(),codice:o.codice,errori:o.errori},null,2)),e.writeFileSync(t.join(We,"out.txt"),c.join("\n"))}await async function(){try{var amb=function(cat,cbGetMacro,cbGetVariante,cbFunc,cbInfo,cbGetFile,e){var t=new we(cat);return g(cbGetMacro,cbGetVariante,cbFunc,cbInfo,cbGetFile,e),t}(Re,cbGetMacro,cbGetVariante,cbFunc,cbInfo,cbGetFile),a=t.join(Me,Re);if(e.mkdirSync(We,{recursive:!0}),!e.existsSync(a))throw new Error(`Manca il catalogo: ${Re} su ${Me}`);var s=(new Date).valueOf();switch(je[2].trim().toLowerCase()){case"g":case"genera":await Ze(amb,0);break;case"d":case"dump":await async function(amb){var{file:a,folder:r,diversi:i}=He(amb.cat,je[3]||"");if(!e.existsSync(a))throw new Error("Manca il file: "+a);var s,n,o=t.extname(a),l=t.basename(a,o);if(console.log(l,o),".mu"==o){var c=new ve(amb,l);await c.loadAndCompile(`${l}${o}`),s=c.getmacro(),n=t.join(We,l+".json")}else".var"==o&&(s=await async function(cod,cat,amb){var e=new Q(amb);return await e.load(cod,cat),e}(l,Re,amb),n=t.join(We,l+".var.json"));s&&(e.writeFileSync(n,JSON.stringify(s,null,2)),console.log(`${Le}${xe}Dump: ${ye}${Fe}${n}`))}(amb);break;case"gw":await Ye(amb,Ze);break;case"c":case"compila":await async function(amb){var a,s,n=t.join(Me,Re);if(!e.existsSync(n))throw new Error("Manca il catalogo "+Re);if(!e.existsSync(Te))throw new Error("Manca il database di lavoro: "+Te);if(e.existsSync(Te))if((Je=r.db(Te)).esisteTabella("artbarre")){Ue=!0;var o=Je.all("select cod cod,des des,flfm fm,coderr coderr,codalt codalt from artbarre order by cod ");for(var l of(s={},o)){(d=l.cod.trim().toLowerCase().substr(1))&&(s[d]={des:l.des,fm:l.fm,coderr:l.coderr.trim().toLowerCase(),codalt:l.codalt.trim().toLowerCase()})}a=Je.all("select codicebarra barcode,diml l,dima a,dimp p,cod cod from articoli where codicebarra like ? order by codicebarra","+%")}else a=Je.all("select barcode,l,a,p,cod from items where barcode>'' order by barcode"),s={};else console.warn("MISSING DBWORK (barre e limits)");var c=Be(Re);c.begin(),c.run("delete from variants"),c.run("delete from macros"),c.run("delete from barcodes"),c.run("delete from extras");var f=Ge(Re,n);for(var h of(await amb.compila(f,((e,t)=>{if(t){if("macros"===e){var{def:a,md:r}=Ke(`${t.cod}.mu`);t.def=a,t.md=r}i(c,e,t,"mus")}})),f.var)){var d,u=`${n}/${h}.var.txt`;if(e.existsSync(u))(d=H(e.readFileSync(u).toString()))&&d.length&&i(c,"extras",{tipo:"l",cod:h,info:JSON.stringify(d)},"mus")}await amb.barrecompila(a,s,((e,t)=>{i(c,e,t,"mus")})),i(c,"infos",{cod:"info",des:f.cat,info:JSON.stringify({cat:f.cat,md:f.info})},"mus"),Je&&Je.chiudi();c.commit(),c.chiudi()}(amb),console.log(`Compilazione catalogo: ${ke}${xe}${Re}${ye}: ${Fe}${(new Date).valueOf()-s}ms.`);break;case"x":case"e":case"esegui":await Qe(amb);break;case"f":case"format":!function(amb){var{file:t,folder:a,diversi:r,ext:i}=He(amb.cat,je[3]||"");if(e.existsSync(t)){var s=e.readFileSync(t).toString(),n=".var"==i;s=function(e,t){let lines=e.split("\n"),a=[],r=0,i=!1,s=!1,n=[];var o=t;o&&(o=(f=ce(0,lines)).fl)&&(n=f.cols);for(let e=0;e<lines.length;e++){let t=lines[e],v=t.trim();var l=v.split("//");let m=l[0].trim();l.splice(0,1);let p=l.length?` // ${l.join("//").trim()} `:"";if(v.startsWith("/*"))i=!0,a.push(v);else if(i&&v.endsWith("*/"))i=!1,a.push(v);else if(i)a.push(t);else{var c=le.exec(v);if(c){var f;a.push(v),r=c[1]?0:1,/^\s*\{(var|deriva|header|v|h)(\s.*)?\}/i.test(v)?(o=(f=ce(e+1,lines)).fl)&&(n=f.cols):o=!1,s=!1;continue}if(o)if(m.startsWith(":")&&!m.startsWith(":h ")||!m)a.push(v);else{var h=" ";m.startsWith(":h ")&&(m=m.substr(3).trim(),h=":h ");for(var d=x(m),u=0;u<d.length;u++)d[u].includes(",")&&(d[u]=`"${d[u]}"`),d[u]=d[u].padEnd(n[u]," ");a.push(`${h}${d.join(" , ")} ${p}`)}else{let e=" ".repeat(r>=0?r:0);if(s)a.push(`${e} ${v}`);else{let t="";v.startsWith("#")&&(t=v.substring(1).split(" ")[0].toUpperCase(),v="#"+t+v.substring(t.length+1)),["IF","IFDEF","IFNDEF"].includes(t)?v.indexOf("#",2)<0?(a.push(`${e}${v}`),r++):(v=v.replace(/#([\w]+)/g,((e,t)=>"#"+t.toUpperCase())),a.push(`${e}${v}`)):["FOR","SELECT","FORVAR","VARIANTE","DO"].includes(t)?(a.push(`${e}${v}`),r++):["ELSEIF","ELSE","ELSEIFDEF","ELSEIFNDEF","CASE","CASES","DEFAULT"].includes(t)&&r>0?a.push(" ".repeat(r>0?r-1:0)+v):["ENDIF","ENDSELECT","LOOP","ENDFOR"].includes(t)?(a.push(" ".repeat(r>0?r-1:0)+v),r--,r<0&&(r=0)):v.startsWith("_ ")||v.startsWith(":")?a.push(v):a.push(e+v)}s=m.endsWith("\\")}}}return a.join("\n")}(s,n),e.writeFileSync(t,s),console.log(`formatted: ${n} ${Le}${xe}${t}${ye}`)}}(amb);break;case"w":case"watch":await Ye(amb,Qe);break;default:throw new Error("Funzione non contemplata (g,c,b,x)")}}catch(e){Pe(e)}}();export{Be as dbmu,Ge as getinfo,Ke as getinfofile,Xe as xlsexport,qe as xlsimport};
|
|
2
|
+
import fs from"fs";import path from"path";import{init,database,insertorupdate,checkdb,setstruttura}from"croswil_lib";import minimist from"minimist";
|
|
3
|
+
/**
|
|
4
|
+
* Esegue una semplice somma sincrona di due numeri
|
|
5
|
+
* @param {number} a - Primo numero da sommare
|
|
6
|
+
* @param {number} b - Secondo numero da sommare
|
|
7
|
+
* @returns {number} La somma dei due numeri
|
|
8
|
+
*/function quote(v){if((v=(v||"").trim()).length>1){if(v.startsWith('"')&&v.endsWith('"'))return v;if(v.startsWith("(")&&v.endsWith(")"))return v}return`"${v}"`}function hash(obj){let str="";if("string"==typeof obj||"number"==typeof obj)str=obj+"";else if("object"==typeof obj&&obj){const chiaviOrdinati=Object.keys(obj).sort(),separatore="\0";str=chiaviOrdinati.map((key=>`${key}${separatore}${String(obj[key])}`)).join(separatore)}let h1=2166136261,h2=2218511855;for(let i=0;i<str.length;i++){const char=str.charCodeAt(i);h1^=char,h1+=h1<<5^2779096485,h2^=h1,h2=((h2<<3)+char^2134516169)>>>0}return h1>>>=0,h1.toString(16)+h2.toString(16)}
|
|
9
|
+
/**
|
|
10
|
+
* Formatta un messaggio di errore rimuovendo informazioni non necessarie
|
|
11
|
+
* @param {Error|string} err - L'errore da formattare
|
|
12
|
+
* @returns {string} Il messaggio di errore formattato
|
|
13
|
+
*/function geterrdes(err){if(err&&"object"==typeof err){let errMsg=err.stack?.toString().replace(/^.*?node_modules.*$/gim,"")||err.message||"";errMsg=errMsg.replaceAll("/","_").replaceAll(".js","").replaceAll("\n\n","\n").replace(/\;\s+/gi,"\n"),err=errMsg}return(err=err.replace(/sqlite/gi,"SQL ")).replaceAll(";",",").trim()}let cbGetVariante$1,cbGetMacro$1,cbFunc$1,cbInfo$1,cbGetFile$1,cbLogga;
|
|
14
|
+
/**
|
|
15
|
+
* Funzione di logging che utilizza un callback personalizzato se disponibile
|
|
16
|
+
* @param {...any} args - Argomenti da loggare
|
|
17
|
+
*/const logga=(...args)=>{cbLogga?cbLogga(args):console.log(...args)};
|
|
18
|
+
/**
|
|
19
|
+
* Configura i callback utilizzati dal modulo
|
|
20
|
+
* @param {Function} cbGetMacro1 - Callback per recuperare macro
|
|
21
|
+
* @param {Function} cbGetVariante1 - Callback per recuperare varianti
|
|
22
|
+
* @param {Function} cbFunc1 - Callback per funzioni generiche
|
|
23
|
+
* @param {Function} cbInfo1 - Callback per informazioni
|
|
24
|
+
* @param {Function} cbGetFile1 - Callback per accesso ai file
|
|
25
|
+
* @param {Function} cbLogga1 - Callback per logging
|
|
26
|
+
*/function setcallbacks(cbGetMacro1,cbGetVariante1,cbFunc1,cbInfo1,cbGetFile1,cbLogga1){cbGetMacro$1=cbGetMacro1,cbGetVariante$1=cbGetVariante1,cbFunc$1=cbFunc1,cbInfo$1=cbInfo1,cbGetFile$1=cbGetFile1,cbLogga=cbLogga1}
|
|
27
|
+
/**
|
|
28
|
+
* Restituisce il timestamp corrente in millisecondi
|
|
29
|
+
* @returns {number} Timestamp corrente
|
|
30
|
+
*/
|
|
31
|
+
/**
|
|
32
|
+
* Normalizza una stringa rimuovendo spazi e convertendo in minuscolo
|
|
33
|
+
* @param {string} k - Stringa da normalizzare
|
|
34
|
+
* @returns {string} Stringa normalizzata
|
|
35
|
+
*/
|
|
36
|
+
function clean(k,locase=!1){return locase?(k||"").trim().toLowerCase():(k||"").trim()}
|
|
37
|
+
/**
|
|
38
|
+
* Analizza una stringa per estrarre una coppia chiave-valore
|
|
39
|
+
* @param {string} r - Stringa da analizzare (es: "chiave=valore")
|
|
40
|
+
* @param {string} [sep='='] - Carattere separatore
|
|
41
|
+
* @returns {{v: string, o: string, fl: boolean}} Oggetto contenente chiave (v), valore (o) e flag presenza separatore (fl)
|
|
42
|
+
*/function getcouple(r,sep="=",locase=!0){var 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}}
|
|
43
|
+
/**
|
|
44
|
+
* Valida e separa un identificatore e una categoria
|
|
45
|
+
* @param {string} id - Identificatore da validare (formato: "categoria/nome" o solo "nome")
|
|
46
|
+
* @param {string} cat - Categoria di default
|
|
47
|
+
* @throws {Error} Se manca la categoria
|
|
48
|
+
* @returns {{name: string, cat: string}} Oggetto con nome e categoria validati
|
|
49
|
+
*/function checkmu(id,cat){if((id=(id||"").trim()).indexOf("/")>0){var 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)}}
|
|
50
|
+
/**
|
|
51
|
+
* Valida un identificatore verificando che contenga solo caratteri permessi
|
|
52
|
+
* @param {string} id - Identificatore da validare
|
|
53
|
+
* @throws {Error} Se l'identificatore contiene caratteri non validi
|
|
54
|
+
* @returns {string} Identificatore validato in minuscolo
|
|
55
|
+
*/function checkname(id){if(!(id=(id||"").trim())||!/^(?:(\w|\-|\_|\+|\.))+$/im.test(id)){throw new Error(`nome non valido: |${id}| \n deve contenere solo lettere, _, e numeri`)}return id.toLowerCase()}
|
|
56
|
+
/**
|
|
57
|
+
* Converte una stringa in array di colonne, gestendo diversi formati
|
|
58
|
+
* @param {string} value - Stringa da convertire
|
|
59
|
+
* @returns {string[]} Array di colonne
|
|
60
|
+
*/function getcolonne(value,keepquote=!1){value=String(value||"");const pp=/^(\d+)\.\.(\d+)$/.exec(value);if(pp){var n1=parseInt(pp[1]),n2=parseInt(pp[2]),cl=[];n1>n2&&([n1,n2]=[n2,n1]);for(var 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
|
+
/**
|
|
62
|
+
* Analizza variabili in un'espressione usando delimitatori
|
|
63
|
+
* @param {string} ex - Espressione da analizzare
|
|
64
|
+
* @param {number} k0 - Posizione iniziale
|
|
65
|
+
* @param {string} inipar - Delimitatore iniziale ([, (, {)
|
|
66
|
+
* @param {string} endpar - Delimitatore finale (], ), })
|
|
67
|
+
* @param {boolean} [nonewline=false] - Se true, termina all'incontro di un newline
|
|
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?")":"}");for(var mp=pars1.includes(inipar),par=1,res=[],nres=0,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(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
|
+
/**
|
|
71
|
+
* Classe per la gestione degli errori con funzionalità di accumulo e formattazione
|
|
72
|
+
*/
|
|
73
|
+
/**
|
|
74
|
+
* Copia le proprietà non-funzione da un oggetto sorgente a uno destinazione
|
|
75
|
+
* @param {Object} objDestinazione - Oggetto destinazione
|
|
76
|
+
* @param {Object} objSorgente - Oggetto sorgente
|
|
77
|
+
*/
|
|
78
|
+
function setOggetto(objDestinazione,objSorgente){"object"==typeof objDestinazione&&"object"==typeof objSorgente&&Object.keys(objSorgente).forEach((key=>{Object.hasOwn(objDestinazione,key)&&"function"!=typeof objDestinazione[key]&&(objDestinazione[key]=objSorgente[key])}))}
|
|
79
|
+
/**
|
|
80
|
+
* Estrae le proprietà non-funzione da un oggetto, escludendo chiavi specificate
|
|
81
|
+
* @param {Object} obj - Oggetto da cui estrarre le proprietà
|
|
82
|
+
* @param {string[]} [exclude] - Array di chiavi da escludere
|
|
83
|
+
* @returns {Object} Nuovo oggetto con le proprietà estratte
|
|
84
|
+
*/function getOggetto(obj,exclude){return"object"==typeof obj?Object.keys(obj).reduce(((acc,key)=>("function"!=typeof obj[key]&&(exclude&&exclude.length>0&&exclude.includes(key)||(acc[key]=obj[key])),acc)),{}):{}}
|
|
85
|
+
/**
|
|
86
|
+
* Converte una stringa in un oggetto JSON, gestendo errori e restituendo un valore di default se non valido
|
|
87
|
+
* @param {string|Array|Object} str - Stringa da convertire in JSON, array o oggetto da restituire direttamente
|
|
88
|
+
* @param {*} [def={}] - Valore di default da restituire in caso di errore di parsing
|
|
89
|
+
* @throws {Error} Non genera eccezioni, gli errori vengono loggati internamente
|
|
90
|
+
* @returns {*} L'oggetto JSON convertito dalla stringa, l'input originale se è un array/oggetto, o il valore di default in caso di errore
|
|
91
|
+
* @example
|
|
92
|
+
* fromjson('{"a": 1}') // returns {a: 1}
|
|
93
|
+
* fromjson([1,2,3]) // returns [1,2,3]
|
|
94
|
+
* fromjson('invalid json', {}) // returns {}
|
|
95
|
+
*/function fromjson(str,def){if(Array.isArray(str))return str;if("string"!=typeof str)return str;if(""==str)return def||{};try{return JSON.parse(str)}catch(e){return logga(`Errore parsing JSON: ${e}\n${str}`),def||{}}}const errori=new class Errori{constructor(){this.azzera()}
|
|
96
|
+
/**
|
|
97
|
+
* Azzera la lista degli errori
|
|
98
|
+
*/azzera(){this.err=[]}
|
|
99
|
+
/**
|
|
100
|
+
* Aggiunge un errore alla lista
|
|
101
|
+
* @param {string} msg - Messaggio di errore
|
|
102
|
+
* @param {Object} row - Informazioni aggiuntive sull'errore
|
|
103
|
+
*/add(msg,row){this.err.push({msg:msg,row:row})}
|
|
104
|
+
/**
|
|
105
|
+
* Restituisce la lista completa degli errori
|
|
106
|
+
* @returns {Array} Lista degli errori
|
|
107
|
+
*/get(){return this.err}
|
|
108
|
+
/**
|
|
109
|
+
* Restituisce il numero di errori presenti
|
|
110
|
+
* @returns {number} Numero di errori
|
|
111
|
+
*/get length(){return this.err.length}
|
|
112
|
+
/**
|
|
113
|
+
* Converte la lista degli errori in stringa
|
|
114
|
+
* @returns {string} Rappresentazione testuale degli errori
|
|
115
|
+
*/toString(){var cl=[];for(var e of this.err){let m="object"==typeof e.msg?JSON.stringify(e.msg):e.msg||"";cl.push(`${e.row?e.row+":":""}${m}`)}return cl.join("\n")}};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()}
|
|
116
|
+
/**
|
|
117
|
+
* Valuta un'espressione matematica o logica e restituisce il risultato
|
|
118
|
+
* @param {string|number} expression - L'espressione da valutare
|
|
119
|
+
* @returns {number} Il risultato della valutazione dell'espressione
|
|
120
|
+
* @description
|
|
121
|
+
* Supporta operazioni matematiche di base, funzioni trigonometriche,
|
|
122
|
+
* operatori di confronto e operazioni logiche.
|
|
123
|
+
* Le funzioni supportate includono: sqrt, floor, abs, sin, cos, random, clamp, round
|
|
124
|
+
*/function muCalc(expression){if(!expression)return 0;if("number"==typeof expression)return expression||0;if("string"!=typeof expression)return 0;var s=expression.replaceAll(",",".");return REGEX_NUMERO.test(s)?Number(s)||0:valutaparentesi(expression)||0}function valutavar(sh,res){var vv=res[0]||"";if(!vv)return"";if(sh.counter>=500)return vv;var vx=valutabase(sh,sh.var(valuta0(sh,vv)));if(sh.counter>=500)return vv;if(res[1]){var cols=getcolonne(vx);if("l"==res[1])return String(cols.length);var col=muCalc(valuta0(sh,res[1]));if(!(col>=0&&col<cols.length))return"";vx=valuta0(sh,cols[col])}if(res[2]){var c1=muCalc(valuta0(sh,res[2]));if(c1){var 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){var vv=getcolonne(res||""),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":var m1=valuta0(sh,vv[1]||""),m2=valuta0(sh,vv[2]||"");sh.add(m1,sh.vars(m2));break;case"ex":m1=valuta0(sh,vv[1]||"");(m2=valuta0(sh,vv[2]||""))||(m2=",");var m3=muCalc(valuta0(sh,vv[3]||"")),tm=m1.split(m2);return m3>0&&tm[m3-1]||"";case"ex2":var sep=replacecharcode(vv[1]||""),pos=muCalc(valuta0(sh,vv[2]||""));return vv.splice(0,3),(str=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{var search=replacecharcode(vv[1]||"x"),replace=replacecharcode(vv[2]||"").trim();return vv.splice(0,3),search=search.replace(/&(\d+)/g,((match,code)=>`\\u${parseInt(code).toString(16).padStart(4,"0")}`)),vv.join(";").replace(new RegExp(search,"im"),replace)}catch(error){return""}case"look":case"lookb":{let 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":return(pos=muCalc(valuta0(sh,vv[1]||""))||0)?vv[pos>0?pos+1:2]||"":(pos=muCalc(valuta0(sh,vv[2]||"")),sep=vv[1]||"",pos?vv[3].split(sep)[pos-1]:"");case"totab":return vv.splice(0,1),vv.join("\t");case"tosep":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":var str=valuta0(sh,vv[1]||""),len=(pos=muCalc(valuta0(sh,vv[2]||"")),muCalc(valuta0(sh,vv[3]||"")));return str.substring(pos-1,pos+len-1);case"arrotonda":{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(str=muCalc(valuta0(sh,vv[1])))?vv[2]||1:vv[3]||0;case"instr":case"instr2":var str1=vv[1]||"",str2=vv[2]||"";return str1.toLowerCase().indexOf(str2.toLowerCase())+1;case"instr2":str2=vv[1]||"";return vv.splice(0,2),vv.join(";").toLowerCase().indexOf(str2.toLowerCase())+1;default:return{fun:r1,pars:vv}}}function valuta0(sh,ex){if(ex+="",sh.counter>=500)return ex;for(;;){const rt=/\$([\{\(])/im.exec(ex);if(!rt)break;var i1=rt.index,{i:i,res:res}="("==rt[1]?parsevar(ex,i1+2,"(",")"):parsevar(ex,i1+2,"{","}");ex=valuta0(sh,ex.substring(0,i1))+valutavar(sh,res)+(i>=0?valuta0(sh,ex.substring(i+1)):"")}return ex=(ex=ex.replace(/\$([a-z|][\w|\.]*)/gi,((match,m1)=>{for(var m2="";m1.length;){var tm=valutabase(sh,sh.var(m1));if(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;let cl=[];for(let i=+p1;i<=+p2;i+=p4)cl.push(i.toString());return cl.join(";")})),ex}function valutabase(sh,ex){return ex&&(sh.counter++,sh.counter<=500&&(ex=valuta0(sh,ex)),sh.counter--),ex}class Variabile{constructor(){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}
|
|
125
|
+
/**
|
|
126
|
+
* Salva lo stato corrente delle variabili nello stack
|
|
127
|
+
*/push(){this.vec.push({...this.dictionary})}
|
|
128
|
+
/**
|
|
129
|
+
* Ripristina l'ultimo stato salvato delle variabili
|
|
130
|
+
*/pop(){this.vec.length>0&&(this.dictionary=this.vec.pop())}
|
|
131
|
+
/**
|
|
132
|
+
* Rimuove tutte le variabili e pulisce lo stack
|
|
133
|
+
*/clear(){this.vec=[],this.dictionary={}}azzera=()=>this.clear()
|
|
134
|
+
/**
|
|
135
|
+
* Recupera il valore di una variabile
|
|
136
|
+
*/;var(key){let fmt="";const pp=/^(\d+)\.\.(\d+)$/.exec(key);if(pp){var n1=parseInt(pp[1]),n2=parseInt(pp[2]),cl=[];n1>n2&&([n1,n2]=[n2,n1]);for(var i=n1;i<=n2;i++)cl.push(i+"");return cl}if(key.indexOf("|")>=0){let tm=key.split("|");key=tm[0],fmt=tm[1]}function toformat(val,fmt){switch(fmt.trim().toLowerCase()){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){var xx=Intl.NumberFormat("en",{style:"currency",currency:"EUR"}).format(n);return xx.replace(/€/g,"").replace(/\./g,";").replace(/,/g,".").replace(/;/g,",")+"€"}return valorezero})(parseFloat(val));case"num":return((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})(parseFloat(val));default:return val}var date}const sanitizedKey=Variabile.sanitizeKey(key);if(sanitizedKey.startsWith(".")&&this.fndotcallback){let tm=this.fndotcallback(sanitizedKey.toLowerCase());if(tm)return toformat(tm,fmt)}if(Variabile.isValidKey(sanitizedKey)){const lowercaseKey=sanitizedKey.toLowerCase();var rr=/^([\w][\w\d]*)[\.\[]/.exec(lowercaseKey);if(rr){var tm=this.dictionary[rr[1]];if(tm&&"object"==typeof tm)return toformat(function objval(tm,key){for(var parts=key.split("."),obj=tm,i=0;i<parts.length;i++){var part=parts[i],match=part.match(/(.*?)\[(\d+)\]/);if(match){if(void 0===(obj=obj[match[1]]))return"";obj=obj[parseInt(match[2],10)]}else 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}
|
|
137
|
+
/**
|
|
138
|
+
* Restituisce un dump delle variabili
|
|
139
|
+
*/dump(isstr=!1){var cl=[];for(var 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} = ${e.val}`)):cl}
|
|
140
|
+
/**
|
|
141
|
+
* Aggiunge o rimuove una variabile
|
|
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}`)}
|
|
143
|
+
/**
|
|
144
|
+
* Valuta un'espressione con supporto per callback asincroni
|
|
145
|
+
*/valutasync(str){return valutabase(this,str)}async valuta(ex,callback){var tm=await async function valutafunc(sh,ex,callback){if(ex){for(var ii=0;ii<20;ii++){var i1=ex.lastIndexOf("$[");if(!(i1>=0)){ex=valutabase(sh,ex);break}var{i:i,res:res}=parsevar(ex,i1+2,"[","]"),t1=valutabase(sh,ex.substring(0,i1)),t2=res?valutabase(sh,res[0]):"",t3=i>=0?valutabase(sh,ex.substring(i+1)):"",t4=valutaquadra(sh,t2);"object"==typeof t4&&(t4=callback?await callback(t4?.fun,t4.pars):`** fun: ${t4.fun} ** `),ex=t1+(t4="object"==typeof t4?"**str**":t4+""||"")+t3}return ex}return""}(this,ex,callback);return tm=(ex=>{for(;;){var i1=ex.indexOf("{");if(!(i1>=0))break;var{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(!(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||"";var getcode0=async(codicebarra,liv)=>{var barra=this.barre[codicebarra];if(!barra&&callback&&((barra=await callback(codicebarra))||(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};var{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:""},bx=barra.r;if(z){var 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){if(t=bx.find((e=>e.x>=x)))return{c:t.c,fm:t.x==x?0:1,x1:t.x,x:x,extra:extra}}else{var t;if(t=bx.find((e=>e.x==x&&e.y==y)))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))))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))))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={});var barre={};if(Array.isArray(vettore)){for(var 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);var 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(var 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}}
|
|
146
|
+
/**
|
|
147
|
+
* Costanti e espressioni regolari utilizzate nel modulo
|
|
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("|");
|
|
149
|
+
/**
|
|
150
|
+
* Rimuove i commenti dal codice sorgente mantenendo la struttura del codice
|
|
151
|
+
* @param {string} codice - Il codice sorgente da processare
|
|
152
|
+
* @param {boolean} tienivuoti - Se true mantiene le righe vuote
|
|
153
|
+
* @returns {string[]} Array di righe di codice senza commenti
|
|
154
|
+
*/function muClComments(codice,tienivuoti){const righe=(code=codice,code.replace(/("(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*')|\/\*[\s\S]*?\*\//g,((match,quoted)=>quoted||""))).split(/\r?\n/);var code;const tm=[];let rigaContinua="";for(const riga of righe){let rigaTrim=riga.trim();if(rigaTrim.includes("//")&&(rigaTrim=rigaTrim.split("//")[0].trim()),0!==rigaTrim.length||tienivuoti)if(rigaContinua.length>0&&(rigaTrim=rigaContinua+" "+rigaTrim,rigaContinua=""),rigaTrim.endsWith("\\")){rigaTrim=rigaTrim.slice(0,-1);const indiceCommento=rigaTrim.lastIndexOf("//");-1!==indiceCommento&&(rigaTrim=rigaTrim.slice(0,indiceCommento).trim()),rigaContinua=rigaTrim}else tm.push(rigaTrim)}return tm}
|
|
155
|
+
/**
|
|
156
|
+
* Analizza e organizza il codice in una struttura dati gerarchica
|
|
157
|
+
* @param {string[]} tt - Array di righe di codice da analizzare
|
|
158
|
+
* @param {boolean} acapo - Se true mantiene i ritorni a capo nel contenuto
|
|
159
|
+
* @returns {Object[]} Array di oggetti rappresentanti la struttura del codice
|
|
160
|
+
* @throws {Error} Se tt non è un array
|
|
161
|
+
*/function muClean(tt,acapo=!1){if(Array.isArray(tt)){var tm=[];
|
|
162
|
+
/**
|
|
163
|
+
* Aggiunge una riga generica alla struttura
|
|
164
|
+
* @param {string} r - Riga da aggiungere
|
|
165
|
+
*/for(var rigaTrim of tt){const matchComando=rigaTrim.match(/^#([\w\.]+)\s*(.*)$/);if(matchComando){var tipo=matchComando[1].toUpperCase().trim(),tipo2="";if(tipo.includes(".")){var 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("#")){let tmx={tipo:tipo,contenuto:matchComando[2]};tipo2&&(tmx.tipo2=tipo2),tm.push(tmx)}else{var 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*(.*)$/))?(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)}for(var nn=0,nf=0,ns=0,lev=[],lef=[],les=[],i=0;i<tm.length;i++){var t=tm[i];switch(t.i=i,t.tipo){case"FOR":case"FORVAR":case"VARIANTE":case"DO":lef[++nf]={pos:i,bk:[]};break;case"LOOP":case"ENDFOR":if(nf>0){var{pos:pos}=lef[nf];for(var 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":lev[++nn]={pos:i,bk:[t]};break;case"SELECT":les[++ns]={pos:i,bk:[t],first:i};break;case"ELSEIF":case"ELSEIFDEF":case"ELSEIFNDEF":case"ELSE":if(nn>0){var{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){var{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){var{pos:pos,next:next}=lev[nn];for(var b of(tm[pos].next=i,lev[nn].bk))b.last=i;nn--}break;case"ENDSELECT":if(ns>0){var{pos:pos,next:next}=les[ns];for(var b of(tm[pos].next=i,les[ns].bk))b.last=i;ns--}}}return tm}function addgen(r){if(tm.length>0&&""==tm[tm.length-1].tipo){var 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})}errori.add("muClean: expected array!")}
|
|
166
|
+
/**
|
|
167
|
+
* Analizza e processa i limiti definiti nel codice
|
|
168
|
+
* @param {string} dati - Dati contenenti le definizioni dei limiti
|
|
169
|
+
* @returns {Object[]} Array di oggetti rappresentanti i limiti processati
|
|
170
|
+
*/function muLimits(dati){var tk,rr=muClComments(dati),tm=[],parsa=v=>v?[...new Set(v.split(",").map((e=>e.trim())).sort().filter((e=>e)))]:void 0;for(var r of rr){var 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)))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(var 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;let{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(let 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}
|
|
171
|
+
/**
|
|
172
|
+
* Classe per gestire le varianti di un prodotto.
|
|
173
|
+
* Permette di caricare, manipolare e convertire varianti di prodotto con relativi attributi e limiti.
|
|
174
|
+
* @class
|
|
175
|
+
* @exports
|
|
176
|
+
*/
|
|
177
|
+
class Variante{
|
|
178
|
+
/**
|
|
179
|
+
* Crea una nuova istanza di Variante
|
|
180
|
+
* @param {Object} amb - Ambiente di esecuzione contenente il contesto applicativo
|
|
181
|
+
*/
|
|
182
|
+
constructor(amb){this.rows={},this.name="$",this.key="$",this.limits=void 0,
|
|
183
|
+
/** @type {Ambiente} */
|
|
184
|
+
this.amb=amb}
|
|
185
|
+
/**
|
|
186
|
+
* Imposta i dati principali della variante
|
|
187
|
+
* @param {string} id - Identificativo univoco della variante
|
|
188
|
+
* @param {string} cat - Categoria di appartenenza
|
|
189
|
+
* @returns {Object} Oggetto contenente nome e categoria normalizzati
|
|
190
|
+
*/setheader(id,cat){var{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}}
|
|
191
|
+
/**
|
|
192
|
+
* Cerca la riga con dimensione più vicina a quella richiesta
|
|
193
|
+
* @param {number|string} dim - Dimensione target da cercare
|
|
194
|
+
* @param {number} colonna - Indice della colonna (1-based) contenente la dimensione
|
|
195
|
+
* @returns {string} Riga formattata nel formato CSV
|
|
196
|
+
*/fromdim(dim,colonna=2){"number"!=typeof dim&&(dim=muCalc(dim)),colonna>0&&colonna--;var rsel,max=1e9;for(var kk in this.rows){var row=this.rows[kk];if(!row.annulla){var dd=parseFloat(row.v[colonna])||0;dd<=max&&dd>=dim&&(max=dd,rsel=row)}}return this.#torow(dim,rsel)}
|
|
197
|
+
/**
|
|
198
|
+
* Carica una variante dal database o da file
|
|
199
|
+
* @param {string} id - Identificativo della variante
|
|
200
|
+
* @param {string} cat - Categoria della variante
|
|
201
|
+
* @param {boolean} nofilter - Se true, non carica i filtri associati
|
|
202
|
+
* @returns {Promise<boolean>} Promise che risolve a true se il caricamento ha successo
|
|
203
|
+
*/async load(id,cat,nofilter=!1){var{name:name,cat:cat}=this.setheader(id,cat);if(cbGetVariante$1){var 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){let tm=await cbInfo$1("filter",cat,name);tm&&tm.length&&(this.limits=parselimitifromdb(tm))}return!0}}return!1}
|
|
204
|
+
/**
|
|
205
|
+
* Carica il contenuto della variante da array di stringhe
|
|
206
|
+
* @private
|
|
207
|
+
* @param {string[]} lines - Array di stringhe contenenti la definizione della variante
|
|
208
|
+
* @returns {Promise<boolean>} Promise che risolve a true se il caricamento ha successo
|
|
209
|
+
*/async _loadContent(lines){const regx=/^\s*[\!\:]\s*(\w+)\s*(.*)$/i;var ky="";let limit,limits=[],modelimit=!1;for(var currentLine of lines){if("{limit}"==(tm=currentLine.toLowerCase()))limit=[],limits.push(limit),modelimit=!0;else if("{:limit}"==tm)modelimit=!1;else if(modelimit)limit.push(currentLine);else{if(rr=regx.exec(clean(currentLine)))if(ky&&"extra"==rr[1].toLowerCase()){var tm=getcolonne(rr[2]);for(var t of tm){var q=t.indexOf("=");if(q>0){var a=clean(t.substring(0,q));"v"!=a&&(this.rows[ky][a]=t.substring(q+1).trim())}}}else switch(rr[1].toLowerCase()){case"alias":if((vv=rr[2].toLowerCase().split(";"))[0].trim()!=this.name)if(1==vv.length)this.alias=vv[0];else{var vx;this.amb?vx=await this.amb.getvariante(vv[0]):(vx=new Variante,await vx.load(vv[0],this.cat));var rr=vx?.rows;if(rr){var kky=Object.keys(rr);if(kky.length){vv.splice(0,1);const addrows=kk=>{kk&&kk.forEach((k=>this.rows[k]=rr[k]))};for(var t of vv){var rx=/([ei])\s*:\s*(.*)\s*$/im.exec(t);if(rx){for(var k3=rx[2].split(","),i=0;i<k3.length;i++)k3[i]=k3[i].trim();kky="e"==rx[1]?kky.filter((k=>{for(var k2 of k3)if(k.startsWith(k2))return!1;return!0})):kky.filter((k=>{for(var 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":let 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(k=clean((tm=getcolonne(currentLine))[0]))&&(ky=k,this.rows[ky]={annulla:0,v:tm})}}var kk=Object.keys(this.rows);for(var k of kk)if(k.includes(".")){var vv=k.split(".");for(i=0;i<vv.length-1;i++){var 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){let rs={};const 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(var d of data)addres0(key,d);else addres0(key,data)}for(var v of vec){var tm=rx1.exec(v);if(tm)switch(tm[1]){case"var":case"v":case"variante":let i=(tm[2]||"").indexOf(" ");if(i>0){let 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));for(var o of(tv||(tv={v:v1,o:[]},rs.v.push(tv)),v2))tv.o.includes(o)||tv.o.push(o)}}break;case"d":case"dt":case"data":case"date":let 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(var ll of limvec){let 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}
|
|
210
|
+
/**
|
|
211
|
+
* Converte la variante in un vettore di righe
|
|
212
|
+
* @returns {string[]} Array di righe formattate
|
|
213
|
+
*/tovec(){var tm=this.rows,cl=[],xx=Object.keys(tm).sort();for(var x of xx)this.rows[x].annulla<2&&cl.push(this.#torow(x,this.rows[x]));return cl}
|
|
214
|
+
/**
|
|
215
|
+
* Converte una riga in una stringa CSV
|
|
216
|
+
* @private
|
|
217
|
+
* @param {string} cod - Codice della riga
|
|
218
|
+
* @param {Object} tm - Oggetto contenente i dati della riga
|
|
219
|
+
* @returns {string} Stringa CSV formattata
|
|
220
|
+
*/#torow(cod,tm){var cl=[cod];if(tm)for(var t of tm.v)"string"==typeof t&&(t.includes(",")||t.includes(";"))?cl.push(quote(t)):cl.push(t||"");return cl.join(",")}
|
|
221
|
+
/**
|
|
222
|
+
* Converte un codice nella sua rappresentazione CSV
|
|
223
|
+
* @param {string} cod - Codice da convertire
|
|
224
|
+
* @returns {string} Stringa CSV o codice originale se non trovato
|
|
225
|
+
*/tovar(cod,vcod=""){var c1=clean(cod);if(!this.rows[c1])return vcod||cod;var tm=this.rows[c1];return 2==tm.annulla?"":this.#torow(vcod||cod,tm)}
|
|
226
|
+
/**
|
|
227
|
+
* Verifica se un'opzione è valida
|
|
228
|
+
* @param {string} opz - Opzione da verificare
|
|
229
|
+
* @returns {boolean} True se l'opzione è valida
|
|
230
|
+
*/isvalidopz(opz){let c1=clean(opz),t=this.rows[c1];return!!t&&(1!=t.annulla&&!t.hasliv)}
|
|
231
|
+
/**
|
|
232
|
+
* Trova la prima opzione valida tra quelle disponibili
|
|
233
|
+
* @param {string} opz - Opzione da controllare per prima
|
|
234
|
+
* @returns {string|undefined} Prima opzione valida trovata o undefined
|
|
235
|
+
*/firstvalid(opz){if(opz&&this.isvalidopz(opz))return opz;if(this.vdef&&this.vdef.length)for(var o of this.vdef)if(this.isvalidopz(o))return o;for(var x in this.rows)if(this.isvalidopz(x))return x}
|
|
236
|
+
/**
|
|
237
|
+
* Resetta tutti i filtri applicati alla variante
|
|
238
|
+
*/resetfilter(){for(var x in delete this._valids,this.rows)this.rows[x].annulla=0}
|
|
239
|
+
/**
|
|
240
|
+
* Restituisce le chiavi valide ordinate alfabeticamente
|
|
241
|
+
* @returns {string[]} Array di chiavi valide
|
|
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());let tm=[];for(var f of filtra){let rr=/^\#([ie])(\d*)\s+(.+)$/i.exec(f);if(rr){let t={ex:"e"==rr[1],col:(parseInt(rr[2])||1)-1,val:getcolonne(rr[3])};t.val.length&&tm.push(t)}}if(tm.length)for(var x in this.rows){let r=this.rows[x];for(var t of tm)if(t.ex){if(_check(r.v[t.col]||"",t.val)){r.annulla=1;break}}else if(!_check(r.v[t.col]||"",t.val)){r.annulla=1;break}}function _check(value,valori){return!!valori.find((e=>e.startsWith(value)))}}
|
|
243
|
+
/**
|
|
244
|
+
* Applica i limiti configurati alle opzioni della variante
|
|
245
|
+
* @returns {Array|void} Array di limiti applicati o void se reset
|
|
246
|
+
*/limita(filtra){if(filtra&&filtra.length)return this.limitfiltra(filtra);if(!this.limits||!this.amb)return this.resetfilter();let{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(var v of e.v){let 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();let incstar=new Set,exstar=new Set,incaltri=new Set,exaltri=new Set,isinc=!1,isex=!1;for(var 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(var x in this.rows){let r=this.rows[x],flinc=!1,flex=!1;if(isinc){for(let i of incstar)if(x.startsWith(i)){flinc=!0;break}!flinc&&incaltri.has(x)&&(flinc=!0)}if(isex){for(let 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}
|
|
247
|
+
/**
|
|
248
|
+
* Carica il contenuto esteso della variante
|
|
249
|
+
* @param {Object|string} content - Contenuto da caricare, può essere un oggetto o una stringa
|
|
250
|
+
* @returns {Promise<void>} Promise che si risolve al completamento del caricamento
|
|
251
|
+
*/async loadContentExtended(content){if("object"==typeof content){for(var x in content)["rows","des","h","alias","obbligo"].includes(x)&&(this[x]=content[x]);"string"==typeof content.def&&content.def.length&&(this.vdef=getcolonne(content.def.trim().toLowerCase())),content.filter&&content.filter.length&&(this.limits=parselimitifromdb(content.filter))}else await this._loadContent(muClComments(content,!1))}todata(){return{name:this.name,des:this.des,alias:this.alias,obbligo:this.obbligo,h:this.h,rows:this.rows,limits:this.limits,key:this.key}}}let _nofunc={};async function getcbfunc(tm,cmd,pars,vari,amb,output){if(cbFunc$1){if(_nofunc[cmd])return"";let a=await cbFunc$1(cmd,pars,vari,amb,output);return a=(a||"").trim(),"!"==a&&(_nofunc[cmd]=!0,a=""),a}return tm}async function intvaluta(amb,mac,str){return await amb.vari.valuta(str,(async(fun,pars)=>{if("dim"===fun){var dm=muCalc(pars[1]),vv=await dammivariante(amb,mac,pars[2]),col=parseInt(pars[3])||2;return vv&&vv.fromdim?vv.fromdim(dm,col):dm}return await getcbfunc(`**fun:${fun}**`,fun,pars,amb.vari,amb)}))}async function dammivariante(amb,macro,ky){return macro&¯o?.localvar&¯o.localvar[ky]?macro.localvar[ky]:await amb.getvariante(ky)}async function impostavariante(amb,macro,a,b,head){let tm,ky=a;if((b=b||"")&&"string"==typeof b){var k=b.indexOf(":");k>=0&&(k>0&&(ky=clean(b.slice(0,k))),b=b.slice(k+1))}
|
|
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){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]&&!tipo?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(var ii=0;ii<codice.length;){var riga=codice[ii];switch(riga.tipo){case"IFDEF":case"IFNDEF":case"IF":var 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{tm=1;let vv;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();var tmx=muCalc(riga.t1||"");vv.find((v=>muCalc(v)==tmx))&&(tm=1)}else if("CASES"==riga.tipo){tm=0,vv=await _getvv();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{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"J":await getcbfunc("$$","$$",await intvaluta(amb,mac,riga.contenuto),vari,amb,output);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(var 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(var 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{var{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(var x in macro.head)saved[x]=amb.vari.var(x);if(parametri&¶metri.length)for(var 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(var 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":var j=-1;if((i=riga.contenuto.indexOf("="))>=0&&(j=riga.contenuto.indexOf("=",i+1)),j<0){if((i=(v=riga.contenuto).indexOf("="))>0){var 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(var v of vv){if((i=v.indexOf("="))>0){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":var i;if((i=riga.contenuto.indexOf("="))>0){a=await intvaluta(amb,mac,riga.contenuto.slice(0,i).trim()),b=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":if(tm=getcolonne(riga.contenuto))for(var x of tm){var{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":fl=!0;(valido=(riga.contenuto||"").trim())&&!muCalc(await intvaluta(amb,mac,valido))&&(fl=!1),riga.next&&(fl||(ii=riga.next+1));break;case"VARIANTE":case"FORVAR":case"FOR":{var valido,elenco;if(options.oldstyle)v=(vv=riga.contenuto.split(","))[2]||"i",elenco=vv[0],valido=vv[1];else v=(vv=getcolonne(riga.contenuto||""))[0]||"",elenco=clean(vv[1],!0),valido=vv[2]||"";if(v=v.includes("$")?await intvaluta(amb,mac,v):v||"","FORVAR"==riga.tipo||"VARIANTE"==riga.tipo){var xx=(tm=await intvaluta(amb,mac,elenco))?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){(rr=codice[riga.next]).for={v:v,elenco:elenco,nc:nc,valido:valido};var 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":var 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){var{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);var rr;a="";if(rr=/^\!(\w+)[\s;,]\s*(.+)?$/gim.exec(tm)){var 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(var 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(var x of xgen.calcola)mac.formula[x]&&await muEval(amb,mac,mac.formula[x],{limited:!0});for(var x of xgen.exclude){if(mac.formula[x])if(vvv=await muEval(amb,mac,mac.formula[x],{limited:!0}))for(var v of vvv){if(muCalc(v))return}}var out1=await muEval(amb,mac,xgen.codice,{limited:!0,localvar:mac.localvar}),bb={};for(var x of xgen.bom)if(mac.formula[x]){var vvv=await muEval(amb,mac,mac.formula[x],{limited:!0});for(var v of vvv=vvv.join("\n").split("\n"))if(v){var tm=getcolonne(v);bb[x]||(bb[x]=[]);for(var t={},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(var x of out1){var tm=getcolonne(x);if(tm[0]&&!output[tm[0]]){output[tm[0]]=1,output.counter++,output.counter2++;for(var o={__id:output.counter},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(var v of vv)if(v.trim()){if(muCalc(vari.valutasync(v)))return!0}return!1}class Macro{constructor(amb,name){var{name:name,cat:cat}=checkmu(name,amb.cat||"");this.name=name,this.cat=cat,
|
|
253
|
+
/** @type {Ambiente} */
|
|
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(){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(var x of this.head)if(!x._h){var 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(var x of this.parametri._){let x1=(x.split("=")[0]||"").trim().toLowerCase();tm=((tm=this.amb.vari.var[x1])||"").split(",")[0],s[x1]=tm}return s}async setparametri(pars){let ff={};for(var x of(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)})),this.head))"g"!=x.t&&("z"!=x.t||pars[x.cod]||(pars[x.cod]="1"),x._v=pars[x.cod],ff[x.cod]=!0);for(var 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)for(var i of(this.paralias||(this.paralias={}),Array.isArray(this.head)||(this.head=[]),this.head))i._v="",delete i._h,delete i._h1,delete i._h2,i.alias&&(this.paralias[i.cod]=i.alias);for(var x of(parimposta||(parimposta=[]),parcall||(parcall=[]),[...parimposta,...parcall])){if((i=x.indexOf("="))>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(var 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(var x in this.localvar){setOggetto(vv=new Variante,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){}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(var 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(var i=1;i<pp.length;i++)res=res.replaceAll(`$${i}`,pp[i]);var tm=muClComments(res),t2=[];for(var t of(flin&&(tm=tm.filter((t=>!/^\{(\:?(var|valid|formula|header|genera|v|f|h))[\s|\}]/im.test(t)))),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){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=[],tm=muClComments(res),flin=!1;let lochead=[];for(var 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(var 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":if(r2=/^\s*\{(genera|g)\s+(.+)?\}/im.exec(t)){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":if(r2=/^\s*\{(var|v)\s+(.+)?\}/im.exec(t)){var 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":var r2;if(r2=/^\s*\{(formula|f)\s+(.+)?\}/im.exec(t)){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)}for(var f in this.parametri={},this.codice=this.cleanfiltraparametri("_",this.codice,acapo),this.formula)this.formula[f]=this.cleanfiltraparametri(f,this.formula[f],acapo);for(var f in this.localvar){var vv=new Variante,v=this.localvar[f];for(var x of(vv.setheader(f,this.cat),vv.rows={},v.rows)){var k=(c=getcolonne(x))[0].trim().toLowerCase();vv.rows[k]={annulla:0,v:c}}v.des&&(vv.des=v.des),this.localvar[f]=vv}tm=this.valid;for(var t of(this.valid=[],tm)){(p={v:(p=getcouple(t,",")).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(var t of tm){if(rr=/^\s*([\w\-\_]+)+[\;\,\s]\s*(.*)?$/im.exec(t)){var c;pp=getcolonne(rr[2]);let ht;if(c=clean(rr[1]))for(var tp of(ht=head.find((e=>e.cod==c)),ht||(ht={cod:c,t:"t"},head.push(ht)),pp)){var p;switch((p=getcouple(tp)).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(var kk in tm)if(Array.isArray(tm[kk])){var gen={codice:[],head:"",calcola:[],bom:[],vars:[],exclude:[]};const regx=/^\s*[\!\:]\s*(\w+)\s*(.*)$/i;for(var k2 of tm[kk]){var rr;if(rr=regx.exec(clean(k2)))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(var 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(var 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}}
|
|
255
|
+
/**
|
|
256
|
+
* Formatta il codice sorgente applicando indentazione e allineamento
|
|
257
|
+
* @param {string} code - Il codice sorgente da formattare
|
|
258
|
+
* @param {boolean} gisvar - Flag che indica se formattare come variabile
|
|
259
|
+
* @returns {string} Il codice formattato
|
|
260
|
+
*/function headerconvert(tt){var rr=muClComments(tt,!1),grp=(tt={},{r:[]}),fl=!1;for(var r of rr){var m=/^\s*\{(h|head|header)\s+(\w+)\}/im.exec(r);if(m)grp={cod:m[2],des:m[2],r:[]},fl=!1,tt[m[2]]=grp;else if(!/^\s*\:/.exec(r)){var tm,v=r.split(","),t={cod:clean(v[0])};(tm=(v[1]||"").trim())&&(t.des=tm),(tm=clean(v[2]))&&(t.tipo=tm),(tm=clean(v[3]))&&(t.alias=tm),(tm=clean(v[4]))&&(t.valid=tm),(tm=clean(v[5]))&&(t.visible=tm),t.cod&&(fl||"sep"!=t.tipo?grp.r.push(t):(grp.des=t.des,grp.valid=t.valid,grp.visible=t.visible,fl=!0))}}return tt}function aliasconvert(tt){var rr=muClComments(tt.toLowerCase(),!1),tx={};for(var r of rr)if(!/^\s*\:/.exec(r)){var v=getcolonne(r);v[0]&&v[1]&&(tx[v[0]]={cod:v[1]})}return tx}class Ambiente{#headers=void 0;#alias=void 0;#deriva=void 0;#typos=void 0;constructor(cat=".",maxdelays=100,righevuote=!1){this.righevuote=righevuote,this.maxdelays=maxdelays,this.setcatalog(cat),this.fndotcallback=void 0}setcatalog(cat){return cat=clean(cat),this.cat!=cat&&(this.cat=cat,this.item=this.rule=this.model="",this.azzera(!0)),cat}get muvalutatore(){return{getcolonne:getcolonne,muCalc:muCalc,muEval:muEval,tipifree:tipifree}}azzera(mode=!1){
|
|
261
|
+
/** @type {Variabile} */
|
|
262
|
+
this.vari=new Variabile,this.fndotcallback&&this.vari.setfndot(this.fndotcallback),this.ruleheader="",mode&&(
|
|
263
|
+
/** @type {Object.<string, Macro>} */
|
|
264
|
+
this.macro={},
|
|
265
|
+
/** @type {Object.<string, Variante>} */
|
|
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)}async 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(var t of tm)switch(t.tipo){case"_headers":t.value,t.value=headerconvert(t.value),this.#headers=t.value||{};break;case"_alias":t.value,t.value=aliasconvert(t.value),this.#alias=t.value||{};break;case"_typos":t.value;var tips=fromjson(t.value);for(var tp in tips){var tq=tips[tp];tq.db&&(tq.db=muClean(muClComments(tq.db))),tq.list&&(tq.list=muClean(muClComments(tq.list)))}t.value=tips,this.#typos=t.value||{}}}setitem(item,rule,model,datadelgiorno){this.item=clean(item,!0),this.rule=clean(rule,!0),this.model=clean(model,!0),this.data=datadelgiorno||(new Date).toInt()}async getheader(cod){if(!this.#headers&&cbInfo$1){var tm=await cbInfo$1("headers",this.cat,"_headers");this.parseheaderfrominfo(tm)}return this.#headers||(this.#headers={}),this.#headers[cod]}async getalias(){if(!this.#alias&&cbInfo$1){var tm=await cbInfo$1("headers",this.cat,"_alias");this.parseheaderfrominfo(tm)}return 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);(macro=clean(rr[1],!0)).includes("$")&&(macro=await this.vari.valuta(macro));var pars=getcolonne(rr[2]),{name:name,cat:cat}=checkmu(macro,this.cat);this.cat=cat;var macro,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,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;for(var x in cc.compila(articolibarre,titolibarre),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(var v of info.var)await this.varcompila(v,callback);for(var v of info.mu)await this.macrocompila(v,callback);if(callback("infos",{cod:"info",des:info.cat,info:JSON.stringify({cat:info.cat,md:info.info})}),this.#headers=void 0,this.#alias=void 0,this.#deriva=void 0,this.#typos=void 0,cbInfo$1){var tm=await cbInfo$1("headers",this.cat,["_headers","_alias","_deriva","_typos"]);this.parseheaderfrominfo(tm)}this.#headers?callback("infos",{cod:"headers",des:"",info:JSON.stringify(this.#headers)}):logga("missing headers"),this.#alias&&callback("infos",{cod:"alias",des:"",info:JSON.stringify(this.#alias)}),this.#deriva&&callback("infos",{cod:"deriva",des:"",info:JSON.stringify(this.#deriva)}),this.#typos&&callback("infos",{cod:"typos",des:"tipologie",info:JSON.stringify(this.#typos)})}}async getheaderfromdb(name){let totale=await cbInfo$1("header",this.cat,name,!this.#deriva),{head:head,rows:rows,macros:macros,deriva:deriva,llvars:llvars}=totale;for(var r of rows)r.cod=clean(r.cod),r.alias=clean(r.alias),r.t=clean(r.t);if(!llvars){for(var r of(llvars=new Set,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(var 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(var 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(var 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(var x of tm){let m=new Macro(this,x.name);for(var t in x.content){let contenuto=x.content[t];m[t]=contenuto}this.macro[m.key]=m}}}async setruleheader(rule,pars){var{name:name,cat:cat}=checkmu(rule,this.cat),ky=`${cat}/${name}`;if(!this.macro[ky]){let totale=await this.getheaderfromdb(name),{head:head,rows:rows,macros:macros}=totale;await this.getlinkedmacros(head.rule,macros);var tm=new Macro(this,name);if(!head)return void errori.add("Missing rule: "+rule);if(head.rule){let k2=this.macro[`${cat}/${head.rule}`];if(k2)for(var 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}1.0.135${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(var 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;isvar&&(isvar=(tm=verificaisvar(0,lines)).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){var tm;formattedCode.push(line),indentLevel=rr[1]?0:1,/^\s*\{(var|deriva|header|v|h)(\s.*)?\}/i.test(line)?(isvar=(tm=verificaisvar(i+1,lines)).fl)&&(cols=tm.cols):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};
|