croswil_markuno 2.1.25 → 2.1.26
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 +1 -1
- package/bin/mu.js +4 -4
- package/package.json +1 -1
package/bin/mu-convcad.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{init as e,database as t}from"croswil_lib";import o from"fs";import r from"path";import i from"minimist";function s(e,t=!1){e=String(e||"");const o=/^(\d+)\.\.(\d+)$/.exec(e);if(o){let e=parseInt(o[1]),t=parseInt(o[2]);const r=[];e>t&&([e,t]=[t,e]);for(let o=e;o<=t;o++)r.push(o+"");return r}if(!/["({[]/.test(e))return e.split(/[,;]/).map((e=>e.trim()));const r=[];let i="",s=0,a=!1;for(let l=0;l<e.length;l++){const t=e[l];if(0===s&&'"'===t&&(0!==l&&"\\"===e[l-1]||(a=!a)),a||("("===t||"["===t||"{"===t?s++:")"!==t&&"]"!==t&&"}"!==t||(s=Math.max(0,s-1))),","!==t&&";"!==t||0!==s||a)i+=t;else{const e=i.trim();r.push(e),i=""}}const n=i.trim();return n&&r.push(n),r.map((e=>(e=e.trim(),!t&&(e.startsWith('"')&&e.endsWith('"')||e.startsWith("(")&&e.endsWith(")"))?e.slice(1,-1):e)))}function a(e,t){const o=(e=>e.replace(/("(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*')|\/\*[\s\S]*?\*\//g,((e,t)=>t||"")))(e).split(/\r?\n/),r=[];let i="";for(const s of o){let e=s;if(/(^|[^:])\/\/.*/.test(e)&&(e=e.replace(/(^|[^:])\/\/.*/,((e,t)=>t.trim()))),e=e.trim(),0!==e.length)if(i.length>0&&(e=i+" "+e,i=""),e.endsWith("\\")){e=e.slice(0,-1);const t=e.lastIndexOf("//");-1!==t&&(e=e.slice(0,t).trim()),i=e}else r.push(e)}return r}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(){const e=[];for(const t of this.err){const o="object"==typeof t.msg?JSON.stringify(t.msg):t.msg||"";e.push(`${t.row?t.row+":":""}${o}`)}return e.join("\n")}};const n=/^\s*\{(:)?(var|deriva|valid|formula|header|genera|g|v|f|h)(\s.*)?\}/i;function l(e,t){let o=!1;const r=[];for(let i=e;i<t.length;i++){const e=t[i].trim();let a=e.split("//")[0].trim();if(e.startsWith("/*"))o=!0;else if(o&&e.endsWith("*/"))o=!1;else if(!o){if(n.test(e))return{fl:!0,i2:i-1,cols:r};if(a.endsWith("\\"))return{fl:!1};if(e.startsWith(":h ")&&(a=a.substr(3).trim()),!a.startsWith(":")){const e=s(a);for(let t=0;t<e.length;t++){let o=e[t].length;e[t].includes(",")&&(o+=2),(!r[t]||r[t]<o)&&(r[t]=o)}}}}return{fl:!0,i2:t.length-1,cols:r}}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";o.existsSync(C)&&(w=JSON.parse(o.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}2.1.33${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;const S=L._[2]||void 0;(L.h||L.help||!S)&&(console.log(F),process.exit(0)),w.CAT=S;const y=r.join(w.FOLDERCAT,S),D=r.join(w.FOLDERCAD,S);var E=r.join(D,`${S}.ddb`);o.existsSync(E)||(console.log("manca il database di origine: "+S),process.exit(1)),o.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 o of e)!o.startsWith('"')&&o.includes(",")&&(o=`"${o}"`),t.push(o);return t.join(",")}function R(e,t){var o=(e=e.replaceAll("\t",",").replaceAll("\r","").replace(/\#vb/gim,"/* VB !not supported").replace(/#endvb/gim,"*/").replace(/\#msg /gim,"!msg ")).split("\n"),r=[],i=!1;return o.forEach(((e,o)=>{e.startsWith("/*")&&(i=!0),i?r.push(e):/^\s*$/.test(e)||(t?(e=e.replace(/\s*\#m\s+(\w+)/im,((e,t)=>"#m ++"+t)),r.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*\_*/,"")),r.push(e))),i&&e.trim().endsWith("*/")&&(i=!1)})),function(e){const t=e.split("\n"),o=[];let r,i=0,a=!1,c=!1,d=[];if(r){const e=l(0,t);r=e.fl,r&&(d=e.cols)}for(let p=0;p<t.length;p++){const e=t[p];let h=e.trim();const f=h.split("//");let u=f[0].trim();f.splice(0,1);const m=f.length?` // ${f.join("//").trim()} `:"";if(h.startsWith("/*"))a=!0,o.push(h);else if(a&&h.endsWith("*/"))a=!1,o.push(h);else if(a)o.push(e);else{const e=n.exec(h);if(e){if(o.push(h),i=e[1]?0:1,/^\s*\{(var|deriva|header|v|h)(\s.*)?\}/i.test(h)){const e=l(p+1,t);r=e.fl,r&&(d=e.cols)}else r=!1;c=!1;continue}if(r)if(u.startsWith(":")&&!u.startsWith(":h ")||!u)o.push(h);else{let e=" ";u.startsWith(":h ")&&(u=u.substr(3).trim(),e=":h ");const t=s(u);for(let o=0;o<t.length;o++)t[o].includes(",")&&(t[o]=`"${t[o]}"`),t[o]=t[o].padEnd(d[o]," ");o.push(`${e}${t.join(" , ")} ${m}`)}else{const e=" ".repeat(i>=0?i:0);if(c)o.push(`${e} ${h}`);else{let t="";h.startsWith("#")&&(t=h.substring(1).split(" ")[0].toUpperCase(),h="#"+t+h.substring(t.length+1)),["IF","IFDEF","IFNDEF"].includes(t)?h.indexOf("#",2)<0?(o.push(`${e}${h}`),i++):(h=h.replace(/#([\w]+)/g,((e,t)=>"#"+t.toUpperCase())),o.push(`${e}${h}`)):["FOR","SELECT","FORVAR","VARIANTE","DO"].includes(t)?(o.push(`${e}${h}`),i++):["ELSEIF","ELSE","ELSEIFDEF","ELSEIFNDEF","CASE","CASES","DEFAULT"].includes(t)&&i>0?o.push(" ".repeat(i>0?i-1:0)+h):["ENDIF","ENDSELECT","LOOP","ENDFOR"].includes(t)?(o.push(" ".repeat(i>0?i-1:0)+h),i--,i<0&&(i=0)):h.startsWith("_ ")||h.startsWith(":")?o.push(h):o.push(e+h)}c=u.endsWith("\\")}}}return o.join("\n")}(r.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 o in e)"cod"!=o&&t.push(`${o}=${e[o]}`);return`${e.cod} ${t.join(",")}`}function T(e){var t=e.split(",");if(t[1]||t[2]){var o={};return o.cod=(t[2]||t[1]).trim().toLowerCase(),t[2]&&(o.alias=t[2].trim().toLowerCase()),t[3]&&(o.valid=t[3].trim().toLowerCase()),t[4]&&(o.des=t[4].trim()),t[5]&&(o.visible=t[5].trim().toLowerCase()),x[t[0]]?o.tipo=x[t[0]]:"D"==t[0]?o.tipo="sp."+t[6]:o.tipo=t[0].trim().toUpperCase(),o}}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)&&(o.existsSync(y)&&o.rmSync(y,{recursive:!0}),o.existsSync(I)&&o.unlinkSync(I)),o.existsSync(y)||o.mkdirSync(y,{recursive:!0}),o.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),o.writeFileSync(`${y}/${B.cod}.var`,J.join("\n"))}}for(var B of(N=_.all("select cod cod,des des,fldef defs from modelli order by cod"),(J=[]).push(":des Modelli\n\n:h Cod, Descrizione\n"),N))J.push(" "+W([B.cod.trim().toLowerCase(),B.des]));o.writeFileSync(`${y}/modelli.var`,J.join("\n")),M=["// Alias Varianti\n\n{v __aliasvar}\n:h variante, alias",...M.sort()],o.writeFileSync(`${y}/_alias.inc`,M.join("\n")),console.log("-> gruppi.ini");var H=r.join(D,"gruppi.ini");if(o.existsSync(H)){N=a(re=o.readFileSync(H).toString().replaceAll("�","'"));var K={},Z=[];for(var B of N)(de=/^\s*\[(\w+)\]/i.exec(B))?(Z=[],K[de[1].trim().toLowerCase()]=Z):(he=T(B))&&Z.push(z(he))}var q=Object.keys(K).sort();for(var Q of((J=[]).push("// includes headers"),q))J.push(""),J.push(`{h ${Q}}`),J.push(...K[Q]);if(o.writeFileSync(r.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();o.writeFileSync(r.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")}`)}for(var B of(N=_.all(`${A} and cod like ?`,">>%"),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 `,o.writeFileSync(r.join(y,`+${ge}.mu`),J)}var te=o.readdirSync(D);te=te.filter((e=>e.toLowerCase().endsWith(".erg")));var oe=0;for(var N of(console.log("-> regole",te.length),te)){var re=o.readFileSync(r.join(D,N)).toString().replaceAll("\r",""),ie=r.extname(N),se=r.basename(N,ie).trim().toLowerCase();if(!se.includes(".")&&"gene"!=se){var ae={cod:se,des:"",codice:[],header:[],formule:{}},ne=[],le=(J=re.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){if(J=[`// rule ${ae.cod}\n :des ${ae.des||ae.cod}\n `],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)),o.writeFileSync(r.join(y,se+".mu"),J.join("\n")),O(`reg ${++oe}: ${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)(ce=(P=ve.trim().toLowerCase()).split(",")[0].trim())&&(ce.includes(".")?me[(B=ce.split("."))[0]]?me[B[0]][B[1]]=P:console.log("errore tipo",ce):(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))));for(var B of(o.writeFileSync(y+"/typos.json",JSON.stringify(me,null,2)),N=_.all(`${A} and cod like ?`,"M>%"),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 `,o.writeFileSync(r.join(y,`++${ge}.mu`),J)}}if(L.a||L.abilita){function Oe(e){for(var t=[],o="";;){var r=e.lastIndexOf(",",100);if(e.length<100||r<0){t.push(o+e),o.length&&t.push("");break}t.push(o+e.substr(0,r)+", \\"),o=" ",e=e.substr(r+1)}return t.join("\n")}function Ae(e){var t=e.toLowerCase().split(";"),o=e=>e?[...new Set(e.split("*").sort().filter((e=>e.trim())))].join(","):"";return{abilit:o(t[0]),scons:o(t[1]),obs:o(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(o.existsSync(r.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));o.writeFileSync(r.join(y,be+".var.txt"),J.join("\n"))}}k=(new Date).valueOf()-k,console.log("Tempo: ",k+"ms"),_.chiudi();
|
|
2
|
+
import{init as e,database as t}from"croswil_lib";import o from"fs";import r from"path";import i from"minimist";function s(e,t=!1){e=String(e||"");const o=/^(\d*)\.\.(\d*)$/.exec(e);if(o){let e=parseInt(o[1])||0,t=parseInt(o[2])||0;const r=[];for(let o=e;o<=t;o++)r.push(o+"");return r}if(!/["({[]/.test(e))return e.split(/[,;]/).map((e=>e.trim()));const r=[];let i="",s=0,a=!1;for(let l=0;l<e.length;l++){const t=e[l];if(0===s&&'"'===t&&(0!==l&&"\\"===e[l-1]||(a=!a)),a||("("===t||"["===t||"{"===t?s++:")"!==t&&"]"!==t&&"}"!==t||(s=Math.max(0,s-1))),","!==t&&";"!==t||0!==s||a)i+=t;else{const e=i.trim();r.push(e),i=""}}const n=i.trim();return n&&r.push(n),r.map((e=>(e=e.trim(),!t&&(e.startsWith('"')&&e.endsWith('"')||e.startsWith("(")&&e.endsWith(")"))?e.slice(1,-1):e)))}function a(e,t){const o=(e=>e.replace(/("(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*')|\/\*[\s\S]*?\*\//g,((e,t)=>t||"")))(e).split(/\r?\n/),r=[];let i="";for(const s of o){let e=s;if(/(^|[^:])\/\/.*/.test(e)&&(e=e.replace(/(^|[^:])\/\/.*/,((e,t)=>t.trim()))),e=e.trim(),0!==e.length)if(i.length>0&&(e=i+" "+e,i=""),e.endsWith("\\")){e=e.slice(0,-1);const t=e.lastIndexOf("//");-1!==t&&(e=e.slice(0,t).trim()),i=e}else r.push(e)}return r}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(){const e=[];for(const t of this.err){const o="object"==typeof t.msg?JSON.stringify(t.msg):t.msg||"";e.push(`${t.row?t.row+":":""}${o}`)}return e.join("\n")}};const n=/^\s*\{(:)?(var|deriva|valid|formula|header|genera|g|v|f|h)(\s.*)?\}/i;function l(e,t){let o=!1;const r=[];for(let i=e;i<t.length;i++){const e=t[i].trim();let a=e.split("//")[0].trim();if(e.startsWith("/*"))o=!0;else if(o&&e.endsWith("*/"))o=!1;else if(!o){if(n.test(e))return{fl:!0,i2:i-1,cols:r};if(a.endsWith("\\"))return{fl:!1};if(e.startsWith(":h ")&&(a=a.substr(3).trim()),!a.startsWith(":")){const e=s(a);for(let t=0;t<e.length;t++){let o=e[t].length;e[t].includes(",")&&(o+=2),(!r[t]||r[t]<o)&&(r[t]=o)}}}}return{fl:!0,i2:t.length-1,cols:r}}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";o.existsSync(C)&&(w=JSON.parse(o.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}2.1.33${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;const S=L._[2]||void 0;(L.h||L.help||!S)&&(console.log(F),process.exit(0)),w.CAT=S;const y=r.join(w.FOLDERCAT,S),D=r.join(w.FOLDERCAD,S);var E=r.join(D,`${S}.ddb`);o.existsSync(E)||(console.log("manca il database di origine: "+S),process.exit(1)),o.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 o of e)!o.startsWith('"')&&o.includes(",")&&(o=`"${o}"`),t.push(o);return t.join(",")}function R(e,t){var o=(e=e.replaceAll("\t",",").replaceAll("\r","").replace(/\#vb/gim,"/* VB !not supported").replace(/#endvb/gim,"*/").replace(/\#msg /gim,"!msg ")).split("\n"),r=[],i=!1;return o.forEach(((e,o)=>{e.startsWith("/*")&&(i=!0),i?r.push(e):/^\s*$/.test(e)||(t?(e=e.replace(/\s*\#m\s+(\w+)/im,((e,t)=>"#m ++"+t)),r.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*\_*/,"")),r.push(e))),i&&e.trim().endsWith("*/")&&(i=!1)})),function(e){const t=e.split("\n"),o=[];let r,i=0,a=!1,c=!1,d=[];if(r){const e=l(0,t);r=e.fl,r&&(d=e.cols)}for(let p=0;p<t.length;p++){const e=t[p];let h=e.trim();const f=h.split("//");let u=f[0].trim();f.splice(0,1);const m=f.length?` // ${f.join("//").trim()} `:"";if(h.startsWith("/*"))a=!0,o.push(h);else if(a&&h.endsWith("*/"))a=!1,o.push(h);else if(a)o.push(e);else{const e=n.exec(h);if(e){if(o.push(h),i=e[1]?0:1,/^\s*\{(var|deriva|header|v|h)(\s.*)?\}/i.test(h)){const e=l(p+1,t);r=e.fl,r&&(d=e.cols)}else r=!1;c=!1;continue}if(r)if(u.startsWith(":")&&!u.startsWith(":h ")||!u)o.push(h);else{let e=" ";u.startsWith(":h ")&&(u=u.substr(3).trim(),e=":h ");const t=s(u);for(let o=0;o<t.length;o++)t[o].includes(",")&&(t[o]=`"${t[o]}"`),t[o]=t[o].padEnd(d[o]," ");o.push(`${e}${t.join(" , ")} ${m}`)}else{const e=" ".repeat(i>=0?i:0);if(c)o.push(`${e} ${h}`);else{let t="";h.startsWith("#")&&(t=h.substring(1).split(" ")[0].toUpperCase(),h="#"+t+h.substring(t.length+1)),["IF","IFDEF","IFNDEF"].includes(t)?h.indexOf("#",2)<0?(o.push(`${e}${h}`),i++):(h=h.replace(/#([\w]+)/g,((e,t)=>"#"+t.toUpperCase())),o.push(`${e}${h}`)):["FOR","SELECT","FORVAR","VARIANTE","DO"].includes(t)?(o.push(`${e}${h}`),i++):["ELSEIF","ELSE","ELSEIFDEF","ELSEIFNDEF","CASE","CASES","DEFAULT"].includes(t)&&i>0?o.push(" ".repeat(i>0?i-1:0)+h):["ENDIF","ENDSELECT","LOOP","ENDFOR"].includes(t)?(o.push(" ".repeat(i>0?i-1:0)+h),i--,i<0&&(i=0)):h.startsWith("_ ")||h.startsWith(":")?o.push(h):o.push(e+h)}c=u.endsWith("\\")}}}return o.join("\n")}(r.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 o in e)"cod"!=o&&t.push(`${o}=${e[o]}`);return`${e.cod} ${t.join(",")}`}function T(e){var t=e.split(",");if(t[1]||t[2]){var o={};return o.cod=(t[2]||t[1]).trim().toLowerCase(),t[2]&&(o.alias=t[2].trim().toLowerCase()),t[3]&&(o.valid=t[3].trim().toLowerCase()),t[4]&&(o.des=t[4].trim()),t[5]&&(o.visible=t[5].trim().toLowerCase()),x[t[0]]?o.tipo=x[t[0]]:"D"==t[0]?o.tipo="sp."+t[6]:o.tipo=t[0].trim().toUpperCase(),o}}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)&&(o.existsSync(y)&&o.rmSync(y,{recursive:!0}),o.existsSync(I)&&o.unlinkSync(I)),o.existsSync(y)||o.mkdirSync(y,{recursive:!0}),o.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),o.writeFileSync(`${y}/${B.cod}.var`,J.join("\n"))}}for(var B of(N=_.all("select cod cod,des des,fldef defs from modelli order by cod"),(J=[]).push(":des Modelli\n\n:h Cod, Descrizione\n"),N))J.push(" "+W([B.cod.trim().toLowerCase(),B.des]));o.writeFileSync(`${y}/modelli.var`,J.join("\n")),M=["// Alias Varianti\n\n{v __aliasvar}\n:h variante, alias",...M.sort()],o.writeFileSync(`${y}/_alias.inc`,M.join("\n")),console.log("-> gruppi.ini");var H=r.join(D,"gruppi.ini");if(o.existsSync(H)){N=a(re=o.readFileSync(H).toString().replaceAll("�","'"));var K={},Z=[];for(var B of N)(de=/^\s*\[(\w+)\]/i.exec(B))?(Z=[],K[de[1].trim().toLowerCase()]=Z):(he=T(B))&&Z.push(z(he))}var q=Object.keys(K).sort();for(var Q of((J=[]).push("// includes headers"),q))J.push(""),J.push(`{h ${Q}}`),J.push(...K[Q]);if(o.writeFileSync(r.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();o.writeFileSync(r.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")}`)}for(var B of(N=_.all(`${A} and cod like ?`,">>%"),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 `,o.writeFileSync(r.join(y,`+${ge}.mu`),J)}var te=o.readdirSync(D);te=te.filter((e=>e.toLowerCase().endsWith(".erg")));var oe=0;for(var N of(console.log("-> regole",te.length),te)){var re=o.readFileSync(r.join(D,N)).toString().replaceAll("\r",""),ie=r.extname(N),se=r.basename(N,ie).trim().toLowerCase();if(!se.includes(".")&&"gene"!=se){var ae={cod:se,des:"",codice:[],header:[],formule:{}},ne=[],le=(J=re.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){if(J=[`// rule ${ae.cod}\n :des ${ae.des||ae.cod}\n `],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)),o.writeFileSync(r.join(y,se+".mu"),J.join("\n")),O(`reg ${++oe}: ${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)(ce=(P=ve.trim().toLowerCase()).split(",")[0].trim())&&(ce.includes(".")?me[(B=ce.split("."))[0]]?me[B[0]][B[1]]=P:console.log("errore tipo",ce):(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))));for(var B of(o.writeFileSync(y+"/typos.json",JSON.stringify(me,null,2)),N=_.all(`${A} and cod like ?`,"M>%"),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 `,o.writeFileSync(r.join(y,`++${ge}.mu`),J)}}if(L.a||L.abilita){function Oe(e){for(var t=[],o="";;){var r=e.lastIndexOf(",",100);if(e.length<100||r<0){t.push(o+e),o.length&&t.push("");break}t.push(o+e.substr(0,r)+", \\"),o=" ",e=e.substr(r+1)}return t.join("\n")}function Ae(e){var t=e.toLowerCase().split(";"),o=e=>e?[...new Set(e.split("*").sort().filter((e=>e.trim())))].join(","):"";return{abilit:o(t[0]),scons:o(t[1]),obs:o(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(o.existsSync(r.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));o.writeFileSync(r.join(y,be+".var.txt"),J.join("\n"))}}k=(new Date).valueOf()-k,console.log("Tempo: ",k+"ms"),_.chiudi();
|
package/bin/mu.js
CHANGED
|
@@ -57,7 +57,7 @@ import fs from"fs";import path from"path";import{init,database,insertorupdate,ch
|
|
|
57
57
|
* Converte una stringa in array di colonne, gestendo diversi formati
|
|
58
58
|
* @param {string} value - Stringa da convertire
|
|
59
59
|
* @returns {string[]} Array di colonne
|
|
60
|
-
*/function getcolonne(value,keepquote=!1){value=String(value||"");const pp=/^(\d
|
|
60
|
+
*/function getcolonne(value,keepquote=!1){value=String(value||"");const pp=/^(\d*)\.\.(\d*)$/.exec(value);if(pp){let n1=parseInt(pp[1])||0,n2=parseInt(pp[2])||0;const cl=[];for(let i=n1;i<=n2;i++)cl.push(i+"");return cl}if(!/["({[]/.test(value))return value.split(/[,;]/).map((e=>e.trim()));const risultato=[];let buffer="",livelloParentesi=0,inVirgolette=!1;for(let i=0;i<value.length;i++){const char=value[i];if(0===livelloParentesi&&'"'===char&&(0!==i&&"\\"===value[i-1]||(inVirgolette=!inVirgolette)),inVirgolette||("("===char||"["===char||"{"===char?livelloParentesi++:")"!==char&&"]"!==char&&"}"!==char||(livelloParentesi=Math.max(0,livelloParentesi-1))),","!==char&&";"!==char||0!==livelloParentesi||inVirgolette)buffer+=char;else{const trimmed=buffer.trim();risultato.push(trimmed),buffer=""}}const trimmed=buffer.trim();return trimmed&&risultato.push(trimmed),risultato.map((e=>(e=e.trim(),!keepquote&&(e.startsWith('"')&&e.endsWith('"')||e.startsWith("(")&&e.endsWith(")"))?e.slice(1,-1):e)))}
|
|
61
61
|
/**
|
|
62
62
|
* Analizza variabili in un'espressione usando delimitatori
|
|
63
63
|
* @param {string} ex - Espressione da analizzare
|
|
@@ -133,7 +133,7 @@ function setOggetto(objDestinazione,objSorgente){"object"==typeof objDestinazion
|
|
|
133
133
|
*/clear(){this.vec=[],this.dictionary={}}azzera=()=>this.clear()
|
|
134
134
|
/**
|
|
135
135
|
* Recupera il valore di una variabile
|
|
136
|
-
*/;var(key){let fmt="";const pp=/^(\d
|
|
136
|
+
*/;var(key){let fmt="";const pp=/^(\d*)\.\.(\d*)$/.exec(key);if(pp){let n1=parseInt(pp[1])||0,n2=parseInt(pp[2])||0;const cl=[];for(let i=n1;i<=n2;i++)cl.push(i+"");return cl}if(key.indexOf("|")>=0){const tm=key.split("|");key=tm[0],fmt=tm[1]}function toformat(val,fmt){switch(fmt.trim().toLowerCase()){case"0":return String(parseInt(val)||0);case"-":return String((parseInt(val)||1)-1);case"+":return String((parseInt(val)||0)+1);case"data":return date=parseFloat(val)||0,new Intl.DateTimeFormat("it",{day:"2-digit",month:"short",year:"2-digit"}).format(date.toDate());case"euro":return((n,valorezero="")=>{if(n){let xx=Intl.NumberFormat("en",{style:"currency",currency:"EUR"}).format(n);return xx=xx.replace(/€/g,"").replace(/\./g,";").replace(/,/g,".").replace(/;/g,",")+"€",xx}return valorezero})(parseFloat(val));case"num":return toNum(parseFloat(val));case"n":case"n0":case"n1":case"n2":case"n3":case"n4":{const dec=parseInt(fmt.slice(1))||0;return toNum(parseFloat(val),dec)}case"u":return String(val).toUpperCase();case"l":return String(val).toLowerCase();default:return val}var date}const sanitizedKey=Variabile.sanitizeKey(key);if(sanitizedKey.startsWith(".")&&this.fndotcallback){const tm=this.fndotcallback(sanitizedKey.toLowerCase());if(tm)return toformat(tm,fmt)}if(Variabile.isValidKey(sanitizedKey)){const lowercaseKey=sanitizedKey.toLowerCase(),rr=/^([\w][\w\d]*)([.[])/.exec(lowercaseKey);if(rr){const tm=this.dictionary[rr[1]];if(tm&&"object"==typeof tm)return toformat(function objval(tm,key){const parts=key.split(".");let obj=tm;for(let i=0;i<parts.length;i++){const part=parts[i],match=part.match(/(.*?)\[(\d*)\]/);if(match){if(match[1]&&(obj=obj[match[1]]),void 0===obj)return"";obj=obj[parseInt(match[2],10)||0]}else switch(part){case"_k":obj=(Object.keys(obj)||[]).join(",");break;case"_v":obj=Object.values(obj)||[];break;case"_l":obj=obj.length||0;break;default:obj=obj[part]}if(void 0===obj)return""}return"number"==typeof obj?obj+"":obj}(tm,("["==rr[2]?rr[2]:"")+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
137
|
/**
|
|
138
138
|
* Restituisce un dump delle variabili
|
|
139
139
|
*/dump(isstr=!1){let cl=[];for(const t in this.dictionary)cl.push({cod:t,val:this.dictionary[t]});return cl=cl.sort(((a,b)=>a.cod>b.cod)),isstr?cl.map((e=>`${e.cod} = ${isObject(e.val)?JSON.stringify(e.val,null,2):e.val}`)):cl}
|
|
@@ -239,7 +239,7 @@ this.amb=amb}
|
|
|
239
239
|
/**
|
|
240
240
|
* Restituisce le chiavi valide ordinate alfabeticamente
|
|
241
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());const tm=[];for(const f of filtra){const rr=/^#([iex])(\d*)\s+(.+)$/i.exec(f);if(rr){const t={ex:rr[1],col:(parseInt(rr[2])||1)-1,val:"x"==rr[1]?rr[3]:getcolonne(rr[3])};t.val.length&&tm.push(t)}}if(tm.length)for(const x in this.rows){const r=this.rows[x];for(const t of tm)if("e"==t.ex){if(_check((r.v[t.col]+"").toLowerCase(),t.val)){r.annulla=1;break}}else if("x"==t.ex){const vt=(r.v[t.col]+"").toLowerCase().split(/[,;]/).map((e=>e.trim()));if(!_check((t.val+"").toLowerCase(),vt)){r.annulla=1;break}}else if(!_check((r.v[t.col]+"").toLowerCase(),t.val)){r.annulla=1;break}}function _check(value,valori){return!!valori.find((e=>e.startsWith(value)))}}
|
|
242
|
+
*/validkeys(){let kk=Object.keys(this.rows)||[];return kk=kk.filter((k=>0==this.rows[k].annulla)).sort(),kk}limitfiltra(filtra){if(this.resetfilter(),!filtra)return;filtra=muClComments(filtra.toLowerCase());const tm=[];for(const f of filtra){const rr=/^#([iex])(\d*)\s+(.+)$/i.exec(f);if(rr){const t={ex:rr[1],col:(parseInt(rr[2])||1)-1,val:"x"==rr[1]?rr[3]:getcolonne(rr[3])};t.val.length&&tm.push(t)}}if(tm.length)for(const x in this.rows){const r=this.rows[x];for(const t of tm)if("e"==t.ex){if(_check((r.v[t.col]+"").toLowerCase(),t.val)){r.annulla=1;break}}else if("x"==t.ex){const vt=(r.v[t.col]+"").toLowerCase().split(/[,;]/).map((e=>e.trim()));if(!_check((t.val+"").toLowerCase(),vt)){r.annulla=1;break}}else if(!_check((r.v[t.col]+"").toLowerCase(),t.val)){r.annulla=1;break}}function _check(value,valori){if(1==valori?.length&&"."==valori[0])return!!value;return!!valori.find((e=>e.startsWith(value)))}}
|
|
243
243
|
/**
|
|
244
244
|
* Applica i limiti configurati alle opzioni della variante
|
|
245
245
|
* @returns {Array|void} Array di limiti applicati o void se reset
|
|
@@ -251,7 +251,7 @@ this.amb=amb}
|
|
|
251
251
|
*/async loadContentExtended(content){if("object"==typeof content){for(const x in content)["rows","des","h","alias","obbligo"].includes(x)&&(this[x]=content[x]);"string"==typeof content.def&&content.def.length&&(this.vdef=getcolonne(content.def.trim().toLowerCase())),content.filter&&content.filter.length&&(this.limits=parselimitifromdb(content.filter))}else await this._loadContent(muClComments(content,!1))}todata(){return{name:this.name,des:this.des,alias:this.alias,obbligo:this.obbligo,h:this.h,rows:this.rows,limits:this.limits,key:this.key}}}const _nofunc={};async function getcbfunc(tm,cmd,pars,vari,amb,output){if(cbFunc$1){if(_nofunc[cmd])return"";let a=await cbFunc$1(cmd,pars,vari,amb,output);return isObject(a)||(a=(a||"").trim(),"!"==a&&(_nofunc[cmd]=!0,a="")),a}return tm}async function intvaluta(amb,mac,str){return await amb.vari.valuta(str,(async(fun,pars)=>{switch(fun){case"dim":{let dm=muCalc(pars[1]),vv=await dammivariante(amb,mac,pars[2]),col=parseInt(pars[3])||2;return vv&&vv.fromdim?vv.fromdim(dm,col):dm}case"seed":{let n1=pars[1],cl=getcolonne(pars[2]);return cl[seeder(cl.length,n1)]||""}case"seedvar":{let vv=await dammivariante(amb,mac,pars[2]),n1=pars[1],cl=vv.validkeys();if(pars[3]&&pars[4]){let idcol=muCalc(pars[3])-1;if(idcol>=0){let pcol=getcolonne(pars[4]);cl=cl.filter((e=>{let t=vv.rows[e];if(t&&t.v&&t.v[idcol]){let v=getcolonne(t.v[idcol]);if(v)for(let p of pcol)if(v.includes(p))return!0}return!1}))}}let id=seeder(cl.length,n1);return id>=0&&vv.tovar(cl[id])||""}default:return await getcbfunc(`**fun:${fun}**`,fun,pars,amb.vari,amb)}}))}async function dammivariante(amb,macro,ky){let tm;return tm=macro&¯o?.localvar&¯o.localvar[ky]?macro.localvar[ky]:await amb.getvariante(ky),tm}async function impostavariante(amb,macro,a,b,head){let tm,ky=a;if((b=b||"")&&"string"==typeof b){const k=b.indexOf(":");k>=0&&(k>0&&(ky=clean(b.slice(0,k))),b=b.slice(k+1))}
|
|
252
252
|
/** @type {Variante} */if(head&&head.alias&&(ky=head.alias),macro&¯o.paralias&¯o.paralias[a]&&(ky=macro.paralias[a]),tm=await dammivariante(amb,macro,ky),tm)if(head&&head.t){head.des||(head.des=tm.des);let x8=head?.filtra||"";if(x8.includes("$")&&(x8=await amb.vari.valuta(x8)),"m"===head.t){let col=2;if(b.includes(":")){const xx=b.split(":");col=parseInt(xx[1]),b=xx[0]}tm.limita(x8),b=tm.fromdim(parseFloat(b),col)}else{tm.limita(x8);const b1=tm.firstvalid(b,getcolonne(head.def));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&&("object"==typeof a?output.push(JSON.stringify(a,null,2)):"string"==typeof a&&a.startsWith("_ ")&&output.length>0&&"string"==typeof output[output.length-1]?output[output.length-1]+=a.slice(2):output.push(...a.split("\n")))};async function muEval(amb,mac,codice,options){if(!Array.isArray(codice))return errori.add("codice is not a valid parsed array"),[];options||(options={}),options.id||(options.id="_"),options._stackmacro||(options._stackmacro=0),options.limited||(options.limited=!1),amb||errori.add("amb deve essere definito");const vari=amb.vari;amb.maxdelays,amb.cat;const output=[];let macro,pars,xid;(new Date).valueOf();for(let ii=0;ii<codice.length;){let riga=codice[ii];switch(riga.tipo){case"IFDEF":case"IFNDEF":case"IF":{const tm="IF"==riga.tipo?muCalc(await intvaluta(amb,mac,riga.contenuto)):"IFDEF"==riga.tipo?""!=await intvaluta(amb,mac,riga.contenuto):""==await intvaluta(amb,mac,riga.contenuto);riga.next?(codice[riga.next].jlast=tm?1:0,tm||(ii=riga.next-1)):errori.add("Troppo tempo",riga)}break;case"SELECT":riga.next?(codice[riga.next].t1=await intvaluta(amb,mac,riga.contenuto),ii=riga.next-1):errori.add("manca endselect",riga);break;case"CASE":case"CASES":case"DEFAULT":if(riga.next)if(riga.jlast)riga.jlast=0,ii=riga.last-1;else{let vv,tm=1;const _getvv=async()=>{let vv=await intvaluta(amb,mac,riga.contenuto);return vv=vv.includes(":")&&!vv.includes(",")?vv.split(":").map((e=>(e||"").trim())):getcolonne(vv),vv};if("CASE"==riga.tipo){tm=0,vv=await _getvv();const tmx=muCalc(riga.t1||"");vv.find((v=>muCalc(v)==tmx))&&(tm=1)}else if("CASES"==riga.tipo){tm=0,vv=await _getvv();const tmx=riga.t1||"";vv.find((v=>v==tmx))&&(tm=1)}codice[riga.next].jlast=tm?1:0,codice[riga.next].t1=riga.t1,tm||(ii=riga.next-1)}else errori.add("manca select",riga);break;case"ELSEIF":case"ELSEIFDEF":case"ELSEIFNDEF":case"ELSE":if(riga.next)if(riga.jlast)riga.jlast=0,ii=riga.last-1;else{const tm="ELSE"==riga.tipo?1:"ELSEIF"==riga.tipo?muCalc(await intvaluta(amb,mac,riga.contenuto)):"ELSEIFDEF"==riga.tipo?""!=await intvaluta(amb,mac,riga.contenuto):""==await intvaluta(amb,mac,riga.contenuto);codice[riga.next].jlast=tm?1:0,tm||(ii=riga.next-1)}else errori.add("manca endif",riga);break;case"ENDIF":case"ENDSELECT":case"CACHE":case"CVAR":break;case"PUSH":vari.push();break;case"POP":vari.pop();break;case"INC":case"I":if(options._stackmacro>500)errori.add("stack chiamate macro troppo profondo!",riga);else if(({macro:macro,pars:pars,xid:xid}=await amb.getmacro(riga)||{}),macro){options._inc=!0,options._stackmacro++;const saved={},parametri=macro.parametri?._;if(parametri&¶metri.length)for(const x of parametri){const x1=clean(x.split("=")[0]||"",!0);x1&&(saved[x1]=vari.dictionary[x1])}await macro.impostaparametri(parametri,pars);const rs1=await muEval(amb,macro,macro.codice,options);for(const v in saved)saved[v]?vari.dictionary[v]=saved[v]:delete vari.dictionary[v];output.push(...rs1),options._stackmacro--,options._inc=!1}break;case"RET":{const a=await intvaluta(amb,mac,riga.contenuto);amb.vari.savevars(a)}break;case"MACRO":case"M":case"FUNC":case"F":if(options._stackmacro>500)errori.add("stack chiamate macro troppo profondo!",riga);else{let{macro:macro,pars:pars,xid:xid}=await amb.getmacro(riga)||{};if(macro){const ismacro=!!options.grafica||["F","FUNC"].includes(riga.tipo),optid=options.id||"",parametri=macro.parametri?._,saved={};if(ismacro)vari.push();else{if(macro.head)for(const x of macro.head)saved[x.cod]=amb.vari.var(x.cod);if(parametri&¶metri.length)for(const x of parametri){const x1=(x.split("=")[0]||"").trim().toLowerCase();x1&&(saved[x1]=vari.dictionary[x1])}}if(macro.codice.length){if(options._stackmacro++,options.grafica&&"function"==typeof options.grafica){let f="",xid="";pars&&pars.length?(f=pars.find((e=>e.startsWith("#id"))),f?(f=await vari.valuta(f.slice(4)),f.startsWith("#")?options.id=f: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 tm=amb.pick.key;amb.pick.key=options.id;const out=await options.grafica({tipo:riga.tipo,id:xid,pars:pars,parametri:parametri,macro:macro,options:options,vari:amb.vari,amb:amb});amb.pick.key=tm,output.push(out)}else{await macro.impostaparametri(parametri,pars);let tm=amb.vari.var("_rootnode");amb.vari.add("_rootnode","0");const rs1=await muEval(amb,macro,macro.codice,options);amb.vari.add("_rootnode",tm),output.push(...rs1)}options._stackmacro--}if(ismacro)vari.pop();else for(const v in saved)saved[v]?vari.dictionary[v]=saved[v]:delete vari.dictionary[v];options.id=optid}else errori.add("Macro non trovata!",riga)}break;case"SETDEF":{let cl=getcolonne(riga.contenuto.toLowerCase()),tm=await dammivariante(amb,macro,cl[0]),prf=cl[1]||"def_",filtra=cl[2];if(prf.endsWith("_")||(prf+="_"),tm&&tm.rows){cl=Object.keys(tm.rows),filtra&&(cl=cl.filter((e=>e.startsWith(filtra))));for(let c of cl){let ky=`${prf}${c}`;if(!vari.dictionary[ky]){function torow(tm){const cl=[];if(tm)for(const t of tm.v.slice(1))"string"==typeof t&&(t.includes(",")||t.includes(";"))?cl.push(quote(t)):cl.push(t||"");return cl.join(",")}vari.add(ky,await intvaluta(amb,mac,torow(tm.rows[c])))}}}}break;case"LET":case"LETS":{let i=riga.contenuto.indexOf("="),j=-1;if(i>=0&&(j=riga.contenuto.indexOf("=",i+1)),j<0){const v=riga.contenuto;if(i=v.indexOf("="),i>0){const a=await intvaluta(amb,mac,v.slice(0,i).trim());let b=v.slice(i+1).trim();b="LET"==riga.tipo?muCalc(await intvaluta(amb,mac,b))||"":await intvaluta(amb,mac,b),vari.add(a,b)}}else{const vv=getcolonne(riga.contenuto);for(const v of vv)if(i=v.indexOf("="),i>0){const a=await intvaluta(amb,mac,v.slice(0,i));let b=v.slice(i+1).trim();b="LET"==riga.tipo?muCalc(await intvaluta(amb,mac,b))||"":await intvaluta(amb,mac,b),vari.add(a,b)}}}break;case"LETT":{const i=riga.contenuto.indexOf("=");if(i>0){const a=await intvaluta(amb,mac,riga.contenuto.slice(0,i).trim()),b=await intvaluta(amb,mac,riga.contenuto.slice(i+1).trim());vari.add(a,b)}}break;case"LOOK":case"LOOKB":{const cc=getcolonne(await intvaluta(amb,mac,riga.contenuto)),base=muCalc(cc[1]),col=muCalc(cc[3]),ww=await dammivariante(amb,macro,cc[2]);if(ww&&ww.rows){const rr=Object.values(ww.rows).reduce(((t,e)=>{const val=parseInt(e.v[col?col-1:0]);return val&&("LOOKB"==riga.tipo?val<=base&&val>t.v&&(t.v=val,t.c=e.v[0]):val>=base&&val<t.v&&(t.v=val,t.c=e.v[0])),t}),{v:"LOOKB"==riga.tipo?0:1/0,c:""});rr&&rr.c&&(amb.vari.add(cc[0],ww.tovar(rr.c)),options.checkheader&&"function"==typeof options.checkheader&&await options.checkheader({variante:cc[0],valore:ww.tovar(rr.c),riga:riga}))}else amb.vari.add(cc[0],`${base},no,no`)}break;case"LETV":case"LETM":case"DEF":{const tm=getcolonne(riga.contenuto);if(tm)for(const x of tm){let{v:v,o:o,fl:fl}=getcouple(x);if(fl){v=await vari.valuta(v),o=await intvaluta(amb,mac,o);const valore=await impostavariante(amb,mac,v.trim().toLowerCase(),o.trim().toLowerCase(),"LETM"==riga.tipo?{t:"m"}:{t:"v"});options._stackmacro<=0&&options.checkheader&&"function"==typeof options.checkheader&&await options.checkheader({variante:v,valore:valore,riga:riga})}}}break;case"DO":{const valido=(riga.contenuto||"").trim();let fl=!0;valido&&!muCalc(await intvaluta(amb,mac,valido))&&(fl=!1),riga.next&&(fl||(ii=riga.next+1))}break;case"VARIANTE":case"FORVAR":case"FOR":{let vv,valido,elenco,v;if(options.oldstyle?(vv=riga.contenuto.split(","),v=vv[2]||"i",elenco=vv[0],valido=vv[1]):(vv=getcolonne(riga.contenuto||""),v=vv[0]||"",elenco=clean(vv[1],!0),valido=vv[2]||""),v=v.includes("$")?await intvaluta(amb,mac,v):v||"","FORVAR"==riga.tipo||"VARIANTE"==riga.tipo){const tm=await intvaluta(amb,mac,elenco),xx=tm?await dammivariante(amb,mac,tm):void 0;xx?elenco=xx.tovec():(elenco=[],errori.add("getvariante not found!",riga))}else{const txx=await intvaluta(amb,mac,elenco||"");elenco=elenco?getcolonne(txx):void 0}elenco=elenco||[];const nc=0;if(riga.next){codice[riga.next].for={v:v,elenco:elenco,nc:nc,valido:valido};let voce,fl=!0;v&&elenco.length>0?nc>=elenco.length?fl=!1:(voce=elenco[nc],vari.add(v,voce),valido&&(fl=!muCalc(await intvaluta(amb,mac,valido)))):fl=!1,fl||(ii=riga.next-1)}else errori.add("manca endfor/loop",riga)}break;case"LOOP":{let fl=!0;riga.contenuto&&!muCalc(await intvaluta(amb,mac,riga.contenuto))&&(fl=!1),fl&&(ii=riga.prev-1);break}case"ENDFOR":if(!riga.contenuto||muCalc(await intvaluta(amb,mac,riga.contenuto)))if(riga.for){const{v:v,elenco:elenco,valido:valido}=riga.for;if(v&&elenco.length>0&&riga.for.nc<500)for(;;){if(riga.for.nc++,riga.for.nc<elenco.length){if(vari.add(v,elenco[riga.for.nc]),valido&&muCalc(await intvaluta(amb,mac,valido)))continue;ii=riga.prev;break}break}}else errori.add("manca istruzione for",riga);break;case"BREAK":case"EXIT":case"EXITFOR":riga.next?riga.contenuto.trim()?muCalc(await intvaluta(amb,mac,riga.contenuto))&&(ii=riga.next):ii=riga.next:errori.add("break outside loop",riga);break;case"CONTINUE":riga.next?riga.contenuto&&!muCalc(await intvaluta(amb,mac,riga.contenuto))||(ii=riga.next-1):errori.add("continue outside loop",riga);break;case"MSG":case"LOG":{const tm99=await intvaluta(amb,mac,riga.contenuto);logga(tm99),errori.add(tm99)}break;default:{let tm;if(riga.contenuto.startsWith("!")){tm=await intvaluta(amb,mac,riga.contenuto);let a="";const rr=/^!(.\w+)[\s;,]\s*(.+)?$/gim.exec(tm);if(rr)if(rr[1].startsWith("."))await getcbfunc(tm,tm.slice(1),[],vari,amb),a="";else{const cmd=rr[1].toLowerCase(),pars=getcolonne(rr[2]||"");a=await getcbfunc(tm,cmd,pars,vari,amb)}a&&outpush(output,a)}else options.parsefnpunto&&"function"==typeof options.parsefnpunto&&riga.contenuto.startsWith(".")?await options.parsefnpunto({dati:riga.contenuto,output:output,id:options.id,vari:amb.vari,amb:amb}):(tm=await intvaluta(amb,mac,riga.contenuto),outpush(output,tm))}}ii++}return output}async function muGenerate_0(mac,amb,genera,callback,output){const xgen=mac.genera[genera];if(xgen){output.counter2=0;const working_variant={};async function processavariante(liv){if(output.isTestmode&&output.counter>output.isTestmode)return;if(liv<xgen.vars.length){const xx=xgen.vars[liv];if(!working_variant[xx]){const xvar=await dammivariante(amb,mac,xx),keys=xvar?Object.keys(xvar.rows):void 0;if(keys&&keys.length>0){for(const k of keys)amb.vari.add(xvar.name,xvar.tovar(k)),working_variant[xx]=!0,await processavariante(liv+1),working_variant[xx]=!1;return}logga("manca la variante",xx)}}for(const x of xgen.calcola)mac.formula[x]&&await muEval(amb,mac,mac.formula[x],{limited:!0});for(const x of xgen.exclude)if(mac.formula[x]){const vvv=await muEval(amb,mac,mac.formula[x],{limited:!0});if(vvv)for(const v of vvv){if(muCalc(v))return}}const out1=await muEval(amb,mac,xgen.codice,{limited:!0,localvar:mac.localvar}),bb={};for(const x of xgen.bom)if(mac.formula[x]){let vvv=await muEval(amb,mac,mac.formula[x],{limited:!0});vvv=vvv.join("\n").split("\n");for(const v of vvv)if(v){const tm=getcolonne(v);bb[x]||(bb[x]=[]);const t={};for(let i=0;i<tm.length;i++)t[`c${i}`]=tm[i];bb[x].push(t)}}await async function docallback(callback,out1,bom,xgen,genera,output){let fl=!0;for(const x of out1){const tm=getcolonne(x);if(tm[0]&&!output[tm[0]]){output[tm[0]]=1,output.counter++,output.counter2++;const o={__id:output.counter};for(let i=0;i<tm.length;i++){let key=xgen.head[i]?xgen.head[i]:`c${i}`;"#"==key[0]?(key=key.substr(1),o[key]=Math.round(1e3*muCalc(tm[i]))/1e3):o[key]=tm[i]}await callback(genera,o,fl?bom:void 0,output.counter,output.counter2),fl=!1}}}(callback,out1,bb,xgen,genera,output)}await processavariante(0)}}const DIMS=["l","a","p"],rx1=/^\{(:?(var|valid|formula|genera|header|v|f|g|h))[\s|}]/im,tipifree=["s","g","h","p","q"];function valutaCondizioniTestata(vari,str){const vv=str.split("\n");for(const v of vv)if(v.trim()){if(muCalc(vari.valutasync(v)))return!0}return!1}class Macro{constructor(amb,_name){const{name:name,cat:cat}=checkmu(_name,amb.cat||"");this.name=name,this.cat=cat,
|
|
253
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(){const cl=[];return this.errori.forEach((e=>cl.push({e:e}))),cl}getparametri(op={}){const{noderiva:noderiva}=op,s={};if(this.dims&&DIMS.forEach((k=>{const t=muCalc(this.amb.vari.var(k));t&&(s[k]=String(t))})),this.head){for(const x of this.head)if(!x._h){if(noderiva&&x._d&&x._d.cod)continue;let tm=this.amb.vari.var(x.cod);tipifree.includes(x.t)||"string"==typeof tm&&(tm=tm.split(",")[0]),s[x.cod]=tm}}else if(this.parametri?._)for(const x of this.parametri._){const x1=(x.split("=")[0]||"").trim().toLowerCase();let tm=this.amb.vari.var[x1];tm=(tm||"").split(",")[0],s[x1]=tm}return s}async setparametri(pars){const ff={},ruleset=this.amb.ruleset||{};pars||(pars={}),this.dims&&DIMS.forEach((e=>{let t=pars[e]||this.dims[e].val;t=parseFloat(t)||0,this.dims[e].visible&&(t<this.dims[e].min&&(t=this.dims[e].min),t>this.dims[e].max&&(t=this.dims[e].max)),pars[e]=String(t)}));for(const x of this.head){const tm=ruleset[x.cod];tm&&(tm.islock?(x.visible="0",pars[x.cod]=tm.opz,x._islock=!0):pars[x.cod]||(pars[x.cod]=tm.opz)),"g"!=x.t&&("z"!=x.t||pars[x.cod]||(pars[x.cod]="1"),x._v=pars[x.cod]||"",ff[x.cod]=!0)}for(const x in pars)ff[x]||(ff[x]=!0,await impostavariante(this.amb,this,x,pars[x]));return this.head?.length>0&&await this.setparametro(this.head[0].cod,pars[this.head[0].cod]||void 0,!0,pars),this.getparametri()}async setparametro(name,value,propaga=!1,pars={}){if(value&&"string"==typeof value&&value.includes("$")&&(value=await intvaluta(this.amb,this,value)),pars||(pars={}),this.head){const _imposta=async(riga,vv,id,propaga)=>{const nn=riga?.cod;if(riga.valid&&!riga._h1){const t0=!valutaCondizioniTestata(this.amb.vari,riga.valid);if(riga._h!=t0&&(riga._h=t0,["g","g1","g2"].includes(riga.t)))for(let i=id+1;i<this.head.length;i++){const tm1=this.head[i];if(tm1){if(["g","g1","g2"].includes(tm1.t))break;tm1._h1=riga._h}}}if(riga._h||riga._h1)return this.amb.vari.add(nn,""),riga._v=void 0,"";{if(delete riga._h2,riga.visible){const t0=!valutaCondizioniTestata(this.amb.vari,riga.visible);if(t0&&(riga._h2=t0),["g","g1","g2"].includes(riga.t))for(let i=id+1;i<this.head.length;i++){const tm1=this.head[i];if(tm1){if(["g","g1","g2"].includes(tm1.t))break;riga._h2?tm1._h3=riga._h2:delete tm1._h3}}}let tx=this.amb.vari.var(nn)||"";"thlm".includes(riga.t)&&"string"==typeof tx&&(tx=tx.split(",")[0]);let txold=tx;if("z"!=riga.t||tx||(this.amb.vari.add(nn,"1"),tx="1"),"m"==riga.t&&riga.spars){const vspars=getcolonne(riga.spars);tx=parseFloat(tx||vspars[0])||0,vspars[1]&&parseFloat(tx)<vspars[1]&&(tx=parseFloat(vspars[1])||0),vspars[2]&&parseFloat(tx)>vspars[2]&&(tx=parseFloat(vspars[2])||0),tx=String(tx),this.amb.vari.add(nn,tx)}const tmimposta=await impostavariante(this.amb,this,nn,vv||riga._v||tx,riga);if(riga._v=void 0,tx=this.amb.vari.var(nn)||"","thl".includes(riga.t)&&"string"==typeof tx&&(tx=tx.split(",")[0],this.amb&&this.amb.deriva&&this.amb.deriva.length>0)){const t2=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==tx))))));t2.length&&t2.forEach((e=>{let t=this.head.find((h=>h.cod==e.tocod));if(t){let t1=this.amb.vari.var(t.cod);pars&&pars[t.cod]&&(t1=pars[t.cod]),"string"==typeof t1&&(t1=t1.split(",")[0],t1&&t1!=txold&&t1!=tx?delete t._d:(t._v=e.toopz||tx,t._d={cod:riga.cod,opz:e.toopz}))}}))}return tmimposta}};let tm,i0=-1;if("#dim"==name)propaga=1;else{if(i0=this.head.findIndex((e=>e.cod===name)),i0<0)return;const hh=this.head[i0];tm=await _imposta(hh,value,i0),propaga&&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)}isderivato(hd){return"string"==typeof hd&&(hd=this.head.find((e=>e.cod==hd))),!!(hd&&hd._d&&hd._d.cod)}async impostaparametri(parimposta,parcall,ismacro=!1,progettokeys){if(this.head){this.paralias||(this.paralias={}),Array.isArray(this.head)||(this.head=[]);for(const i of this.head)i._v="",delete i._h,delete i._h1,delete i._h2,i.alias&&(this.paralias[i.cod]=i.alias)}progettokeys||(progettokeys={}),parimposta||(parimposta=[]),parcall||(parcall=[]);for(const x of[...parimposta,...parcall]){const i=x.indexOf("=");if(i>0){let a=clean(x.substr(0,i));a.includes("$")&&(a=await intvaluta(this.amb,this,a));let t,b=x.substr(i+1);b.includes("$")&&(b=await intvaluta(this.amb,this,b)),this.head&&(t=this.head.find((e=>e.cod==a)))?t._v=b:await impostavariante(this.amb,this,a,b)}}if(this.head){let fl=!0;for(const h of this.head){let fl2=await this.checkvalid(h.valid);ismacro&&(fl2=!0),["g","g1","g2"].includes(h.t)?fl=fl2:fl&&fl2&&await this.setparametro(h.cod,progettokeys[h.cod]||h._v)}}}async checkvalid(formula){if(!formula)return!0;return!!muCalc(await intvaluta(this.amb,this,formula))}getmacrostr(){return JSON.stringify(this.getmacro())}getmacro(){return getOggetto(this,["amb"])}setmacro(vv){if(setOggetto(this,fromjson(vv,{})),this.localvar)for(const x in this.localvar){const vv=new Variante;setOggetto(vv,this.localvar[x]),this.localvar[x]=vv}}async load(xname,xcat){let name,cat;try{let tm;if(({name:name,cat:cat}=checkmu(xname||this.name,xcat||this.cat||"")),this.name||(this.name=name),this.cat||(this.cat=cat),this.azzera(),cbGetMacro$1&&(tm=await cbGetMacro$1(cat,name),"string"==typeof tm&&(tm.startsWith("{")||tm.startsWith("["))&&(tm=fromjson(tm)),tm&&tm.head&&!Array.isArray(tm.head)&&(tm.head=[]),this.amb.checkscripts(tm.linkscript),delete tm.linkscript,tm.head&&(tm.dims=function getheaddims(dims){let res;try{res="object"==typeof dims&&dims?dims:JSON.parse(dims||"{}")}catch(error){res={}}return res||(res={}),res.l||(res.l={visible:1,val:1e3,min:0,max:1e4}),res.a||(res.a={visible:1,val:1e3,min:0,max:1e4}),res.p||(res.p={visible:1,val:1e3,min:0,max:1e4}),res}(tm.dims))),tm){if("string"==typeof tm)await this.parsedata(tm);else for(const x in tm)this[x]=tm[x];return!0}errori.add(`missing cbGetFile: ${cat}/${name}`)}catch(error){errori.add(geterrdes(error),`macro.load: ${name}/${cat}`)}}async loadAndCompile(file,_cat,acapo=!1){let res;const{name:name,cat:cat}=checkmu(file,this.cat||_cat);return this.azzera(),cbGetFile$1&&(res=await cbGetFile$1(cat,name)),res?(await this.parsedata(res,acapo),this.getmacro()):void errori.add(`missing cbGetFile: ${name}/${cat}`)}async#loadinclude(file,flin,stak,pp){let res;const{name:name,cat:cat}=checkmu(file,this.cat);if(cbGetFile$1&&(res=await cbGetFile$1(cat,name)),!res)return[];if(res.includes("$1")&&pp&&pp.length>0)for(let i=1;i<pp.length;i++)res=res.replaceAll(`$${i}`,pp[i]);let tm=muClComments(res);const t2=[];flin&&(tm=tm.filter((t=>!/^\{(:?(var|valid|formula|header|genera|v|f|h))[\s|}]/im.test(t))));for(const t of tm){const rr=rx1.exec(t);if(rr)flin=!rr[1].startsWith(":"),t2.push(t);else{const r1=/^\s*\{i\s(.+)?\}/im.exec(t);if(r1){const pp=getcolonne(r1[1]);if(!stak.includes(pp[0])){stak.push(pp[0]);const t3=await this.loadinclude(pp[0],flin,stak,pp);Array.isArray(t3)&&t2.push(...t3),stak.pop()}}else t2.push(t)}}return t2}async parsedata(res,acapo=!1){if(this.azzera(),!res)return;const t2=[];let tm=muClComments(res),flin=!1;const lochead=[];for(const t of tm){const rr=rx1.exec(t);if(rr)flin=!rr[1].startsWith(":"),t2.push(t);else{const r1=/^\s*\{i\s(.+)?\}/im.exec(t);if(r1){const pp=getcolonne(r1[1]),t3=await this.#loadinclude(pp[0],flin,[pp[0]],pp);Array.isArray(t3)&&t2.push(...t3)}else t2.push(t)}}flin=!1;let out=this.codice;for(const t of t2){const rr=rx1.exec(t);if(rr)if(rr[1].startsWith(":"))out=this.codice;else switch(rr[1]){case"genera":case"g":{let r2=/^\s*\{(genera|g)\s+(.+)?\}/im.exec(t);if(r2){const name=checkname(getcolonne(r2[2])[0]);this.genera[name]=[],out=this.genera[name]}else out=this.errori,out.push(t)}break;case"valid":out=this.valid;break;case"var":case"v":{const r2=/^\s*\{(var|v)\s+(.+)?\}/im.exec(t);if(r2){const nn=getcolonne(r2[2]),name=checkname(nn[0]);this.localvar[name]={name:name,des:nn[1]||"",rows:[]},out=this.localvar[name].rows}else out=this.errori,out.push(t)}break;case"formula":case"f":{const r2=/^\s*\{(formula|f)\s+(.+)?\}/im.exec(t);if(r2){const name=checkname(r2[2]);this.formula[name]=[],out=this.formula[name]}else out=this.errori,out.push(t)}break;case"h":case"header":out=lochead;break;default:this.errori.push(t),out=this.errori}else t.startsWith("{")&&(out=this.codice),out.push(t)}this.parametri={},this.codice=this.cleanfiltraparametri("_",this.codice,acapo);for(const f in this.formula)this.formula[f]=this.cleanfiltraparametri(f,this.formula[f],acapo);for(const f in this.localvar){const vv=new Variante,v=this.localvar[f];vv.setheader(f,this.cat),vv.rows={};for(const x of v.rows){const c=getcolonne(x),k=c[0].trim().toLowerCase();vv.rows[k]={annulla:0,v:c}}v.des&&(vv.des=v.des),this.localvar[f]=vv}tm=this.valid,this.valid=[];for(const t of tm){let p=getcouple(t,",");p={v:p.v,msg:p.o},p.v&&(p.v.startsWith("#")?this.formula[p.v.substring(1)]&&this.valid.push(p):this.valid.push(p))}tm=lochead;const head=[];for(const t of tm){const rr=/^\s*([\w\-_]+)+[;,\s]\s*(.*)?$/im.exec(t);if(rr){const pp=getcolonne(rr[2]),c=clean(rr[1]);let ht;if(c){ht=head.find((e=>e.cod==c)),ht||(ht={cod:c,t:"t"},head.push(ht));for(const tp of pp){const p=getcouple(tp);switch(p.v){case"t":ht.t=p.o;break;case"def":case"default":ht.def=p.o;break;case"valid":case"colonna":case"hidden":p.o.startsWith("#")?this.formula[p.o.substring(1)]&&(ht[p.v]=p.o):ht[p.v]=p.o;break;default:ht[p.v]=p.o}}}}}this.head=head,tm=this.genera;const genera={};for(const kk in tm)if(Array.isArray(tm[kk])){const gen={codice:[],head:"",calcola:[],bom:[],vars:[],exclude:[]},regx=/^\s*[!:]\s*(\w+)\s*(.*)$/i;for(const k2 of tm[kk]){const rr=regx.exec(clean(k2));if(rr)switch(rr[1]){case"calcola":case"c":gen.calcola=[...gen.calcola,...getcolonne(rr[2])];break;case"exclude":case"e":case"escludi":gen.exclude=[...gen.exclude,...getcolonne(rr[2])];break;case"bom":case"db":gen.bom=[...gen.bom,...getcolonne(rr[2])];break;case"vars":case"v":gen.vars=[...gen.vars,...getcolonne(rr[2])];break;case"head":case"h":gen.head=getcolonne(rr[2]);break;default:this.errori.push(`genera ${kk} => ${k2}`)}else gen.codice.push(k2)}gen.codice=muClean(gen.codice,!0),genera[kk]=gen}this.genera=genera}cleanfiltraparametri(key,codice,acapo){if(this.paralias||(this.paralias={}),codice&&codice.length){let fl=!1;const getparalias=dati=>{const cl=[],co=getcolonne(dati);for(const c of co)if(c.includes(":")){const v=c.split(":");this.paralias[v[0]]=v[1],cl.push(v[0])}else cl.push(c);return cl};for(let i=0;i<codice.length;i++){const rr=/^:p[;,\s]+(.*)?$/im.exec(codice[i]);if(rr)codice[i]=null,fl=!0,this.parametri[key]=getparalias(rr[1]);else{const rr=/^!(parametri|pars|p)[;,\s]+(.*)?$/im.exec(codice[i]);rr&&(codice[i]=null,fl=!0,this.parametri[key]=getparalias(rr[2]))}}fl&&(codice=codice.filter((e=>null!=e)))}return codice=muClean(codice,acapo)}}const regex=/^\s*\{(:)?(var|deriva|valid|formula|header|genera|g|v|f|h)(\s.*)?\}/i;function verificaisvar(i1,lines){let inBloccoCommento=!1;const cols=[];for(let i=i1;i<lines.length;i++){const line=lines[i].trim();let linenc=line.split("//")[0].trim();if(line.startsWith("/*"))inBloccoCommento=!0;else if(inBloccoCommento&&line.endsWith("*/"))inBloccoCommento=!1;else if(!inBloccoCommento){if(regex.test(line))return{fl:!0,i2:i-1,cols:cols};if(linenc.endsWith("\\"))return{fl:!1};if(line.startsWith(":h ")&&(linenc=linenc.substr(3).trim()),!linenc.startsWith(":")){const cl=getcolonne(linenc);for(let j=0;j<cl.length;j++){let l=cl[j].length;cl[j].includes(",")&&(l+=2),(!cols[j]||cols[j]<l)&&(cols[j]=l)}}}}return{fl:!0,i2:lines.length-1,cols:cols}}
|
|
254
|
+
this.amb=amb,this.azzera()}azzera(){this.key=`${this.cat}/${this.name}`,this.localvar={},this.head=[],this.frontend=!1,this.valid=[],this.parametri={},this.paralias={},this.formula={},this.settings={},this.errori=[],this.codice=[],this.genera={}}get isgenera(){return Object.keys(this.genera).length||0}get iscodice(){return this.codice.length||0}get isheader(){return this.head?.length||0}geterrori(){const cl=[];return this.errori.forEach((e=>cl.push({e:e}))),cl}getparametri(op={}){const{noderiva:noderiva}=op,s={};if(this.dims&&DIMS.forEach((k=>{const t=muCalc(this.amb.vari.var(k));t&&(s[k]=String(t))})),this.head){for(const x of this.head)if(!x._h){if(noderiva&&x._d&&x._d.cod)continue;let tm=this.amb.vari.var(x.cod);tipifree.includes(x.t)||"string"==typeof tm&&(tm=tm.split(",")[0]),s[x.cod]=tm}}else if(this.parametri?._)for(const x of this.parametri._){const x1=(x.split("=")[0]||"").trim().toLowerCase();let tm=this.amb.vari.var[x1];tm=(tm||"").split(",")[0],s[x1]=tm}return s}async setparametri(pars){const ff={},ruleset=this.amb.ruleset||{};pars||(pars={}),this.dims&&DIMS.forEach((e=>{let t=pars[e]||this.dims[e].val;t=parseFloat(t)||0,this.dims[e].visible&&(t<this.dims[e].min&&(t=this.dims[e].min),t>this.dims[e].max&&(t=this.dims[e].max)),pars[e]=String(t)}));for(const x of this.head){const tm=ruleset[x.cod];tm&&(tm.islock?(x.visible="0",pars[x.cod]=tm.opz,x._islock=!0):pars[x.cod]||(pars[x.cod]=tm.opz)),"g"!=x.t&&("z"!=x.t||pars[x.cod]||(pars[x.cod]="1"),x._v=pars[x.cod]||"",ff[x.cod]=!0)}for(const x in pars)ff[x]||(ff[x]=!0,await impostavariante(this.amb,this,x,pars[x]));return this.head?.length>0&&await this.setparametro(this.head[0].cod,pars[this.head[0].cod]||void 0,!0,pars),this.getparametri()}async setparametro(name,value,propaga=!1,pars={}){if(value&&"string"==typeof value&&value.includes("$")&&(value=await intvaluta(this.amb,this,value)),pars||(pars={}),this.head){const _imposta=async(riga,vv,id,propaga)=>{const nn=riga?.cod;if(riga.valid&&!riga._h1){const t0=!valutaCondizioniTestata(this.amb.vari,riga.valid);if(riga._h!=t0&&(riga._h=t0,["g","g1","g2"].includes(riga.t)))for(let i=id+1;i<this.head.length;i++){const tm1=this.head[i];if(tm1){if(["g","g1","g2"].includes(tm1.t))break;tm1._h1=riga._h}}}if(riga._h||riga._h1)return this.amb.vari.add(nn,""),riga._v=void 0,"";{if(delete riga._h2,riga.visible){const t0=!valutaCondizioniTestata(this.amb.vari,riga.visible);if(t0&&(riga._h2=t0),["g","g1","g2"].includes(riga.t))for(let i=id+1;i<this.head.length;i++){const tm1=this.head[i];if(tm1){if(["g","g1","g2"].includes(tm1.t))break;riga._h2?tm1._h3=riga._h2:delete tm1._h3}}}let tx=this.amb.vari.var(nn)||"";"thlm".includes(riga.t)&&"string"==typeof tx&&(tx=tx.split(",")[0]);let txold=tx;if("z"!=riga.t||tx||(this.amb.vari.add(nn,"1"),tx="1"),"m"==riga.t&&riga.spars){const vspars=getcolonne(riga.spars);tx=parseFloat(tx||vspars[0])||0,vspars[1]&&parseFloat(tx)<vspars[1]&&(tx=parseFloat(vspars[1])||0),vspars[2]&&parseFloat(tx)>vspars[2]&&(tx=parseFloat(vspars[2])||0),tx=String(tx),this.amb.vari.add(nn,tx)}const tmimposta=await impostavariante(this.amb,this,nn,vv||riga._v||tx,riga);if(riga._v=void 0,tx=this.amb.vari.var(nn)||"","thl".includes(riga.t)&&"string"==typeof tx&&(tx=tx.split(",")[0],this.amb&&this.amb.deriva&&this.amb.deriva.length>0)){const t2=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==tx))))));t2.length&&t2.forEach((e=>{let t=this.head.find((h=>h.cod==e.tocod));if(t){let t1=this.amb.vari.var(t.cod);pars&&pars[t.cod]&&(t1=pars[t.cod]),"string"==typeof t1&&(t1=t1.split(",")[0],t1&&t1!=txold&&t1!=tx?delete t._d:(t._v=e.toopz||tx,t._d={cod:riga.cod,opz:e.toopz}))}}))}return tmimposta}};let tm,i0=-1;if("#dim"==name)propaga=1;else{if(i0=this.head.findIndex((e=>e.cod===name)),i0<0)return;const hh=this.head[i0];tm=await _imposta(hh,value,i0),propaga&&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)}getmarker(){let marker;if(this.head&&this.head.length){let tm=this.head.find((e=>"marker"==(e.stipo||"").trim().toLowerCase().split(/[;,]/)[0].trim()));tm&&tm.cod&&(marker=tm.cod)}return marker}isderivato(hd){return"string"==typeof hd&&(hd=this.head.find((e=>e.cod==hd))),!!(hd&&hd._d&&hd._d.cod)}async impostaparametri(parimposta,parcall,ismacro=!1,progettokeys){if(this.head){this.paralias||(this.paralias={}),Array.isArray(this.head)||(this.head=[]);for(const i of this.head)i._v="",delete i._h,delete i._h1,delete i._h2,i.alias&&(this.paralias[i.cod]=i.alias)}progettokeys||(progettokeys={}),parimposta||(parimposta=[]),parcall||(parcall=[]);for(const x of[...parimposta,...parcall]){const i=x.indexOf("=");if(i>0){let a=clean(x.substr(0,i));a.includes("$")&&(a=await intvaluta(this.amb,this,a));let t,b=x.substr(i+1);b.includes("$")&&(b=await intvaluta(this.amb,this,b)),this.head&&(t=this.head.find((e=>e.cod==a)))?t._v=b:await impostavariante(this.amb,this,a,b)}}if(this.head){let fl=!0;for(const h of this.head){let fl2=await this.checkvalid(h.valid);ismacro&&(fl2=!0),["g","g1","g2"].includes(h.t)?fl=fl2:fl&&fl2&&await this.setparametro(h.cod,progettokeys[h.cod]||h._v)}}}async checkvalid(formula){if(!formula)return!0;return!!muCalc(await intvaluta(this.amb,this,formula))}getmacrostr(){return JSON.stringify(this.getmacro())}getmacro(){return getOggetto(this,["amb"])}setmacro(vv){if(setOggetto(this,fromjson(vv,{})),this.localvar)for(const x in this.localvar){const vv=new Variante;setOggetto(vv,this.localvar[x]),this.localvar[x]=vv}}async load(xname,xcat){let name,cat;try{let tm;if(({name:name,cat:cat}=checkmu(xname||this.name,xcat||this.cat||"")),this.name||(this.name=name),this.cat||(this.cat=cat),this.azzera(),cbGetMacro$1&&(tm=await cbGetMacro$1(cat,name),"string"==typeof tm&&(tm.startsWith("{")||tm.startsWith("["))&&(tm=fromjson(tm)),tm&&tm.head&&!Array.isArray(tm.head)&&(tm.head=[]),this.amb.checkscripts(tm.linkscript),delete tm.linkscript,tm.head&&(tm.dims=function getheaddims(dims){let res;try{res="object"==typeof dims&&dims?dims:JSON.parse(dims||"{}")}catch(error){res={}}return res||(res={}),res.l||(res.l={visible:1,val:1e3,min:0,max:1e4}),res.a||(res.a={visible:1,val:1e3,min:0,max:1e4}),res.p||(res.p={visible:1,val:1e3,min:0,max:1e4}),res}(tm.dims))),tm){if("string"==typeof tm)await this.parsedata(tm);else for(const x in tm)this[x]=tm[x];return!0}errori.add(`missing cbGetFile: ${cat}/${name}`)}catch(error){errori.add(geterrdes(error),`macro.load: ${name}/${cat}`)}}async loadAndCompile(file,_cat,acapo=!1){let res;const{name:name,cat:cat}=checkmu(file,this.cat||_cat);return this.azzera(),cbGetFile$1&&(res=await cbGetFile$1(cat,name)),res?(await this.parsedata(res,acapo),this.getmacro()):void errori.add(`missing cbGetFile: ${name}/${cat}`)}async#loadinclude(file,flin,stak,pp){let res;const{name:name,cat:cat}=checkmu(file,this.cat);if(cbGetFile$1&&(res=await cbGetFile$1(cat,name)),!res)return[];if(res.includes("$1")&&pp&&pp.length>0)for(let i=1;i<pp.length;i++)res=res.replaceAll(`$${i}`,pp[i]);let tm=muClComments(res);const t2=[];flin&&(tm=tm.filter((t=>!/^\{(:?(var|valid|formula|header|genera|v|f|h))[\s|}]/im.test(t))));for(const t of tm){const rr=rx1.exec(t);if(rr)flin=!rr[1].startsWith(":"),t2.push(t);else{const r1=/^\s*\{i\s(.+)?\}/im.exec(t);if(r1){const pp=getcolonne(r1[1]);if(!stak.includes(pp[0])){stak.push(pp[0]);const t3=await this.loadinclude(pp[0],flin,stak,pp);Array.isArray(t3)&&t2.push(...t3),stak.pop()}}else t2.push(t)}}return t2}async parsedata(res,acapo=!1){if(this.azzera(),!res)return;const t2=[];let tm=muClComments(res),flin=!1;const lochead=[];for(const t of tm){const rr=rx1.exec(t);if(rr)flin=!rr[1].startsWith(":"),t2.push(t);else{const r1=/^\s*\{i\s(.+)?\}/im.exec(t);if(r1){const pp=getcolonne(r1[1]),t3=await this.#loadinclude(pp[0],flin,[pp[0]],pp);Array.isArray(t3)&&t2.push(...t3)}else t2.push(t)}}flin=!1;let out=this.codice;for(const t of t2){const rr=rx1.exec(t);if(rr)if(rr[1].startsWith(":"))out=this.codice;else switch(rr[1]){case"genera":case"g":{let r2=/^\s*\{(genera|g)\s+(.+)?\}/im.exec(t);if(r2){const name=checkname(getcolonne(r2[2])[0]);this.genera[name]=[],out=this.genera[name]}else out=this.errori,out.push(t)}break;case"valid":out=this.valid;break;case"var":case"v":{const r2=/^\s*\{(var|v)\s+(.+)?\}/im.exec(t);if(r2){const nn=getcolonne(r2[2]),name=checkname(nn[0]);this.localvar[name]={name:name,des:nn[1]||"",rows:[]},out=this.localvar[name].rows}else out=this.errori,out.push(t)}break;case"formula":case"f":{const r2=/^\s*\{(formula|f)\s+(.+)?\}/im.exec(t);if(r2){const name=checkname(r2[2]);this.formula[name]=[],out=this.formula[name]}else out=this.errori,out.push(t)}break;case"h":case"header":out=lochead;break;default:this.errori.push(t),out=this.errori}else t.startsWith("{")&&(out=this.codice),out.push(t)}this.parametri={},this.codice=this.cleanfiltraparametri("_",this.codice,acapo);for(const f in this.formula)this.formula[f]=this.cleanfiltraparametri(f,this.formula[f],acapo);for(const f in this.localvar){const vv=new Variante,v=this.localvar[f];vv.setheader(f,this.cat),vv.rows={};for(const x of v.rows){const c=getcolonne(x),k=c[0].trim().toLowerCase();vv.rows[k]={annulla:0,v:c}}v.des&&(vv.des=v.des),this.localvar[f]=vv}tm=this.valid,this.valid=[];for(const t of tm){let p=getcouple(t,",");p={v:p.v,msg:p.o},p.v&&(p.v.startsWith("#")?this.formula[p.v.substring(1)]&&this.valid.push(p):this.valid.push(p))}tm=lochead;const head=[];for(const t of tm){const rr=/^\s*([\w\-_]+)+[;,\s]\s*(.*)?$/im.exec(t);if(rr){const pp=getcolonne(rr[2]),c=clean(rr[1]);let ht;if(c){ht=head.find((e=>e.cod==c)),ht||(ht={cod:c,t:"t"},head.push(ht));for(const tp of pp){const p=getcouple(tp);switch(p.v){case"t":ht.t=p.o;break;case"def":case"default":ht.def=p.o;break;case"valid":case"colonna":case"hidden":p.o.startsWith("#")?this.formula[p.o.substring(1)]&&(ht[p.v]=p.o):ht[p.v]=p.o;break;default:ht[p.v]=p.o}}}}}this.head=head,tm=this.genera;const genera={};for(const kk in tm)if(Array.isArray(tm[kk])){const gen={codice:[],head:"",calcola:[],bom:[],vars:[],exclude:[]},regx=/^\s*[!:]\s*(\w+)\s*(.*)$/i;for(const k2 of tm[kk]){const rr=regx.exec(clean(k2));if(rr)switch(rr[1]){case"calcola":case"c":gen.calcola=[...gen.calcola,...getcolonne(rr[2])];break;case"exclude":case"e":case"escludi":gen.exclude=[...gen.exclude,...getcolonne(rr[2])];break;case"bom":case"db":gen.bom=[...gen.bom,...getcolonne(rr[2])];break;case"vars":case"v":gen.vars=[...gen.vars,...getcolonne(rr[2])];break;case"head":case"h":gen.head=getcolonne(rr[2]);break;default:this.errori.push(`genera ${kk} => ${k2}`)}else gen.codice.push(k2)}gen.codice=muClean(gen.codice,!0),genera[kk]=gen}this.genera=genera}cleanfiltraparametri(key,codice,acapo){if(this.paralias||(this.paralias={}),codice&&codice.length){let fl=!1;const getparalias=dati=>{const cl=[],co=getcolonne(dati);for(const c of co)if(c.includes(":")){const v=c.split(":");this.paralias[v[0]]=v[1],cl.push(v[0])}else cl.push(c);return cl};for(let i=0;i<codice.length;i++){const rr=/^:p[;,\s]+(.*)?$/im.exec(codice[i]);if(rr)codice[i]=null,fl=!0,this.parametri[key]=getparalias(rr[1]);else{const rr=/^!(parametri|pars|p)[;,\s]+(.*)?$/im.exec(codice[i]);rr&&(codice[i]=null,fl=!0,this.parametri[key]=getparalias(rr[2]))}}fl&&(codice=codice.filter((e=>null!=e)))}return codice=muClean(codice,acapo)}}const regex=/^\s*\{(:)?(var|deriva|valid|formula|header|genera|g|v|f|h)(\s.*)?\}/i;function verificaisvar(i1,lines){let inBloccoCommento=!1;const cols=[];for(let i=i1;i<lines.length;i++){const line=lines[i].trim();let linenc=line.split("//")[0].trim();if(line.startsWith("/*"))inBloccoCommento=!0;else if(inBloccoCommento&&line.endsWith("*/"))inBloccoCommento=!1;else if(!inBloccoCommento){if(regex.test(line))return{fl:!0,i2:i-1,cols:cols};if(linenc.endsWith("\\"))return{fl:!1};if(line.startsWith(":h ")&&(linenc=linenc.substr(3).trim()),!linenc.startsWith(":")){const cl=getcolonne(linenc);for(let j=0;j<cl.length;j++){let l=cl[j].length;cl[j].includes(",")&&(l+=2),(!cols[j]||cols[j]<l)&&(cols[j]=l)}}}}return{fl:!0,i2:lines.length-1,cols:cols}}
|
|
255
255
|
/**
|
|
256
256
|
* Formatta il codice sorgente applicando indentazione e allineamento
|
|
257
257
|
* @param {string} code - Il codice sorgente da formattare
|