markuno_lib 1.2.52 → 1.2.54

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/markcad.js CHANGED
@@ -523,7 +523,7 @@ function alignByMinDist(sag1,sag2,isopen){const n1=sag1.length,n2=sag2.length;if
523
523
  * - dati: Array di oggetti con le posizioni elaborate dei tagli
524
524
  * - punti: Array di oggetti {a,b} che definiscono inizio e fine di ogni segmento
525
525
  */
526
- function calcoladivisioni(ff,notused,shape2,oggetti){return makedivisions(ff,shape2,oggetti)},check:check,checkoggetto:checkoggetto,creaprofiloesterno:creaprofiloesterno,create:function create(x,y,bordo,options){options||(options={});let{minvano:minvano,priority:priority,taglio:taglio,tipo:tipo,h1:h1,h2:h2,d1:d1,d2:d2,l1:l1,l2:l2,x1:x1,x2:x2,y1:y1,y2:y2,gvert:gvert,goriz:goriz,forma:forma,area:area}=options,ff=check({x:x,y:y,area:area,bordo:bordo,gvert:gvert,goriz:goriz,priority:priority,minvano:minvano,taglio:taglio,tipo:tipo,h1:h1,h2:h2,l1:l1,l2:l2,d1:d1,x1:x1,y1:y1,d2:d2,x2:x2,y2:y2});return ff.forma=forma,ff},elaborapercorso:elaborapercorso,getbordi:getbordi,makedivisions:makedivisions,makeshape:function makeshape(ff,oggetti){return creaprofiloesterno(ff,oggetti)},priorita:{v:"verticale",h:"orizzontale"},tagli:tagli,tipi:tipi,tipilocks:[{cod:"diml",des:"Larghezza"},{cod:"dima",des:"Altezza"},{cod:"etipo",des:"Modifica Tipo"},{cod:"etaglio",des:"Modifica Taglio"},{cod:"ebordi",des:"Modifica Bordi"},{cod:"esag",des:"Shape"},{cod:"vcrea",des:"Crea Div. Verticale"},{cod:"ocrea",des:"Crea Div. Orizzontale"},{cod:"vmov",des:"Sposta Div. Verticale"},{cod:"omov",des:"Sposta Div. Orizzontale"},{cod:"vedit",des:"Modifica Div. Verticale"},{cod:"oedit",des:"Modifica Div. Orizzontale"},{cod:"emods",des:"Modificatori Orizzontali/Verticali"},{cod:"ecuts",des:"Modifica/Aggiungi Cuts"},{cod:"earee",des:"Modifica Aree"}],tipoalign:tipoalign,tipocut:tipocut});function joinlinestoshapes(lk){let out=[];for(let ll of lk)for(let l1 of ll.lines){let l=new Linea2(l1.p1,l1.p2);l.move(ll.pos.x,ll.pos.z),l.rotate(ll.ang),l.valid=!0,out.push(l)}function samepoint(p1,p2){return Math.abs(p1.x-p2.x)+Math.abs(p1.y-p2.y)<.1}for(let i=0;i<out.length;i++){if(!out[i].valid)continue;if(out[i].len<.1){out[i].valid=!1;continue}const a=out[i];for(let j=i+1;j<out.length;j++){const b=out[j];if(!b.valid)continue;if(!a.isparallela(b))continue;if(!a.isCollineare(b))continue;a.a1b=b.onsegment(a.p1,.1),a.a2b=b.onsegment(a.p2,.1),a.b1a=a.onsegment(b.p1,.1),a.b2a=a.onsegment(b.p2,.1);const{x:ax,y:ay}=a.direzione,{x:bx,y:by}=b.direzione;if(ax*bx+ay*by>0)if(a.b1a&&a.b2a)b.valid=!1;else{if(a.a1b&&a.a2b){a.valid=!1;break}if(a.a1b&&a.b2a){let l=new Linea2(b.p1,a.p2);l.valid=!0,out.push(l),a.valid=!1,b.valid=!1;break}if(a.a2b&&a.b1a){let l=new Linea2(a.p1,b.p2);l.valid=!0,out.push(l),a.valid=!1,b.valid=!1;break}}else{const ta1=a.proiezionet(a.p1).t,ta2=a.proiezionet(a.p2).t,tb1=a.proiezionet(b.p1).t,tb2=a.proiezionet(b.p2).t,minA=Math.min(ta1,ta2),maxA=Math.max(ta1,ta2),minB=Math.min(tb1,tb2),maxB=Math.max(tb1,tb2),ovMin=Math.max(minA,minB),ovMax=Math.min(maxA,maxB);if(ovMax>ovMin+.1){if(minA<ovMin){let l=new Linea2(a.puntot(minA),a.puntot(ovMin));l.valid=!0,out.push(l)}if(maxA>ovMax){let l=new Linea2(a.puntot(maxA),a.puntot(ovMax));l.valid=!0,out.push(l)}if(minB<ovMin){let l=new Linea2(a.puntot(minB),a.puntot(ovMin));l.valid=!0,out.push(l)}if(maxB>ovMax){let l=new Linea2(a.puntot(maxB),a.puntot(ovMax));l.valid=!0,out.push(l)}a.valid=!1,b.valid=!1;break}}}}out=out.filter((e=>e.valid)).map((e=>getshape().frompt([e.p1,e.p2])));for(let i1=0;i1<out.length;i1++){let s1=out[i1],changed=!0;for(;changed;){changed=!1;for(let i2=i1+1;i2<out.length;){let s2=out[i2];samepoint(s1.pt[0],s2.pt[0])?(s2.pt.reverse(),s1.pt.unshift(...s2.pt.slice(0,-1)),out.splice(i2,1),changed=!0):samepoint(s1.pt[s1.pt.length-1],s2.pt[s2.pt.length-1])?(s2.pt.reverse(),s1.pt.push(...s2.pt.slice(1)),out.splice(i2,1),changed=!0):samepoint(s1.pt[0],s2.pt[s2.pt.length-1])?(s1.pt.unshift(...s2.pt.slice(0,-1)),out.splice(i2,1),changed=!0):samepoint(s1.pt[s1.pt.length-1],s2.pt[0])?(s1.pt.push(...s2.pt.slice(1)),out.splice(i2,1),changed=!0):i2++}}}return out}async function valutagrafica(amb,startmacro,rulespec,progetto,fnreload){let{getcolonne:getcolonne,muCalc:muCalc,muEval:muEval,tipifree:tipifree}=amb.muvalutatore;rulespec||(rulespec={});for(let x of["l","a","p"]){!amb.vari.var(x)&&startmacro.dims&&amb.vari.add(x,String(startmacro.dims[x].val||100))}let fnlist=new Set;const PARSGLOBAL=["sl","sa","sp","ul","ua","up","ax","ay","az","scx","scy","scz","scale"];let isdimreload,isfnreload=!1,oo=await muEval(amb,startmacro,startmacro.codice,{leveleval:0,checkheader:op=>{let{variante:variante}=op;if(Array.isArray(startmacro.head)){let ff=startmacro.head.find((e=>e.cod==variante));isfnreload=!!ff}},grafica:async _op=>{let p2,cadv,iscad,des,fatti,{id:id,pars:pars,parametri:parametri,macro:macro,options:options,vari:vari}=_op,isheader=!!(macro&&macro.head&&macro.head.length),sv={l:amb.vari.var("l"),a:amb.vari.var("a"),p:amb.vari.var("p")};const varcad=["l","a","p","#d",...PARSGLOBAL];for(let x of varcad){let tm=amb.vari.dictionary[x];tm&&(sv[x]=tm)}async function _parsepars(x,head){let k,v,r9=/^#(d|des|descrizione)\s*=\s*(.*)\s*$/im.exec(x);if(r9)k="#d",v=await amb.vari.valuta(r9[2]);else{let result=await vari.parametrokeyval(x);k=result.k,v=result.v}k&&!fatti[k]&&(fatti[k]=!0,varcad.includes(k)?"#d"==k?des=v:("string"==typeof v&&(v=muCalc(v)),["l","a","p"].includes(k)&&amb.vari.add(k,String(v)),cadv[k]=v,iscad=!0):"string"==typeof v?p2.push(`${k}=${v}`):amb.vari.add(k,v))}let px;if(p2=[],cadv={},iscad=!1,des="",fatti={},progetto&&progetto.keys&&progetto.keys[id]&&(px=progetto.keys[id].pars,px))for(let t in px){let t1=amb.vari.dictionary[t];t1&&(sv[t]=t1),await _parsepars(`${t}=${px[t]}`)}if(pars&&pars.length)for(const par of pars)await _parsepars(par);if(parametri&&parametri.length)for(const param of parametri)await _parsepars(param);if(macro&&macro.head&&macro.head.length){let tm=macro.head.filter((e=>!["g","p"].includes(e.t)));for(const h of tm)await _parsepars(h.cod)}let out={iscad:iscad,isheader:isheader,name:macro.name,des:des,leveleval:options.leveleval};isheader&&id&&(out.id=id),iscad&&(cadv.l?amb.vari.add("l",String(cadv.l)):cadv.l=muCalc(amb.vari.var("l")),cadv.a?amb.vari.add("a",String(cadv.a)):cadv.a=muCalc(amb.vari.var("a")),cadv.p?amb.vari.add("p",String(cadv.p)):cadv.p=muCalc(amb.vari.var("p")),out.cadv=cadv),await macro.impostaparametri(parametri,p2,!0,px);let ruleid=rulespec[id];id&&isheader&&ruleid&&ruleid.pars&&(out.pars=ruleid.pars,options.leveleval++,await macro.setparametri(ruleid.pars));let tm=amb.vari.var("_rootnode");if(amb.vari.add("_rootnode","0"),out.rows=await muEval(amb,macro,macro.codice,options),amb.vari.add("_rootnode",tm),id&&isheader&&(out.spars=macro.getparametri()),iscad)for(let x in sv)amb.vari.dictionary[x]=sv[x];return out},parsefnpunto:async _op=>{let{dati:dati,vari:vari,id:id,output:output}=_op;dati=dati.trim();let q=dati.indexOf(" "),q2=dati.indexOf(",");q2>0&&q>0&&q2<q&&(q=q2);let fn,pp,pars={},p2={};q>1?(fn=dati.slice(1,q),pp=getcolonne(dati.slice(q+1))):(fn=dati.slice(1),pp=[]),fnlist.has(fn)||fnlist.add(fn);for(let p of pp){let{k:k,v:v}=await vari.parametrokeyval(p);k&&/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(k)&&(pars[k]=v||"")}for(let l of["l","a","p"])pars[l]||(pars[l]=vari.var(l));let tm=Object.keys(pars);for(let l of PARSGLOBAL)tm.includes(l)&&(p2[l]=muCalc(pars[l]),p2[l]&&(pars[l]=p2[l]));output.push({t:"fn",fn:fn,id:id,pars:pars,p2:p2})}});for(let x of["l","a","p"])if(startmacro.dims&&startmacro.dims[x].val!=parseFloat(amb.vari.var(x))){isdimreload=!0;break}return(isfnreload||isdimreload&&"function"==typeof fnreload)&&await fnreload(isdimreload,isfnreload),{oo:oo,vari:amb.vari.dump(!0),fnlist:[...fnlist]}}function ismacro(row){return"object"==typeof row&&row?.name&&row.rows}function isfn(row){return"object"==typeof row&&"fn"==row?.t}function getnodebyid(id,nodocorrente){let res;return nodocorrente&&nodocorrente.rows&&function _getnode(rows){for(let x of rows){if(ismacro(x)){if(x.id==id)return void(res=x);x.rows&&_getnode(x.rows)}if(res)return}}(nodocorrente.rows),res}function getsubrules(nodocorrente){let res=[];return res.push({id:"",level:0,name:"home"}),function _xfiltrati(rr,level){if(rr.rows&&rr.rows.length)for(let x of rr.rows)ismacro(x)&&(x.id&&x.isheader?(res.push({id:x.id,name:x.name,des:x.des||"",spec:x.pars?1:0,level:level}),_xfiltrati(x,level+1)):_xfiltrati(x,level))}(nodocorrente,1),res}function getdumpmacro(nodo){let cl=[];return function _dumpnodo(node){if(node.rows&&node.rows.length)for(let x of node.rows)if(ismacro(x)){x.name;let c=[];if(x.iscad&&x.cadv)for(let k in x.cadv){let t=x.cadv[k];"number"==typeof t&&t&&c.push(`${k}=${t}`)}if(x.pars)for(let k in x.pars){let t=x.pars[k];c.push(`${k}=${t}`)}c.length&&cl.push(`--\x3e ${x.name} ${c.join(",")}`),_dumpnodo(x),c.length&&cl.push("<--")}else isfn(x)?cl.push(`FN: ${x.fn} ${JSON.stringify(x.pars)}`):"string"==typeof x&&x.length&&cl.push(x)}(nodo),cl.join("\n")}const mgreen$1=new THREE.MeshStandardMaterial({color:36864,roughness:.5,metalness:.4,side:THREE.DoubleSide});function getorientate(ori,x,y,z){switch(x=x||0,y=y||0,z=z||0,ori.trim().toLowerCase()){case"alp":return{x:y,y:x,z:z};case"apl":return{x:y,y:z,z:x};case"pla":return{x:z,y:x,z:y};case"pal":return{x:z,y:y,z:x};case"lpa":return{x:x,y:z,z:y};default:return{x:x,y:y,z:z}}}function parselavs(ori,id,x=0,y=0,z=0,lavorazioni="",facce="",def=""){let lavcods=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)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}(lavorazioni),rets=[];for(let lavcod of lavcods){let rr=/^([({}):$\w.\\/]+)[\s;,]*(.*)?$/im.exec(lavcod);if(rr&&rr[1]){let lav={name:rr[1].trim().toLowerCase(),...getorientate(ori,x,y,z),id:id,facce:facce};if(rr[2]){let aa=getcolonne(rr[2]);for(let a of aa){let i=a.indexOf("=");i>0&&(lav[a.slice(0,i).trim()]=a.slice(i+1).trim())}}rets.push(lav)}}return!rets.length&&def&&rets.push({name:def,...getorientate(ori,x,y,z),id:id,facce:facce}),rets}function getemitter(data){let{d:d,name:name,x:x,y:y,z:z,lavs:lavs="",ids:ids="",faces:faces=null,size:size=5}=data;ids=getcolonne(clean(ids,!0));const emitter=new THREE.Object3D;if(emitter.position.set(x,y,z),emitter.userData={emitter:!0,lavs:lavs,ids:ids,faces:faces,size:size,name:name},d){const geometry=new THREE.SphereGeometry(size||5,8,8),material=new THREE.MeshBasicMaterial({color:16711680}),mesh=new THREE.Mesh(geometry,material);emitter.add(mesh)}return emitter}function getreceiver(gcad,data){gcad.gmats.__istask=1;let{d:d,ori:ori="LAP",x:x=0,y:y=0,z:z=0,tipo:tipo="",start:start="",end:end=""}=data;tipo=clean(tipo,!0);const receiver=new THREE.Object3D;if(receiver.position.set(x/2,y/2,z/2),receiver.userData={receiver:!0,ori:(ori||"").trim().toLowerCase(),x:x,y:y,z:z,tipo:tipo,start:start,end:end},d){const geometry=new THREE.BoxGeometry(x,y,z),mesh=new THREE.Mesh(geometry,mgreen$1);mesh.position.set(0,0,0),receiver.add(mesh)}return receiver}function calcolatasks(scena){const emitterWorldPosition=new WeakMap,receiverWorldMatrixInverse=new WeakMap;function boxBoxIntersects(pos,l,x,y,z){return pos.x+l>0&&pos.x-l<x&&pos.y+l>0&&pos.y-l<y&&pos.z+l>0&&pos.z-l<z}function getFacceToccate(pos,sogliafaccia,x,y,z,filtra){const facce=[];function addfaccia(f){filtra&&!filtra.includes(f)||facce.push(f)}return Math.abs(pos.x-0)<sogliafaccia&&addfaccia("s"),Math.abs(pos.x-x)<sogliafaccia&&addfaccia("d"),Math.abs(pos.y-0)<sogliafaccia&&addfaccia("b"),Math.abs(pos.y-y)<sogliafaccia&&addfaccia("a"),Math.abs(pos.z-0)<sogliafaccia&&addfaccia("z"),Math.abs(pos.z-z)<sogliafaccia&&addfaccia("f"),facce.join("")}function getEmitterWorldPosition(emitter){if(!emitterWorldPosition.has(emitter)){const pos=new THREE.Vector3;emitter.getWorldPosition(pos),emitterWorldPosition.set(emitter,pos)}return emitterWorldPosition.get(emitter)}function getReceiverWorldMatrixInverse(receiver){if(!receiverWorldMatrixInverse.has(receiver)){const inv=receiver.matrixWorld.clone().invert();receiverWorldMatrixInverse.set(receiver,inv)}return receiverWorldMatrixInverse.get(receiver)}scena.updateMatrixWorld(!0);const receivers=[],emitters=[];!function scan(obj){obj.userData?.receiver&&receivers.push(obj),obj.userData?.emitter&&emitters.push(obj),obj.children&&obj.children.forEach(scan)}(scena);let tasks=[];for(const receiver of receivers){const{mat:mat,ori:ori,x:x,y:y,z:z,start:start,end:end,tipo:tipo,size:size}=receiver.userData;let singletask={id:mat,...getorientate(ori,x,y,z),tipo:tipo,ori:ori,lavs:[]};start&&singletask.lavs.push(...parselavs(ori,"_start",0,0,0,start,"",""));const matrixInverse=getReceiverWorldMatrixInverse(receiver);for(const emitter of emitters){if("string"==typeof tipo&&""!==tipo){const idx=emitter.userData.ids;if(Array.isArray(idx)&&idx.length>0&&!idx.includes("*")&&!idx.includes(tipo))continue}const posLocalAdj=getEmitterWorldPosition(emitter).clone().applyMatrix4(matrixInverse).clone().add(new THREE.Vector3(x/2,y/2,z/2));if(!boxBoxIntersects(posLocalAdj,emitter.userData.size??0,x,y,z))continue;const facceToccate=getFacceToccate(posLocalAdj,emitter.userData.soglia??2,x,y,z,emitter.userData.faces);facceToccate&&facceToccate.length&&singletask.lavs.push(...parselavs(ori,emitter.userData.name,posLocalAdj.x,posLocalAdj.y,posLocalAdj.z,emitter.userData.lavs,facceToccate,"nd"))}end&&singletask.lavs.push(...parselavs(ori,"_end",0,0,0,end,"","")),singletask.lavs.length&&tasks.push(singletask)}return tasks}function getbb(obj,force=!1){if(!force&&obj.userData.bb)return obj.userData._boundingbox;const box=(new THREE.Box3).setFromObject(obj);return obj.userData._boundingbox=box,box}function setorigine(obj,x=0,y=0,z=0){const min=getbb(obj).min,wrapper=new THREE.Group;return wrapper.add(obj),obj.position.sub(new THREE.Vector3(min.x+x,min.y+y,min.z+z)),wrapper}function scalaoggetto(gcad,originale,scale={}){const box=getbb(originale),size=new THREE.Vector3;box.getSize(size);const min=box.min,axes=["x","y","z","u","v"],norm={};for(let ax of axes){let sc=scale[ax];if(void 0===sc)norm[ax]={s:1};else if("number"==typeof sc)norm[ax]={s:sc};else if("object"==typeof sc){let s=sc.s??1,dim="x"===ax?size.x:"y"===ax?size.y:size.z,minv="x"===ax?min.x:"y"===ax?min.y:min.z;void 0!==sc.distperc&&(sc.dist=dim*sc.distperc),void 0!==sc.dist&&(s=(dim+sc.dist)/dim);let p1=sc.p1?sc.p1+minv:void 0,p2=sc.p2?sc.p2+minv:void 0;void 0!==sc.p1perc&&(p1=minv+dim*sc.p1perc),void 0!==sc.p2perc&&(p2=minv+dim*sc.p2perc),norm[ax]={s:s,p1:p1,p2:p2}}}if(axes.every((ax=>void 0===norm[ax].p1||void 0===norm[ax].p2))){if(1===norm.x.s&&1===norm.y.s&&1===norm.z.s)return originale;const wrapper=new THREE.Group;return wrapper.scale.set(norm.x.s,norm.y.s,norm.z.s),wrapper.add(originale),wrapper}const key=hash(`${originale.uuid}|${JSON.stringify(norm)}`);if(gcad.meshes[key])return gcad.meshes[key];const needAxis={};axes.forEach((ax=>{const{s:s,p1:p1,p2:p2}=norm[ax];needAxis[ax]=!(1===s&&void 0===p1&&void 0===p2)}));const clone=originale.clone(!0);return delete clone?.userData._boundingbox,clone.traverse((n=>{if(n.isMesh){const sOld=n.scale.clone();n.geometry=n.geometry.clone();const posAttr=n.geometry.attributes.position,uvAttr=n.geometry.attributes.uv,trasf=(val,ax)=>{if(!needAxis[ax])return val;const{s:s,p1:p1,p2:p2}=norm[ax];if(void 0===p1||void 0===p2)return val*s;const delta=p2*s-p2;if(val<p1)return val;if(val>=p2)return val+delta;return p1+(val-p1)*((p2-p1+delta)/(p2-p1))};if(posAttr&&(needAxis.x||needAxis.y||needAxis.z)){const arr=posAttr.array;for(let i=0;i<arr.length;i+=3)needAxis.x&&(arr[i]=trasf(arr[i],"x")),needAxis.y&&(arr[i+1]=trasf(arr[i+1],"y")),needAxis.z&&(arr[i+2]=trasf(arr[i+2],"z"));posAttr.needsUpdate=!0,n.geometry.computeVertexNormals()}if(uvAttr&&(needAxis.u||needAxis.v)){const arr=uvAttr.array;for(let i=0;i<arr.length;i+=2)needAxis.u&&(arr[i]=trasf(arr[i],"u")),needAxis.v&&(arr[i+1]=trasf(arr[i+1],"v"));uvAttr.needsUpdate=!0}n.scale.set(sOld.x*norm.x.s,sOld.y*norm.y.s,sOld.z*norm.z.s)}})),gcad.meshes[key]=clone,clone}function posiziona(grp,pos={}){let tm=new THREE.Group;if(grp){let g2=grp.clone(),tm2=g2,{sl:sl=0,sa:sa=0,sp:sp=0,ax:ax=0,ay:ay=0,az:az=0,ul:ul=0,ua:ua=0,up:up=0,scale:scale=1,scx:scx=scale,scy:scy=scale,scz:scz=scale,emitters:emitters,emittersname:emittersname,order:order,ignoreTraverse:ignoreTraverse}=pos;if("number"==typeof order&&g2.traverse((child=>{child.isMesh&&(child.renderOrder=order)})),tm.position.set(sl,sa,sp),tm.rotation.set(ax*PIF,ay*PIF,az*PIF),(ul||ua||up)&&(tm2=new THREE.Group,tm2.add(g2),tm2.position.set(ul,ua,up)),tm.scale.set(scx,scy,scz),tm.add(tm2),ignoreTraverse&&(tm.userData.ignoreTraverse=!0),emitters&&emitters.length)for(let e of emitters)e.name=e.name||emittersname,tm.add(getemitter(e))}return tm}const SIDE=THREE.DoubleSide;let materialline1=new THREE.LineBasicMaterial({color:16711680}),materialline2=new THREE.LineBasicMaterial({color:11579568});const mwhite=new THREE.MeshStandardMaterial({color:16777215,roughness:.5,metalness:.4,side:SIDE}),mgray1=new THREE.MeshStandardMaterial({color:8421504,roughness:.5,metalness:.4,side:SIDE}),mgray2=new THREE.MeshStandardMaterial({color:11579568,roughness:.5,metalness:.4,side:SIDE}),mred$1=new THREE.MeshStandardMaterial({color:16711680,roughness:.5,metalness:.4,side:SIDE}),mblue=new THREE.MeshStandardMaterial({color:1982639,roughness:.5,metalness:.4,side:SIDE}),mgreen=new THREE.MeshStandardMaterial({color:36864,roughness:.5,metalness:.4,side:SIDE}),mblack=new THREE.MeshStandardMaterial({color:0,roughness:.5,metalness:.4,side:SIDE}),scaleunit=.001;function groupfromgeometry(geometry,material,x,y,z,name,layer){let child=new THREE.Group;child.position.set(x,y,z),child.name=name;const mesh=new THREE.Mesh(geometry,material);mesh.name=name,mesh.castShadow=!0,mesh.receiveShadow=!0,mesh.layers.set(layer);const edges=new THREE.EdgesGeometry(geometry),lineSegments=new THREE.LineSegments(edges,materialline1);return lineSegments.layers.set(30),child.add(mesh),child.add(lineSegments),child}function edgesfromgeometry(g1,layer=30){return getlinesgeom(new THREE.EdgesGeometry(g1,40),layer)}function getlinesgeom(edges,layer=30){const lineSegments=new THREE.LineSegments(edges,materialline1);return lineSegments.layers.set(layer),lineSegments}function getmesh(geom,material,layer=1,clone=!1){let m=new THREE.Mesh(geom,clone?material.clone():material);return m.castShadow=!0,m.receiveShadow=!0,m.layers.set(layer),m}function get3dshape(punti,material,layer){if(!punti||punti.length<3)return new THREE.BufferGeometry;const vertices=[];for(let i=0;i<punti.length;i++){const p1=punti[i],p2=punti[(i+1)%punti.length];vertices.push(p1.x,0,p1.y),vertices.push(p2.x,0,p2.y)}const geometry=new THREE.BufferGeometry;geometry.setAttribute("position",new THREE.Float32BufferAttribute(vertices,3));let m=new THREE.LineSegments(geometry,material);return m.layers.set(layer),m}function creategroup(name,op={}){let{ignoreTraverse:ignoreTraverse}=op,g=new THREE.Group;return g.name=name||"$$",ignoreTraverse&&(g.userData.ignoreTraverse=!0),g}function svuotanodo(n){!function _dispose(node){if(node.children.length){[...node.children].forEach((child=>{_dispose(child),node.remove(child)}))}node.geometry&&node.geometry.dispose(),node.material&&(Array.isArray(node.material)?node.material.forEach((m=>m.dispose())):node.material.dispose())}(n)}function deletegroup(grpbase,name){if(!grpbase?.children)return;let gr=grpbase.children.find((e=>e.name==name));if(gr){for(;gr.children.length>0;){const child=gr.children[0];gr.remove(child)}gr.parent&&gr.parent.remove(gr),gr=null}}function randombasemat(){const material=new THREE.LineBasicMaterial,color=new THREE.Color;return color.setHSL(Math.random(),.7,.4),material.color=color,material}
526
+ function calcoladivisioni(ff,notused,shape2,oggetti){return makedivisions(ff,shape2,oggetti)},check:check,checkoggetto:checkoggetto,creaprofiloesterno:creaprofiloesterno,create:function create(x,y,bordo,options){options||(options={});let{minvano:minvano,priority:priority,taglio:taglio,tipo:tipo,h1:h1,h2:h2,d1:d1,d2:d2,l1:l1,l2:l2,x1:x1,x2:x2,y1:y1,y2:y2,gvert:gvert,goriz:goriz,forma:forma,area:area}=options,ff=check({x:x,y:y,area:area,bordo:bordo,gvert:gvert,goriz:goriz,priority:priority,minvano:minvano,taglio:taglio,tipo:tipo,h1:h1,h2:h2,l1:l1,l2:l2,d1:d1,x1:x1,y1:y1,d2:d2,x2:x2,y2:y2});return ff.forma=forma,ff},elaborapercorso:elaborapercorso,getbordi:getbordi,makedivisions:makedivisions,makeshape:function makeshape(ff,oggetti){return creaprofiloesterno(ff,oggetti)},priorita:{v:"verticale",h:"orizzontale"},tagli:tagli,tipi:tipi,tipilocks:[{cod:"diml",des:"Larghezza"},{cod:"dima",des:"Altezza"},{cod:"etipo",des:"Modifica Tipo"},{cod:"etaglio",des:"Modifica Taglio"},{cod:"ebordi",des:"Modifica Bordi"},{cod:"esag",des:"Shape"},{cod:"vcrea",des:"Crea Div. Verticale"},{cod:"ocrea",des:"Crea Div. Orizzontale"},{cod:"vmov",des:"Sposta Div. Verticale"},{cod:"omov",des:"Sposta Div. Orizzontale"},{cod:"vedit",des:"Modifica Div. Verticale"},{cod:"oedit",des:"Modifica Div. Orizzontale"},{cod:"emods",des:"Modificatori Orizzontali/Verticali"},{cod:"ecuts",des:"Modifica/Aggiungi Cuts"},{cod:"earee",des:"Modifica Aree"}],tipoalign:tipoalign,tipocut:tipocut});function joinlinestoshapes(lk){let out=[];for(let ll of lk)for(let l1 of ll.lines){let l=new Linea2(l1.p1,l1.p2);l.rotate(-ll.ang),l.move(ll.pos.x,ll.pos.z),l.valid=!0,out.push(l)}function samepoint(p1,p2){return Math.abs(p1.x-p2.x)+Math.abs(p1.y-p2.y)<.1}for(let i=0;i<out.length;i++){if(!out[i].valid)continue;if(out[i].len<.1){out[i].valid=!1;continue}const a=out[i];for(let j=i+1;j<out.length;j++){const b=out[j];if(!b.valid)continue;if(!a.isparallela(b))continue;if(!a.isCollineare(b))continue;a.a1b=b.onsegment(a.p1,.1),a.a2b=b.onsegment(a.p2,.1),a.b1a=a.onsegment(b.p1,.1),a.b2a=a.onsegment(b.p2,.1);const{x:ax,y:ay}=a.direzione,{x:bx,y:by}=b.direzione;if(ax*bx+ay*by>0)if(a.b1a&&a.b2a)b.valid=!1;else{if(a.a1b&&a.a2b){a.valid=!1;break}if(a.a1b&&a.b2a){let l=new Linea2(b.p1,a.p2);l.valid=!0,out.push(l),a.valid=!1,b.valid=!1;break}if(a.a2b&&a.b1a){let l=new Linea2(a.p1,b.p2);l.valid=!0,out.push(l),a.valid=!1,b.valid=!1;break}}else{const ta1=a.proiezionet(a.p1).t,ta2=a.proiezionet(a.p2).t,tb1=a.proiezionet(b.p1).t,tb2=a.proiezionet(b.p2).t,minA=Math.min(ta1,ta2),maxA=Math.max(ta1,ta2),minB=Math.min(tb1,tb2),maxB=Math.max(tb1,tb2),ovMin=Math.max(minA,minB),ovMax=Math.min(maxA,maxB);if(ovMax>ovMin+.1){if(minA<ovMin){let l=new Linea2(a.puntot(minA),a.puntot(ovMin));l.valid=!0,out.push(l)}if(maxA>ovMax){let l=new Linea2(a.puntot(maxA),a.puntot(ovMax));l.valid=!0,out.push(l)}if(minB<ovMin){let l=new Linea2(a.puntot(minB),a.puntot(ovMin));l.valid=!0,out.push(l)}if(maxB>ovMax){let l=new Linea2(a.puntot(maxB),a.puntot(ovMax));l.valid=!0,out.push(l)}a.valid=!1,b.valid=!1;break}}}}out=out.filter((e=>e.valid)).map((e=>getshape().frompt([e.p1,e.p2])));for(let i1=0;i1<out.length;i1++){let s1=out[i1],changed=!0;for(;changed;){changed=!1;for(let i2=i1+1;i2<out.length;){let s2=out[i2];samepoint(s1.pt[0],s2.pt[0])?(s2.pt.reverse(),s1.pt.unshift(...s2.pt.slice(0,-1)),out.splice(i2,1),changed=!0):samepoint(s1.pt[s1.pt.length-1],s2.pt[s2.pt.length-1])?(s2.pt.reverse(),s1.pt.push(...s2.pt.slice(1)),out.splice(i2,1),changed=!0):samepoint(s1.pt[0],s2.pt[s2.pt.length-1])?(s1.pt.unshift(...s2.pt.slice(0,-1)),out.splice(i2,1),changed=!0):samepoint(s1.pt[s1.pt.length-1],s2.pt[0])?(s1.pt.push(...s2.pt.slice(1)),out.splice(i2,1),changed=!0):i2++}}}return out}async function valutagrafica(amb,startmacro,rulespec,progetto,fnreload){let{getcolonne:getcolonne,muCalc:muCalc,muEval:muEval,tipifree:tipifree}=amb.muvalutatore;rulespec||(rulespec={});for(let x of["l","a","p"]){!amb.vari.var(x)&&startmacro.dims&&amb.vari.add(x,String(startmacro.dims[x].val||100))}let fnlist=new Set;const PARSGLOBAL=["sl","sa","sp","ul","ua","up","ax","ay","az","scx","scy","scz","scale"];let isdimreload,isfnreload=!1,oo=await muEval(amb,startmacro,startmacro.codice,{leveleval:0,checkheader:op=>{let{variante:variante}=op;if(Array.isArray(startmacro.head)){let ff=startmacro.head.find((e=>e.cod==variante));isfnreload=!!ff}},grafica:async _op=>{let p2,cadv,iscad,des,fatti,{id:id,pars:pars,parametri:parametri,macro:macro,options:options,vari:vari}=_op,isheader=!!(macro&&macro.head&&macro.head.length),sv={l:amb.vari.var("l"),a:amb.vari.var("a"),p:amb.vari.var("p")};const varcad=["l","a","p","#d",...PARSGLOBAL];for(let x of varcad){let tm=amb.vari.dictionary[x];tm&&(sv[x]=tm)}async function _parsepars(x,head){let k,v,r9=/^#(d|des|descrizione)\s*=\s*(.*)\s*$/im.exec(x);if(r9)k="#d",v=await amb.vari.valuta(r9[2]);else{let result=await vari.parametrokeyval(x);k=result.k,v=result.v}k&&!fatti[k]&&(fatti[k]=!0,varcad.includes(k)?"#d"==k?des=v:("string"==typeof v&&(v=muCalc(v)),["l","a","p"].includes(k)&&amb.vari.add(k,String(v)),cadv[k]=v,iscad=!0):"string"==typeof v?p2.push(`${k}=${v}`):amb.vari.add(k,v))}let px;if(p2=[],cadv={},iscad=!1,des="",fatti={},progetto&&progetto.keys&&progetto.keys[id]&&(px=progetto.keys[id].pars,px))for(let t in px){let t1=amb.vari.dictionary[t];t1&&(sv[t]=t1),await _parsepars(`${t}=${px[t]}`)}if(pars&&pars.length)for(const par of pars)await _parsepars(par);if(parametri&&parametri.length)for(const param of parametri)await _parsepars(param);if(macro&&macro.head&&macro.head.length){let tm=macro.head.filter((e=>!["g","p"].includes(e.t)));for(const h of tm)await _parsepars(h.cod)}let out={iscad:iscad,isheader:isheader,name:macro.name,des:des,leveleval:options.leveleval};isheader&&id&&(out.id=id),iscad&&(cadv.l?amb.vari.add("l",String(cadv.l)):cadv.l=muCalc(amb.vari.var("l")),cadv.a?amb.vari.add("a",String(cadv.a)):cadv.a=muCalc(amb.vari.var("a")),cadv.p?amb.vari.add("p",String(cadv.p)):cadv.p=muCalc(amb.vari.var("p")),out.cadv=cadv),await macro.impostaparametri(parametri,p2,!0,px);let ruleid=rulespec[id];id&&isheader&&ruleid&&ruleid.pars&&(out.pars=ruleid.pars,options.leveleval++,await macro.setparametri(ruleid.pars));let tm=amb.vari.var("_rootnode");if(amb.vari.add("_rootnode","0"),out.rows=await muEval(amb,macro,macro.codice,options),amb.vari.add("_rootnode",tm),id&&isheader&&(out.spars=macro.getparametri()),iscad)for(let x in sv)amb.vari.dictionary[x]=sv[x];return out},parsefnpunto:async _op=>{let{dati:dati,vari:vari,id:id,output:output}=_op;dati=dati.trim();let q=dati.indexOf(" "),q2=dati.indexOf(",");q2>0&&q>0&&q2<q&&(q=q2);let fn,pp,pars={},p2={};q>1?(fn=dati.slice(1,q),pp=getcolonne(dati.slice(q+1))):(fn=dati.slice(1),pp=[]),fnlist.has(fn)||fnlist.add(fn);for(let p of pp){let{k:k,v:v}=await vari.parametrokeyval(p);k&&/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(k)&&(pars[k]=v||"")}for(let l of["l","a","p"])pars[l]||(pars[l]=vari.var(l));let tm=Object.keys(pars);for(let l of PARSGLOBAL)tm.includes(l)&&(p2[l]=muCalc(pars[l]),p2[l]&&(pars[l]=p2[l]));output.push({t:"fn",fn:fn,id:id,pars:pars,p2:p2})}});for(let x of["l","a","p"])if(startmacro.dims&&startmacro.dims[x].val!=parseFloat(amb.vari.var(x))){isdimreload=!0;break}return(isfnreload||isdimreload&&"function"==typeof fnreload)&&await fnreload(isdimreload,isfnreload),{oo:oo,vari:amb.vari.dump(!0),fnlist:[...fnlist]}}function ismacro(row){return"object"==typeof row&&row?.name&&row.rows}function isfn(row){return"object"==typeof row&&"fn"==row?.t}function getnodebyid(id,nodocorrente){let res;return nodocorrente&&nodocorrente.rows&&function _getnode(rows){for(let x of rows){if(ismacro(x)){if(x.id==id)return void(res=x);x.rows&&_getnode(x.rows)}if(res)return}}(nodocorrente.rows),res}function getsubrules(nodocorrente){let res=[];return res.push({id:"",level:0,name:"home"}),function _xfiltrati(rr,level){if(rr.rows&&rr.rows.length)for(let x of rr.rows)ismacro(x)&&(x.id&&x.isheader?(res.push({id:x.id,name:x.name,des:x.des||"",spec:x.pars?1:0,level:level}),_xfiltrati(x,level+1)):_xfiltrati(x,level))}(nodocorrente,1),res}function getdumpmacro(nodo){let cl=[];return function _dumpnodo(node){if(node.rows&&node.rows.length)for(let x of node.rows)if(ismacro(x)){x.name;let c=[];if(x.iscad&&x.cadv)for(let k in x.cadv){let t=x.cadv[k];"number"==typeof t&&t&&c.push(`${k}=${t}`)}if(x.pars)for(let k in x.pars){let t=x.pars[k];c.push(`${k}=${t}`)}c.length&&cl.push(`--\x3e ${x.name} ${c.join(",")}`),_dumpnodo(x),c.length&&cl.push("<--")}else isfn(x)?cl.push(`FN: ${x.fn} ${JSON.stringify(x.pars)}`):"string"==typeof x&&x.length&&cl.push(x)}(nodo),cl.join("\n")}const mgreen$1=new THREE.MeshStandardMaterial({color:36864,roughness:.5,metalness:.4,side:THREE.DoubleSide});function getorientate(ori,x,y,z){switch(x=x||0,y=y||0,z=z||0,ori.trim().toLowerCase()){case"alp":return{x:y,y:x,z:z};case"apl":return{x:y,y:z,z:x};case"pla":return{x:z,y:x,z:y};case"pal":return{x:z,y:y,z:x};case"lpa":return{x:x,y:z,z:y};default:return{x:x,y:y,z:z}}}function parselavs(ori,id,x=0,y=0,z=0,lavorazioni="",facce="",def=""){let lavcods=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)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}(lavorazioni),rets=[];for(let lavcod of lavcods){let rr=/^([({}):$\w.\\/]+)[\s;,]*(.*)?$/im.exec(lavcod);if(rr&&rr[1]){let lav={name:rr[1].trim().toLowerCase(),...getorientate(ori,x,y,z),id:id,facce:facce};if(rr[2]){let aa=getcolonne(rr[2]);for(let a of aa){let i=a.indexOf("=");i>0&&(lav[a.slice(0,i).trim()]=a.slice(i+1).trim())}}rets.push(lav)}}return!rets.length&&def&&rets.push({name:def,...getorientate(ori,x,y,z),id:id,facce:facce}),rets}function getemitter(data){let{d:d,name:name,x:x,y:y,z:z,lavs:lavs="",ids:ids="",faces:faces=null,size:size=5}=data;ids=getcolonne(clean(ids,!0));const emitter=new THREE.Object3D;if(emitter.position.set(x,y,z),emitter.userData={emitter:!0,lavs:lavs,ids:ids,faces:faces,size:size,name:name},d){const geometry=new THREE.SphereGeometry(size||5,8,8),material=new THREE.MeshBasicMaterial({color:16711680}),mesh=new THREE.Mesh(geometry,material);emitter.add(mesh)}return emitter}function getreceiver(gcad,data){gcad.gmats.__istask=1;let{d:d,ori:ori="LAP",x:x=0,y:y=0,z:z=0,tipo:tipo="",start:start="",end:end=""}=data;tipo=clean(tipo,!0);const receiver=new THREE.Object3D;if(receiver.position.set(x/2,y/2,z/2),receiver.userData={receiver:!0,ori:(ori||"").trim().toLowerCase(),x:x,y:y,z:z,tipo:tipo,start:start,end:end},d){const geometry=new THREE.BoxGeometry(x,y,z),mesh=new THREE.Mesh(geometry,mgreen$1);mesh.position.set(0,0,0),receiver.add(mesh)}return receiver}function calcolatasks(scena){const emitterWorldPosition=new WeakMap,receiverWorldMatrixInverse=new WeakMap;function boxBoxIntersects(pos,l,x,y,z){return pos.x+l>0&&pos.x-l<x&&pos.y+l>0&&pos.y-l<y&&pos.z+l>0&&pos.z-l<z}function getFacceToccate(pos,sogliafaccia,x,y,z,filtra){const facce=[];function addfaccia(f){filtra&&!filtra.includes(f)||facce.push(f)}return Math.abs(pos.x-0)<sogliafaccia&&addfaccia("s"),Math.abs(pos.x-x)<sogliafaccia&&addfaccia("d"),Math.abs(pos.y-0)<sogliafaccia&&addfaccia("b"),Math.abs(pos.y-y)<sogliafaccia&&addfaccia("a"),Math.abs(pos.z-0)<sogliafaccia&&addfaccia("z"),Math.abs(pos.z-z)<sogliafaccia&&addfaccia("f"),facce.join("")}function getEmitterWorldPosition(emitter){if(!emitterWorldPosition.has(emitter)){const pos=new THREE.Vector3;emitter.getWorldPosition(pos),emitterWorldPosition.set(emitter,pos)}return emitterWorldPosition.get(emitter)}function getReceiverWorldMatrixInverse(receiver){if(!receiverWorldMatrixInverse.has(receiver)){const inv=receiver.matrixWorld.clone().invert();receiverWorldMatrixInverse.set(receiver,inv)}return receiverWorldMatrixInverse.get(receiver)}scena.updateMatrixWorld(!0);const receivers=[],emitters=[];!function scan(obj){obj.userData?.receiver&&receivers.push(obj),obj.userData?.emitter&&emitters.push(obj),obj.children&&obj.children.forEach(scan)}(scena);let tasks=[];for(const receiver of receivers){const{mat:mat,ori:ori,x:x,y:y,z:z,start:start,end:end,tipo:tipo,size:size}=receiver.userData;let singletask={id:mat,...getorientate(ori,x,y,z),tipo:tipo,ori:ori,lavs:[]};start&&singletask.lavs.push(...parselavs(ori,"_start",0,0,0,start,"",""));const matrixInverse=getReceiverWorldMatrixInverse(receiver);for(const emitter of emitters){if("string"==typeof tipo&&""!==tipo){const idx=emitter.userData.ids;if(Array.isArray(idx)&&idx.length>0&&!idx.includes("*")&&!idx.includes(tipo))continue}const posLocalAdj=getEmitterWorldPosition(emitter).clone().applyMatrix4(matrixInverse).clone().add(new THREE.Vector3(x/2,y/2,z/2));if(!boxBoxIntersects(posLocalAdj,emitter.userData.size??0,x,y,z))continue;const facceToccate=getFacceToccate(posLocalAdj,emitter.userData.soglia??2,x,y,z,emitter.userData.faces);facceToccate&&facceToccate.length&&singletask.lavs.push(...parselavs(ori,emitter.userData.name,posLocalAdj.x,posLocalAdj.y,posLocalAdj.z,emitter.userData.lavs,facceToccate,"nd"))}end&&singletask.lavs.push(...parselavs(ori,"_end",0,0,0,end,"","")),singletask.lavs.length&&tasks.push(singletask)}return tasks}function getbb(obj,force=!1){if(!force&&obj.userData.bb)return obj.userData._boundingbox;const box=(new THREE.Box3).setFromObject(obj);return obj.userData._boundingbox=box,box}function setorigine(obj,x=0,y=0,z=0){const min=getbb(obj).min,wrapper=new THREE.Group;return wrapper.add(obj),obj.position.sub(new THREE.Vector3(min.x+x,min.y+y,min.z+z)),wrapper}function scalaoggetto(gcad,originale,scale={}){const box=getbb(originale),size=new THREE.Vector3;box.getSize(size);const min=box.min,axes=["x","y","z","u","v"],norm={};for(let ax of axes){let sc=scale[ax];if(void 0===sc)norm[ax]={s:1};else if("number"==typeof sc)norm[ax]={s:sc};else if("object"==typeof sc){let s=sc.s??1,dim="x"===ax?size.x:"y"===ax?size.y:size.z,minv="x"===ax?min.x:"y"===ax?min.y:min.z;void 0!==sc.distperc&&(sc.dist=dim*sc.distperc),void 0!==sc.dist&&(s=(dim+sc.dist)/dim);let p1=sc.p1?sc.p1+minv:void 0,p2=sc.p2?sc.p2+minv:void 0;void 0!==sc.p1perc&&(p1=minv+dim*sc.p1perc),void 0!==sc.p2perc&&(p2=minv+dim*sc.p2perc),norm[ax]={s:s,p1:p1,p2:p2}}}if(axes.every((ax=>void 0===norm[ax].p1||void 0===norm[ax].p2))){if(1===norm.x.s&&1===norm.y.s&&1===norm.z.s)return originale;const wrapper=new THREE.Group;return wrapper.scale.set(norm.x.s,norm.y.s,norm.z.s),wrapper.add(originale),wrapper}const key=hash(`${originale.uuid}|${JSON.stringify(norm)}`);if(gcad.meshes[key])return gcad.meshes[key];const needAxis={};axes.forEach((ax=>{const{s:s,p1:p1,p2:p2}=norm[ax];needAxis[ax]=!(1===s&&void 0===p1&&void 0===p2)}));const clone=originale.clone(!0);return delete clone?.userData._boundingbox,clone.traverse((n=>{if(n.isMesh){const sOld=n.scale.clone();n.geometry=n.geometry.clone();const posAttr=n.geometry.attributes.position,uvAttr=n.geometry.attributes.uv,trasf=(val,ax)=>{if(!needAxis[ax])return val;const{s:s,p1:p1,p2:p2}=norm[ax];if(void 0===p1||void 0===p2)return val*s;const delta=p2*s-p2;if(val<p1)return val;if(val>=p2)return val+delta;return p1+(val-p1)*((p2-p1+delta)/(p2-p1))};if(posAttr&&(needAxis.x||needAxis.y||needAxis.z)){const arr=posAttr.array;for(let i=0;i<arr.length;i+=3)needAxis.x&&(arr[i]=trasf(arr[i],"x")),needAxis.y&&(arr[i+1]=trasf(arr[i+1],"y")),needAxis.z&&(arr[i+2]=trasf(arr[i+2],"z"));posAttr.needsUpdate=!0,n.geometry.computeVertexNormals()}if(uvAttr&&(needAxis.u||needAxis.v)){const arr=uvAttr.array;for(let i=0;i<arr.length;i+=2)needAxis.u&&(arr[i]=trasf(arr[i],"u")),needAxis.v&&(arr[i+1]=trasf(arr[i+1],"v"));uvAttr.needsUpdate=!0}n.scale.set(sOld.x*norm.x.s,sOld.y*norm.y.s,sOld.z*norm.z.s)}})),gcad.meshes[key]=clone,clone}function posiziona(grp,pos={}){let tm=new THREE.Group;if(grp){let g2=grp.clone(),tm2=g2,{sl:sl=0,sa:sa=0,sp:sp=0,ax:ax=0,ay:ay=0,az:az=0,ul:ul=0,ua:ua=0,up:up=0,scale:scale=1,scx:scx=scale,scy:scy=scale,scz:scz=scale,emitters:emitters,emittersname:emittersname,order:order,ignoreTraverse:ignoreTraverse}=pos;if("number"==typeof order&&g2.traverse((child=>{child.isMesh&&(child.renderOrder=order)})),tm.position.set(sl,sa,sp),tm.rotation.set(ax*PIF,ay*PIF,az*PIF),(ul||ua||up)&&(tm2=new THREE.Group,tm2.add(g2),tm2.position.set(ul,ua,up)),tm.scale.set(scx,scy,scz),tm.add(tm2),ignoreTraverse&&(tm.userData.ignoreTraverse=!0),emitters&&emitters.length)for(let e of emitters)e.name=e.name||emittersname,tm.add(getemitter(e))}return tm}const SIDE=THREE.DoubleSide;let materialline1=new THREE.LineBasicMaterial({color:16711680,transparent:!1,opacity:1}),materialline2=new THREE.LineBasicMaterial({color:11579568,transparent:!1,opacity:1});const mwhite=new THREE.MeshStandardMaterial({color:16777215,roughness:.5,metalness:.4,side:SIDE}),mgray1=new THREE.MeshStandardMaterial({color:8421504,roughness:.5,metalness:.4,side:SIDE}),mgray2=new THREE.MeshStandardMaterial({color:11579568,roughness:.5,metalness:.4,side:SIDE}),mred$1=new THREE.MeshStandardMaterial({color:16711680,roughness:.5,metalness:.4,side:SIDE}),mblue=new THREE.MeshStandardMaterial({color:1982639,roughness:.5,metalness:.4,side:SIDE}),mgreen=new THREE.MeshStandardMaterial({color:36864,roughness:.5,metalness:.4,side:SIDE}),mblack=new THREE.MeshStandardMaterial({color:0,roughness:.5,metalness:.4,side:SIDE}),scaleunit=.001;function groupfromgeometry(geometry,material,x,y,z,name,layer){let child=new THREE.Group;child.position.set(x,y,z),child.name=name;const mesh=new THREE.Mesh(geometry,material);mesh.name=name,mesh.castShadow=!0,mesh.receiveShadow=!0,mesh.layers.set(layer);const edges=new THREE.EdgesGeometry(geometry),lineSegments=new THREE.LineSegments(edges,materialline1);return lineSegments.layers.set(30),child.add(mesh),child.add(lineSegments),child}function edgesfromgeometry(g1,layer=30){return getlinesgeom(new THREE.EdgesGeometry(g1,40),layer)}function getlinesgeom(edges,layer=30){const lineSegments=new THREE.LineSegments(edges,materialline1);return lineSegments.layers.set(layer),lineSegments}function getmesh(geom,material,layer=1,clone=!1){let m=new THREE.Mesh(geom,clone?material.clone():material);return m.castShadow=!0,m.receiveShadow=!0,m.layers.set(layer),m}function get3dshape(punti,material,layer){if(!punti||punti.length<3)return new THREE.BufferGeometry;const vertices=[];for(let i=0;i<punti.length;i++){const p1=punti[i],p2=punti[(i+1)%punti.length];vertices.push(p1.x,0,p1.y),vertices.push(p2.x,0,p2.y)}const geometry=new THREE.BufferGeometry;geometry.setAttribute("position",new THREE.Float32BufferAttribute(vertices,3));let m=new THREE.LineSegments(geometry,material);return m.layers.set(layer),m}function creategroup(name,op={}){let{ignoreTraverse:ignoreTraverse}=op,g=new THREE.Group;return g.name=name||"$$",ignoreTraverse&&(g.userData.ignoreTraverse=!0),g}function svuotanodo(n){!function _dispose(node){if(node.children.length){[...node.children].forEach((child=>{_dispose(child),node.remove(child)}))}node.geometry&&node.geometry.dispose(),node.material&&(Array.isArray(node.material)?node.material.forEach((m=>m.dispose())):node.material.dispose())}(n)}function deletegroup(grpbase,name){if(!grpbase?.children)return;let gr=grpbase.children.find((e=>e.name==name));if(gr){for(;gr.children.length>0;){const child=gr.children[0];gr.remove(child)}gr.parent&&gr.parent.remove(gr),gr=null}}function randombasemat(){const material=new THREE.LineBasicMaterial,color=new THREE.Color;return color.setHSL(Math.random(),.7,.4),material.color=color,material}
527
527
  /**
528
528
  * Crea una linea 3D
529
529
  * @param {Object} l - Oggetto contenente punti p1 e p2
@@ -630,7 +630,7 @@ function getcilindro(gcad,ori,h,r1,r2,mats=mwhite,options){options||(options={})
630
630
  * @param {THREE.Material} mat - materiale della mesh
631
631
  * @param {object} [options] - opzioni: {center: boolean, nolines: boolean}
632
632
  * @returns {THREE.Group}
633
- */function getsphere(gcad,r,mat,options){options||(options={});let{nolines:nolines,segmenti:segmenti=16}=options,grp=new THREE.Group;const sphere=new THREE.SphereGeometry(r,2*segmenti,segmenti);if(scalauv(sphere),!nolines){let segments=edgesfromgeometry(sphere);grp.add(segments)}return grp.add(getmesh(sphere,mat||mwhite)),grp}function getextrude(gcad,pts,h=10,holes=[],mat=void 0,op={}){mat&&mat.isMaterial||(op=mat,mat=void 0),op=op??{};let{stonda:stonda,sx:sx,sy:sy,round:round,nolines:nolines}=op,ky=hash(`${JSON.stringify(pts)}|${h}|${JSON.stringify(op)}|${JSON.stringify(holes)}`);sx=sx??stonda??0,sy=sy??stonda??0;let geom=gcad.geo[ky];if(!geom){const sh=function makeShape(points){const shape=new THREE.Shape;shape.moveTo(points[0].x,points[0].y);for(let i=1;i<points.length;i++)shape.lineTo(points[i].x,points[i].y);return shape.closePath(),shape}(pts);holes.forEach((hh=>sh.holes.push(function makePath(points){const path=new THREE.Path;path.moveTo(points[0].x,points[0].y);for(let i=1;i<points.length;i++)path.lineTo(points[i].x,points[i].y);return path.closePath(),path}(hh)))),geom=new THREE.ExtrudeGeometry(sh,{depth:h,bevelEnabled:sx>0&&sy>0,bevelSize:sx,bevelThickness:sy,bevelSegments:round?3:1,curveSegments:10}),gcad.geo[ky]=geom}return new THREE.Mesh(geom,mat||mwhite)}function getthorus(gcad,r,tuber=.2,mat,options){options||(options={});let{center:center,nolines:nolines,segmenti:segmenti=16,tubi:tubi=12}=options,grp=new THREE.Group;const thorus=new THREE.TorusGeometry(r,tuber,tubi,2*segmenti);if(scalauv(thorus),grp.position.set(0,center?0:r,0),!nolines){let segments=edgesfromgeometry(thorus);grp.add(segments)}return grp.add(getmesh(thorus,mat||mwhite)),grp}
633
+ */function getsphere(gcad,r,mat,options){options||(options={});let{nolines:nolines,segmenti:segmenti=16}=options,grp=new THREE.Group;const sphere=new THREE.SphereGeometry(r,2*segmenti,segmenti);if(scalauv(sphere),!nolines){let segments=edgesfromgeometry(sphere);grp.add(segments)}return grp.add(getmesh(sphere,mat||mwhite)),grp}function getextrude(gcad,pts,h=10,holes=[],mat=void 0,op={}){mat&&mat.isMaterial||(op=mat,mat=void 0),op=op??{};let{stonda:stonda,sx:sx,sy:sy,round:round,nolines:nolines}=op,ky=hash(`${JSON.stringify(pts)}|${h}|${JSON.stringify(op)}|${JSON.stringify(holes)}`);sx=sx??stonda??0,sy=sy??stonda??0;let geom=gcad.geo[ky];if(!geom){const sh=function makeShape(points){const shape=new THREE.Shape;shape.moveTo(points[0].x,points[0].y);for(let i=1;i<points.length;i++)shape.lineTo(points[i].x,points[i].y);return shape.closePath(),shape}(pts);holes.forEach((hh=>sh.holes.push(function makePath(points){const path=new THREE.Path;path.moveTo(points[0].x,points[0].y);for(let i=1;i<points.length;i++)path.lineTo(points[i].x,points[i].y);return path.closePath(),path}(hh))));const benabled=sx>0&&sy>0;geom=new THREE.ExtrudeGeometry(sh,{depth:h,bevelEnabled:benabled,bevelSize:sx,bevelThickness:sy,bevelSegments:benabled?round?3:1:0,curveSegments:benabled?10:1}),gcad.geo[ky]=geom}return new THREE.Mesh(geom,mat||mwhite)}function getthorus(gcad,r,tuber=.2,mat,options){options||(options={});let{center:center,nolines:nolines,segmenti:segmenti=16,tubi:tubi=12}=options,grp=new THREE.Group;const thorus=new THREE.TorusGeometry(r,tuber,tubi,2*segmenti);if(scalauv(thorus),grp.position.set(0,center?0:r,0),!nolines){let segments=edgesfromgeometry(thorus);grp.add(segments)}return grp.add(getmesh(thorus,mat||mwhite)),grp}
634
634
  /**
635
635
  * @param {BufferGeometry} geometry
636
636
  * @param {number} tolerance
@@ -641,7 +641,7 @@ function getcilindro(gcad,ori,h,r1,r2,mats=mwhite,options){options||(options={})
641
641
  * @param {number} drawMode
642
642
  * @return {BufferGeometry}
643
643
  */
644
- function toTrianglesDrawMode(geometry,drawMode){if(drawMode===TrianglesDrawMode)return console.warn("THREE.BufferGeometryUtils.toTrianglesDrawMode(): Geometry already defined as triangles."),geometry;if(drawMode===TriangleFanDrawMode||drawMode===TriangleStripDrawMode){let index=geometry.getIndex();if(null===index){const indices=[],position=geometry.getAttribute("position");if(void 0===position)return console.error("THREE.BufferGeometryUtils.toTrianglesDrawMode(): Undefined position attribute. Processing not possible."),geometry;for(let i=0;i<position.count;i++)indices.push(i);geometry.setIndex(indices),index=geometry.getIndex()}const numberOfTriangles=index.count-2,newIndices=[];if(drawMode===TriangleFanDrawMode)for(let i=1;i<=numberOfTriangles;i++)newIndices.push(index.getX(0)),newIndices.push(index.getX(i)),newIndices.push(index.getX(i+1));else for(let i=0;i<numberOfTriangles;i++)i%2==0?(newIndices.push(index.getX(i)),newIndices.push(index.getX(i+1)),newIndices.push(index.getX(i+2))):(newIndices.push(index.getX(i+2)),newIndices.push(index.getX(i+1)),newIndices.push(index.getX(i)));newIndices.length/3!==numberOfTriangles&&console.error("THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unable to generate correct amount of triangles.");const newGeometry=geometry.clone();return newGeometry.setIndex(newIndices),newGeometry.clearGroups(),newGeometry}return console.error("THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unknown draw mode:",drawMode),geometry}function pannellogeometry(gcad,l,a,p,r1=0,r2=0,r3=0,r4=0,b=0,npt=2){let ky=hash(`pg--${l}|${a}|${p}|${r1}|${r2}|${r3}|${r4}|${b}|${npt}`);if(l-=.01,a-=.01,p-=.01,!gcad.geo[ky]){l-=2*b,a-=2*b,p-=2*b;let tm=getshape();const vv=[{x:r4,y:0},{x:a-r1,y:0},{x:a,y:r1},{x:a,y:p-r2},{x:a-r2,y:p},{x:r3,y:p},{x:0,y:p-r3},{x:0,y:r4}];tm.addpt(vv[0]),tm.addpt(vv[1]),r1&&tm.addpt(raccordabezier(vv[0],vv[1],vv[2],vv[3],npt)),tm.addpt(vv[2]),tm.addpt(vv[3]),r2&&tm.addpt(raccordabezier(vv[2],vv[3],vv[4],vv[5],npt)),tm.addpt(vv[4]),tm.addpt(vv[5]),r3&&tm.addpt(raccordabezier(vv[4],vv[5],vv[6],vv[7],npt)),tm.addpt(vv[6]),tm.addpt(vv[7]),r2&&tm.addpt(raccordabezier(vv[6],vv[7],vv[0],vv[1],npt)),tm.removeduplicate(.01);let pts=tm.pt;const shape=new THREE.Shape;shape.moveTo(pts[0].x,pts[0].y);for(let i=1;i<pts.length;i++)shape.lineTo(pts[i].x,pts[i].y);shape.lineTo(pts[0].x,pts[0].y);const extrudeSettings={depth:l,bevelEnabled:b>0,bevelThickness:b,bevelSize:b,bevelSegments:1};let xgeo=new THREE.ExtrudeGeometry(shape,extrudeSettings);xgeo=function mergeVertices(geometry,tolerance=1e-4){tolerance=Math.max(tolerance,Number.EPSILON);const hashToIndex={},indices=geometry.getIndex(),positions=geometry.getAttribute("position"),vertexCount=indices?indices.count:positions.count;let nextIndex=0;const attributeNames=Object.keys(geometry.attributes),tmpAttributes={},tmpMorphAttributes={},newIndices=[],getters=["getX","getY","getZ","getW"],setters=["setX","setY","setZ","setW"];for(let i=0,l=attributeNames.length;i<l;i++){const name=attributeNames[i],attr=geometry.attributes[name];tmpAttributes[name]=new attr.constructor(new attr.array.constructor(attr.count*attr.itemSize),attr.itemSize,attr.normalized);const morphAttributes=geometry.morphAttributes[name];morphAttributes&&(tmpMorphAttributes[name]||(tmpMorphAttributes[name]=[]),morphAttributes.forEach(((morphAttr,i)=>{const array=new morphAttr.array.constructor(morphAttr.count*morphAttr.itemSize);tmpMorphAttributes[name][i]=new morphAttr.constructor(array,morphAttr.itemSize,morphAttr.normalized)})))}const halfTolerance=.5*tolerance,exponent=Math.log10(1/tolerance),hashMultiplier=Math.pow(10,exponent),hashAdditive=halfTolerance*hashMultiplier;for(let i=0;i<vertexCount;i++){const index=indices?indices.getX(i):i;let hash="";for(let j=0,l=attributeNames.length;j<l;j++){const name=attributeNames[j],attribute=geometry.getAttribute(name),itemSize=attribute.itemSize;for(let k=0;k<itemSize;k++)hash+=~~(attribute[getters[k]](index)*hashMultiplier+hashAdditive)+","}if(hash in hashToIndex)newIndices.push(hashToIndex[hash]);else{for(let j=0,l=attributeNames.length;j<l;j++){const name=attributeNames[j],attribute=geometry.getAttribute(name),morphAttributes=geometry.morphAttributes[name],itemSize=attribute.itemSize,newArray=tmpAttributes[name],newMorphArrays=tmpMorphAttributes[name];for(let k=0;k<itemSize;k++){const getterFunc=getters[k],setterFunc=setters[k];if(newArray[setterFunc](nextIndex,attribute[getterFunc](index)),morphAttributes)for(let m=0,ml=morphAttributes.length;m<ml;m++)newMorphArrays[m][setterFunc](nextIndex,morphAttributes[m][getterFunc](index))}}hashToIndex[hash]=nextIndex,newIndices.push(nextIndex),nextIndex++}}const result=geometry.clone();for(const name in geometry.attributes){const tmpAttribute=tmpAttributes[name];if(result.setAttribute(name,new tmpAttribute.constructor(tmpAttribute.array.slice(0,nextIndex*tmpAttribute.itemSize),tmpAttribute.itemSize,tmpAttribute.normalized)),name in tmpMorphAttributes)for(let j=0;j<tmpMorphAttributes[name].length;j++){const tmpMorphAttribute=tmpMorphAttributes[name][j];result.morphAttributes[name][j]=new tmpMorphAttribute.constructor(tmpMorphAttribute.array.slice(0,nextIndex*tmpMorphAttribute.itemSize),tmpMorphAttribute.itemSize,tmpMorphAttribute.normalized)}}return result.setIndex(newIndices),result}(xgeo),xgeo.computeVertexNormals();const uv=xgeo.attributes.uv;let x1=Math.random()*l,y1=Math.random()*(a+p);for(let i=0;i<uv.count;i++)uv.setXY(i,uv.getY(i)+y1,uv.getX(i)+x1);uv.needsUpdate=!0,gcad.geo[ky]=xgeo}return gcad.geo[ky]}function getpannello(gcad,orientamento,x,y,z,mat1,mat2,options){options||(options={});let l,a,p,{r:r,r1:r1,r2:r2,r3:r3,r4:r4,b:b,npt:npt}=options;r1=r1||r||0,r2=r2||r||0,r3=r3||r||0,r4=r4||r||0,npt=npt||2,b=b||0,(b>=x/2||b>=y/2||b>=z/2)&&(b=0),l="L"==(orientamento=orientamento.trim().toUpperCase())[0]?x:"A"==orientamento[0]?y:z,a="L"==orientamento[1]?x:"A"==orientamento[1]?y:z,p="L"==orientamento[2]?x:"A"==orientamento[2]?y:z;let grp=new THREE.Group;if(!options.nolines){let segments=edgesfromgeometry(new THREE.BoxGeometry(x,y,z));segments.position.set(x/2,y/2,z/2),grp.add(segments)}let mesh=getmesh(pannellogeometry(gcad,l,a,p,r1,r2,r3,r4,b,npt),[mat2||mat1||mgreen,mat1||mred]);mesh.name="pannello",mesh.layers.set(1);let m2=mesh;return b&&(mesh.position.set(b,b,b),m2=new THREE.Group,m2.add(mesh)),mesh=function meshrotate(orientamento,mesh,x=0,y=0,z=0){switch(orientamento.trim().toUpperCase()){case"LPA":mesh.rotation.y=Math.PI/2,mesh.rotation.x=Math.PI,mesh.position.set(0,z,0);break;case"ALP":mesh.rotation.x=Math.PI/2,mesh.position.set(0,x,0);break;case"APL":mesh.rotation.x=-Math.PI/2,mesh.rotation.z=-Math.PI/2;break;case"PLA":break;case"PAL":mesh.rotation.z=Math.PI/2,mesh.position.set(z,0,0);break;case"LAP":mesh.rotation.y=Math.PI/2,mesh.rotation.z=Math.PI/2}return mesh}(orientamento,m2,l,a,p),grp.add(mesh),grp}async function getpannello2(gcad,orientamento,l,a,p,mat,round=0){let bb;switch(orientamento){case"lap":bb=getextrude(gcad,getshape().fromrect(l-2*round,a-2*round).pt,p-2*round,[],mat,{round:round,stonda:round}),bb.position.x=round,bb.position.z=p-round,bb.position.y=a-round,bb.rotation.x=Math.PI;break;case"alp":bb=getextrude(gcad,getshape().fromrect(a-2*round,l-2*round).pt,p-2*round,[],mat,{round:round,stonda:round}),bb.position.x=round,bb.position.z=round,bb.position.y=a-round,bb.rotation.z=-Math.PI/2;break;case"apl":bb=getextrude(gcad,getshape().fromrect(a-2*round,p-2*round).pt,l-2*round,[],mat,{round:round,stonda:round}),bb.position.x=round,bb.position.z=round,bb.position.y=round,bb.rotation.y=Math.PI/2,bb.rotation.z=Math.PI/2;break;case"pal":bb=getextrude(gcad,getshape().fromrect(p-2*round,a-2*round).pt,l-2*round,[],mat,{round:round,stonda:round}),bb.position.x=round,bb.position.z=p-round,bb.position.y=round,bb.rotation.y=Math.PI/2;break;case"pla":bb=getextrude(gcad,getshape().fromrect(p-2*round,l-2*round).pt,a-2*round,[],mat,{round:round,stonda:round}),bb.rotation.z=-Math.PI/2,bb.rotation.x=-Math.PI/2,bb.position.x=round,bb.position.z=round,bb.position.y=round;break;default:bb=getextrude(gcad,getshape().fromrect(l-2*round,p-2*round).pt,a-2*round,[],mat,{round:3,stonda:3}),bb.position.x=round,bb.position.z=round,bb.rotation.x=Math.PI/2,bb.position.y=a-round}return bb}function earcut(data,holeIndices,dim=2){const hasHoles=holeIndices&&holeIndices.length,outerLen=hasHoles?holeIndices[0]*dim:data.length;let outerNode=linkedList(data,0,outerLen,dim,!0);const triangles=[];if(!outerNode||outerNode.next===outerNode.prev)return triangles;let minX,minY,invSize;if(hasHoles&&(outerNode=function eliminateHoles(data,holeIndices,outerNode,dim){const queue=[];for(let i=0,len=holeIndices.length;i<len;i++){const list=linkedList(data,holeIndices[i]*dim,i<len-1?holeIndices[i+1]*dim:data.length,dim,!1);list===list.next&&(list.steiner=!0),queue.push(getLeftmost(list))}queue.sort(compareXYSlope);for(let i=0;i<queue.length;i++)outerNode=eliminateHole(queue[i],outerNode);return outerNode}(data,holeIndices,outerNode,dim)),data.length>80*dim){minX=1/0,minY=1/0;let maxX=-1/0,maxY=-1/0;for(let i=dim;i<outerLen;i+=dim){const x=data[i],y=data[i+1];x<minX&&(minX=x),y<minY&&(minY=y),x>maxX&&(maxX=x),y>maxY&&(maxY=y)}invSize=Math.max(maxX-minX,maxY-minY),invSize=0!==invSize?32767/invSize:0}return earcutLinked(outerNode,triangles,dim,minX,minY,invSize,0),triangles}function linkedList(data,start,end,dim,clockwise){let last;if(clockwise===function signedArea(data,start,end,dim){let sum=0;for(let i=start,j=end-dim;i<end;i+=dim)sum+=(data[j]-data[i])*(data[i+1]+data[j+1]),j=i;return sum}(data,start,end,dim)>0)for(let i=start;i<end;i+=dim)last=insertNode(i/dim|0,data[i],data[i+1],last);else for(let i=end-dim;i>=start;i-=dim)last=insertNode(i/dim|0,data[i],data[i+1],last);return last&&equals(last,last.next)&&(removeNode(last),last=last.next),last}function filterPoints(start,end){if(!start)return start;end||(end=start);let again,p=start;do{if(again=!1,p.steiner||!equals(p,p.next)&&0!==area(p.prev,p,p.next))p=p.next;else{if(removeNode(p),p=end=p.prev,p===p.next)break;again=!0}}while(again||p!==end);return end}function earcutLinked(ear,triangles,dim,minX,minY,invSize,pass){if(!ear)return;!pass&&invSize&&function indexCurve(start,minX,minY,invSize){let p=start;do{0===p.z&&(p.z=zOrder(p.x,p.y,minX,minY,invSize)),p.prevZ=p.prev,p.nextZ=p.next,p=p.next}while(p!==start);p.prevZ.nextZ=null,p.prevZ=null,function sortLinked(list){let numMerges,inSize=1;do{let e,p=list;list=null;let tail=null;for(numMerges=0;p;){numMerges++;let q=p,pSize=0;for(let i=0;i<inSize&&(pSize++,q=q.nextZ,q);i++);let qSize=inSize;for(;pSize>0||qSize>0&&q;)0!==pSize&&(0===qSize||!q||p.z<=q.z)?(e=p,p=p.nextZ,pSize--):(e=q,q=q.nextZ,qSize--),tail?tail.nextZ=e:list=e,e.prevZ=tail,tail=e;p=q}tail.nextZ=null,inSize*=2}while(numMerges>1);return list}(p)}(ear,minX,minY,invSize);let stop=ear;for(;ear.prev!==ear.next;){const prev=ear.prev,next=ear.next;if(invSize?isEarHashed(ear,minX,minY,invSize):isEar(ear))triangles.push(prev.i,ear.i,next.i),removeNode(ear),ear=next.next,stop=next.next;else if((ear=next)===stop){pass?1===pass?earcutLinked(ear=cureLocalIntersections(filterPoints(ear),triangles),triangles,dim,minX,minY,invSize,2):2===pass&&splitEarcut(ear,triangles,dim,minX,minY,invSize):earcutLinked(filterPoints(ear),triangles,dim,minX,minY,invSize,1);break}}}function isEar(ear){const a=ear.prev,b=ear,c=ear.next;if(area(a,b,c)>=0)return!1;const ax=a.x,bx=b.x,cx=c.x,ay=a.y,by=b.y,cy=c.y,x0=Math.min(ax,bx,cx),y0=Math.min(ay,by,cy),x1=Math.max(ax,bx,cx),y1=Math.max(ay,by,cy);let p=c.next;for(;p!==a;){if(p.x>=x0&&p.x<=x1&&p.y>=y0&&p.y<=y1&&pointInTriangleExceptFirst(ax,ay,bx,by,cx,cy,p.x,p.y)&&area(p.prev,p,p.next)>=0)return!1;p=p.next}return!0}function isEarHashed(ear,minX,minY,invSize){const a=ear.prev,b=ear,c=ear.next;if(area(a,b,c)>=0)return!1;const ax=a.x,bx=b.x,cx=c.x,ay=a.y,by=b.y,cy=c.y,x0=Math.min(ax,bx,cx),y0=Math.min(ay,by,cy),x1=Math.max(ax,bx,cx),y1=Math.max(ay,by,cy),minZ=zOrder(x0,y0,minX,minY,invSize),maxZ=zOrder(x1,y1,minX,minY,invSize);let p=ear.prevZ,n=ear.nextZ;for(;p&&p.z>=minZ&&n&&n.z<=maxZ;){if(p.x>=x0&&p.x<=x1&&p.y>=y0&&p.y<=y1&&p!==a&&p!==c&&pointInTriangleExceptFirst(ax,ay,bx,by,cx,cy,p.x,p.y)&&area(p.prev,p,p.next)>=0)return!1;if(p=p.prevZ,n.x>=x0&&n.x<=x1&&n.y>=y0&&n.y<=y1&&n!==a&&n!==c&&pointInTriangleExceptFirst(ax,ay,bx,by,cx,cy,n.x,n.y)&&area(n.prev,n,n.next)>=0)return!1;n=n.nextZ}for(;p&&p.z>=minZ;){if(p.x>=x0&&p.x<=x1&&p.y>=y0&&p.y<=y1&&p!==a&&p!==c&&pointInTriangleExceptFirst(ax,ay,bx,by,cx,cy,p.x,p.y)&&area(p.prev,p,p.next)>=0)return!1;p=p.prevZ}for(;n&&n.z<=maxZ;){if(n.x>=x0&&n.x<=x1&&n.y>=y0&&n.y<=y1&&n!==a&&n!==c&&pointInTriangleExceptFirst(ax,ay,bx,by,cx,cy,n.x,n.y)&&area(n.prev,n,n.next)>=0)return!1;n=n.nextZ}return!0}function cureLocalIntersections(start,triangles){let p=start;do{const a=p.prev,b=p.next.next;!equals(a,b)&&intersects(a,p,p.next,b)&&locallyInside(a,b)&&locallyInside(b,a)&&(triangles.push(a.i,p.i,b.i),removeNode(p),removeNode(p.next),p=start=b),p=p.next}while(p!==start);return filterPoints(p)}function splitEarcut(start,triangles,dim,minX,minY,invSize){let a=start;do{let b=a.next.next;for(;b!==a.prev;){if(a.i!==b.i&&isValidDiagonal(a,b)){let c=splitPolygon(a,b);return a=filterPoints(a,a.next),c=filterPoints(c,c.next),earcutLinked(a,triangles,dim,minX,minY,invSize,0),void earcutLinked(c,triangles,dim,minX,minY,invSize,0)}b=b.next}a=a.next}while(a!==start)}function compareXYSlope(a,b){let result=a.x-b.x;if(0===result&&(result=a.y-b.y,0===result)){result=(a.next.y-a.y)/(a.next.x-a.x)-(b.next.y-b.y)/(b.next.x-b.x)}return result}function eliminateHole(hole,outerNode){const bridge=function findHoleBridge(hole,outerNode){let p=outerNode;const hx=hole.x,hy=hole.y;let m,qx=-1/0;if(equals(hole,p))return p;do{if(equals(hole,p.next))return p.next;if(hy<=p.y&&hy>=p.next.y&&p.next.y!==p.y){const x=p.x+(hy-p.y)*(p.next.x-p.x)/(p.next.y-p.y);if(x<=hx&&x>qx&&(qx=x,m=p.x<p.next.x?p:p.next,x===hx))return m}p=p.next}while(p!==outerNode);if(!m)return null;const stop=m,mx=m.x,my=m.y;let tanMin=1/0;p=m;do{if(hx>=p.x&&p.x>=mx&&hx!==p.x&&pointInTriangle(hy<my?hx:qx,hy,mx,my,hy<my?qx:hx,hy,p.x,p.y)){const tan=Math.abs(hy-p.y)/(hx-p.x);locallyInside(p,hole)&&(tan<tanMin||tan===tanMin&&(p.x>m.x||p.x===m.x&&sectorContainsSector(m,p)))&&(m=p,tanMin=tan)}p=p.next}while(p!==stop);return m}(hole,outerNode);if(!bridge)return outerNode;const bridgeReverse=splitPolygon(bridge,hole);return filterPoints(bridgeReverse,bridgeReverse.next),filterPoints(bridge,bridge.next)}function sectorContainsSector(m,p){return area(m.prev,m,p.prev)<0&&area(p.next,m,m.next)<0}function zOrder(x,y,minX,minY,invSize){return(x=1431655765&((x=858993459&((x=252645135&((x=16711935&((x=(x-minX)*invSize|0)|x<<8))|x<<4))|x<<2))|x<<1))|(y=1431655765&((y=858993459&((y=252645135&((y=16711935&((y=(y-minY)*invSize|0)|y<<8))|y<<4))|y<<2))|y<<1))<<1}function getLeftmost(start){let p=start,leftmost=start;do{(p.x<leftmost.x||p.x===leftmost.x&&p.y<leftmost.y)&&(leftmost=p),p=p.next}while(p!==start);return leftmost}function pointInTriangle(ax,ay,bx,by,cx,cy,px,py){return(cx-px)*(ay-py)>=(ax-px)*(cy-py)&&(ax-px)*(by-py)>=(bx-px)*(ay-py)&&(bx-px)*(cy-py)>=(cx-px)*(by-py)}function pointInTriangleExceptFirst(ax,ay,bx,by,cx,cy,px,py){return!(ax===px&&ay===py)&&pointInTriangle(ax,ay,bx,by,cx,cy,px,py)}function isValidDiagonal(a,b){return a.next.i!==b.i&&a.prev.i!==b.i&&!function intersectsPolygon(a,b){let p=a;do{if(p.i!==a.i&&p.next.i!==a.i&&p.i!==b.i&&p.next.i!==b.i&&intersects(p,p.next,a,b))return!0;p=p.next}while(p!==a);return!1}(a,b)&&(locallyInside(a,b)&&locallyInside(b,a)&&function middleInside(a,b){let p=a,inside=!1;const px=(a.x+b.x)/2,py=(a.y+b.y)/2;do{p.y>py!=p.next.y>py&&p.next.y!==p.y&&px<(p.next.x-p.x)*(py-p.y)/(p.next.y-p.y)+p.x&&(inside=!inside),p=p.next}while(p!==a);return inside}(a,b)&&(area(a.prev,a,b.prev)||area(a,b.prev,b))||equals(a,b)&&area(a.prev,a,a.next)>0&&area(b.prev,b,b.next)>0)}function area(p,q,r){return(q.y-p.y)*(r.x-q.x)-(q.x-p.x)*(r.y-q.y)}function equals(p1,p2){return p1.x===p2.x&&p1.y===p2.y}function intersects(p1,q1,p2,q2){const o1=sign(area(p1,q1,p2)),o2=sign(area(p1,q1,q2)),o3=sign(area(p2,q2,p1)),o4=sign(area(p2,q2,q1));return o1!==o2&&o3!==o4||(!(0!==o1||!onSegment(p1,p2,q1))||(!(0!==o2||!onSegment(p1,q2,q1))||(!(0!==o3||!onSegment(p2,p1,q2))||!(0!==o4||!onSegment(p2,q1,q2)))))}function onSegment(p,q,r){return q.x<=Math.max(p.x,r.x)&&q.x>=Math.min(p.x,r.x)&&q.y<=Math.max(p.y,r.y)&&q.y>=Math.min(p.y,r.y)}function sign(num){return num>0?1:num<0?-1:0}function locallyInside(a,b){return area(a.prev,a,a.next)<0?area(a,b,a.next)>=0&&area(a,a.prev,b)>=0:area(a,b,a.prev)<0||area(a,a.next,b)<0}function splitPolygon(a,b){const a2=createNode(a.i,a.x,a.y),b2=createNode(b.i,b.x,b.y),an=a.next,bp=b.prev;return a.next=b,b.prev=a,a2.next=an,an.prev=a2,b2.next=a2,a2.prev=b2,bp.next=b2,b2.prev=bp,b2}function insertNode(i,x,y,last){const p=createNode(i,x,y);return last?(p.next=last.next,p.prev=last,last.next.prev=p,last.next=p):(p.prev=p,p.next=p),p}function removeNode(p){p.next.prev=p.prev,p.prev.next=p.next,p.prevZ&&(p.prevZ.nextZ=p.nextZ),p.nextZ&&(p.nextZ.prevZ=p.prevZ)}function createNode(i,x,y){return{i:i,x:x,y:y,prev:null,next:null,z:0,prevZ:null,nextZ:null,steiner:!1}}function unifyVertices(vertices,uvs,indices){const vertMap=new Map,verticesOut=[],uvsOut=[],indicesOut=[];for(let i=0;i<indices.length;i++){const idx=indices[i],vx=vertices[3*idx+0],vy=vertices[3*idx+1],vz=vertices[3*idx+2],ux=uvs[2*idx+0],uy=uvs[2*idx+1],key=`${vx},${vy},${vz}|${ux},${uy}`;if(vertMap.has(key))indicesOut.push(vertMap.get(key));else{const newIndex=verticesOut.length/3;vertMap.set(key,newIndex),verticesOut.push(vx,vy,vz),uvsOut.push(ux,uy),indicesOut.push(newIndex)}}return{vertices:verticesOut,uvs:uvsOut,indices:indicesOut}}function infoestrudi(shape,hshape,pts,options,sh){options||(options={}),pts||(pts=[]);let p0=options.p0||0,coeffbase1=Math.tan(options.coeffbase1*PIF||0),coeffbase2=Math.tan(options.coeffbase2*PIF||0),p1=hshape||options.p1||20,coefftop1=Math.tan(options.coefftop1*PIF||0),coefftop2=Math.tan(options.coefftop2*PIF||0),{mi:mi,ma:ma}=shape.pt.reduce(((t,e)=>(t.mi.x=Math.min(t.mi.x,e.x),t.mi.y=Math.min(t.mi.y,e.y),t.ma.x=Math.max(t.ma.x,e.x),t.ma.y=Math.max(t.ma.y,e.y),t)),{mi:{x:1e9,y:1e9},ma:{x:-1e9,y:-1e9}}),lmax=0,lmin=1e9;function getpars(p){p.z1=getzeta(p.x,p.y,p0,coeffbase1,coeffbase2,sh),p.z2=getzeta(p.x,p.y,p1,coefftop1,coefftop2,sh),p.l=Math.abs(p.z2-p.z1)}for(let p of pts)getpars(p);getpars(mi),getpars(ma);let rect=[{x:mi.x,y:mi.y},{x:ma.x,y:mi.y},{x:ma.x,y:ma.y},{x:mi.x,y:ma.y}];for(let r of rect)getpars(r),r.l>lmax&&(lmax=r.l),r.l<lmin&&(lmin=r.l);return{aini:options.coeffbase1||0,aini2:options.coeffbase2||0,afin:options.coefftop1||0,afin2:options.coefftop2||0,pts:pts,mi:mi,ma:ma,rect:rect,dimx:ma.x-mi.x,dimy:ma.y-mi.y,lnom:p1-p0,lmax:lmax,lmin:lmin,lmed:(lmax+lmin)/2}}function getzeta(x,y,zbase,cx,cy,sh,invert=!1){let z=x*cx+y*cy+zbase;if(sh){let t=sh.xfromy(-y,0,!0);invert?z-=t:z=t}return z}function sidegeomfromshapes(gcad,ky,s1,s2,invert=!1,stonda=!1){if(s1&&s2){if(s1.length!==s2.length)throw new Error("shapes with different length");if(s1.length<2)throw new Error("I percorsi devono contenere almeno due punti ciascuno.");if(!gcad.geo[ky]){const vertices=[],uvs=[],indices=[],np=s1.length,addpts=ss=>{for(const s of ss)vertices.push(s.x,s.y,s.z),uvs.push(s.u,s.v)},equalpos=(p1,p2)=>p1.x===p2.x&&p1.y===p2.y&&p1.z===p2.z,addindexquad=(i1,i2,i3,i4)=>{invert?indices.push(i1,i3,i2,i3,i4,i2):indices.push(i1,i2,i3,i3,i2,i4)};addpts(s1),addpts(s2);for(let i=0;i<np-1;i++){const j=i+1;equalpos(s1[i],s1[j])||addindexquad(i,j,i+np,j+np)}const geometry=new THREE.BufferGeometry;if(stonda){let tm=unifyVertices(vertices,uvs,indices);geometry.setAttribute("position",new THREE.Float32BufferAttribute(tm.vertices,3)),geometry.setAttribute("uv",new THREE.Float32BufferAttribute(tm.uvs,2)),geometry.setIndex(tm.indices)}else geometry.setAttribute("position",new THREE.Float32BufferAttribute(vertices,3)),geometry.setAttribute("uv",new THREE.Float32BufferAttribute(uvs,2)),geometry.setIndex(indices);geometry.computeVertexNormals(),gcad.geo[ky]=geometry}return gcad.geo[ky]}}function bottomgeomfromshape(gcad,inverti,outer,holes,c=0,a=0,b=0,shape=null,stonda=!1){let ky=`bg:${c}|${a}${b}|${outer.key}|${inverti}|${shape?.key||""}`;for(let h of holes)ky=`${ky}|${h.key}`;if(ky=hash(ky),!gcad.geo[ky]){let triangles,pos=[],hl=[],cc=outer.pt.length;pos=outer.vec;const geometry=new THREE.BufferGeometry,vertices=[],uvs=[],indices=[];function addvertexes(triangles,pos){let i0=vertices.length/3;for(let i=0;i<triangles.length;i++){const index=triangles[i],x=pos[2*index],y=-pos[2*index+1],z=getzeta(x,y,c,a,b,shape,inverti);vertices.push(x,y,z),uvs.push(y,x)}for(let i=0;i<triangles.length;i+=3)inverti?indices.push(i+i0,i+i0+2,i+i0+1):indices.push(i+i0,i+i0+1,i+i0+2)}if(shape){let cl2=outer.sliceony(shape);for(let c of cl2){let x=c.flatMap((p=>[p.x,p.y]));addvertexes(earcut(x,[]),x)}}else if(Array.isArray(holes)&&holes.length){for(let h of holes)hl.push(cc),cc+=h.pt.length,pos=[...pos,...h.vec];triangles=earcut(pos,hl),addvertexes(triangles,pos)}else triangles=earcut(pos),addvertexes(triangles,pos);if(stonda){let tm=unifyVertices(vertices,uvs,indices);geometry.setAttribute("position",new THREE.Float32BufferAttribute(tm.vertices,3)),geometry.setAttribute("uv",new THREE.Float32BufferAttribute(tm.uvs,2)),geometry.setIndex(tm.indices)}else geometry.setAttribute("position",new THREE.Float32BufferAttribute(vertices,3)),geometry.setAttribute("uv",new THREE.Float32BufferAttribute(uvs,2)),geometry.setIndex(indices);geometry.computeVertexNormals(),gcad.geo[ky]=geometry}return gcad.geo[ky]}function estrusorotate(orientamento,mesh,z=0){switch(orientamento.trim().toUpperCase().slice(0,1)){case"A":mesh.rotation.x=-Math.PI/2;break;case"L":mesh.rotation.y=Math.PI/2,mesh.rotation.z=Math.PI;break;case"P":mesh.rotation.z=Math.PI/2}return mesh}
644
+ function toTrianglesDrawMode(geometry,drawMode){if(drawMode===TrianglesDrawMode)return console.warn("THREE.BufferGeometryUtils.toTrianglesDrawMode(): Geometry already defined as triangles."),geometry;if(drawMode===TriangleFanDrawMode||drawMode===TriangleStripDrawMode){let index=geometry.getIndex();if(null===index){const indices=[],position=geometry.getAttribute("position");if(void 0===position)return console.error("THREE.BufferGeometryUtils.toTrianglesDrawMode(): Undefined position attribute. Processing not possible."),geometry;for(let i=0;i<position.count;i++)indices.push(i);geometry.setIndex(indices),index=geometry.getIndex()}const numberOfTriangles=index.count-2,newIndices=[];if(drawMode===TriangleFanDrawMode)for(let i=1;i<=numberOfTriangles;i++)newIndices.push(index.getX(0)),newIndices.push(index.getX(i)),newIndices.push(index.getX(i+1));else for(let i=0;i<numberOfTriangles;i++)i%2==0?(newIndices.push(index.getX(i)),newIndices.push(index.getX(i+1)),newIndices.push(index.getX(i+2))):(newIndices.push(index.getX(i+2)),newIndices.push(index.getX(i+1)),newIndices.push(index.getX(i)));newIndices.length/3!==numberOfTriangles&&console.error("THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unable to generate correct amount of triangles.");const newGeometry=geometry.clone();return newGeometry.setIndex(newIndices),newGeometry.clearGroups(),newGeometry}return console.error("THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unknown draw mode:",drawMode),geometry}function pannellogeometry(gcad,l,a,p,r1=0,r2=0,r3=0,r4=0,b=0,npt=2){let ky=hash(`pg--${l}|${a}|${p}|${r1}|${r2}|${r3}|${r4}|${b}|${npt}`);if(l-=.01,a-=.01,p-=.01,!gcad.geo[ky]){l-=2*b,a-=2*b,p-=2*b;let tm=getshape();const vv=[{x:r4,y:0},{x:a-r1,y:0},{x:a,y:r1},{x:a,y:p-r2},{x:a-r2,y:p},{x:r3,y:p},{x:0,y:p-r3},{x:0,y:r4}];tm.addpt(vv[0]),tm.addpt(vv[1]),r1&&tm.addpt(raccordabezier(vv[0],vv[1],vv[2],vv[3],npt)),tm.addpt(vv[2]),tm.addpt(vv[3]),r2&&tm.addpt(raccordabezier(vv[2],vv[3],vv[4],vv[5],npt)),tm.addpt(vv[4]),tm.addpt(vv[5]),r3&&tm.addpt(raccordabezier(vv[4],vv[5],vv[6],vv[7],npt)),tm.addpt(vv[6]),tm.addpt(vv[7]),r2&&tm.addpt(raccordabezier(vv[6],vv[7],vv[0],vv[1],npt)),tm.removeduplicate(.01);let pts=tm.pt;const shape=new THREE.Shape;shape.moveTo(pts[0].x,pts[0].y);for(let i=1;i<pts.length;i++)shape.lineTo(pts[i].x,pts[i].y);shape.lineTo(pts[0].x,pts[0].y);const extrudeSettings={depth:l,bevelEnabled:b>0,bevelThickness:b,bevelSize:b,bevelSegments:1};let xgeo=new THREE.ExtrudeGeometry(shape,extrudeSettings);xgeo=function mergeVertices(geometry,tolerance=1e-4){tolerance=Math.max(tolerance,Number.EPSILON);const hashToIndex={},indices=geometry.getIndex(),positions=geometry.getAttribute("position"),vertexCount=indices?indices.count:positions.count;let nextIndex=0;const attributeNames=Object.keys(geometry.attributes),tmpAttributes={},tmpMorphAttributes={},newIndices=[],getters=["getX","getY","getZ","getW"],setters=["setX","setY","setZ","setW"];for(let i=0,l=attributeNames.length;i<l;i++){const name=attributeNames[i],attr=geometry.attributes[name];tmpAttributes[name]=new attr.constructor(new attr.array.constructor(attr.count*attr.itemSize),attr.itemSize,attr.normalized);const morphAttributes=geometry.morphAttributes[name];morphAttributes&&(tmpMorphAttributes[name]||(tmpMorphAttributes[name]=[]),morphAttributes.forEach(((morphAttr,i)=>{const array=new morphAttr.array.constructor(morphAttr.count*morphAttr.itemSize);tmpMorphAttributes[name][i]=new morphAttr.constructor(array,morphAttr.itemSize,morphAttr.normalized)})))}const halfTolerance=.5*tolerance,exponent=Math.log10(1/tolerance),hashMultiplier=Math.pow(10,exponent),hashAdditive=halfTolerance*hashMultiplier;for(let i=0;i<vertexCount;i++){const index=indices?indices.getX(i):i;let hash="";for(let j=0,l=attributeNames.length;j<l;j++){const name=attributeNames[j],attribute=geometry.getAttribute(name),itemSize=attribute.itemSize;for(let k=0;k<itemSize;k++)hash+=~~(attribute[getters[k]](index)*hashMultiplier+hashAdditive)+","}if(hash in hashToIndex)newIndices.push(hashToIndex[hash]);else{for(let j=0,l=attributeNames.length;j<l;j++){const name=attributeNames[j],attribute=geometry.getAttribute(name),morphAttributes=geometry.morphAttributes[name],itemSize=attribute.itemSize,newArray=tmpAttributes[name],newMorphArrays=tmpMorphAttributes[name];for(let k=0;k<itemSize;k++){const getterFunc=getters[k],setterFunc=setters[k];if(newArray[setterFunc](nextIndex,attribute[getterFunc](index)),morphAttributes)for(let m=0,ml=morphAttributes.length;m<ml;m++)newMorphArrays[m][setterFunc](nextIndex,morphAttributes[m][getterFunc](index))}}hashToIndex[hash]=nextIndex,newIndices.push(nextIndex),nextIndex++}}const result=geometry.clone();for(const name in geometry.attributes){const tmpAttribute=tmpAttributes[name];if(result.setAttribute(name,new tmpAttribute.constructor(tmpAttribute.array.slice(0,nextIndex*tmpAttribute.itemSize),tmpAttribute.itemSize,tmpAttribute.normalized)),name in tmpMorphAttributes)for(let j=0;j<tmpMorphAttributes[name].length;j++){const tmpMorphAttribute=tmpMorphAttributes[name][j];result.morphAttributes[name][j]=new tmpMorphAttribute.constructor(tmpMorphAttribute.array.slice(0,nextIndex*tmpMorphAttribute.itemSize),tmpMorphAttribute.itemSize,tmpMorphAttribute.normalized)}}return result.setIndex(newIndices),result}(xgeo),xgeo.computeVertexNormals();const uv=xgeo.attributes.uv;let x1=Math.random()*l,y1=Math.random()*(a+p);for(let i=0;i<uv.count;i++)uv.setXY(i,uv.getY(i)+y1,uv.getX(i)+x1);uv.needsUpdate=!0,gcad.geo[ky]=xgeo}return gcad.geo[ky]}function getpannello(gcad,orientamento,x,y,z,mat1,mat2,options){options||(options={});let l,a,p,{r:r,r1:r1,r2:r2,r3:r3,r4:r4,b:b,npt:npt}=options;r1=r1||r||0,r2=r2||r||0,r3=r3||r||0,r4=r4||r||0,npt=npt||2,b=b||0,(b>=x/2||b>=y/2||b>=z/2)&&(b=0),l="L"==(orientamento=orientamento.trim().toUpperCase())[0]?x:"A"==orientamento[0]?y:z,a="L"==orientamento[1]?x:"A"==orientamento[1]?y:z,p="L"==orientamento[2]?x:"A"==orientamento[2]?y:z;let grp=new THREE.Group;if(!options.nolines){let segments=edgesfromgeometry(new THREE.BoxGeometry(x,y,z));segments.position.set(x/2,y/2,z/2),grp.add(segments)}let mesh=getmesh(pannellogeometry(gcad,l,a,p,r1,r2,r3,r4,b,npt),[mat2||mat1||mgreen,mat1||mred]);mesh.name="pannello",mesh.layers.set(1);let m2=mesh;return b&&(mesh.position.set(b,b,b),m2=new THREE.Group,m2.add(mesh)),mesh=function meshrotate(orientamento,mesh,x=0,y=0,z=0){switch(orientamento.trim().toUpperCase()){case"LPA":mesh.rotation.y=Math.PI/2,mesh.rotation.x=Math.PI,mesh.position.set(0,z,0);break;case"ALP":mesh.rotation.x=Math.PI/2,mesh.position.set(0,x,0);break;case"APL":mesh.rotation.x=-Math.PI/2,mesh.rotation.z=-Math.PI/2;break;case"PLA":break;case"PAL":mesh.rotation.z=Math.PI/2,mesh.position.set(z,0,0);break;case"LAP":mesh.rotation.y=Math.PI/2,mesh.rotation.z=Math.PI/2}return mesh}(orientamento,m2,l,a,p),grp.add(mesh),grp}async function getpannello2(gcad,orientamento,l,a,p,mat,round=0){let bb;switch((round<0||round>Math.max(l,a,p)/3)&&(round=0),orientamento){case"lap":bb=getextrude(gcad,getshape().fromrect(l-2*round,a-2*round).pt,p-2*round,[],mat,{round:round,stonda:round}),bb.position.x=round,bb.position.z=p-round,bb.position.y=a-round,bb.rotation.x=Math.PI;break;case"alp":bb=getextrude(gcad,getshape().fromrect(a-2*round,l-2*round).pt,p-2*round,[],mat,{round:round,stonda:round}),bb.position.x=round,bb.position.z=round,bb.position.y=a-round,bb.rotation.z=-Math.PI/2;break;case"apl":bb=getextrude(gcad,getshape().fromrect(a-2*round,p-2*round).pt,l-2*round,[],mat,{round:round,stonda:round}),bb.position.x=round,bb.position.z=round,bb.position.y=round,bb.rotation.y=Math.PI/2,bb.rotation.z=Math.PI/2;break;case"pal":bb=getextrude(gcad,getshape().fromrect(p-2*round,a-2*round).pt,l-2*round,[],mat,{round:round,stonda:round}),bb.position.x=round,bb.position.z=p-round,bb.position.y=round,bb.rotation.y=Math.PI/2;break;case"pla":bb=getextrude(gcad,getshape().fromrect(p-2*round,l-2*round).pt,a-2*round,[],mat,{round:round,stonda:round}),bb.rotation.z=-Math.PI/2,bb.rotation.x=-Math.PI/2,bb.position.x=round,bb.position.z=round,bb.position.y=round;break;default:bb=getextrude(gcad,getshape().fromrect(l-2*round,p-2*round).pt,a-2*round,[],mat,{round:round,stonda:round}),bb.position.x=round,bb.position.z=round,bb.rotation.x=Math.PI/2,bb.position.y=a-round}return bb}function earcut(data,holeIndices,dim=2){const hasHoles=holeIndices&&holeIndices.length,outerLen=hasHoles?holeIndices[0]*dim:data.length;let outerNode=linkedList(data,0,outerLen,dim,!0);const triangles=[];if(!outerNode||outerNode.next===outerNode.prev)return triangles;let minX,minY,invSize;if(hasHoles&&(outerNode=function eliminateHoles(data,holeIndices,outerNode,dim){const queue=[];for(let i=0,len=holeIndices.length;i<len;i++){const list=linkedList(data,holeIndices[i]*dim,i<len-1?holeIndices[i+1]*dim:data.length,dim,!1);list===list.next&&(list.steiner=!0),queue.push(getLeftmost(list))}queue.sort(compareXYSlope);for(let i=0;i<queue.length;i++)outerNode=eliminateHole(queue[i],outerNode);return outerNode}(data,holeIndices,outerNode,dim)),data.length>80*dim){minX=1/0,minY=1/0;let maxX=-1/0,maxY=-1/0;for(let i=dim;i<outerLen;i+=dim){const x=data[i],y=data[i+1];x<minX&&(minX=x),y<minY&&(minY=y),x>maxX&&(maxX=x),y>maxY&&(maxY=y)}invSize=Math.max(maxX-minX,maxY-minY),invSize=0!==invSize?32767/invSize:0}return earcutLinked(outerNode,triangles,dim,minX,minY,invSize,0),triangles}function linkedList(data,start,end,dim,clockwise){let last;if(clockwise===function signedArea(data,start,end,dim){let sum=0;for(let i=start,j=end-dim;i<end;i+=dim)sum+=(data[j]-data[i])*(data[i+1]+data[j+1]),j=i;return sum}(data,start,end,dim)>0)for(let i=start;i<end;i+=dim)last=insertNode(i/dim|0,data[i],data[i+1],last);else for(let i=end-dim;i>=start;i-=dim)last=insertNode(i/dim|0,data[i],data[i+1],last);return last&&equals(last,last.next)&&(removeNode(last),last=last.next),last}function filterPoints(start,end){if(!start)return start;end||(end=start);let again,p=start;do{if(again=!1,p.steiner||!equals(p,p.next)&&0!==area(p.prev,p,p.next))p=p.next;else{if(removeNode(p),p=end=p.prev,p===p.next)break;again=!0}}while(again||p!==end);return end}function earcutLinked(ear,triangles,dim,minX,minY,invSize,pass){if(!ear)return;!pass&&invSize&&function indexCurve(start,minX,minY,invSize){let p=start;do{0===p.z&&(p.z=zOrder(p.x,p.y,minX,minY,invSize)),p.prevZ=p.prev,p.nextZ=p.next,p=p.next}while(p!==start);p.prevZ.nextZ=null,p.prevZ=null,function sortLinked(list){let numMerges,inSize=1;do{let e,p=list;list=null;let tail=null;for(numMerges=0;p;){numMerges++;let q=p,pSize=0;for(let i=0;i<inSize&&(pSize++,q=q.nextZ,q);i++);let qSize=inSize;for(;pSize>0||qSize>0&&q;)0!==pSize&&(0===qSize||!q||p.z<=q.z)?(e=p,p=p.nextZ,pSize--):(e=q,q=q.nextZ,qSize--),tail?tail.nextZ=e:list=e,e.prevZ=tail,tail=e;p=q}tail.nextZ=null,inSize*=2}while(numMerges>1);return list}(p)}(ear,minX,minY,invSize);let stop=ear;for(;ear.prev!==ear.next;){const prev=ear.prev,next=ear.next;if(invSize?isEarHashed(ear,minX,minY,invSize):isEar(ear))triangles.push(prev.i,ear.i,next.i),removeNode(ear),ear=next.next,stop=next.next;else if((ear=next)===stop){pass?1===pass?earcutLinked(ear=cureLocalIntersections(filterPoints(ear),triangles),triangles,dim,minX,minY,invSize,2):2===pass&&splitEarcut(ear,triangles,dim,minX,minY,invSize):earcutLinked(filterPoints(ear),triangles,dim,minX,minY,invSize,1);break}}}function isEar(ear){const a=ear.prev,b=ear,c=ear.next;if(area(a,b,c)>=0)return!1;const ax=a.x,bx=b.x,cx=c.x,ay=a.y,by=b.y,cy=c.y,x0=Math.min(ax,bx,cx),y0=Math.min(ay,by,cy),x1=Math.max(ax,bx,cx),y1=Math.max(ay,by,cy);let p=c.next;for(;p!==a;){if(p.x>=x0&&p.x<=x1&&p.y>=y0&&p.y<=y1&&pointInTriangleExceptFirst(ax,ay,bx,by,cx,cy,p.x,p.y)&&area(p.prev,p,p.next)>=0)return!1;p=p.next}return!0}function isEarHashed(ear,minX,minY,invSize){const a=ear.prev,b=ear,c=ear.next;if(area(a,b,c)>=0)return!1;const ax=a.x,bx=b.x,cx=c.x,ay=a.y,by=b.y,cy=c.y,x0=Math.min(ax,bx,cx),y0=Math.min(ay,by,cy),x1=Math.max(ax,bx,cx),y1=Math.max(ay,by,cy),minZ=zOrder(x0,y0,minX,minY,invSize),maxZ=zOrder(x1,y1,minX,minY,invSize);let p=ear.prevZ,n=ear.nextZ;for(;p&&p.z>=minZ&&n&&n.z<=maxZ;){if(p.x>=x0&&p.x<=x1&&p.y>=y0&&p.y<=y1&&p!==a&&p!==c&&pointInTriangleExceptFirst(ax,ay,bx,by,cx,cy,p.x,p.y)&&area(p.prev,p,p.next)>=0)return!1;if(p=p.prevZ,n.x>=x0&&n.x<=x1&&n.y>=y0&&n.y<=y1&&n!==a&&n!==c&&pointInTriangleExceptFirst(ax,ay,bx,by,cx,cy,n.x,n.y)&&area(n.prev,n,n.next)>=0)return!1;n=n.nextZ}for(;p&&p.z>=minZ;){if(p.x>=x0&&p.x<=x1&&p.y>=y0&&p.y<=y1&&p!==a&&p!==c&&pointInTriangleExceptFirst(ax,ay,bx,by,cx,cy,p.x,p.y)&&area(p.prev,p,p.next)>=0)return!1;p=p.prevZ}for(;n&&n.z<=maxZ;){if(n.x>=x0&&n.x<=x1&&n.y>=y0&&n.y<=y1&&n!==a&&n!==c&&pointInTriangleExceptFirst(ax,ay,bx,by,cx,cy,n.x,n.y)&&area(n.prev,n,n.next)>=0)return!1;n=n.nextZ}return!0}function cureLocalIntersections(start,triangles){let p=start;do{const a=p.prev,b=p.next.next;!equals(a,b)&&intersects(a,p,p.next,b)&&locallyInside(a,b)&&locallyInside(b,a)&&(triangles.push(a.i,p.i,b.i),removeNode(p),removeNode(p.next),p=start=b),p=p.next}while(p!==start);return filterPoints(p)}function splitEarcut(start,triangles,dim,minX,minY,invSize){let a=start;do{let b=a.next.next;for(;b!==a.prev;){if(a.i!==b.i&&isValidDiagonal(a,b)){let c=splitPolygon(a,b);return a=filterPoints(a,a.next),c=filterPoints(c,c.next),earcutLinked(a,triangles,dim,minX,minY,invSize,0),void earcutLinked(c,triangles,dim,minX,minY,invSize,0)}b=b.next}a=a.next}while(a!==start)}function compareXYSlope(a,b){let result=a.x-b.x;if(0===result&&(result=a.y-b.y,0===result)){result=(a.next.y-a.y)/(a.next.x-a.x)-(b.next.y-b.y)/(b.next.x-b.x)}return result}function eliminateHole(hole,outerNode){const bridge=function findHoleBridge(hole,outerNode){let p=outerNode;const hx=hole.x,hy=hole.y;let m,qx=-1/0;if(equals(hole,p))return p;do{if(equals(hole,p.next))return p.next;if(hy<=p.y&&hy>=p.next.y&&p.next.y!==p.y){const x=p.x+(hy-p.y)*(p.next.x-p.x)/(p.next.y-p.y);if(x<=hx&&x>qx&&(qx=x,m=p.x<p.next.x?p:p.next,x===hx))return m}p=p.next}while(p!==outerNode);if(!m)return null;const stop=m,mx=m.x,my=m.y;let tanMin=1/0;p=m;do{if(hx>=p.x&&p.x>=mx&&hx!==p.x&&pointInTriangle(hy<my?hx:qx,hy,mx,my,hy<my?qx:hx,hy,p.x,p.y)){const tan=Math.abs(hy-p.y)/(hx-p.x);locallyInside(p,hole)&&(tan<tanMin||tan===tanMin&&(p.x>m.x||p.x===m.x&&sectorContainsSector(m,p)))&&(m=p,tanMin=tan)}p=p.next}while(p!==stop);return m}(hole,outerNode);if(!bridge)return outerNode;const bridgeReverse=splitPolygon(bridge,hole);return filterPoints(bridgeReverse,bridgeReverse.next),filterPoints(bridge,bridge.next)}function sectorContainsSector(m,p){return area(m.prev,m,p.prev)<0&&area(p.next,m,m.next)<0}function zOrder(x,y,minX,minY,invSize){return(x=1431655765&((x=858993459&((x=252645135&((x=16711935&((x=(x-minX)*invSize|0)|x<<8))|x<<4))|x<<2))|x<<1))|(y=1431655765&((y=858993459&((y=252645135&((y=16711935&((y=(y-minY)*invSize|0)|y<<8))|y<<4))|y<<2))|y<<1))<<1}function getLeftmost(start){let p=start,leftmost=start;do{(p.x<leftmost.x||p.x===leftmost.x&&p.y<leftmost.y)&&(leftmost=p),p=p.next}while(p!==start);return leftmost}function pointInTriangle(ax,ay,bx,by,cx,cy,px,py){return(cx-px)*(ay-py)>=(ax-px)*(cy-py)&&(ax-px)*(by-py)>=(bx-px)*(ay-py)&&(bx-px)*(cy-py)>=(cx-px)*(by-py)}function pointInTriangleExceptFirst(ax,ay,bx,by,cx,cy,px,py){return!(ax===px&&ay===py)&&pointInTriangle(ax,ay,bx,by,cx,cy,px,py)}function isValidDiagonal(a,b){return a.next.i!==b.i&&a.prev.i!==b.i&&!function intersectsPolygon(a,b){let p=a;do{if(p.i!==a.i&&p.next.i!==a.i&&p.i!==b.i&&p.next.i!==b.i&&intersects(p,p.next,a,b))return!0;p=p.next}while(p!==a);return!1}(a,b)&&(locallyInside(a,b)&&locallyInside(b,a)&&function middleInside(a,b){let p=a,inside=!1;const px=(a.x+b.x)/2,py=(a.y+b.y)/2;do{p.y>py!=p.next.y>py&&p.next.y!==p.y&&px<(p.next.x-p.x)*(py-p.y)/(p.next.y-p.y)+p.x&&(inside=!inside),p=p.next}while(p!==a);return inside}(a,b)&&(area(a.prev,a,b.prev)||area(a,b.prev,b))||equals(a,b)&&area(a.prev,a,a.next)>0&&area(b.prev,b,b.next)>0)}function area(p,q,r){return(q.y-p.y)*(r.x-q.x)-(q.x-p.x)*(r.y-q.y)}function equals(p1,p2){return p1.x===p2.x&&p1.y===p2.y}function intersects(p1,q1,p2,q2){const o1=sign(area(p1,q1,p2)),o2=sign(area(p1,q1,q2)),o3=sign(area(p2,q2,p1)),o4=sign(area(p2,q2,q1));return o1!==o2&&o3!==o4||(!(0!==o1||!onSegment(p1,p2,q1))||(!(0!==o2||!onSegment(p1,q2,q1))||(!(0!==o3||!onSegment(p2,p1,q2))||!(0!==o4||!onSegment(p2,q1,q2)))))}function onSegment(p,q,r){return q.x<=Math.max(p.x,r.x)&&q.x>=Math.min(p.x,r.x)&&q.y<=Math.max(p.y,r.y)&&q.y>=Math.min(p.y,r.y)}function sign(num){return num>0?1:num<0?-1:0}function locallyInside(a,b){return area(a.prev,a,a.next)<0?area(a,b,a.next)>=0&&area(a,a.prev,b)>=0:area(a,b,a.prev)<0||area(a,a.next,b)<0}function splitPolygon(a,b){const a2=createNode(a.i,a.x,a.y),b2=createNode(b.i,b.x,b.y),an=a.next,bp=b.prev;return a.next=b,b.prev=a,a2.next=an,an.prev=a2,b2.next=a2,a2.prev=b2,bp.next=b2,b2.prev=bp,b2}function insertNode(i,x,y,last){const p=createNode(i,x,y);return last?(p.next=last.next,p.prev=last,last.next.prev=p,last.next=p):(p.prev=p,p.next=p),p}function removeNode(p){p.next.prev=p.prev,p.prev.next=p.next,p.prevZ&&(p.prevZ.nextZ=p.nextZ),p.nextZ&&(p.nextZ.prevZ=p.prevZ)}function createNode(i,x,y){return{i:i,x:x,y:y,prev:null,next:null,z:0,prevZ:null,nextZ:null,steiner:!1}}function unifyVertices(vertices,uvs,indices){const vertMap=new Map,verticesOut=[],uvsOut=[],indicesOut=[];for(let i=0;i<indices.length;i++){const idx=indices[i],vx=vertices[3*idx+0],vy=vertices[3*idx+1],vz=vertices[3*idx+2],ux=uvs[2*idx+0],uy=uvs[2*idx+1],key=`${vx},${vy},${vz}|${ux},${uy}`;if(vertMap.has(key))indicesOut.push(vertMap.get(key));else{const newIndex=verticesOut.length/3;vertMap.set(key,newIndex),verticesOut.push(vx,vy,vz),uvsOut.push(ux,uy),indicesOut.push(newIndex)}}return{vertices:verticesOut,uvs:uvsOut,indices:indicesOut}}function infoestrudi(shape,hshape,pts,options,sh){options||(options={}),pts||(pts=[]);let p0=options.p0||0,coeffbase1=Math.tan(options.coeffbase1*PIF||0),coeffbase2=Math.tan(options.coeffbase2*PIF||0),p1=hshape||options.p1||20,coefftop1=Math.tan(options.coefftop1*PIF||0),coefftop2=Math.tan(options.coefftop2*PIF||0),{mi:mi,ma:ma}=shape.pt.reduce(((t,e)=>(t.mi.x=Math.min(t.mi.x,e.x),t.mi.y=Math.min(t.mi.y,e.y),t.ma.x=Math.max(t.ma.x,e.x),t.ma.y=Math.max(t.ma.y,e.y),t)),{mi:{x:1e9,y:1e9},ma:{x:-1e9,y:-1e9}}),lmax=0,lmin=1e9;function getpars(p){p.z1=getzeta(p.x,p.y,p0,coeffbase1,coeffbase2,sh),p.z2=getzeta(p.x,p.y,p1,coefftop1,coefftop2,sh),p.l=Math.abs(p.z2-p.z1)}for(let p of pts)getpars(p);getpars(mi),getpars(ma);let rect=[{x:mi.x,y:mi.y},{x:ma.x,y:mi.y},{x:ma.x,y:ma.y},{x:mi.x,y:ma.y}];for(let r of rect)getpars(r),r.l>lmax&&(lmax=r.l),r.l<lmin&&(lmin=r.l);return{aini:options.coeffbase1||0,aini2:options.coeffbase2||0,afin:options.coefftop1||0,afin2:options.coefftop2||0,pts:pts,mi:mi,ma:ma,rect:rect,dimx:ma.x-mi.x,dimy:ma.y-mi.y,lnom:p1-p0,lmax:lmax,lmin:lmin,lmed:(lmax+lmin)/2}}function getzeta(x,y,zbase,cx,cy,sh,invert=!1){let z=x*cx+y*cy+zbase;if(sh){let t=sh.xfromy(-y,0,!0);invert?z-=t:z=t}return z}function sidegeomfromshapes(gcad,ky,s1,s2,invert=!1,stonda=!1){if(s1&&s2){if(s1.length!==s2.length)throw new Error("shapes with different length");if(s1.length<2)throw new Error("I percorsi devono contenere almeno due punti ciascuno.");if(!gcad.geo[ky]){const vertices=[],uvs=[],indices=[],np=s1.length,addpts=ss=>{for(const s of ss)vertices.push(s.x,s.y,s.z),uvs.push(s.u,s.v)},equalpos=(p1,p2)=>p1.x===p2.x&&p1.y===p2.y&&p1.z===p2.z,addindexquad=(i1,i2,i3,i4)=>{invert?indices.push(i1,i3,i2,i3,i4,i2):indices.push(i1,i2,i3,i3,i2,i4)};addpts(s1),addpts(s2);for(let i=0;i<np-1;i++){const j=i+1;equalpos(s1[i],s1[j])||addindexquad(i,j,i+np,j+np)}const geometry=new THREE.BufferGeometry;if(stonda){let tm=unifyVertices(vertices,uvs,indices);geometry.setAttribute("position",new THREE.Float32BufferAttribute(tm.vertices,3)),geometry.setAttribute("uv",new THREE.Float32BufferAttribute(tm.uvs,2)),geometry.setIndex(tm.indices)}else geometry.setAttribute("position",new THREE.Float32BufferAttribute(vertices,3)),geometry.setAttribute("uv",new THREE.Float32BufferAttribute(uvs,2)),geometry.setIndex(indices);geometry.computeVertexNormals(),gcad.geo[ky]=geometry}return gcad.geo[ky]}}function bottomgeomfromshape(gcad,inverti,outer,holes,c=0,a=0,b=0,shape=null,stonda=!1){let ky=`bg:${c}|${a}${b}|${outer.key}|${inverti}|${shape?.key||""}`;for(let h of holes)ky=`${ky}|${h.key}`;if(ky=hash(ky),!gcad.geo[ky]){let triangles,pos=[],hl=[],cc=outer.pt.length;pos=outer.vec;const geometry=new THREE.BufferGeometry,vertices=[],uvs=[],indices=[];function addvertexes(triangles,pos){let i0=vertices.length/3;for(let i=0;i<triangles.length;i++){const index=triangles[i],x=pos[2*index],y=-pos[2*index+1],z=getzeta(x,y,c,a,b,shape,inverti);vertices.push(x,y,z),uvs.push(y,x)}for(let i=0;i<triangles.length;i+=3)inverti?indices.push(i+i0,i+i0+2,i+i0+1):indices.push(i+i0,i+i0+1,i+i0+2)}if(shape){let cl2=outer.sliceony(shape);for(let c of cl2){let x=c.flatMap((p=>[p.x,p.y]));addvertexes(earcut(x,[]),x)}}else if(Array.isArray(holes)&&holes.length){for(let h of holes)hl.push(cc),cc+=h.pt.length,pos=[...pos,...h.vec];triangles=earcut(pos,hl),addvertexes(triangles,pos)}else triangles=earcut(pos),addvertexes(triangles,pos);if(stonda){let tm=unifyVertices(vertices,uvs,indices);geometry.setAttribute("position",new THREE.Float32BufferAttribute(tm.vertices,3)),geometry.setAttribute("uv",new THREE.Float32BufferAttribute(tm.uvs,2)),geometry.setIndex(tm.indices)}else geometry.setAttribute("position",new THREE.Float32BufferAttribute(vertices,3)),geometry.setAttribute("uv",new THREE.Float32BufferAttribute(uvs,2)),geometry.setIndex(indices);geometry.computeVertexNormals(),gcad.geo[ky]=geometry}return gcad.geo[ky]}function estrusorotate(orientamento,mesh,z=0){switch(orientamento.trim().toUpperCase().slice(0,1)){case"A":mesh.rotation.x=-Math.PI/2;break;case"L":mesh.rotation.y=Math.PI/2,mesh.rotation.z=Math.PI;break;case"P":mesh.rotation.z=Math.PI/2}return mesh}
645
645
  /**
646
646
  * Crea una geometria estrusa con opzioni avanzate
647
647
  * @param {string} orient - Orientamento dell'estrusione
@@ -1091,11 +1091,11 @@ constructor(data,position,debugMessage){this.data=data,this.offset=position,this
1091
1091
  *
1092
1092
  * @method readString
1093
1093
  * @return {String} Data read from the dataview.
1094
- */readString(){let s="",c=this.readByte();for(;c;)s+=String.fromCharCode(c),c=this.readByte();return s}}const M3DMAGIC=19789,MLIBMAGIC=15786,CMAGIC=49725,M3D_VERSION=2,COLOR_F=16,COLOR_24=17,LIN_COLOR_24=18,LIN_COLOR_F=19,INT_PERCENTAGE=48,FLOAT_PERCENTAGE=49,MDATA=15677,MESH_VERSION=15678,MASTER_SCALE=256,MAT_ENTRY=45055,MAT_NAME=40960,MAT_AMBIENT=40976,MAT_DIFFUSE=40992,MAT_SPECULAR=41008,MAT_SHININESS=41024,MAT_TRANSPARENCY=41040,MAT_TWO_SIDE=41089,MAT_ADDITIVE=41091,MAT_WIRE=41093,MAT_WIRE_SIZE=41095,MAT_TEXMAP=41472,MAT_OPACMAP=41488,MAT_BUMPMAP=41520,MAT_SPECMAP=41476,MAT_MAPNAME=41728,MAT_MAP_USCALE=41812,MAT_MAP_VSCALE=41814,MAT_MAP_UOFFSET=41816,MAT_MAP_VOFFSET=41818,NAMED_OBJECT=16384,N_TRI_OBJECT=16640,POINT_ARRAY=16656,FACE_ARRAY=16672,MSH_MAT_GROUP=16688,TEX_VERTS=16704,MESH_MATRIX=16736,to_std=(mat,cache)=>{if(!mat||"MeshPhongMaterial"!==mat.type)return mat;if(cache){const c=cache.get(mat);if(c)return c}const rough=1-("number"==typeof mat.shininess?Math.min(Math.max(mat.shininess,0),100):30)/100,std=new THREE.MeshStandardMaterial({name:mat.name,color:mat.color,map:mat.map,normalMap:mat.normalMap,emissive:mat.emissive,emissiveMap:mat.emissiveMap,envMap:mat.envMap,envMapIntensity:mat.envMapIntensity??1,lightMap:mat.lightMap,lightMapIntensity:mat.lightMapIntensity,alphaTest:mat.alphaTest,depthWrite:mat.depthWrite,depthTest:mat.depthTest,wireframe:mat.wireframe,transparent:mat.transparent,opacity:mat.opacity,side:mat.side,roughness:rough,metalness:0});return cache&&cache.set(mat,std),"function"==typeof mat.dispose&&(mat.dispose(),mat.userData=mat.userData||{},mat.userData._replaced=!0),std.needsUpdate=!0,std};function newgcad(P,_cat,islog=!0){let _movs={},_textures={},_meshes={},_geometries={},_cachefn={};const textureCache=new Map;let _smats={},_scripts={},_loadertex=new THREE.TextureLoader,_loaderGLTF=new GLTFLoader,_loader3DS=new TDSLoader;const dracoLoader=new DRACOLoader;dracoLoader.setDecoderPath("https://www.gstatic.com/draco/versioned/decoders/1.5.6/"),_loaderGLTF.setDRACOLoader(dracoLoader);const ktx2Loader=new KTX2Loader;ktx2Loader.setTranscoderPath("https://unpkg.com/three@0.159.0/examples/jsm/libs/basis/"),_loaderGLTF.setKTX2Loader(ktx2Loader),_loaderGLTF.setMeshoptDecoder(MeshoptDecoder);let cats=[_cat],getcat=()=>cats[cats.length-1],_gmatricole={};
1094
+ */readString(){let s="",c=this.readByte();for(;c;)s+=String.fromCharCode(c),c=this.readByte();return s}}const M3DMAGIC=19789,MLIBMAGIC=15786,CMAGIC=49725,M3D_VERSION=2,COLOR_F=16,COLOR_24=17,LIN_COLOR_24=18,LIN_COLOR_F=19,INT_PERCENTAGE=48,FLOAT_PERCENTAGE=49,MDATA=15677,MESH_VERSION=15678,MASTER_SCALE=256,MAT_ENTRY=45055,MAT_NAME=40960,MAT_AMBIENT=40976,MAT_DIFFUSE=40992,MAT_SPECULAR=41008,MAT_SHININESS=41024,MAT_TRANSPARENCY=41040,MAT_TWO_SIDE=41089,MAT_ADDITIVE=41091,MAT_WIRE=41093,MAT_WIRE_SIZE=41095,MAT_TEXMAP=41472,MAT_OPACMAP=41488,MAT_BUMPMAP=41520,MAT_SPECMAP=41476,MAT_MAPNAME=41728,MAT_MAP_USCALE=41812,MAT_MAP_VSCALE=41814,MAT_MAP_UOFFSET=41816,MAT_MAP_VOFFSET=41818,NAMED_OBJECT=16384,N_TRI_OBJECT=16640,POINT_ARRAY=16656,FACE_ARRAY=16672,MSH_MAT_GROUP=16688,TEX_VERTS=16704,MESH_MATRIX=16736;const to_std=(mat,cache)=>{if(!mat||"MeshPhongMaterial"!==mat.type)return mat;if(cache){const c=cache.get(mat);if(c)return c}const rough=1-("number"==typeof mat.shininess?Math.min(Math.max(mat.shininess,0),100):30)/100,std=new THREE.MeshStandardMaterial({name:mat.name,color:mat.color,map:mat.map,normalMap:mat.normalMap,emissive:mat.emissive,emissiveMap:mat.emissiveMap,envMap:mat.envMap,envMapIntensity:mat.envMapIntensity??1,lightMap:mat.lightMap,lightMapIntensity:mat.lightMapIntensity,alphaTest:mat.alphaTest,depthWrite:mat.depthWrite,depthTest:mat.depthTest,wireframe:mat.wireframe,transparent:mat.transparent,opacity:mat.opacity,side:mat.side,roughness:rough,metalness:0});return cache&&cache.set(mat,std),"function"==typeof mat.dispose&&(mat.dispose(),mat.userData=mat.userData||{},mat.userData._replaced=!0),std.needsUpdate=!0,std};function newgcad(P,_cat,islog=!0){let _movs={},_textures={},_meshes={},_geometries={},_cachefn={};const textureCache=new Map;let _smats={},_scripts={},_loadertex=new THREE.TextureLoader,_loaderGLTF=new GLTFLoader,_loader3DS=new TDSLoader;const dracoLoader=new DRACOLoader;dracoLoader.setDecoderPath("https://www.gstatic.com/draco/versioned/decoders/1.5.6/"),_loaderGLTF.setDRACOLoader(dracoLoader);const ktx2Loader=new KTX2Loader;ktx2Loader.setTranscoderPath("https://unpkg.com/three@0.159.0/examples/jsm/libs/basis/"),_loaderGLTF.setKTX2Loader(ktx2Loader),_loaderGLTF.setMeshoptDecoder(MeshoptDecoder);let cats=[_cat],getcat=()=>cats[cats.length-1],_gmatricole={};
1095
1095
  /**
1096
1096
  * Libera tutte le risorse caricate
1097
1097
  */
1098
- async function clearmat(){for(const key in _textures)if(_textures[key]){const texture=await _textures[key];texture?.dispose()}for(const key in _smats)_smats[key]&&_smats[key]?.dispose();for(const[key,texOrPromise]of textureCache.entries()){const texture=texOrPromise instanceof Promise?await texOrPromise:texOrPromise;texture?.dispose&&texture.dispose()}textureCache.clear(),_textures={},_smats={}}return{clearmatricole:()=>{_gmatricole={}},islog:islog,clear:async function clear(){function destroymesh(mesh){function disposeMaterial(material){material.map&&material.map.dispose(),material.lightMap&&material.lightMap.dispose(),material.bumpMap&&material.bumpMap.dispose(),material.normalMap&&material.normalMap.dispose(),material.specularMap&&material.specularMap.dispose(),material.dispose()}mesh&&mesh.traverse((child=>{child.isMesh&&(child.geometry.dispose(),child.material&&(Array.isArray(child.material)?child.material.forEach(disposeMaterial):disposeMaterial(child.material)))}))}_gmatricole={},_cachefn={},THREE.Cache.clear();for(const c in _geometries)_geometries[c]?.dispose();for(const key in _meshes)if(_meshes[key]){destroymesh(await _meshes[key])}await clearmat(),_movs={},_textures={},_meshes={},_geometries={},_smats={},_scripts={}},clearmat:clearmat,getScript:async function getScript(file){file.endsWith(".custom")?file=file.slice(0,-7):file.endsWith(".js")&&(file=file.slice(0,-3));let key=hash(`${getcat()}|${file}`);if(!_scripts[key]){let script;try{script=await P.fetch("mufiles/customfn",{id:getcat(),name:file,ispar:1})}catch(error){script=`log('undefined ${getcat()}/${file}: ${error.message}');`}_scripts[key]=script}return _scripts[key]},checkScripts:async function checkScripts(files){let cl=[];if(!files||!Array.isArray(files))return;let ct=getcat();files=[...files,"_ricalcolatop","_ricalcolaaltri","_ricalcolalinee"];for(let f of files){let key=hash(`${ct}|${f}`);_scripts[key]||cl.push(f)}if(cl?.length){let scripts=await P.fetch("mufiles/customfn",{id:ct,name:cl,ispar:1});if(scripts)for(let s of scripts){let key=hash(`${ct}|${s.n}`);_scripts[key]=s.v}}},get loaderGLTF(){return _loaderGLTF},get gmats(){return _gmatricole},scripts:()=>Object.keys(_scripts),get geo(){return _geometries},get movs(){return _movs},get textures(){return _textures},get smats(){return _smats},get meshes(){return _meshes},get cacheFns(){return _cachefn},dump(){console.log(`SMATS:\n${Object.keys(_smats).join(" - ")};\nGEOMS:\n${Object.keys(_geometries).join(" - ")};\nTEX:\n${Object.keys(_textures).join(" - ")};\nMESH:\n${Object.keys(_meshes).join(" - ")};\n`)},get cat(){return getcat()},pushcat(cat){cats.push(cat)},popcat:()=>(cats.length>1&&cats.length--,getcat()),async tex(file,sx=1,sy,rot){sy||(sy=sx),rot||(rot=0);const key=hash(`${getcat()}|${file}|${sx}|${sy}|${rot}`);return _textures[key]||(_textures[key]=new Promise(((resolve,reject)=>{let url;if(file.startsWith("https://"))url=file;else if(P._cdn)if(file.includes("/")){let v=file.split("/");url=`${P._cdn}${v[0]}/textures/${v[1]}`}else url=`${P._cdn}${getcat()}/textures/${file}`;else url=P.fullget("mufiles/getfile",{id:getcat(),subfolder:"textures",name:file,force:1});if(textureCache.has(url)){const tex=textureCache.get(url).clone();return tex.wrapS=THREE.RepeatWrapping,tex.wrapT=THREE.RepeatWrapping,tex.repeat.set(.001*sx,.001*sy),tex.rotation=rot,tex.colorSpace=THREE.SRGBColorSpace,void resolve(tex)}_loadertex.load(url,(tex=>{textureCache.set(url,tex),tex.wrapS=THREE.RepeatWrapping,tex.wrapT=THREE.RepeatWrapping,tex.repeat.set(.001*sx,.001*sy),tex.rotation=rot,resolve(tex)}),void 0,(error=>{console.log(`Manca Texture ${file}!. questo rallenta molto il processo`),delete _textures[key],resolve(void 0)}))}))),_textures[key]},async get3ds(file){file.endsWith(".3ds")&&(file=file.slice(0,-4));const key=hash(`${getcat()}|${file}.3ds`);return _meshes[key]||(_meshes[key]=await new Promise(((resolve,reject)=>{let url,urlt="";file.startsWith("https://")?(url=`${file}.3ds`,urlt=url):P._cdn?(url=`${P._cdn}${getcat()}/3d/${file}.3ds`,urlt=`${P._cdn}${getcat()}/3d/${file}/`):(url=P.fullget("mufiles/getfile",{id:getcat(),subfolder:"3d",name:file,ext:".3ds"}),urlt=url+"&tex="),_loader3DS.setResourcePath(urlt),_loader3DS.load(url,(object=>{const cache=new WeakMap;object.traverse((n=>{n.isMesh&&n.material&&(n.material=Array.isArray(n.material)?n.material.map((e=>to_std(e,cache))):to_std(n.material,cache))})),object.userData||(object.userData={}),object.userData._ky=key,resolve(object)}),void 0,(error=>{console.log(error),delete _meshes[key],resolve(void 0)}))}))),_meshes[key]},async getglb(file){const ext=".glb";file.endsWith(ext)&&(file=file.slice(0,-4)),file.startsWith("https://")||(file=file.replace(/\//g,"+"));let elemento=(file=file.split("+"))[1];file=file[0];const key=hash(`${getcat()}|${file}${ext}`);_meshes[key]||(_meshes[key]=await new Promise(((resolve,reject)=>{let url;url=file.startsWith("https://")?`${file}.glb`:P._cdn?`${P._cdn}${getcat()}/3d/${file}.glb`:P.fullget("mufiles/getfile",{id:getcat(),subfolder:"3d",name:file,ext:ext}),_loaderGLTF.setPath(""),_loaderGLTF.setResourcePath((resource=>(console.log("risorsa",resource),`${url}&tex=${resource}`))),_loaderGLTF.load(url,(async gltf=>{const object=gltf.scene;object.userData||(object.userData={}),object.userData._ky=key,resolve(object)}),void 0,(error=>{console.log(error),delete _meshes[key],resolve(void 0)}))})));let tm=_meshes[key];if(elemento){let n=tm?.getObjectByName(elemento);n&&(tm=n)}return tm},replacemats(bb,mats,callback){if(!Array.isArray(mats)||0==mats.length)return bb;const leggi_slot=mat=>{if(!mat)return-1;let s=(mat?.map?.name||mat?.name||mat?.map?.userData?.name||"").toString().trim();if(callback){const s1=callback(s);void 0!==s1&&(s=s1)}if(s.includes("_")&&(s=s.split("_").pop()),!s)return-1;const n=parseInt(s,10);return n>=1&&n<=9?n:-1};let serve_clone=!1,ky=String(bb.userData?._ky||"");if(bb.traverse((n=>{if(!n.isMesh)return;const ms=Array.isArray(n.material)?n.material:[n.material];for(const m of ms){const k=leggi_slot(m);k>0&&mats[k-1]&&(serve_clone=!0,ky+="|"+(mats[k-1].name||mats[k-1].uuid))}})),serve_clone){if(ky=hash(ky),_meshes[ky])return _meshes[ky];const cc=bb.clone(!0);cc.traverse((n=>{if(n.isMesh)if(Array.isArray(n.material))n.material=n.material.map((m=>{if(!m)return m;const k=leggi_slot(m);if(k>0&&mats[k-1]){const t=mats[k-1];return t.needsUpdate=!0,t}return m}));else{const m=n.material,k=leggi_slot(m);n.material=k>0&&mats[k-1]?(mats[k-1].needsUpdate=!0,mats[k-1]):m}})),cc.userData=cc.userData||{},cc.userData._ky=ky,_meshes[ky]=cc,bb=cc}return bb}}}const originalMaterials=new Map;
1098
+ async function clearmat(){for(const key in _textures)if(_textures[key]){const texture=await _textures[key];texture?.dispose()}for(const key in _smats)_smats[key]&&_smats[key]?.dispose();for(const[key,texOrPromise]of textureCache.entries()){const texture=texOrPromise instanceof Promise?await texOrPromise:texOrPromise;texture?.dispose&&texture.dispose()}textureCache.clear(),_textures={},_smats={}}return{clearmatricole:()=>{_gmatricole={}},islog:islog,clear:async function clear(){function destroymesh(mesh){function disposeMaterial(material){material.map&&material.map.dispose(),material.lightMap&&material.lightMap.dispose(),material.bumpMap&&material.bumpMap.dispose(),material.normalMap&&material.normalMap.dispose(),material.specularMap&&material.specularMap.dispose(),material.dispose()}mesh&&mesh.traverse((child=>{child.isMesh&&(child.geometry.dispose(),child.material&&(Array.isArray(child.material)?child.material.forEach(disposeMaterial):disposeMaterial(child.material)))}))}_gmatricole={},_cachefn={},THREE.Cache.clear();for(const c in _geometries)_geometries[c]?.dispose();for(const key in _meshes)if(_meshes[key]){destroymesh(await _meshes[key])}await clearmat(),_movs={},_textures={},_meshes={},_geometries={},_smats={},_scripts={}},clearmat:clearmat,getScript:async function getScript(file){file.endsWith(".custom")?file=file.slice(0,-7):file.endsWith(".js")&&(file=file.slice(0,-3));let key=hash(`${getcat()}|${file}`);if(!_scripts[key]){let script;try{script=await P.fetch("mufiles/customfn",{id:getcat(),name:file,ispar:1})}catch(error){script=`log('undefined ${getcat()}/${file}: ${error.message}');`}_scripts[key]=script}return _scripts[key]},checkScripts:async function checkScripts(files){let cl=[];if(!files||!Array.isArray(files))return;let ct=getcat();files=[...files,"_ricalcolatop","_ricalcolaaltri","_ricalcolalinee"];for(let f of files){let key=hash(`${ct}|${f}`);_scripts[key]||cl.push(f)}if(cl?.length){let scripts=await P.fetch("mufiles/customfn",{id:ct,name:cl,ispar:1});if(scripts)for(let s of scripts){let key=hash(`${ct}|${s.n}`);_scripts[key]=s.v}}},get loaderGLTF(){return _loaderGLTF},get gmats(){return _gmatricole},scripts:()=>Object.keys(_scripts),get geo(){return _geometries},get movs(){return _movs},get textures(){return _textures},get smats(){return _smats},get meshes(){return _meshes},get cacheFns(){return _cachefn},dump(){console.log(`SMATS:\n${Object.keys(_smats).join(" - ")};\nGEOMS:\n${Object.keys(_geometries).join(" - ")};\nTEX:\n${Object.keys(_textures).join(" - ")};\nMESH:\n${Object.keys(_meshes).join(" - ")};\n`)},get cat(){return getcat()},pushcat(cat){cats.push(cat)},popcat:()=>(cats.length>1&&cats.length--,getcat()),async tex(file,sx=1,sy,rot){if(sy||(sy=sx),rot||(rot=0),"__alpha"==file)return key=file,_textures[key]||(_textures[key]=function getfortransparent(){const texture=new THREE.CanvasTexture(function generateTexture(){const canvas=document.createElement("canvas");canvas.width=2,canvas.height=2;const context=canvas.getContext("2d");return context.fillStyle="white",context.fillRect(0,1,2,1),canvas}());return texture.magFilter=THREE.NearestFilter,texture.wrapT=THREE.RepeatWrapping,texture.wrapS=THREE.RepeatWrapping,texture.repeat.set(1,3.5),texture}()),_textures[key];const key=hash(`${getcat()}|${file}|${sx}|${sy}|${rot}`);return _textures[key]||(_textures[key]=new Promise(((resolve,reject)=>{let url;if(file.startsWith("https://"))url=file;else if(P._cdn)if(file.includes("/")){let v=file.split("/");url=`${P._cdn}${v[0]}/textures/${v[1]}`}else url=`${P._cdn}${getcat()}/textures/${file}`;else url=P.fullget("mufiles/getfile",{id:getcat(),subfolder:"textures",name:file,force:1});if(textureCache.has(url)){const tex=textureCache.get(url).clone();return tex.wrapS=THREE.RepeatWrapping,tex.wrapT=THREE.RepeatWrapping,tex.repeat.set(.001*sx,.001*sy),tex.rotation=rot,tex.colorSpace=THREE.SRGBColorSpace,void resolve(tex)}_loadertex.load(url,(tex=>{textureCache.set(url,tex),tex.wrapS=THREE.RepeatWrapping,tex.wrapT=THREE.RepeatWrapping,tex.repeat.set(.001*sx,.001*sy),tex.rotation=rot,resolve(tex)}),void 0,(error=>{console.log(`Manca Texture ${file}!. questo rallenta molto il processo`),delete _textures[key],resolve(void 0)}))}))),_textures[key]},async get3ds(file){file.endsWith(".3ds")&&(file=file.slice(0,-4));const key=hash(`${getcat()}|${file}.3ds`);return _meshes[key]||(_meshes[key]=await new Promise(((resolve,reject)=>{let url,urlt="";file.startsWith("https://")?(url=`${file}.3ds`,urlt=url):P._cdn?(url=`${P._cdn}${getcat()}/3d/${file}.3ds`,urlt=`${P._cdn}${getcat()}/3d/${file}/`):(url=P.fullget("mufiles/getfile",{id:getcat(),subfolder:"3d",name:file,ext:".3ds"}),urlt=url+"&tex="),_loader3DS.setResourcePath(urlt),_loader3DS.load(url,(object=>{const cache=new WeakMap;object.traverse((n=>{n.isMesh&&n.material&&(n.material=Array.isArray(n.material)?n.material.map((e=>to_std(e,cache))):to_std(n.material,cache))})),object.userData||(object.userData={}),object.userData._ky=key,resolve(object)}),void 0,(error=>{console.log(error),delete _meshes[key],resolve(void 0)}))}))),_meshes[key]},async getglb(file){const ext=".glb";file.endsWith(ext)&&(file=file.slice(0,-4)),file.startsWith("https://")||(file=file.replace(/\//g,"+"));let elemento=(file=file.split("+"))[1];file=file[0];const key=hash(`${getcat()}|${file}${ext}`);_meshes[key]||(_meshes[key]=await new Promise(((resolve,reject)=>{let url;url=file.startsWith("https://")?`${file}.glb`:P._cdn?`${P._cdn}${getcat()}/3d/${file}.glb`:P.fullget("mufiles/getfile",{id:getcat(),subfolder:"3d",name:file,ext:ext}),_loaderGLTF.setPath(""),_loaderGLTF.setResourcePath((resource=>(console.log("risorsa",resource),`${url}&tex=${resource}`))),_loaderGLTF.load(url,(async gltf=>{const object=gltf.scene;object.userData||(object.userData={}),object.userData._ky=key,resolve(object)}),void 0,(error=>{console.log(error),delete _meshes[key],resolve(void 0)}))})));let tm=_meshes[key];if(elemento){let n=tm?.getObjectByName(elemento);n&&(tm=n)}return tm},replacemats(bb,mats,callback){if(!Array.isArray(mats)||0==mats.length)return bb;const leggi_slot=mat=>{if(!mat)return-1;let s=(mat?.map?.name||mat?.name||mat?.map?.userData?.name||"").toString().trim();if(callback){const s1=callback(s);void 0!==s1&&(s=s1)}if(s.includes("_")&&(s=s.split("_").pop()),!s)return-1;const n=parseInt(s,10);return n>=1&&n<=9?n:-1};let serve_clone=!1,ky=String(bb.userData?._ky||"");if(bb.traverse((n=>{if(!n.isMesh)return;const ms=Array.isArray(n.material)?n.material:[n.material];for(const m of ms){const k=leggi_slot(m);k>0&&mats[k-1]&&(serve_clone=!0,ky+="|"+(mats[k-1].name||mats[k-1].uuid))}})),serve_clone){if(ky=hash(ky),_meshes[ky])return _meshes[ky];const cc=bb.clone(!0);cc.traverse((n=>{if(n.isMesh)if(Array.isArray(n.material))n.material=n.material.map((m=>{if(!m)return m;const k=leggi_slot(m);if(k>0&&mats[k-1]){const t=mats[k-1];return t.needsUpdate=!0,t}return m}));else{const m=n.material,k=leggi_slot(m);n.material=k>0&&mats[k-1]?(mats[k-1].needsUpdate=!0,mats[k-1]):m}})),cc.userData=cc.userData||{},cc.userData._ky=ky,_meshes[ky]=cc,bb=cc}return bb}}}const originalMaterials=new Map;
1099
1099
  /**
1100
1100
  * Salva i materiali originali di tutti i mesh nel gruppo (solo layer <= 20)
1101
1101
  * @param {THREE.Object3D} gruppo
package/bin/marked.js CHANGED
@@ -18,4 +18,4 @@ inline.gfm=merge({},inline.normal,{escape:replace(inline.escape)("])","~|])")(),
18
18
  /**
19
19
  * GFM + Line Breaks Inline Grammar
20
20
  */
21
- inline.breaks=merge({},inline.gfm,{br:replace(inline.br)("{2,}","*")(),text:replace(inline.gfm.text)("{2,}","*")()});const basealias={s:"subtitle",k:"keywords",g:"gruppo",e:"editore",y:"datapub",d:"datapub",p:"priority",a:"autore",u:"base",t:"title",l:"link",i:"img","#":"title"};const aliasInfo=new class AliasInfo{constructor(){this.alias=JSON.parse(JSON.stringify(basealias)),this.check()}check(){let rr=new Set,checkr=x=>{x&&x.length>2&&!rr.has(x)&&rr.add(x)};for(let x in this.alias)this.alias[x]?(checkr(x),checkr(this.alias[x])):delete this.alias[x];this.retoalias=function retroalias(alias){let retro={};for(let x in alias)alias[x]&&(retro[alias[x]]=x);return retro}(this.alias),rr=[...rr],rr=`^\\s*\\:(${rr.join("|")}|\\w{1,2})\\:(.*)$`,this.regex=rr}add(sigla,valore){return sigla&&(this.alias[sigla]=valore,this.check()),this}removeAll(){return this.alias={},this.check(),this}setmappa(mappa){this.alias={};for(let x in mappa)this.alias[x]=mappa[x];this.alias["#"]||(this.alias["#"]="title"),this.check()}parse(data,info,mappa){mappa&&this.setmappa();let xx=data,res={};info&&(res=Object.assign(res,info),res.info=!0);let rr=/^\s*#\s+(.*?)\s*$/im.exec(xx);rr&&(res[this.alias["#"]]=rr[1].toLowerCase());for(let i=0;i<20;i++){let rr=/:::(.*)([^]+?):::/im.exec(xx);if(!rr)break;{let id=rr[1];id||(id=i+""),res.comments||(res.comments=[]),res.comments.push({k:id,v:rr[2]}),xx=xx.substr(rr.index+rr[0].length)}}xx=data;let regex=new RegExp(this.regex,"im");for(let i=0;i<50;i++){let rr=regex.exec(xx);if(!(rr&&rr.length>=2))break;{xx=xx.substr(rr.index+rr[0].length),res.info=!0;let rr2=(rr[2]||"").trim(),oname=this.alias[rr[1].toLowerCase()];oname||(oname=rr[1].toLowerCase()),"l"==oname||"link"==oname?(res[oname]||(res[oname]=[]),res[oname].push(rr2)):res[oname]=rr2}}return res}};var tokenize=(src,easylen,noheader=!1)=>{function _parsetable(tokens,src){let v2,tb={type:"table",headers:[],align:[],cells:[],cols:0},vv=src.split("\n"),fl=!1;function checkcols(cols){if(tb.cols<cols){for(let i=tb.cols;i<cols;i++){tb.align[i]="left",tb.headers[i]=[];for(let r of tb.cells)r[i]=[]}tb.cols=cols}}for(let v1 of vv)if(v1=v1.trim(),v1.length)if(v1.length>2&&v1.startsWith("|")&&v1.endsWith("|")&&(v1=v1.slice(1,-1)),v2=v1.split("|"),checkcols(v2.length),0==fl&&/^[- :]+\|[- :|]*$/im.test(v1)){for(let i=0;i<v2.length;i++){let v=v2[i],x1=v.slice(0,1),x2=v.slice(-1);tb.align[i]=":"==x1&&":"==x2?"center":":"==x2?"right":"left"}fl=!0}else{let r=[];for(let i=0;i<v2.length;i++){let v=v2[i];if(fl){let t=[];_tokenize(t,v,!1),r.push(t)}else _tokenize(tb.headers[i],v,!1)}fl&&tb.cells.push(r)}tokens.push(tb)}function _pushtoken(tokens,src){let cc=/^([\d.]+)\s*/.exec(src),num="",title="";cc&&(num=cc[1],src=src.substring(cc.index+cc[0].length)),cc=/^([\w\s]*?):.*$/gim.exec(src),cc&&(title=cc[1],src=src.substring(cc.index+cc[1].length)),tokens.push({type:"list_item_start",num:num}),title&&(tokens.push({type:"list_title_start"}),_tokenize(tokens,title,!1),tokens.push({type:"list_title_end"})),src=src.replace(/\n +/gim,"<br>"),_tokenize(tokens,src,!1),tokens.push({type:"list_item_end"})}function _parselista(tokens,ordered,space,src){let counter=[space];for(tokens.push({type:"list_start",ordered:ordered});;){let cap=/^( *)([*\-+])[\s$]/im.exec(src);if(!cap){_pushtoken(tokens,src);break}{cap.index&&_pushtoken(tokens,src.substring(0,cap.index));let sl=cap[1].length;if(sl>counter[counter.length-1])tokens.push({type:"list_start",ordered:ordered}),counter.push(sl);else for(;;){let sp=counter[counter.length-1];if(1==counter.length||sp<=sl)break;tokens.push({type:"list_end"}),counter.pop()}src=src.substring(cap.index+cap[0].length)}}for(let c of counter)tokens.push({type:"list_end"})}const _tokenize=(tokens,src,top,bq)=>{let cap;for(src=src.replace(/^ +$/gm,"");src;){if(easylen){let ll=0;for(let t of tokens)t.text||t.html?ll=ll+t.text.length+2:ll+=3;if(ll>easylen)break}if((cap=rules.newline.exec(src))&&(src=src.substring(cap[0].length),cap[0].length>1&&tokens.push({type:"space"})),cap=rules.formula.exec(src))src=src.substring(cap[0].length),tokens.push({type:"code",lang:"math",text:cap[2]||""});else if(cap=/^(\s*`{3})(.*)([^]+?)(`{3})/gim.exec(src)){cap.index>0&&_tokenize(tokens,src.substring(0,cap.index),top);let txt=(cap[3]||"").replace(/^\n/,"").replace(/\n+$/,"");tokens.push({type:"code",lang:cap[2],text:txt}),src=src.substring(cap.index+cap[0].length)}else if(cap=rules.heading.exec(src))src=src.substring(cap[0].length),tokens.push({type:"heading",depth:cap[1].length,text:cap[2]});else if(top&&(cap=/^(.*?\|.*\n[-: ]+\|[-| :]*\n.*?\|[^]*?)\n\n/gim.exec(src)))cap.index>0&&_tokenize(tokens,src.substring(0,cap.index),top),_parsetable(tokens,cap[1]),src=src.substring(cap.index+cap[0].length);else if(top&&(cap=/^\|.*\|\s*(?:\n\|.*\|)+/gim.exec(src)))cap.index>0&&_tokenize(tokens,src.substring(0,cap.index),top),_parsetable(tokens,cap[0]),src=src.substring(cap.index+cap[0].length);else if(cap=rules.lheading.exec(src))src=src.substring(cap[0].length),tokens.push({type:"heading",depth:"="===cap[2]?1:2,text:cap[1]});else if(cap=rules.hr.exec(src))src=src.substring(cap[0].length),tokens.push({type:"hr"});else if(cap=rules.blockquote.exec(src))src=src.substring(cap[0].length),tokens.push({type:"blockquote_start"}),_tokenize(tokens,cap[0].replace(/^ *> ?/gm,""),top,!0),tokens.push({type:"blockquote_end"});else if(cap=/^[\s-:]*?\|[\s-:|]*/im.exec(src),cap||!(cap=/^( *)([*\-+])[\s$]/im.exec(src))){if(cap=rules.html.exec(src))src=src.substring(cap[0].length),tokens.push({type:"html",pre:"pre"===cap[1]||"script"===cap[1]||"style"===cap[1],text:cap[0]});else if(!bq&&top&&(cap=rules.def.exec(src)))src=src.substring(cap[0].length),tokens.push({type:"code",text:`??${cap[0]}??${rules.def}??`});else if(top&&(cap=rules.paragraph.exec(src)))src=src.substring(cap[0].length),tokens.push({type:"paragraph",text:"\n"===cap[1].charAt(cap[1].length-1)?cap[1].slice(0,-1):cap[1]});else if(cap=rules.text.exec(src))src=src.substring(cap[0].length),tokens.push({type:"text",text:cap[0]});else if(src)throw new Error("Infinite loop on byte: "+src.charCodeAt(0))}else{cap.index>0&&_tokenize(tokens,src.substring(0,cap.index)),src=src.substring(cap.index+cap[0].length);let res=/([^]*?)(\n\n|\n\s*[#>])/im.exec(src+"\n\n");if(res){_parselista(tokens,"*"==cap[2],cap[1].length,res[1]),src=src.substring(res[1].length)}else tokens.push({type:"text??",text:cap[0]})}}return tokens};let rules=block.tables;return src=function removeInfo(src,title=!1){let tm=src.replace(/:::([^]+?):::/gim,"").replace(new RegExp(aliasInfo.regex,"gim"),"").replace(/^\s*#\s+/im,"# ").replace(/\r\n|\r/g,"\n").replace(/\t/g," ").replace(/\u00a0/g," ").replace(/\u2424/g,"\n");if(title){const rg=/(^\s*#\s+(.*)?\s*)$/im;let rr=rg.exec(tm);rr&&0==rr.index&&(tm=tm.replace(rg,""))}return tm}(src,noheader),_tokenize([],src,!0)};const controls={string:/(".*?[^\\]"|'.*?[^\\]'|`[^]*?[^\\]`|""|''|``)/m,puntuaction:/(-[-=]?|,|;|\+[+=]?|!=?=?|<<?=?|>>?>?=?|=(?:==?|>)?|&[&=]?|\|[|=]?|\*\*?=?|\/=?|~|\^=?|%=?|\?|\.{3})/g,parentesis:/(\(|\)|\[|\]|\{|\})/g,ingraffe:/([^$])(\{)(.*?)(\})/g,regex:/\/.*?[^\\]\/[gimu]*/m,numbers:/\b((?:(?:0[xX][\dA-Fa-f]+|0[bB][01]+|0[oO][0-7]+)n?|\d+n|NaN|Infinity)\b|(?:\b\d+\.?\d*|\B\.\d+)(?:[Ee][+-]?\d+)?)/gi,js:{comments:/(?:(?:^|[^\\:])(\/\/.*)|(?:^|[^\\])(\/\*[\s\S]*?(?:\*\/)))/m,keyword:/(\b)(import|require|endif|include|define|float|int|real|char|bool|as|true|false|async|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|var|void|while|with|yield)(\b)/g,keyword2:/(\.\w+|\w+:)/g},json:{string:/(".*?[^\\]")/m,string1:/(".*?[^\\]"\s*:)/m},html:{script:/(<script[\s\S]*?>)([^]*?)(<\/script>)/im,tag:/<(!DOCTYPE|\/?\w+)([^]*?)(\/?>)/im,intag:/(\b)([\w-]+)(=)/g,comments:/<!--[^]*?-->/im},bash:{comments:/# .*/,keyword1:/(^ *|; *)(\w+)(\b)/g,keyword:/(\b)(sudo *[\w-]+)(\b)/g},mu:{comments:/(?:(?:^|[^\\:])(\/\/.*)|(?:^|[^\\])(\/\*[\s\S]*?(?:\*\/)))/m,keyword1:/(#)(\w+)(\b)/g,keyword2:/(\$\(?(\w+|\.|:|\)))/g},sql:{keyword:".",keyword2:/(\b)(FROM|USING|FTS5|NVARCHAR|INTEGER|REAL|BLOB|DELETE|UPDATE|BEGIN|END|ADD|CREATE|CONSTRAINT|ALTER|COLUMN|TABLE|ALL|ASC|BETWEEN|CASE|CHECK|COLUMN|INDEX|VIEW|PROCEDURE|DESC|DISTINTC|DROP|OUTER|INNER|LEFT|JOIN|INSERT|INTO|[NOT ]*NULL|LIMIT|SELECT|ORDER BY|UNION|WHERE)(\b)/gi,keyword1:/(\b)(COLLATE|NOCASE|DEFAULT|IF [NOT ]*EXISTS|PRIMARY KEY|VALUES|AS)(\b)/gi,comments:/(?:(?:^|[^\\:])(\/\/.*)|(?:^|[^\\])(\/\*[\s\S]*?(?:\*\/))|(--\s.*))/m}};function elang(str,lang,punct,codes){let data;return codes&&(data=codes.length,codes.push(str)),`<pre class="elang relative">${xelang(str,lang,punct)}<div class="absolute top-1 right-1"><button class="mu-internal-copy" data-copy="${data}">📋</button></div></pre>`}const escapeTag=str=>str.replace(/[<>]/g,(tag=>({"<":"&lt;",">":"&gt;"}[tag]))),escapeHTML=str=>str.replace(/[&<>'"]/g,(tag=>({"&":"&amp;","<":"&lt;",">":"&gt;","'":"&#39;",'"':"&quot;"}[tag]))),unescapeHTML=str=>str.replace(/&amp;/g,"&").replace(/&quot;/g,'"').replace(/&#39;/g,"'").replace(/&gt;/g,">").replace(/&lt;/g,"<");function xelang(str,lang,punct){let gspan=(str,cls)=>(cls&&(cls=cls.replace(/(\b)(\w+)(\b)/g,"$1_$2$3")),`☉☊${cls||""}☊☉${(str=escapeTag(str))||""}☉☋`),regex=code=>{if(controls[lang]){let x=controls[lang][code];if("."==x)return;if(x)return x}let x=controls[code];return"."==x?void 0:x},out=[],r=0,ids=[];if(lang){controls[lang]||(lang="js");let rg=regex("script");if(rg){let st1=[];for(;;){let res=rg.exec(str);if(!res)break;res.index>0&&st1.push(str.substr(0,res.index)),st1.push(`★★K${ids.length}★★`),ids.push(xelang(res[1],lang)+xelang(res[2],"js")+xelang(res[3],lang)),str=str.substr(res.index+res[0].length)}str.length&&st1.push(str),str=st1.join("")}for(let r of[{r:"comments",s:"C"}]){let rg=regex(r.r);if(rg){let st1=[];for(;;){let res=rg.exec(str);if(!res)break;if(res.index>0&&st1.push(str.substr(0,res.index)),st1.push(`★★${r.s}${ids.length}★★`),"html"==lang){let tm=res[0].replace(/</g,"&lt;").replace(/>/g,"&gt;");ids.push(tm)}else ids.push(res[0]);str=str.substr(res.index+res[0].length)}str.length&&st1.push(str),str=st1.join("")}}for(let r of[{r:"string2",s:"A"},{r:"string1",s:"B"},{r:"string",s:"S"},{r:"tag",s:"T"},{r:"regex",s:"R"}]){let rg=regex(r.r);if(rg){let st1=[];for(;;){let res=rg.exec(str);if(!res)break;if(res.index>0&&st1.push(str.substr(0,res.index)),st1.push(`★★${r.s}${ids.length}★★`),"T"==r.s){let tm=res[2].replace(regex("intag"),((p,p1,p2,p3)=>p1+gspan(p2,"intag")+gspan(p3,"punc")));ids.push(gspan("<","punc")+res[1]+tm+gspan(res[3],"punc"))}else if("`"==res[0][0]){let tm=res[0].replace(/(\${)(.*?)(})/gm,((p,p1,p2,p3)=>gspan(p1,"punc")+gspan(p2,"word")+gspan(p3,"punc")));ids.push(tm)}else ids.push(res[0]);str=str.substr(res.index+res[0].length)}str.length&&st1.push(str),str=st1.join("")}}let vv=str.split("\n"),r=0;for(let v of vv)r++,v=v.replace(regex("keyword"),((p,p1,p2,p3)=>gspan(p1,"tag")+gspan(p2,"keys")+p3)).replace(regex("keyword1"),((p,p1,p2,p3)=>p1+gspan(p2,"keys1 keys")+p3)).replace(regex("keyword2"),(p=>gspan(p,"keys2 keys"))).replace(regex("numbers"),(p=>gspan(p,"number"))).replace(regex("ingraffe"),((p,p1,p2,p3,p4)=>p1+gspan(p2,"punc")+gspan(p3,"word")+gspan(p4,"punc"))).replace(regex("puntuaction"),(p=>gspan(p,"punc"))).replace(/★★T(\d+)★★/gu,((m,p)=>gspan(ids[Number(p)],"tag"))).replace(/★★S(\d+)★★/gu,((m,p)=>gspan(ids[Number(p)],"string"))).replace(/★★B(\d+)★★/gu,((m,p)=>gspan(ids[Number(p)],"string string1"))).replace(/★★A(\d+)★★/gu,((m,p)=>gspan(ids[Number(p)],"string string2"))).replace(/★★R(\d+)★★/gu,((m,p)=>gspan(ids[Number(p)],"regex"))).replace(/★★C(\d+)★★/gu,((m,p)=>gspan(ids[Number(p)],"comment"))).replace(/★★K(\d+)★★/gu,((m,p)=>ids[Number(p)])),punct?out.push(gspan((" "+r).substr(-4),"rowid")+gspan(v)):out.push(gspan(v))}else{let vv=str.split("\n");for(let v of vv)r++,punct?out.push(`${gspan((" "+r).substr(-4),"rowid")}${gspan(v)}`):out.push(gspan(v))}let xx=out.join("\n");return xx=xx.replace(/☉☋/gmu,"</span>").replace(/☉☊([^]*?)☊☉/gmu,((p,p1)=>{if(p1){let v1=p1.split(" "),aa=[];for(let v of v1)aa.push(`elang_${lang}${v}`),aa.push(`elang${v}`);return`<span class="${aa.join(" ")}">`}return"<span>"})),xx}class Render{constructor(baseurl,easy,callback){this.baseurl=baseurl,this.easy=easy,this.callback=callback}code(code,lang,codes){if(this.easy)return"";lang||(lang="js");let punct=lang==lang.toUpperCase();return elang(code,lang=lang.toLowerCase(),punct,codes)}blockquote(quote){return this.easy?quote:`<blockquote>\n${quote}</blockquote>\n`}html(html){return html}heading(text,level,raw){return"."==text||"*"==text?"":this.easy?`${text} `:`<h${level}>${text}</h${level}>`}hr(){return this.easy?"":'<div class="my-4"><hr/></div>'}list(body,ordered){let type=ordered?"ol":"ul";return`<${type}>\n${body}</${type}>\n`}listtitle(body){return`<span class="listtitle">${body}</span>`}listitem(text,num){return num?`<li attr-num="${num||""}">${text}</li>\n`:`<li>${text}</li>\n`}paragraph(text){return this.easy?text:`<p>${text}</p>\n`}table(header,body){return this.easy?"":`<table>\n<thead>\n${header}\n</thead>\n<tbody>\n${body}\n</tbody>\n</table>\n\n`}tablerow(content){return`<tr>\n${content}</tr>\n`}tablecell(content,header,align){if(header)return`<th style="text-align:center;">${content}</th>\n`;return`<td style="${align?"text-align:"+align+";":""}">${content}</td>`}colorbase(text){return`<span class='tilde'>${text}</span>`}formula(text,full=!1){if(this.easy)return"";let aa=`<img class='inline px-2' src='https://math.croswil.com/f?${text=text.replace(/<\/?em>/g," ").replace(/\r/g,"").replace("/\n/g"," ")}' alt='${text}'/>`;return full?`<div class='flex justify-center'><div>${aa}</div></div>`:aa}coloralt(text){return`<span class='tilde2'>${text}</span>`}strong(text){return"<strong>"+text+"</strong>"}ico(text){return`<span class="font-ico">${text}</span>`}em(text){return"<em>"+text+"</em>"}codespan(text){return"<code>"+text+"</code>"}br(){return"<br>"}del(text){return`<del>${text}</del>`}link(href,title,text){if(this.easy)return"("+text+")";let out;if("/"==href.substr(0,1)&&this.baseurl&&(href=this.baseurl+href.substr(1)),href.startsWith("!"))out=`<button class="mu-internal-link" data-href="${href=href.slice(1)}">${text}</button>`;else{let target="";href.startsWith(".")?href=href.slice(1):target='target="_blank"',out=`<a ${target} href='${href}' title='${title||""}'>${text}</a>`}return out}image(href,title,text){if(this.easy)return"";let v=text.split("|"),out="",iswebm=!1,ismp4=!1,ismp3=!1;if((href=(href=href.replace("https://www.youtube.com/watch?v=","https://youtu.be/")).replace("https://youtu.be","https://www.youtube.com/embed")).endsWith(".mp3")?(href=href.slice(0,-4),ismp3=!0):href.endsWith(".mp4")?(href=href.slice(0,-4),ismp4=!0):href.endsWith(".webm")?(href=href.slice(0,-5),iswebm=!0):href.endsWith(".video")&&(href=href.slice(0,-6),iswebm=!0,ismp4=!0),ismp3)out=`\n <audio controls ${v.length>=1?' width="'+v[1]+'"':""}\n class="mx-auto my-2 ${v.length>=2?v[2]:""}" \n >\n <source src="${href}.mp3" type="audio/mpeg">\n Il tuo browser non supporta l'elemento audio.\n </audio>\n `;else if(ismp4||iswebm)out=`\n<video ${v.length>=1?' width="'+v[1]+'"':""}\nclass="border rounded-lg shadow-xl ${v.length>=2?v[2]:""}" \ncontrols controlsList="nodownload" >\n ${iswebm?'<source src="'+href+'.webm" type="video/webm" >':""}\n ${ismp4?'<source src="'+href+'.mp4" type="video/mp4" >':""}\n \n Your browser does not support the video tag.\n</video>`;else{if(href.indexOf("https://www.youtu")>=0){let hh=href.split("/embed/")[1]?.split("?")[0];return out=`\n\n<div style="width: 94%; box-shadow: 6px 6px 10px hsl(206.5, 0%, 75%); margin: 3%;">\n <div style="position: relative; padding-bottom: 56.15%; height: 0; overflow: hidden;">\n <iframe \n style="position: absolute; top: 0; left:0; width: 100%; height: 100%; border: 0;"\n loading="lazy";\n srcdoc="<style>\n * {\n padding: 0;\n margin: 0;\n overflow: hidden;\n }\n \n body, html {\n height: 100%;\n }\n \n img, svg {\n position: absolute;\n width: 100%;\n top: 0;\n bottom: 0;\n margin: auto;\n }\n \n svg {\n filter: drop-shadow(1px 1px 10px hsl(206.5, 70.7%, 8%));\n transition: all 250ms ease-in-out;\n }\n \n body:hover svg {\n filter: drop-shadow(1px 1px 10px hsl(206.5, 0%, 10%));\n transform: scale(2);\n }\n </style>\n <a href='https://www.youtube.com/embed/${hh}?autoplay=1'>\n <img src='https://img.youtube.com/vi/${hh}/hqdefault.jpg' alt='${title||"video"}'>\n <svg xmlns='http://www.w3.org/2000/svg' width='64' height='64' viewBox='0 0 24 24' fill='none' stroke='#ffffff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' class='feather feather-play-circle'><circle cx='12' cy='12' r='10'></circle><polygon points='10 8 16 12 10 16 10 8'></polygon></svg>\n </a>\n "\n src="https://www.youtube.com/embed/${hh}" \n title="${title||"video"}"\n frameborder="0"\n allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" \n allowfullscreen>\n </iframe>\n </div>\n </div> \n \n`,out}this.callback&&"function"==typeof this.callback&&(href=this.callback({type:"img",href:href})),"/"==href.substr(0,1)&&this.baseurl&&(href=this.baseurl+href.substr(1)),out='<img src="'+href+'" alt="'+v[0]+'"',v.length>1&&(v[1].length&&(out+=' width="'+v[1]+'"'),v.length>2&&(out+=' class="'+v[2]+'"')),v[0]&&(out+=' title="'+v[0]+'"'),out+="/>"}return out}text(text){return text}}const irules=inline.gfm;let tokenparser=(res,render,maxlen=0)=>{let totl=0,checklen=body=>{if(maxlen>0&&body.length>maxlen-totl){let q=(body=body.substring(0,maxlen-totl)).lastIndexOf(" ");q>0&&(body=body.substring(0,q))}return body},next=()=>token=tokens.pop(),parseText=()=>{let body=token.text;for(;"text"===(tokens[tokens.length-1]||0).type;)body+="\n"+next().text;return output(checklen(body))},outputLink=(cap,link)=>{let href=escape(link.href),title=link.title?escape(link.title):null;return"!"!==cap[0].charAt(0)?render.link(href,title,output(cap[1])):render.image(href,title,escape(cap[1]))};const output=src=>{let link,text,href,cap,out="";for(;src;)if(cap=irules.escape.exec(src))src=src.substring(cap[0].length),out+=cap[1];else if(cap=irules.autolink.exec(src))src=src.substring(cap[0].length),"@"===cap[2]?(text=":"===cap[1].charAt(6)?cap[1].substring(7):cap[1],href=`mailto:${text}`):(text=escape(cap[1]),href=text),out+=render.link(href,null,text);else if(inLink||!(cap=irules.url.exec(src))){if(cap=irules.tag.exec(src))!inLink&&/^<a /i.test(cap[0])?inLink=!0:inLink&&/^<\/a>/i.test(cap[0])&&(inLink=!1),src=src.substring(cap[0].length),out+=cap[0];else if(cap=irules.link.exec(src))src=src.substring(cap[0].length),inLink=!0,out+=outputLink(cap,{href:cap[2],title:cap[3]}),inLink=!1;else if((cap=irules.reflink.exec(src))||(cap=irules.nolink.exec(src))){if(src=src.substring(cap[0].length),link=(cap[2]||cap[1]).replace(/\s+/g," "),link=links[link.toLowerCase()],!link||!link.href){out+=cap[0].charAt(0),src=cap[0].substring(1)+src;continue}inLink=!0,out+=outputLink(cap,link),inLink=!1}else if(cap=irules.formula.exec(src))src=src.substring(cap[0].length),out+=render.formula(output(cap[1]));else if(cap=irules.ico.exec(src))src=src.substring(cap[0].length),out+=render.ico(output(cap[2]||cap[1]));else if(cap=irules.strong.exec(src))src=src.substring(cap[0].length),out+=render.strong(output(cap[2]||cap[1]));else if(cap=irules.em.exec(src))src=src.substring(cap[0].length),out+=render.em(output(cap[2]||cap[1]));else if(cap=irules.code.exec(src))src=src.substring(cap[0].length),out+=render.codespan(escape(cap[2],!0));else if(cap=irules.br.exec(src))src=src.substring(cap[0].length),out+=render.br();else if(cap=irules.del.exec(src))src=src.substring(cap[0].length),out+=render.del(output(cap[1]));else if(cap=irules.coloralt.exec(src))src=src.substring(cap[0].length),out+=render.coloralt(output(cap[1]));else if(cap=irules.colorbase.exec(src))src=src.substring(cap[0].length),out+=render.colorbase(output(cap[1]));else if(cap=irules.text.exec(src))src=src.substring(cap[0].length),out+=render.text(cap[0]);else if(src)throw new Error("Infinite loop on byte: "+src.charCodeAt(0))}else src=src.substring(cap[0].length),text=escape(cap[1]),href=text,out+=render.link(href,null,text);return out};let token,tok=()=>{switch(token.type){case"space":return"";case"hr":return render.hr();case"heading":return render.heading(output(checklen(token.text)),token.depth,token.text);case"code":return"math"==token.lang?render.formula(token.text,!0):render.code(token.text,token.lang,codes);case"table":{let row,cell,j,header="",body=[];cell=[];for(let i=0;i<token.headers.length;i++)cell.push(render.tablecell(tokenparser(token.headers[i],render,0).out,!0,token.align[i]));header=render.tablerow(cell.join(""));for(let i=0;i<token.cells.length;i++){for(row=token.cells[i],cell=[],j=0;j<row.length;j++)cell.push(render.tablecell(tokenparser(row[j],render,0).out,!1,token.align[j]));body.push(render.tablerow(cell.join("")))}return render.table(header,body.join(""))}case"blockquote_start":{let body="";for(;"blockquote_end"!==next().type;)body+=tok();return render.blockquote(body)}case"list_start":{let body="",ordered=token.ordered;for(;"list_end"!==next().type;)body+=tok();return render.list(body,ordered)}case"list_title_start":{let body="";for(;"list_title_end"!==next().type;)body+=tok();return render.listtitle(body)}case"list_item_start":{let body="",num=token.num;for(;"list_item_end"!==next().type;)body+="text"===token.type?parseText():tok();return render.listitem(body,num)}case"html":return render.html(token.text);case"paragraph":return render.paragraph(output(checklen(token.text)));case"text":return render.paragraph(parseText());default:console.log("missing",token.type)}},tokens=res.reverse(),inLink=!1,links={},codes=[],out=[];for(;next();){let t=tok();if(totl+=t.length,t&&out.push(t),maxlen>0&&totl>maxlen)break}return{out:out.join(""),codes:codes}};function __parselist(tt,tm){let rr;function pb(exp,cl,callback){if(rr=exp.exec(tt),rr){__parselist(tt.slice(0,rr.index),tm);let t=rr[1];return t.startsWith("\n")&&(tm.push({class:"",text:"\n"}),t=t.slice(1)),tm.push({class:cl,text:callback?callback(t):t}),__parselist(tt.slice(rr.index+rr[1].length),tm),!0}return!1}tt&&"string"==typeof tt&&(pb(/^(:{3}\s*$[^]+?:{3}\s*$)/gim,"comment")||pb(/^(\s*`{3}[^]+?`{3}\s*$)/gim,"code")||pb(/^(\s*:\w+:.*)$/gim,"comment")||(tt=tt.replace(/ {2,}\n/gim," "),pb(/^(\s*#{1,6}\s+.*)/gim,"title")||pb(/(\n\s*\n)/gim,"break")||pb(/^(\s*>\s+[^]*?\n\n)/gim,"cite")||pb(/^(\s*>\s+.*)/gim,"cite")||pb(/^(.*?\|[^]*?\n\n)/gim,"table")||pb(/^( *\*| *-|-{1,8})[ $]/gim,"list")||pb(/^( ([\d]+[.]*)+)[ $]/gim,"list",(r=>{let vv=r.split(".");vv.shift();let cl=[];for(let v of vv)v.length&&cl.push(" ");return cl.push("-"),cl.join("")}))||tm.push({class:"",text:tt})))}function parselist(text,title=""){let tm=[];__parselist(text,tm);let counter=[],space=0;for(let ii=0;ii<tm.length;ii++){let t=tm[ii];if("list"==t.class){let sl=t.text.replace("\n","").length;if(sl>space)counter.push({space:sl,id:1}),space=sl;else for(;;){let c=counter[counter.length-1];if(1==counter.length||c.space<=sl){space=c.space,c.id++;break}counter.pop()}let cl=[],cl1=[];for(let c of counter)cl1.push(" "),cl.push(c.id);cl1.pop(),t.old=t.text,t.text.indexOf("-")>=0?t.text=cl1.join("")+"- "+cl.join(".")+".":t.text=cl1.join("")+"* ",cl=[];for(let j=ii+1;j<tm.length&&""==tm[j].class;j++)cl.push(tm[j].text);t.title=title,t.data=t.text+cl.join("")}else""!=t.class&&("title"==t.class&&(title=t.text),counter=[],space=0)}let cl=[],cards=[];for(let t of tm)"list"==t.class&&cards.push({title:t.title,lev:t.text,data:t.data}),cl.push(t.text);return{txt:cl.join(""),cards:cards,tm:tm}}function parserow$1(tt,tm,classe=""){let rr;function parse3(exp,cl){return rr=exp.exec(tt),!!rr&&(parserow$1(tt.slice(0,rr.index),tm,classe),tm.push({class:`${classe} ${cl}`,text:rr[1]}),parserow$1(rr[2],tm,`${classe} ${cl}`),tm.push({class:`${classe} ${cl}`,text:rr[3]}),parserow$1(tt.slice(rr.index+rr[1].length+rr[2].length+rr[3].length),tm,classe),!0)}(function parse1(exp,cl){return rr=exp.exec(tt),!!rr&&(parserow$1(tt.slice(0,rr.index),tm,classe),tm.push({class:`${classe} ${cl}`,text:rr[1]}),parserow$1(tt.slice(rr.index+rr[1].length),tm,classe),!0)})(/(`.*?`)/gim,"code2")||parse3(/(\*{3})([^]+?)(\*{3})/gim,"grassetto italico")||parse3(/(\*{2})([^]+?)(\*{2})/gim,"grassetto")||parse3(/(\*{1})([^]+?)(\*{1})/gim,"italico")||parse3(/(_{3})([^]+?)(_{3})/gim,"grassetto italico")||parse3(/(_{2})([^]+?)(_{2})/gim,"grassetto")||parse3(/(_{1})([^]+?)(_{1})/gim,"italico")||parse3(/(~{3})([^]+?)(~{3})/gim,"barrato")||parse3(/(~{2})([^]+?)(~{2})/gim,"tilde2")||parse3(/(~{1})([^]+?)(~{1})/gim,"tilde")||tm.push({class:classe,text:tt})}function parseblock$1(tt,tm){let rr;function pb(exp,cl,row=!1){return rr=exp.exec(tt),!!rr&&(parseblock$1(tt.slice(0,rr.index),tm),row?parserow$1(rr[1],tm,cl):tm.push({class:cl,text:rr[1]}),parseblock$1(tt.slice(rr.index+rr[1].length),tm),!0)}if(!(pb(/^(:{3}[^]+?:{3})/gim,"comment")||pb(/^(\s*`{3}[^]+?`{3})/gim,"code")||pb(/^(\s*:\w+:.*)$/gim,"comment")||pb(/^(\s*#{1,6} +.*)$/gim,"title",!0)||pb(/^(\s*>\s+[^]*?\n\n)/gim,"cite",!0)||pb(/^(\s*>\s+.*)/gim,"cite",!0)||pb(/^(.*?\|.*\n[-: ]+\|[-| :]*\n.*?\|[^]*?\n\n)/gim,"tabella",!0)||pb(/^(\n{2,})/gim,"break",!0)||pb(/^( *\*| *-|-{1,8})[ $]/gim,"list",!0)||pb(/(^\s*[\d.]+)[\s$]/gim,"list",!0))){if(rr=/(!*\[)(.*?)(\]\s*\()(.*?)(\))/.exec(tt),rr)return parserow$1(tt.slice(0,rr.index),tm,""),tm.push({class:"grassetto",text:rr[1]}),tm.push({class:"linkdes",text:rr[2]}),tm.push({class:"grassetto",text:rr[3]}),tm.push({class:"linkval",text:rr[4]}),tm.push({class:"grassetto",text:rr[5]}),void parserow$1(tt.slice(rr.index+rr[1].length+rr[2].length+rr[3].length+rr[4].length+rr[5].length),tm,"");parserow$1(tt,tm,"")}}function parsetext(tt){"number"==typeof tt&&(tt=String(tt)),tt&&"string"==typeof tt||(tt=" "),tt.endsWith("\n")&&(tt+=" ");let tm=[];return parseblock$1(tt,tm),tm}function parserow(tt,tm,classe=""){let rr;function parse1(exp,cl){return rr=exp.exec(tt),!!rr&&(parserow(tt.slice(0,rr.index),tm,classe),tm.push({class:`${classe} ${cl}`,text:rr[1]}),parserow(tt.slice(rr.index+rr[1].length),tm,classe),!0)}parse1(/(\/\/.*)$/gim,"commento2")||function parse2(exp,cl){if(rr=exp.exec(tt),rr){let ii=rr.index+rr[1].length;return parserow(tt.slice(0,ii),tm,classe),tm.push({class:`${classe} ${cl}`,text:rr[2]}),parserow(tt.slice(ii+rr[2].length),tm,classe),!0}return!1}(/(#let.? +)([\w_.]+)/gi,"variabile")||parse1(/(#(select|setdef|cases|endselect|ifdef|log|msg|endif|cvar|cache|look|lookb|elseifdef|variante|forvar|for|endfor|continue|break|inc|macro|default|lets|letv|lett|cat|func))/gim,"comando")||parse1(/(#(if\s*|elseif\s*))/gim,"comando")||parse1(/(#(else|let|i |m |f |j |case|def ))/gim,"comando")||parse1(/(\$[{(]?[\w_.]+)/gim,"variabile")||parse1(/({.+?\})/gim,"formula")||parse1(/([})(])/gim,"variabile")||parse1(/([\d.:,;\\,]+)/gim,"digit")||tm.push({class:classe,text:tt})}function parseblock(tt,tm){let rr;(function pb(exp,cl,row=!1){return rr=exp.exec(tt),!!rr&&(parseblock(tt.slice(0,rr.index),tm),row?parserow(rr[1],tm,cl):tm.push({class:cl,text:rr[1]}),parseblock(tt.slice(rr.index+rr[1].length),tm),!0)})(/(\/\*[^]+?\*\/)/gim,"comment")||parserow(tt,tm,"")}function parserule(tt){tt||(tt=" "),tt.endsWith("\n")&&(tt+=" ");let tm=[];return parseblock(tt,tm),tm}function formatrule(code){let lines=code.split("\n"),formattedCode=[],indentLevel=0,next=0;for(let i=0;i<lines.length;i++){let line=lines[i].trim(),indent=" ".repeat(indentLevel>=0?indentLevel+next:next);next=0;let command="";line.split("//")[0].trim().endsWith("\\")&&(next=1),(line.startsWith("#")||line.startsWith("!"))&&(command=line.substring(1).split(" ")[0].toUpperCase(),line=line.substring(0,1)+command+line.substring(command.length+1)),"IF"==command||"IFDEF"==command||"IFNDEF"==command?line.indexOf("#",2)<0?indentLevel++:line=line.replace(/#([\w]+)/g,((match,m1)=>"#"+m1.toUpperCase())):["FOR","FORVAR","DO","SELECT"].includes(command)?indentLevel++:["ENDIF","LOOP","ENDFOR","ENDSELECT"].includes(command)&&(indentLevel--,indent=" ".repeat(indentLevel>=0?indentLevel:0)),["ELSEIF","ELSE","ELSEIFDEF","ELSEIFNDEF","CASE","CASES","DEFAULT"].includes(command)&&indentLevel>0?formattedCode.push(" ".repeat(indentLevel-1)+line):formattedCode.push(indent+line)}return formattedCode.join("\n")}function getcolonne(value){if((value=value+""||"").includes('"')){return value.split(/[,;](?=(?:(?:[^"]*["]){2})*[^"]*$)/).map((part=>part.trim().replace(/(^["'])|(["']$)/g,"").replace(/=\s*["']/g,"=")))}return value.split(/[,;]/).map((p=>p.trim()))}function formatvariante(str){let cl=[],ll=[];for(let c of str.split("\n")){let tm=getcolonne(c);for(let i=0;i<tm.length;i++){let t=tm[i]||"";(t.includes(",")||t.includes(";"))&&(t=`"${t}"`,tm[i]=t);let l=t.length;(!ll[i]||ll[i]<l)&&(ll[i]=l)}cl.push(getcolonne(c))}let res=[];for(let c of cl){let tm=[];for(let i=0;i<ll.length;i++)tm[i]=(c[i]||"").padEnd(ll[i]);res.push(tm.join(" , "))}return res.join("\n")}function markunoFormatCodeMirror(CodeMirror){CodeMirror.defineMode("markuno",(function(){return{startState:function(){return{inComment:!1}},token:function(stream,state){return state.inComment?(stream.skipTo("*/")?(stream.next(),stream.next(),state.inComment=!1):stream.skipToEnd(),"comment"):stream.match(/\/\/.*/)?"comment":stream.sol()&&stream.match(/^\s*\.[a-zA-Z0-9_]+(?=\s|$)/)?"def":state.expectMacroArg?stream.eatSpace()?null:stream.match(/^[^\s#,(){}]+/)?(state.expectMacroArg=!1,"builtin"):(stream.next(),state.expectMacroArg=!1,null):stream.sol()&&stream.match(/^\s*#([mif])\b/i)?(state.expectMacroArg=!0,"def"):stream.match("/*")?(stream.skipTo("*/")?(stream.next(),stream.next()):state.inComment=!0,"comment"):stream.match(/^\s*#(select|cache|cvar|lookb|look|cases|endselect|log|msg|ifdef|ifndef|elseif|elseifndef|endif|elseifdef|variante|forvar|for|endfor|continue|break|inc|macro|default|lets|lett|cat|func|push|pop|letv|let|letm|lett|else)/i)||stream.match(/^\s*#(if\s*|elseif\s*|j |case|def )/i)||stream.match(/#(else|let|letv|lett|letm|cvar|cache|lookb|look)/i)?"keyword":!state.inCommand&&stream.match(/^\s*#[\w_.]+/i)?"string":stream.match(/^\s*![\w_.]+/i)?"builtin":stream.match(/[<>!=+\-*/\\%]+/)?"operator":stream.match(/\$\[[\w_.]+/)||stream.match(/\$\{[\w_.]+/)||stream.match(/\$\([\w_.]+/)||stream.match(/\$[\w_.]+/)||stream.match(/[}\])]/)?"string":stream.match(/\{.+?\}/)?"variable-3":stream.match(/[\d.:,;\\]+/)?"number":(stream.next(),null)}}}))}function parsevars(v,vars){let r=v;if(vars)for(let x in vars){let v2=vars[x]||`..${x}..`;r=r.replace(new RegExp(`\\[${x}\\]`,"gim"),v2)}return r}const parseinfomd=(data,info,mappa)=>aliasInfo.parse(data,info,mappa),mark=(xx,baseurl,notitle=!1,parsedlist=!1,callback)=>{let res;if(parsedlist)res=tokenize(xx,0,notitle);else{let{txt:txt}=parselist(xx);res=tokenize(txt,0,notitle)}return tokenparser(res,new Render(baseurl,!1,callback))},markeasy=(xx,maxlen=400,notitle=!1)=>{let res=tokenize(xx,maxlen,notitle);return tokenparser(res,new Render,maxlen).out};export{Render,aliasInfo,elang,escapeHTML,formatrule,formatvariante,mark,markeasy,markunoFormatCodeMirror,parseinfomd,parselist,parserule,parsetext,tokenparser as parsetokens,parsevars,tokenize,unescapeHTML};
21
+ inline.breaks=merge({},inline.gfm,{br:replace(inline.br)("{2,}","*")(),text:replace(inline.gfm.text)("{2,}","*")()});const basealias={s:"subtitle",k:"keywords",g:"gruppo",e:"editore",y:"datapub",d:"datapub",p:"priority",a:"autore",u:"base",t:"title",l:"link",i:"img","#":"title"};const aliasInfo=new class AliasInfo{constructor(){this.alias=JSON.parse(JSON.stringify(basealias)),this.check()}check(){let rr=new Set,checkr=x=>{x&&x.length>2&&!rr.has(x)&&rr.add(x)};for(let x in this.alias)this.alias[x]?(checkr(x),checkr(this.alias[x])):delete this.alias[x];this.retoalias=function retroalias(alias){let retro={};for(let x in alias)alias[x]&&(retro[alias[x]]=x);return retro}(this.alias),rr=[...rr],rr=`^\\s*\\:(${rr.join("|")}|\\w{1,2})\\:(.*)$`,this.regex=rr}add(sigla,valore){return sigla&&(this.alias[sigla]=valore,this.check()),this}removeAll(){return this.alias={},this.check(),this}setmappa(mappa){this.alias={};for(let x in mappa)this.alias[x]=mappa[x];this.alias["#"]||(this.alias["#"]="title"),this.check()}parse(data,info,mappa){mappa&&this.setmappa();let xx=data,res={};info&&(res=Object.assign(res,info),res.info=!0);let rr=/^\s*#\s+(.*?)\s*$/im.exec(xx);rr&&(res[this.alias["#"]]=rr[1].toLowerCase());for(let i=0;i<20;i++){let rr=/:::(.*)([^]+?):::/im.exec(xx);if(!rr)break;{let id=rr[1];id||(id=i+""),res.comments||(res.comments=[]),res.comments.push({k:id,v:rr[2]}),xx=xx.substr(rr.index+rr[0].length)}}xx=data;let regex=new RegExp(this.regex,"im");for(let i=0;i<50;i++){let rr=regex.exec(xx);if(!(rr&&rr.length>=2))break;{xx=xx.substr(rr.index+rr[0].length),res.info=!0;let rr2=(rr[2]||"").trim(),oname=this.alias[rr[1].toLowerCase()];oname||(oname=rr[1].toLowerCase()),"l"==oname||"link"==oname?(res[oname]||(res[oname]=[]),res[oname].push(rr2)):res[oname]=rr2}}return res}};var tokenize=(src,easylen,noheader=!1)=>{function _parsetable(tokens,src){let v2,tb={type:"table",headers:[],align:[],cells:[],cols:0},vv=src.split("\n"),fl=!1;function checkcols(cols){if(tb.cols<cols){for(let i=tb.cols;i<cols;i++){tb.align[i]="left",tb.headers[i]=[];for(let r of tb.cells)r[i]=[]}tb.cols=cols}}for(let v1 of vv)if(v1=v1.trim(),v1.length)if(v1.length>2&&v1.startsWith("|")&&v1.endsWith("|")&&(v1=v1.slice(1,-1)),v2=v1.split("|"),checkcols(v2.length),0==fl&&/^[- :]+\|[- :|]*$/im.test(v1)){for(let i=0;i<v2.length;i++){let v=v2[i],x1=v.slice(0,1),x2=v.slice(-1);tb.align[i]=":"==x1&&":"==x2?"center":":"==x2?"right":"left"}fl=!0}else{let r=[];for(let i=0;i<v2.length;i++){let v=v2[i];if(fl){let t=[];_tokenize(t,v,!1),r.push(t)}else _tokenize(tb.headers[i],v,!1)}fl&&tb.cells.push(r)}tokens.push(tb)}function _pushtoken(tokens,src){let cc=/^([\d.]+)\s*/.exec(src),num="",title="";cc&&(num=cc[1],src=src.substring(cc.index+cc[0].length)),cc=/^([\w\s]*?):.*$/gim.exec(src),cc&&(title=cc[1],src=src.substring(cc.index+cc[1].length)),tokens.push({type:"list_item_start",num:num}),title&&(tokens.push({type:"list_title_start"}),_tokenize(tokens,title,!1),tokens.push({type:"list_title_end"})),src=src.replace(/\n +/gim,"<br>"),_tokenize(tokens,src,!1),tokens.push({type:"list_item_end"})}function _parselista(tokens,ordered,space,src){let counter=[space];for(tokens.push({type:"list_start",ordered:ordered});;){let cap=/^( *)([*\-+])[\s$]/im.exec(src);if(!cap){_pushtoken(tokens,src);break}{cap.index&&_pushtoken(tokens,src.substring(0,cap.index));let sl=cap[1].length;if(sl>counter[counter.length-1])tokens.push({type:"list_start",ordered:ordered}),counter.push(sl);else for(;;){let sp=counter[counter.length-1];if(1==counter.length||sp<=sl)break;tokens.push({type:"list_end"}),counter.pop()}src=src.substring(cap.index+cap[0].length)}}for(let c of counter)tokens.push({type:"list_end"})}const _tokenize=(tokens,src,top,bq)=>{let cap;for(src=src.replace(/^ +$/gm,"");src;){if(easylen){let ll=0;for(let t of tokens)t.text||t.html?ll=ll+t.text.length+2:ll+=3;if(ll>easylen)break}if((cap=rules.newline.exec(src))&&(src=src.substring(cap[0].length),cap[0].length>1&&tokens.push({type:"space"})),cap=rules.formula.exec(src))src=src.substring(cap[0].length),tokens.push({type:"code",lang:"math",text:cap[2]||""});else if(cap=/^(\s*`{3})(.*)([^]+?)(`{3})/gim.exec(src)){cap.index>0&&_tokenize(tokens,src.substring(0,cap.index),top);let txt=(cap[3]||"").replace(/^\n/,"").replace(/\n+$/,"");tokens.push({type:"code",lang:cap[2],text:txt}),src=src.substring(cap.index+cap[0].length)}else if(cap=rules.heading.exec(src))src=src.substring(cap[0].length),tokens.push({type:"heading",depth:cap[1].length,text:cap[2]});else if(top&&(cap=/^(.*?\|.*\n[-: ]+\|[-| :]*\n.*?\|[^]*?)\n\n/gim.exec(src)))cap.index>0&&_tokenize(tokens,src.substring(0,cap.index),top),_parsetable(tokens,cap[1]),src=src.substring(cap.index+cap[0].length);else if(top&&(cap=/^\|.*\|\s*(?:\n\|.*\|)+/gim.exec(src)))cap.index>0&&_tokenize(tokens,src.substring(0,cap.index),top),_parsetable(tokens,cap[0]),src=src.substring(cap.index+cap[0].length);else if(cap=rules.lheading.exec(src))src=src.substring(cap[0].length),tokens.push({type:"heading",depth:"="===cap[2]?1:2,text:cap[1]});else if(cap=rules.hr.exec(src))src=src.substring(cap[0].length),tokens.push({type:"hr"});else if(cap=rules.blockquote.exec(src))src=src.substring(cap[0].length),tokens.push({type:"blockquote_start"}),_tokenize(tokens,cap[0].replace(/^ *> ?/gm,""),top,!0),tokens.push({type:"blockquote_end"});else if(cap=/^[\s-:]*?\|[\s-:|]*/im.exec(src),cap||!(cap=/^( *)([*\-+])[\s$]/im.exec(src))){if(cap=rules.html.exec(src))src=src.substring(cap[0].length),tokens.push({type:"html",pre:"pre"===cap[1]||"script"===cap[1]||"style"===cap[1],text:cap[0]});else if(!bq&&top&&(cap=rules.def.exec(src)))src=src.substring(cap[0].length),tokens.push({type:"code",text:`??${cap[0]}??${rules.def}??`});else if(top&&(cap=rules.paragraph.exec(src)))src=src.substring(cap[0].length),tokens.push({type:"paragraph",text:"\n"===cap[1].charAt(cap[1].length-1)?cap[1].slice(0,-1):cap[1]});else if(cap=rules.text.exec(src))src=src.substring(cap[0].length),tokens.push({type:"text",text:cap[0]});else if(src)throw new Error("Infinite loop on byte: "+src.charCodeAt(0))}else{cap.index>0&&_tokenize(tokens,src.substring(0,cap.index)),src=src.substring(cap.index+cap[0].length);let res=/([^]*?)(\n\n|\n\s*[#>])/im.exec(src+"\n\n");if(res){_parselista(tokens,"*"==cap[2],cap[1].length,res[1]),src=src.substring(res[1].length)}else tokens.push({type:"text??",text:cap[0]})}}return tokens};let rules=block.tables;return src=function removeInfo(src,title=!1){let tm=src.replace(/:::([^]+?):::/gim,"").replace(new RegExp(aliasInfo.regex,"gim"),"").replace(/^\s*#\s+/im,"# ").replace(/\r\n|\r/g,"\n").replace(/\t/g," ").replace(/\u00a0/g," ").replace(/\u2424/g,"\n");if(title){const rg=/(^\s*#\s+(.*)?\s*)$/im;let rr=rg.exec(tm);rr&&0==rr.index&&(tm=tm.replace(rg,""))}return tm}(src,noheader),_tokenize([],src,!0)};const controls={string:/(".*?[^\\]"|'.*?[^\\]'|`[^]*?[^\\]`|""|''|``)/m,puntuaction:/(-[-=]?|,|;|\+[+=]?|!=?=?|<<?=?|>>?>?=?|=(?:==?|>)?|&[&=]?|\|[|=]?|\*\*?=?|\/=?|~|\^=?|%=?|\?|\.{3})/g,parentesis:/(\(|\)|\[|\]|\{|\})/g,ingraffe:/([^$])(\{)(.*?)(\})/g,regex:/\/.*?[^\\]\/[gimu]*/m,numbers:/\b((?:(?:0[xX][\dA-Fa-f]+|0[bB][01]+|0[oO][0-7]+)n?|\d+n|NaN|Infinity)\b|(?:\b\d+\.?\d*|\B\.\d+)(?:[Ee][+-]?\d+)?)/gi,js:{comments:/(?:(?:^|[^\\:])(\/\/.*)|(?:^|[^\\])(\/\*[\s\S]*?(?:\*\/)))/m,keyword:/(\b)(import|require|endif|include|define|float|int|real|char|bool|as|true|false|async|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|var|void|while|with|yield)(\b)/g,keyword2:/(\.\w+|\w+:)/g},json:{string:/(".*?[^\\]")/m,string1:/(".*?[^\\]"\s*:)/m},html:{script:/(<script[\s\S]*?>)([^]*?)(<\/script>)/im,tag:/<(!DOCTYPE|\/?\w+)([^]*?)(\/?>)/im,intag:/(\b)([\w-]+)(=)/g,comments:/<!--[^]*?-->/im},bash:{comments:/# .*/,keyword1:/(^ *|; *)(\w+)(\b)/g,keyword:/(\b)(sudo *[\w-]+)(\b)/g},mu:{comments:/(?:(?:^|[^\\:])(\/\/.*)|(?:^|[^\\])(\/\*[\s\S]*?(?:\*\/)))/m,keyword1:/(#)(\w+)(\b)/g,keyword2:/(\$\(?(\w+|\.|:|\)))/g},sql:{keyword:".",keyword2:/(\b)(FROM|USING|FTS5|NVARCHAR|INTEGER|REAL|BLOB|DELETE|UPDATE|BEGIN|END|ADD|CREATE|CONSTRAINT|ALTER|COLUMN|TABLE|ALL|ASC|BETWEEN|CASE|CHECK|COLUMN|INDEX|VIEW|PROCEDURE|DESC|DISTINTC|DROP|OUTER|INNER|LEFT|JOIN|INSERT|INTO|[NOT ]*NULL|LIMIT|SELECT|ORDER BY|UNION|WHERE)(\b)/gi,keyword1:/(\b)(COLLATE|NOCASE|DEFAULT|IF [NOT ]*EXISTS|PRIMARY KEY|VALUES|AS)(\b)/gi,comments:/(?:(?:^|[^\\:])(\/\/.*)|(?:^|[^\\])(\/\*[\s\S]*?(?:\*\/))|(--\s.*))/m}};function elang(str,lang,punct,codes){let data;return codes&&(data=codes.length,codes.push(str)),`<pre class="elang relative">${xelang(str,lang,punct)}<div class="absolute top-1 right-1"><button class="mu-internal-copy" data-copy="${data}">📋</button></div></pre>`}const escapeTag=str=>str.replace(/[<>]/g,(tag=>({"<":"&lt;",">":"&gt;"}[tag]))),escapeHTML=str=>str.replace(/[&<>'"]/g,(tag=>({"&":"&amp;","<":"&lt;",">":"&gt;","'":"&#39;",'"':"&quot;"}[tag]))),unescapeHTML=str=>str.replace(/&amp;/g,"&").replace(/&quot;/g,'"').replace(/&#39;/g,"'").replace(/&gt;/g,">").replace(/&lt;/g,"<");function xelang(str,lang,punct){let gspan=(str,cls)=>(cls&&(cls=cls.replace(/(\b)(\w+)(\b)/g,"$1_$2$3")),`☉☊${cls||""}☊☉${(str=escapeTag(str))||""}☉☋`),regex=code=>{if(controls[lang]){let x=controls[lang][code];if("."==x)return;if(x)return x}let x=controls[code];return"."==x?void 0:x},out=[],r=0,ids=[];if(lang){controls[lang]||(lang="js");let rg=regex("script");if(rg){let st1=[];for(;;){let res=rg.exec(str);if(!res)break;res.index>0&&st1.push(str.substr(0,res.index)),st1.push(`★★K${ids.length}★★`),ids.push(xelang(res[1],lang)+xelang(res[2],"js")+xelang(res[3],lang)),str=str.substr(res.index+res[0].length)}str.length&&st1.push(str),str=st1.join("")}for(let r of[{r:"comments",s:"C"}]){let rg=regex(r.r);if(rg){let st1=[];for(;;){let res=rg.exec(str);if(!res)break;if(res.index>0&&st1.push(str.substr(0,res.index)),st1.push(`★★${r.s}${ids.length}★★`),"html"==lang){let tm=res[0].replace(/</g,"&lt;").replace(/>/g,"&gt;");ids.push(tm)}else ids.push(res[0]);str=str.substr(res.index+res[0].length)}str.length&&st1.push(str),str=st1.join("")}}for(let r of[{r:"string2",s:"A"},{r:"string1",s:"B"},{r:"string",s:"S"},{r:"tag",s:"T"},{r:"regex",s:"R"}]){let rg=regex(r.r);if(rg){let st1=[];for(;;){let res=rg.exec(str);if(!res)break;if(res.index>0&&st1.push(str.substr(0,res.index)),st1.push(`★★${r.s}${ids.length}★★`),"T"==r.s){let tm=res[2].replace(regex("intag"),((p,p1,p2,p3)=>p1+gspan(p2,"intag")+gspan(p3,"punc")));ids.push(gspan("<","punc")+res[1]+tm+gspan(res[3],"punc"))}else if("`"==res[0][0]){let tm=res[0].replace(/(\${)(.*?)(})/gm,((p,p1,p2,p3)=>gspan(p1,"punc")+gspan(p2,"word")+gspan(p3,"punc")));ids.push(tm)}else ids.push(res[0]);str=str.substr(res.index+res[0].length)}str.length&&st1.push(str),str=st1.join("")}}let vv=str.split("\n"),r=0;for(let v of vv)r++,v=v.replace(regex("keyword"),((p,p1,p2,p3)=>gspan(p1,"tag")+gspan(p2,"keys")+p3)).replace(regex("keyword1"),((p,p1,p2,p3)=>p1+gspan(p2,"keys1 keys")+p3)).replace(regex("keyword2"),(p=>gspan(p,"keys2 keys"))).replace(regex("numbers"),(p=>gspan(p,"number"))).replace(regex("ingraffe"),((p,p1,p2,p3,p4)=>p1+gspan(p2,"punc")+gspan(p3,"word")+gspan(p4,"punc"))).replace(regex("puntuaction"),(p=>gspan(p,"punc"))).replace(/★★T(\d+)★★/gu,((m,p)=>gspan(ids[Number(p)],"tag"))).replace(/★★S(\d+)★★/gu,((m,p)=>gspan(ids[Number(p)],"string"))).replace(/★★B(\d+)★★/gu,((m,p)=>gspan(ids[Number(p)],"string string1"))).replace(/★★A(\d+)★★/gu,((m,p)=>gspan(ids[Number(p)],"string string2"))).replace(/★★R(\d+)★★/gu,((m,p)=>gspan(ids[Number(p)],"regex"))).replace(/★★C(\d+)★★/gu,((m,p)=>gspan(ids[Number(p)],"comment"))).replace(/★★K(\d+)★★/gu,((m,p)=>ids[Number(p)])),punct?out.push(gspan((" "+r).substr(-4),"rowid")+gspan(v)):out.push(gspan(v))}else{let vv=str.split("\n");for(let v of vv)r++,punct?out.push(`${gspan((" "+r).substr(-4),"rowid")}${gspan(v)}`):out.push(gspan(v))}let xx=out.join("\n");return xx=xx.replace(/☉☋/gmu,"</span>").replace(/☉☊([^]*?)☊☉/gmu,((p,p1)=>{if(p1){let v1=p1.split(" "),aa=[];for(let v of v1)aa.push(`elang_${lang}${v}`),aa.push(`elang${v}`);return`<span class="${aa.join(" ")}">`}return"<span>"})),xx}class Render{constructor(baseurl,easy,callback){this.baseurl=baseurl,this.easy=easy,this.callback=callback}code(code,lang,codes){if(this.easy)return"";lang||(lang="js");let punct=lang==lang.toUpperCase();return elang(code,lang=lang.toLowerCase(),punct,codes)}blockquote(quote){return this.easy?quote:`<blockquote>\n${quote}</blockquote>\n`}html(html){return html}heading(text,level,raw){return"."==text||"*"==text?"":this.easy?`${text} `:`<h${level}>${text}</h${level}>`}hr(){return this.easy?"":'<div class="my-4"><hr/></div>'}list(body,ordered){let type=ordered?"ol":"ul";return`<${type}>\n${body}</${type}>\n`}listtitle(body){return`<span class="listtitle">${body}</span>`}listitem(text,num){return num?`<li attr-num="${num||""}">${text}</li>\n`:`<li>${text}</li>\n`}paragraph(text){return this.easy?text:`<p>${text}</p>\n`}table(header,body){return this.easy?"":`<table>\n<thead>\n${header}\n</thead>\n<tbody>\n${body}\n</tbody>\n</table>\n\n`}tablerow(content){return`<tr>\n${content}</tr>\n`}tablecell(content,header,align){if(header)return`<th style="text-align:center;">${content}</th>\n`;return`<td style="${align?"text-align:"+align+";":""}">${content}</td>`}colorbase(text){return`<span class='tilde'>${text}</span>`}formula(text,full=!1){if(this.easy)return"";let aa=`<img class='inline px-2' src='https://math.croswil.com/f?${text=text.replace(/<\/?em>/g," ").replace(/\r/g,"").replace("/\n/g"," ")}' alt='${text}'/>`;return full?`<div class='flex justify-center'><div>${aa}</div></div>`:aa}coloralt(text){return`<span class='tilde2'>${text}</span>`}strong(text){return"<strong>"+text+"</strong>"}ico(text){return`<span class="font-ico">${text}</span>`}em(text){return"<em>"+text+"</em>"}codespan(text){return"<code>"+text+"</code>"}br(){return"<br>"}del(text){return`<del>${text}</del>`}link(href,title,text){if(this.easy)return"("+text+")";let out;if("/"==href.substr(0,1)&&this.baseurl&&(href=this.baseurl+href.substr(1)),href.startsWith("!"))out=`<button class="mu-internal-link" data-href="${href=href.slice(1)}">${text}</button>`;else{let target="";href.startsWith(".")?href=href.slice(1):target='target="_blank"',out=`<a ${target} href='${href}' title='${title||""}'>${text}</a>`}return out}image(href,title,text){if(this.easy)return"";let v=text.split("|"),out="",iswebm=!1,ismp4=!1,ismp3=!1;if((href=(href=href.replace("https://www.youtube.com/watch?v=","https://youtu.be/")).replace("https://youtu.be","https://www.youtube.com/embed")).endsWith(".mp3")?(href=href.slice(0,-4),ismp3=!0):href.endsWith(".mp4")?(href=href.slice(0,-4),ismp4=!0):href.endsWith(".webm")?(href=href.slice(0,-5),iswebm=!0):href.endsWith(".video")&&(href=href.slice(0,-6),iswebm=!0,ismp4=!0),ismp3)out=`\n <audio controls ${v.length>=1?' width="'+v[1]+'"':""}\n class="mx-auto my-2 ${v.length>=2?v[2]:""}" \n >\n <source src="${href}.mp3" type="audio/mpeg">\n Il tuo browser non supporta l'elemento audio.\n </audio>\n `;else if(ismp4||iswebm)out=`\n<video ${v.length>=1?' width="'+v[1]+'"':""}\nclass="border rounded-lg shadow-xl ${v.length>=2?v[2]:""}" \ncontrols controlsList="nodownload" >\n ${iswebm?'<source src="'+href+'.webm" type="video/webm" >':""}\n ${ismp4?'<source src="'+href+'.mp4" type="video/mp4" >':""}\n \n Your browser does not support the video tag.\n</video>`;else{if(href.indexOf("https://www.youtu")>=0){let hh=href.split("/embed/")[1]?.split("?")[0];return out=`\n\n<div style="width: 94%; box-shadow: 6px 6px 10px hsl(206.5, 0%, 75%); margin: 3%;">\n <div style="position: relative; padding-bottom: 56.15%; height: 0; overflow: hidden;">\n <iframe \n style="position: absolute; top: 0; left:0; width: 100%; height: 100%; border: 0;"\n loading="lazy";\n srcdoc="<style>\n * {\n padding: 0;\n margin: 0;\n overflow: hidden;\n }\n \n body, html {\n height: 100%;\n }\n \n img, svg {\n position: absolute;\n width: 100%;\n top: 0;\n bottom: 0;\n margin: auto;\n }\n \n svg {\n filter: drop-shadow(1px 1px 10px hsl(206.5, 70.7%, 8%));\n transition: all 250ms ease-in-out;\n }\n \n body:hover svg {\n filter: drop-shadow(1px 1px 10px hsl(206.5, 0%, 10%));\n transform: scale(2);\n }\n </style>\n <a href='https://www.youtube.com/embed/${hh}?autoplay=1'>\n <img src='https://img.youtube.com/vi/${hh}/hqdefault.jpg' alt='${title||"video"}'>\n <svg xmlns='http://www.w3.org/2000/svg' width='64' height='64' viewBox='0 0 24 24' fill='none' stroke='#ffffff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' class='feather feather-play-circle'><circle cx='12' cy='12' r='10'></circle><polygon points='10 8 16 12 10 16 10 8'></polygon></svg>\n </a>\n "\n src="https://www.youtube.com/embed/${hh}" \n title="${title||"video"}"\n frameborder="0"\n allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" \n allowfullscreen>\n </iframe>\n </div>\n </div> \n \n`,out}this.callback&&"function"==typeof this.callback&&(href=this.callback({type:"img",href:href})),"/"==href.substr(0,1)&&this.baseurl&&(href=this.baseurl+href.substr(1)),out='<img src="'+href+'" alt="'+v[0]+'"',v.length>1&&(v[1].length&&(out+=' width="'+v[1]+'"'),v.length>2&&(out+=' class="'+v[2]+'"')),v[0]&&(out+=' title="'+v[0]+'"'),out+="/>"}return out}text(text){return text}}const irules=inline.gfm;let tokenparser=(res,render,maxlen=0)=>{let totl=0,checklen=body=>{if(maxlen>0&&body.length>maxlen-totl){let q=(body=body.substring(0,maxlen-totl)).lastIndexOf(" ");q>0&&(body=body.substring(0,q))}return body},next=()=>token=tokens.pop(),parseText=()=>{let body=token.text;for(;"text"===(tokens[tokens.length-1]||0).type;)body+="\n"+next().text;return output(checklen(body))},outputLink=(cap,link)=>{let href=escape(link.href),title=link.title?escape(link.title):null;return"!"!==cap[0].charAt(0)?render.link(href,title,output(cap[1])):render.image(href,title,escape(cap[1]))};const output=src=>{let link,text,href,cap,out="";for(;src;)if(cap=irules.escape.exec(src))src=src.substring(cap[0].length),out+=cap[1];else if(cap=irules.autolink.exec(src))src=src.substring(cap[0].length),"@"===cap[2]?(text=":"===cap[1].charAt(6)?cap[1].substring(7):cap[1],href=`mailto:${text}`):(text=escape(cap[1]),href=text),out+=render.link(href,null,text);else if(inLink||!(cap=irules.url.exec(src))){if(cap=irules.tag.exec(src))!inLink&&/^<a /i.test(cap[0])?inLink=!0:inLink&&/^<\/a>/i.test(cap[0])&&(inLink=!1),src=src.substring(cap[0].length),out+=cap[0];else if(cap=irules.link.exec(src))src=src.substring(cap[0].length),inLink=!0,out+=outputLink(cap,{href:cap[2],title:cap[3]}),inLink=!1;else if((cap=irules.reflink.exec(src))||(cap=irules.nolink.exec(src))){if(src=src.substring(cap[0].length),link=(cap[2]||cap[1]).replace(/\s+/g," "),link=links[link.toLowerCase()],!link||!link.href){out+=cap[0].charAt(0),src=cap[0].substring(1)+src;continue}inLink=!0,out+=outputLink(cap,link),inLink=!1}else if(cap=irules.formula.exec(src))src=src.substring(cap[0].length),out+=render.formula(output(cap[1]));else if(cap=irules.ico.exec(src))src=src.substring(cap[0].length),out+=render.ico(output(cap[2]||cap[1]));else if(cap=irules.strong.exec(src))src=src.substring(cap[0].length),out+=render.strong(output(cap[2]||cap[1]));else if(cap=irules.em.exec(src))src=src.substring(cap[0].length),out+=render.em(output(cap[2]||cap[1]));else if(cap=irules.code.exec(src))src=src.substring(cap[0].length),out+=render.codespan(escape(cap[2],!0));else if(cap=irules.br.exec(src))src=src.substring(cap[0].length),out+=render.br();else if(cap=irules.del.exec(src))src=src.substring(cap[0].length),out+=render.del(output(cap[1]));else if(cap=irules.coloralt.exec(src))src=src.substring(cap[0].length),out+=render.coloralt(output(cap[1]));else if(cap=irules.colorbase.exec(src))src=src.substring(cap[0].length),out+=render.colorbase(output(cap[1]));else if(cap=irules.text.exec(src))src=src.substring(cap[0].length),out+=render.text(cap[0]);else if(src)throw new Error("Infinite loop on byte: "+src.charCodeAt(0))}else src=src.substring(cap[0].length),text=escape(cap[1]),href=text,out+=render.link(href,null,text);return out};let token,tok=()=>{switch(token.type){case"space":return"";case"hr":return render.hr();case"heading":return render.heading(output(checklen(token.text)),token.depth,token.text);case"code":return"math"==token.lang?render.formula(token.text,!0):render.code(token.text,token.lang,codes);case"table":{let row,cell,j,header="",body=[];cell=[];for(let i=0;i<token.headers.length;i++)cell.push(render.tablecell(tokenparser(token.headers[i],render,0).out,!0,token.align[i]));header=render.tablerow(cell.join(""));for(let i=0;i<token.cells.length;i++){for(row=token.cells[i],cell=[],j=0;j<row.length;j++)cell.push(render.tablecell(tokenparser(row[j],render,0).out,!1,token.align[j]));body.push(render.tablerow(cell.join("")))}return render.table(header,body.join(""))}case"blockquote_start":{let body="";for(;"blockquote_end"!==next().type;)body+=tok();return render.blockquote(body)}case"list_start":{let body="",ordered=token.ordered;for(;"list_end"!==next().type;)body+=tok();return render.list(body,ordered)}case"list_title_start":{let body="";for(;"list_title_end"!==next().type;)body+=tok();return render.listtitle(body)}case"list_item_start":{let body="",num=token.num;for(;"list_item_end"!==next().type;)body+="text"===token.type?parseText():tok();return render.listitem(body,num)}case"html":return render.html(token.text);case"paragraph":return render.paragraph(output(checklen(token.text)));case"text":return render.paragraph(parseText());default:console.log("missing",token.type)}},tokens=res.reverse(),inLink=!1,links={},codes=[],out=[];for(;next();){let t=tok();if(totl+=t.length,t&&out.push(t),maxlen>0&&totl>maxlen)break}return{out:out.join(""),codes:codes}};function __parselist(tt,tm){let rr;function pb(exp,cl,callback){if(rr=exp.exec(tt),rr){__parselist(tt.slice(0,rr.index),tm);let t=rr[1];return t.startsWith("\n")&&(tm.push({class:"",text:"\n"}),t=t.slice(1)),tm.push({class:cl,text:callback?callback(t):t}),__parselist(tt.slice(rr.index+rr[1].length),tm),!0}return!1}tt&&"string"==typeof tt&&(pb(/^(:{3}\s*$[^]+?:{3}\s*$)/gim,"comment")||pb(/^(\s*`{3}[^]+?`{3}\s*$)/gim,"code")||pb(/^(\s*:\w+:.*)$/gim,"comment")||(tt=tt.replace(/ {2,}\n/gim," "),pb(/^(\s*#{1,6}\s+.*)/gim,"title")||pb(/(\n\s*\n)/gim,"break")||pb(/^(\s*>\s+[^]*?\n\n)/gim,"cite")||pb(/^(\s*>\s+.*)/gim,"cite")||pb(/^(.*?\|[^]*?\n\n)/gim,"table")||pb(/^( *\*| *-|-{1,8})[ $]/gim,"list")||pb(/^( ([\d]+[.]*)+)[ $]/gim,"list",(r=>{let vv=r.split(".");vv.shift();let cl=[];for(let v of vv)v.length&&cl.push(" ");return cl.push("-"),cl.join("")}))||tm.push({class:"",text:tt})))}function parselist(text,title=""){let tm=[];__parselist(text,tm);let counter=[],space=0;for(let ii=0;ii<tm.length;ii++){let t=tm[ii];if("list"==t.class){let sl=t.text.replace("\n","").length;if(sl>space)counter.push({space:sl,id:1}),space=sl;else for(;;){let c=counter[counter.length-1];if(1==counter.length||c.space<=sl){space=c.space,c.id++;break}counter.pop()}let cl=[],cl1=[];for(let c of counter)cl1.push(" "),cl.push(c.id);cl1.pop(),t.old=t.text,t.text.indexOf("-")>=0?t.text=cl1.join("")+"- "+cl.join(".")+".":t.text=cl1.join("")+"* ",cl=[];for(let j=ii+1;j<tm.length&&""==tm[j].class;j++)cl.push(tm[j].text);t.title=title,t.data=t.text+cl.join("")}else""!=t.class&&("title"==t.class&&(title=t.text),counter=[],space=0)}let cl=[],cards=[];for(let t of tm)"list"==t.class&&cards.push({title:t.title,lev:t.text,data:t.data}),cl.push(t.text);return{txt:cl.join(""),cards:cards,tm:tm}}function parserow$1(tt,tm,classe=""){let rr;function parse3(exp,cl){return rr=exp.exec(tt),!!rr&&(parserow$1(tt.slice(0,rr.index),tm,classe),tm.push({class:`${classe} ${cl}`,text:rr[1]}),parserow$1(rr[2],tm,`${classe} ${cl}`),tm.push({class:`${classe} ${cl}`,text:rr[3]}),parserow$1(tt.slice(rr.index+rr[1].length+rr[2].length+rr[3].length),tm,classe),!0)}(function parse1(exp,cl){return rr=exp.exec(tt),!!rr&&(parserow$1(tt.slice(0,rr.index),tm,classe),tm.push({class:`${classe} ${cl}`,text:rr[1]}),parserow$1(tt.slice(rr.index+rr[1].length),tm,classe),!0)})(/(`.*?`)/gim,"code2")||parse3(/(\*{3})([^]+?)(\*{3})/gim,"grassetto italico")||parse3(/(\*{2})([^]+?)(\*{2})/gim,"grassetto")||parse3(/(\*{1})([^]+?)(\*{1})/gim,"italico")||parse3(/(_{3})([^]+?)(_{3})/gim,"grassetto italico")||parse3(/(_{2})([^]+?)(_{2})/gim,"grassetto")||parse3(/(_{1})([^]+?)(_{1})/gim,"italico")||parse3(/(~{3})([^]+?)(~{3})/gim,"barrato")||parse3(/(~{2})([^]+?)(~{2})/gim,"tilde2")||parse3(/(~{1})([^]+?)(~{1})/gim,"tilde")||tm.push({class:classe,text:tt})}function parseblock$1(tt,tm){let rr;function pb(exp,cl,row=!1){return rr=exp.exec(tt),!!rr&&(parseblock$1(tt.slice(0,rr.index),tm),row?parserow$1(rr[1],tm,cl):tm.push({class:cl,text:rr[1]}),parseblock$1(tt.slice(rr.index+rr[1].length),tm),!0)}if(!(pb(/^(:{3}[^]+?:{3})/gim,"comment")||pb(/^(\s*`{3}[^]+?`{3})/gim,"code")||pb(/^(\s*:\w+:.*)$/gim,"comment")||pb(/^(\s*#{1,6} +.*)$/gim,"title",!0)||pb(/^(\s*>\s+[^]*?\n\n)/gim,"cite",!0)||pb(/^(\s*>\s+.*)/gim,"cite",!0)||pb(/^(.*?\|.*\n[-: ]+\|[-| :]*\n.*?\|[^]*?\n\n)/gim,"tabella",!0)||pb(/^(\n{2,})/gim,"break",!0)||pb(/^( *\*| *-|-{1,8})[ $]/gim,"list",!0)||pb(/(^\s*[\d.]+)[\s$]/gim,"list",!0))){if(rr=/(!*\[)(.*?)(\]\s*\()(.*?)(\))/.exec(tt),rr)return parserow$1(tt.slice(0,rr.index),tm,""),tm.push({class:"grassetto",text:rr[1]}),tm.push({class:"linkdes",text:rr[2]}),tm.push({class:"grassetto",text:rr[3]}),tm.push({class:"linkval",text:rr[4]}),tm.push({class:"grassetto",text:rr[5]}),void parserow$1(tt.slice(rr.index+rr[1].length+rr[2].length+rr[3].length+rr[4].length+rr[5].length),tm,"");parserow$1(tt,tm,"")}}function parsetext(tt){"number"==typeof tt&&(tt=String(tt)),tt&&"string"==typeof tt||(tt=" "),tt.endsWith("\n")&&(tt+=" ");let tm=[];return parseblock$1(tt,tm),tm}function parserow(tt,tm,classe=""){let rr;function parse1(exp,cl){return rr=exp.exec(tt),!!rr&&(parserow(tt.slice(0,rr.index),tm,classe),tm.push({class:`${classe} ${cl}`,text:rr[1]}),parserow(tt.slice(rr.index+rr[1].length),tm,classe),!0)}parse1(/(\/\/.*)$/gim,"commento2")||function parse2(exp,cl){if(rr=exp.exec(tt),rr){let ii=rr.index+rr[1].length;return parserow(tt.slice(0,ii),tm,classe),tm.push({class:`${classe} ${cl}`,text:rr[2]}),parserow(tt.slice(ii+rr[2].length),tm,classe),!0}return!1}(/(#let.? +)([\w_.]+)/gi,"variabile")||parse1(/(#(select|setdef|ret|cases|endselect|ifdef|log|msg|endif|cvar|cache|look|lookb|elseifdef|variante|forvar|for|endfor|continue|break|inc|macro|default|lets|letv|lett|cat|func))/gim,"comando")||parse1(/(#(if\s*|elseif\s*))/gim,"comando")||parse1(/(#(else|let|i |m |f |j |case|def ))/gim,"comando")||parse1(/(\$[{(]?[\w_.]+)/gim,"variabile")||parse1(/({.+?\})/gim,"formula")||parse1(/([})(])/gim,"variabile")||parse1(/([\d.:,;\\,]+)/gim,"digit")||tm.push({class:classe,text:tt})}function parseblock(tt,tm){let rr;(function pb(exp,cl,row=!1){return rr=exp.exec(tt),!!rr&&(parseblock(tt.slice(0,rr.index),tm),row?parserow(rr[1],tm,cl):tm.push({class:cl,text:rr[1]}),parseblock(tt.slice(rr.index+rr[1].length),tm),!0)})(/(\/\*[^]+?\*\/)/gim,"comment")||parserow(tt,tm,"")}function parserule(tt){tt||(tt=" "),tt.endsWith("\n")&&(tt+=" ");let tm=[];return parseblock(tt,tm),tm}function formatrule(code){let lines=code.split("\n"),formattedCode=[],indentLevel=0,next=0;for(let i=0;i<lines.length;i++){let line=lines[i].trim(),indent=" ".repeat(indentLevel>=0?indentLevel+next:next);next=0;let command="";line.split("//")[0].trim().endsWith("\\")&&(next=1),(line.startsWith("#")||line.startsWith("!"))&&(command=line.substring(1).split(" ")[0].toUpperCase(),line=line.substring(0,1)+command+line.substring(command.length+1)),"IF"==command||"IFDEF"==command||"IFNDEF"==command?line.indexOf("#",2)<0?indentLevel++:line=line.replace(/#([\w]+)/g,((match,m1)=>"#"+m1.toUpperCase())):["FOR","FORVAR","DO","SELECT"].includes(command)?indentLevel++:["ENDIF","LOOP","ENDFOR","ENDSELECT"].includes(command)&&(indentLevel--,indent=" ".repeat(indentLevel>=0?indentLevel:0)),["ELSEIF","ELSE","ELSEIFDEF","ELSEIFNDEF","CASE","CASES","DEFAULT"].includes(command)&&indentLevel>0?formattedCode.push(" ".repeat(indentLevel-1)+line):formattedCode.push(indent+line)}return formattedCode.join("\n")}function getcolonne(value){if((value=value+""||"").includes('"')){return value.split(/[,;](?=(?:(?:[^"]*["]){2})*[^"]*$)/).map((part=>part.trim().replace(/(^["'])|(["']$)/g,"").replace(/=\s*["']/g,"=")))}return value.split(/[,;]/).map((p=>p.trim()))}function formatvariante(str){let cl=[],ll=[];for(let c of str.split("\n")){let tm=getcolonne(c);for(let i=0;i<tm.length;i++){let t=tm[i]||"";(t.includes(",")||t.includes(";"))&&(t=`"${t}"`,tm[i]=t);let l=t.length;(!ll[i]||ll[i]<l)&&(ll[i]=l)}cl.push(getcolonne(c))}let res=[];for(let c of cl){let tm=[];for(let i=0;i<ll.length;i++)tm[i]=(c[i]||"").padEnd(ll[i]);res.push(tm.join(" , "))}return res.join("\n")}function markunoFormatCodeMirror(CodeMirror){CodeMirror.defineMode("markuno",(function(){return{startState:function(){return{inComment:!1}},token:function(stream,state){return state.inComment?(stream.skipTo("*/")?(stream.next(),stream.next(),state.inComment=!1):stream.skipToEnd(),"comment"):stream.match(/\/\/.*/)?"comment":stream.sol()&&stream.match(/^\s*\.[a-zA-Z0-9_]+(?=\s|$)/)?"def":state.expectMacroArg?stream.eatSpace()?null:stream.match(/^[^\s#,(){}]+/)?(state.expectMacroArg=!1,"builtin"):(stream.next(),state.expectMacroArg=!1,null):stream.sol()&&stream.match(/^\s*#([mif])\b/i)?(state.expectMacroArg=!0,"def"):stream.match("/*")?(stream.skipTo("*/")?(stream.next(),stream.next()):state.inComment=!0,"comment"):stream.match(/^\s*#(select|ret|cache|cvar|lookb|look|cases|endselect|log|msg|ifdef|ifndef|elseif|elseifndef|endif|elseifdef|variante|forvar|for|endfor|continue|break|inc|macro|default|lets|lett|cat|func|push|pop|letv|let|letm|lett|else)/i)||stream.match(/^\s*#(if\s*|elseif\s*|j |case|def )/i)||stream.match(/#(else|let|letv|lett|letm|cvar|cache|lookb|look)/i)?"keyword":!state.inCommand&&stream.match(/^\s*#[\w_.]+/i)?"string":stream.match(/^\s*![\w_.]+/i)?"builtin":stream.match(/[<>!=+\-*/\\%]+/)?"operator":stream.match(/\$\[[\w_.]+/)||stream.match(/\$\{[\w_.]+/)||stream.match(/\$\([\w_.]+/)||stream.match(/\$[\w_.]+/)||stream.match(/[}\])]/)?"string":stream.match(/\{.+?\}/)?"variable-3":stream.match(/[\d.:,;\\]+/)?"number":(stream.next(),null)}}}))}function parsevars(v,vars){let r=v;if(vars)for(let x in vars){let v2=vars[x]||`..${x}..`;r=r.replace(new RegExp(`\\[${x}\\]`,"gim"),v2)}return r}const parseinfomd=(data,info,mappa)=>aliasInfo.parse(data,info,mappa),mark=(xx,baseurl,notitle=!1,parsedlist=!1,callback)=>{let res;if(parsedlist)res=tokenize(xx,0,notitle);else{let{txt:txt}=parselist(xx);res=tokenize(txt,0,notitle)}return tokenparser(res,new Render(baseurl,!1,callback))},markeasy=(xx,maxlen=400,notitle=!1)=>{let res=tokenize(xx,maxlen,notitle);return tokenparser(res,new Render,maxlen).out};export{Render,aliasInfo,elang,escapeHTML,formatrule,formatvariante,mark,markeasy,markunoFormatCodeMirror,parseinfomd,parselist,parserule,parsetext,tokenparser as parsetokens,parsevars,tokenize,unescapeHTML};
package/bin/markuno.js CHANGED
@@ -127,10 +127,10 @@ function setOggetto(objDestinazione,objSorgente){"object"==typeof objDestinazion
127
127
  */function muCalc(expression){if(!expression)return 0;if("number"==typeof expression)return expression||0;if("string"!=typeof expression)return 0;const s=expression.replaceAll(",",".");return REGEX_NUMERO.test(s)?Number(s)||0:valutaparentesi(expression)||0}function valutavar(sh,res){const vv=res[0]||"";if(!vv)return"";if(sh.counter>=100)return vv;const tmps1=valuta0(sh,vv);let vx;if(sh.stl[tmps1])vx=`-- R:${tmps1} --`;else{const tmps=sh.var(tmps1);if(isObject(tmps))return tmps;sh.stl[tmps1]=!0,vx=valutabase(sh,tmps),delete sh.stl[tmps1]}if(sh.counter>=100)return vv;if(res[1]){const cols=getcolonne(vx);if("l"==res[1])return String(cols.length);const col=muCalc(valuta0(sh,res[1]));if(!(col>=0&&col<cols.length))return"";vx=valuta0(sh,cols[col])}if(res[2]){const c1=muCalc(valuta0(sh,res[2]));if(c1){let c2=0;return res[3]&&(c2=muCalc(valuta0(sh,res[3]))),c1<0?vx.slice(c1):c2?vx.substring(c1-1,c1+c2-1):vx.substring(c1-1)}}return vx}function valutaquadra(sh,res){let vv=getcolonne(res||"");const r1=clean(vv[0]);function replacecharcode(str){return"\\t"==str?"\t":"\\n"==str?"\n":(str||"").replace(/&(\d+)/g,((match,m1)=>String.fromCharCode(parseInt(m1))))}switch(r1){case"set":{const m1=valuta0(sh,vv[1]||""),m2=valuta0(sh,vv[2]||"");sh.add(m1,sh.var(m2))}break;case"ex":{const m1=valuta0(sh,vv[1]||"");let m2=valuta0(sh,vv[2]||"");m2||(m2=",");const m3=muCalc(valuta0(sh,vv[3]||"")),tm=m1.split(m2);return m3>0&&tm[m3-1]||""}case"ex2":{const sep=replacecharcode(vv[1]||""),pos=muCalc(valuta0(sh,vv[2]||""));vv.splice(0,3);return vv.join(";").split(sep)[pos>0?pos-1:0]||""}case"replace":return vv[1].replace(new RegExp(vv[2]||"x","gim"),(vv[3]||"").trim());case"replace2":case"rp2":try{let search=replacecharcode(vv[1]||"x");const replace=replacecharcode(vv[2]||"").trim();vv.splice(0,3),search=search.replace(/&(\d+)/g,((match,code)=>`\\u${parseInt(code).toString(16).padStart(4,"0")}`));return vv.join(";").replace(new RegExp(search,"im"),replace)}catch(error){return""}case"look":case"lookb":{const val=parseFloat(vv[1]||"");if(vv=vv.slice(2).map((e=>parseFloat(e)||0)),"lookb"==r1){const filtered=vv.filter((v=>v<=val));return filtered.length?Math.max(...filtered):val}{const filtered=vv.filter((v=>v>=val));return filtered.length?Math.min(...filtered):val}}case"tk":{let pos=muCalc(valuta0(sh,vv[1]||""))||0;if(!pos){pos=muCalc(valuta0(sh,vv[2]||""));const sep=vv[1]||"";return pos?vv[3].split(sep)[pos-1]:""}return vv[pos>0?pos+1:2]||""}case"totab":return vv.splice(0,1),vv.join("\t");case"tosep":{const sep=replacecharcode(vv[1]||"")||";";return vv.splice(0,2),vv.join(sep)}case"len":{let tm;return vv.length>2?(vv.shift(),tm=vv.join(";")):tm=vv[1]||"",tm.length}case"mid":{const str=valuta0(sh,vv[1]||""),pos=muCalc(valuta0(sh,vv[2]||"")),len=muCalc(valuta0(sh,vv[3]||""));return str.substring(pos-1,pos+len-1)}case"arrotonda":{const str=muCalc(vv[1]);let coeff=1;return["0","1","2","3","4","5","6"].includes(vv[2])?coeff=Math.pow(10,parseInt(vv[2])):(coeff=muCalc(vv[2]),0==coeff&&(coeff=1e3)),Math.round(str*coeff)/coeff}case"iif":return muCalc(valuta0(sh,vv[1]))?vv[2]||1:vv[3]||0;case"instr":case"instr2a":{const str1=vv[1]||"",str2=vv[2]||"";return str1.toLowerCase().indexOf(str2.toLowerCase())+1}case"instr2":{const str2=vv[1]||"";return vv.splice(0,2),vv.join(";").toLowerCase().indexOf(str2.toLowerCase())+1}default:return r1.startsWith(".")?{fun:res,pars:[]}:{fun:r1,pars:vv}}}function valuta0(sh,ex){if(ex+="",sh.counter>=100)return ex;for(;;){const rt=/\$([{(])/im.exec(ex);if(!rt)break;{const i1=rt.index,{i:i,res:res}="("==rt[1]?parsevar(ex,i1+2,"(",")"):parsevar(ex,i1+2,"{","}"),tm=valutavar(sh,res);if(isObject(tm))return tm;ex=valuta0(sh,ex.substring(0,i1))+tm+(i>=0?valuta0(sh,ex.substring(i+1)):"")}}return ex=(ex=ex.replace(/\$([a-z|][\w|.]*)/gi,((match,m1)=>{let m2="";for(;m1.length;){let tm;if(sh.stl[m1]?tm=`--R: ${m1} --`:(sh.stl[m1]=!0,tm=valutabase(sh,sh.var(m1)),delete sh.stl[m1]),tm||!(m1.length>1)){m2=tm+m2;break}m2=m1.slice(-1)+m2,m1=m1.substring(0,m1.length-1)}return m2}))).replace(/\$(\d+):(\d+)(:(\d+))?/g,((p0,p1,p2,p3,p4)=>{p4=p4?+p4:1;const cl=[];for(let i=+p1;i<=+p2;i+=p4)cl.push(i.toString());return cl.join(";")}))}function valutabase(sh,ex){return ex&&(sh.counter++,sh.counter<=100&&(ex=valuta0(sh,ex)),sh.counter--),ex}class Variabile{constructor(){this.stl={},this.dictionary={},this.vec=[],this.counter=0,this.fndotcallback=void 0}static isValidKey(key){return/^[\w][\w\d.[\]]*$/.test(key)}static sanitizeKey(key){return key.replace(/[^a-zA-Z0-9_.[\]]/g,"_")}setfndot(fndotcallback){this.fndotcallback=fndotcallback}
128
128
  /**
129
129
  * Salva lo stato corrente delle variabili nello stack
130
- */push(){this.vec.push({...this.dictionary})}
130
+ */push(){this.vec.push({saves:[],dic:{...this.dictionary}})}
131
131
  /**
132
132
  * Ripristina l'ultimo stato salvato delle variabili
133
- */pop(){this.vec.length>0&&(this.dictionary=this.vec.pop())}
133
+ */pop(){if(this.vec.length>0){let tm=this.vec.pop(),cl={};if(tm.saves&&tm.saves.length)for(let t of tm.saves)cl[t]=this.dictionary[t];if(this.dictionary=tm.dic,tm.saves&&tm.saves.length)for(let t of tm.saves)this.dictionary[t]=cl[t]}}savevars(str){if(!this.vec.length>0)return;let tm=this.vec[this.vec.length-1];tm.saves||(tm.saves=[]);let cl=str.split(",");for(let c of cl){const k=Variabile.sanitizeKey(c);k&&!tm.saves.includes(k)&&tm.saves.push(k)}}
134
134
  /**
135
135
  * Rimuove tutte le variabili e pulisce lo stack
136
136
  */clear(){this.vec=[],this.dictionary={}}azzera=()=>this.clear()
@@ -148,7 +148,7 @@ function setOggetto(objDestinazione,objSorgente){"object"==typeof objDestinazion
148
148
  */valutasync(str){return valutabase(this,str)}async valuta(ex,callback){this.stl={};let tm=await async function valutafunc(sh,ex,callback){if(ex){for(let ii=0;ii<20;ii++){const i1=ex.lastIndexOf("$[");if(!(i1>=0)){ex=valutabase(sh,ex);break}{const{i:i,res:res}=parsevar(ex,i1+2,"[","]"),t1=valutabase(sh,ex.substring(0,i1)),t2=res?res[0].startsWith(".")?valutabase(sh,res.join(":")):valutabase(sh,res[0]):"",t3=i>=0?valutabase(sh,ex.substring(i+1)):"";let t4=valutaquadra(sh,t2);if("object"==typeof t4&&(t4=callback?await callback(t4?.fun,t4.pars):`** fun: ${t4.fun} ** `),isObject(t4))return t4;ex=t1+t4+t3}}return ex}return""}(this,ex,callback);return isObject(tm)||(tm=(ex=>{for(;;){const i1=ex.indexOf("{");if(!(i1>=0))break;{const{i:i,res:res}=parsevar(ex,i1+1,"{","}");if(i<0)return ex;ex=ex.substring(0,i1)+muCalc(res[0])+(i>=0?ex.substring(i+1):"")}}return ex})(tm)),tm}async parametrokeyval(p){if("string"!=typeof p)return{};if(!(p=p.trim()))return{};let k,v,q,isnum=!1;return p.startsWith("#")&&(isnum=!0,p=p.slice(1)),q=p.indexOf("="),q>0?(k=clean(p.slice(0,q)),v=p.slice(q+1)):(q=p.indexOf(":"),q>0?(k=clean(p.slice(0,q)),v=p.slice(q+1),v=this.var(v)):(k=clean(p),v=this.var(k))),v&&"string"==typeof v&&v.includes("$")&&(v=await this.valuta(v)),["l","a","p"].includes(k)&&(isnum=!0),isnum&&(v=muCalc(v)),{k:k,v:v}}}class CodiceBarra{constructor(){this.barre={}}azzera(){this.barre={}}oriented(t,l,a,p){switch(t=(t||"1").substr(0,1).toLowerCase()){case"0":break;case"l":return{t:"l",x:l};case"a":return{t:"a",x:a};case"p":return{t:"p",x:p};case"2":return{t:t,x:l,y:p,z:a};case"5":return{t:t,x:l,y:a,z:p};case"4":return{t:t,x:p,y:l,z:a};case"3":return{t:t,x:a,y:p,z:l};case"6":return{t:t,x:p,y:a,z:l};default:return{t:"1",x:a,y:l,z:p}}}async getcode(codicebarratot,l,a,p,callback){let[codicebarra,modello]=codicebarratot.split(":");modello=modello||"";const getcode0=async(codicebarra,liv)=>{let barra=this.barre[codicebarra];if(!barra&&callback&&(barra=await callback(codicebarra),barra||(barra={t:"1",r:[]}),this.barre[codicebarra]=barra,barra.coderr&&"errore"!=barra.coderr||(barra.coderr=`#err_${codicebarra}`)),!barra||0==barra.r.length)return{extra:{err:"missing codicebarra"},c:`#err_${codicebarra}`,fm:10};const{t:t,x:x,y:y,z:z}=this.oriented(codicebarra,l,a,p),extra={barra:codicebarra,fm:barra.fm,t:t,liv:liv,items:barra.r.length,err:""};let bx=barra.r;if(z){const t2=bx.filter((e=>e.z===z||!e.z));t2.length>0?bx=t2:extra.err=`spessore non coerente: ${z}`}if("l"==t||"a"==t||"p"==t){const t=bx.find((e=>e.x>=x));if(t)return{c:t.c,fm:t.x==x?0:1,x1:t.x,x:x,extra:extra}}else{let t=bx.find((e=>e.x==x&&e.y==y));if(t)return{c:t.c,fm:0,x:x,y:y,z:z,x1:t.x,y1:t.y,z1:t.z,extra:extra};if(0!=barra.fm&&(t=bx.find((e=>e.x>=x&&e.y==y)),t))return{c:t.c,fm:1,x:x,y:y,z:z,x1:t.x,y1:t.y,z1:t.z,extra:extra};if(0!=barra.fm&&2!=barra.fm&&(t=bx.find((e=>e.x>=x&&e.y>=y)),t))return{c:t.c,fm:2,x:x,y:y,z:z,x1:t.x,y1:t.y,z1:t.z,extra:extra}}return barra.codalt&&liv<5?await getcode0(barra.codalt,liv+1):{c:barra.coderr,fm:9,x:x,y:y,z:z,extra:extra}};return await getcode0(codicebarra,0)}compila(vettore,headers){headers||(headers={});const barre={};if(Array.isArray(vettore)){for(const r of vettore)if(r.cod=clean(r.cod),r.barcode=clean(r.barcode),r.barcode.length>2&&"+"==r.barcode[0]){r.barcode=r.barcode.substr(1);const tm=this.oriented(r.barcode.substr(0,1),r.l,r.a,r.p);tm.c=r.modello?{c:r.cod,m:r.modello}:r.cod,barre[r.barcode]||(barre[r.barcode]={t:r.barcode.substr(0,1),r:[]},headers[r.barcode]&&(barre[r.barcode]=Object.assign(headers[r.barcode],barre[r.barcode]))),barre[r.barcode].r.push(tm)}for(const x in barre){barre[x].r.sort(((a,b)=>a.y?1e4*(a.x-b.x)+(a.y-b.y):a.x-b.x))}}this.barre=barre}}
149
149
  /**
150
150
  * Costanti e espressioni regolari utilizzate nel modulo
151
- */const keys="IFDEF|IFNDEF|SETDEF|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("|");function toCadPars(str){const t0=muClComments(str),t2=[];for(const row of t0){const t1=row.includes("(")||row.includes("[")?[row]:getcolonne(row,!0);let fl=!1;for(const t of t1)!t.startsWith('"')&&t.includes("=")?(t2.push(t),fl=!0):fl&&(t2[t2.length-1]+=","+t)}const pars={};for(const x of t2){let{v:v,o:o}=getcouple(x,"=",!1);o=o||"",v&&(/^[-+]?\d*\.?\d+$/.test(o)&&(o=parseFloat(o)),pars[v]=o)}return pars}
151
+ */const keys="IFDEF|IFNDEF|SETDEF|CACHE|RET|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("|");function toCadPars(str){const t0=muClComments(str),t2=[];for(const row of t0){const t1=row.includes("(")||row.includes("[")?[row]:getcolonne(row,!0);let fl=!1;for(const t of t1)!t.startsWith('"')&&t.includes("=")?(t2.push(t),fl=!0):fl&&(t2[t2.length-1]+=","+t)}const pars={};for(const x of t2){let{v:v,o:o}=getcouple(x,"=",!1);o=o||"",v&&(/^[-+]?\d*\.?\d+$/.test(o)&&(o=parseFloat(o)),pars[v]=o)}return pars}
152
152
  /**
153
153
  * Rimuove i commenti dal codice sorgente mantenendo la struttura del codice
154
154
  * @param {string} codice - Il codice sorgente da processare
@@ -251,7 +251,7 @@ this.amb=amb}
251
251
  * @param {Object|string} content - Contenuto da caricare, può essere un oggetto o una stringa
252
252
  * @returns {Promise<void>} Promise che si risolve al completamento del caricamento
253
253
  */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){if(_nofunc[cmd])return"";let a=await cbFunc(cmd,pars,vari,amb,output);return isObject(a)||(a=(a||"").trim(),"!"==a&&(_nofunc[cmd]=!0,a="")),a}return tm}async function intvaluta(amb,mac,str){return await amb.vari.valuta(str,(async(fun,pars)=>{if("dim"===fun){let dm=muCalc(pars[1]),vv=await dammivariante(amb,mac,pars[2]),col=parseInt(pars[3])||2;return vv&&vv.fromdim?vv.fromdim(dm,col):dm}return await getcbfunc(`**fun:${fun}**`,fun,pars,amb.vari,amb)}))}async function dammivariante(amb,macro,ky){let tm;return tm=macro&&macro?.localvar&&macro.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))}
254
- /** @type {Variante} */if(head&&head.alias&&(ky=head.alias),macro&&macro.paralias&&macro.paralias[a]&&(ky=macro.paralias[a]),tm=await dammivariante(amb,macro,ky),tm)if(head&&head.t){head.des||(head.des=tm.des);let x8=head?.filtra||"";if(x8.includes("$")&&(x8=await amb.vari.valuta(x8)),"m"===head.t){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}async function pushpars(amb,macro,parsfunzione,parsinit){const fatti={},vals=[];if(parsfunzione)for(const x of parsfunzione){const{v:v,o:o,fl:fl}=getcouple(x);fatti[v]||(fatti[v]=!0,vals.push({v:v,o:amb.vari.var[v]}),fl&&await impostavariante(amb,macro,v,o))}if(parsinit)for(const x of parsinit){const{v:v,o:o,fl:fl}=getcouple(x);fatti[v]||(fatti[v]=!0,vals.push({v:v,o:amb.vari.var[v]}),fl&&await impostavariante(amb,macro,v,o))}return vals}function poppars(amb,tm){if(tm)for(const x of tm)amb.vari.add(x.v,x.o)}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;tk();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&&parametri.length)for(const x of parametri){const x1=clean(x.split("=")[0]||"",!0);x1&&(saved[x1]=vari.dictionary[x1])}await macro.impostaparametri(parametri,pars);const rs1=await muEval(amb,macro,macro.codice,options);for(const v in saved)saved[v]?vari.dictionary[v]=saved[v]:delete vari.dictionary[v];output.push(...rs1),options._stackmacro--,options._inc=!1}break;case"MACRO":case"M":case"FUNC":case"F":if(options._stackmacro>500)errori.add("stack chiamate macro troppo profondo!",riga);else{let{macro:macro,pars:pars,xid:xid}=await amb.getmacro(riga)||{};if(macro){const ismacro=!!options.grafica||["F","FUNC"].includes(riga.tipo),optid=options.id||"",parametri=macro.parametri?._,saved={};if(ismacro)vari.push();else{if(macro.head)for(const x of macro.head)saved[x.cod]=amb.vari.var(x.cod);if(parametri&&parametri.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(macro,amb,genera,callback,isTestmode=0){if(macro.isgenera&&callback){const output={counter:0,keys:{},isTestmode:isTestmode};if(genera){if(!macro.genera[genera])return!1;await muGenerate_0(macro,amb,genera,callback,output)}else for(const gg in macro.genera)await muGenerate_0(macro,amb,gg,callback,output);return!0}}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"],tipiheader=[{cod:"t",des:"Variante"},{cod:"q",des:"V.Query"},{cod:"f",des:"Valore Fisso"},{cod:"g",des:"Gruppo"},{cod:"s",des:"Libero"},{cod:"m",des:"Misura"},{cod:"c",des:"Check (no/si)"},{cod:"z",des:"Check (si/no)"},{cod:"h",des:"Hidden"},{cod:"p",des:"Programmato"}],tipicolonna=[{cod:"",des:"Libero"},{cod:"a",des:"Area"},{cod:"t",des:"Thumb",folder:"thumbs"},{cod:"i",des:"Image",folder:"textures"},{cod:"x",des:"3D file",folder:"3d"},{cod:"f",des:"Funzione",folder:"script"}];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,
254
+ /** @type {Variante} */if(head&&head.alias&&(ky=head.alias),macro&&macro.paralias&&macro.paralias[a]&&(ky=macro.paralias[a]),tm=await dammivariante(amb,macro,ky),tm)if(head&&head.t){head.des||(head.des=tm.des);let x8=head?.filtra||"";if(x8.includes("$")&&(x8=await amb.vari.valuta(x8)),"m"===head.t){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}async function pushpars(amb,macro,parsfunzione,parsinit){const fatti={},vals=[];if(parsfunzione)for(const x of parsfunzione){const{v:v,o:o,fl:fl}=getcouple(x);fatti[v]||(fatti[v]=!0,vals.push({v:v,o:amb.vari.var[v]}),fl&&await impostavariante(amb,macro,v,o))}if(parsinit)for(const x of parsinit){const{v:v,o:o,fl:fl}=getcouple(x);fatti[v]||(fatti[v]=!0,vals.push({v:v,o:amb.vari.var[v]}),fl&&await impostavariante(amb,macro,v,o))}return vals}function poppars(amb,tm){if(tm)for(const x of tm)amb.vari.add(x.v,x.o)}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;tk();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&&parametri.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&&parametri.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(macro,amb,genera,callback,isTestmode=0){if(macro.isgenera&&callback){const output={counter:0,keys:{},isTestmode:isTestmode};if(genera){if(!macro.genera[genera])return!1;await muGenerate_0(macro,amb,genera,callback,output)}else for(const gg in macro.genera)await muGenerate_0(macro,amb,gg,callback,output);return!0}}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"],tipiheader=[{cod:"t",des:"Variante"},{cod:"q",des:"V.Query"},{cod:"f",des:"Valore Fisso"},{cod:"g",des:"Gruppo"},{cod:"s",des:"Libero"},{cod:"m",des:"Misura"},{cod:"c",des:"Check (no/si)"},{cod:"z",des:"Check (si/no)"},{cod:"h",des:"Hidden"},{cod:"p",des:"Programmato"}],tipicolonna=[{cod:"",des:"Libero"},{cod:"a",des:"Area"},{cod:"t",des:"Thumb",folder:"thumbs"},{cod:"i",des:"Image",folder:"textures"},{cod:"x",des:"3D file",folder:"3d"},{cod:"f",des:"Funzione",folder:"script"}];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,
255
255
  /** @type {Ambiente} */
256
256
  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&&(tm=await cbGetMacro(cat,name),"string"==typeof tm&&(tm.startsWith("{")||tm.startsWith("["))&&(tm=fromjson(tm)),tm&&tm.head&&!Array.isArray(tm.head)&&(tm.head=[]),this.amb.checkscript(tm.linkscript),delete tm.linkscript,tm.head&&(tm.dims=getheaddims(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&&(res=await cbGetFile(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&&(res=await cbGetFile(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)}}function parsevariabili(text){let fl=!1;const tk=[];for(;;){const m=/\$([{[(])/m.exec(text);if(!m){text&&fl&&tk.push({class:"",text:text});break}{fl=!0;const classe="["==m[1]?"inline":"variabile";m.index>0&&tk.push({class:"",text:text.substring(0,m.index)});const{i:i}=parsevar(text,m.index+2,m[1],null);if(!(i>m.index)){tk.push({class:classe,text:text.substring(m.index)});break}tk.push({class:classe,text:text.substring(m.index,i+1)}),text=text.substring(i+1)}}return{fl:fl,tk:tk}}function parseexp(text,exp,callback){if(!callback)throw new Error("missing callback");let fl=!1;const tk=[];for(;;){const m=exp.exec(text);if(!m){text&&fl&&tk.push({class:"",text:text});break}m.index>0&&tk.push({class:"",text:text.substring(0,m.index)}),tk.push(...callback(m)),fl=!0,text=text.substring(m.index+m[0].length)}return{fl:fl,tk:tk}}
257
257
  /**
@@ -259,10 +259,10 @@ this.amb=amb,this.azzera()}azzera(){this.key=`${this.cat}/${this.name}`,this.loc
259
259
  * @param {string} tt - Il codice sorgente da analizzare
260
260
  * @param {boolean} isvar - Flag che indica se analizzare come variabile
261
261
  * @returns {Array<{class: string, text: string}>} Array di token con classi CSS
262
- */function muParsecode(tt,isvar){tt||(tt=" "),tt.endsWith("\n")&&(tt+=" ");const tm=[{class:"",text:tt}];for(let i=0;i<tm.length;i++)if(!tm[i].class){{const{fl:fl,tk:tk}=parseexp(tm[i].text,/(\/\*[^]+?\*\/)/im,(m=>[{class:"comment",text:m[1]}]));fl&&tm.splice(i,1,...tk)}if(!tm[i].class){{const{fl:fl,tk:tk}=parseexp(tm[i].text,/(\/\/.*)$/im,(m=>[{class:"commento2",text:m[1]}]));fl&&tm.splice(i,1,...tk)}if(!tm[i].class){{const{fl:fl,tk:tk}=parseexp(tm[i].text,/(^\s*\{.+?\})/m,(m=>[{class:"header",text:m[1]}]));fl&&tm.splice(i,1,...tk)}if(!tm[i].class){{const{fl:fl,tk:tk}=parseexp(tm[i].text,/(^\s*:\w+)(.*?$)/m,(m=>[{class:"param",text:m[1]},{class:"param2",text:m[2]}]));fl&&tm.splice(i,1,...tk)}if(!isvar){if(tm[i].class)continue;{const{fl:fl,tk:tk}=parseexp(tm[i].text,/(^\s*!\w+)/m,(m=>[{class:"function",text:m[1]}]));fl&&tm.splice(i,1,...tk)}if(tm[i].class)continue;{const{fl:fl,tk:tk}=parseexp(tm[i].text,/(#let.? +)([\w_.]+)/im,(m=>[{class:"comando",text:m[1]},{class:"variabile",text:m[2]}]));fl&&tm.splice(i,1,...tk)}if(tm[i].class)continue;{const{fl:fl,tk:tk}=parseexp(tm[i].text,/(#(push|pop|select|cases|endselect|ifndef|elseifndef|ifdef|endif|elseifdef|variante|forvar|for|endfor|continue|break|inc|macro|default|letm|lets|letv|lett|leto|cat))/im,(m=>[{class:"comando",text:m[1]}]));fl&&tm.splice(i,1,...tk)}if(tm[i].class)continue;{const{fl:fl,tk:tk}=parseexp(tm[i].text,/(#(if\s*|elseif\s*))/im,(m=>[{class:"comando",text:m[1]}]));fl&&tm.splice(i,1,...tk)}if(tm[i].class)continue;{const{fl:fl,tk:tk}=parseexp(tm[i].text,/(#(else|i |m |f |j |case|def ))/im,(m=>[{class:"comando",text:m[1]}]));fl&&tm.splice(i,1,...tk)}if(tm[i].class)continue;{const{fl:fl,tk:tk}=parsevariabili(tm[i].text);fl&&tm.splice(i,1,...tk)}if(tm[i].class)continue;{const{fl:fl,tk:tk}=parseexp(tm[i].text,/(\$[\w_.]+)/im,(m=>[{class:"variabile",text:m[1]}]));fl&&tm.splice(i,1,...tk)}}}}}}return tm}class Pickers{constructor(){this.clear()}clear(){this.d={},this.keypics={},this.key="",this.keypics[this.key]=0}reset(){this.keypics={},this.key="";for(let k in this.d)this.d[k]._invalid=!0}pack(){let cl=[];Object.entries(this.d).forEach((([k,v])=>{v._invalid&&cl.push(k),delete v._invalid}));for(let c of cl)delete this.d[c]}setkey(k){this.key=k,this.keypics[k]||(this.keypics[k]=0)}add(data){let _id=this.keypics[this.key]||0,k=`${this.key}_${_id}`;this.keypics[this.key]=_id+1;let d=this.d[k]??{};return data=data??{},this.d[k]={...d,...data,_invalid:!1,_key:this.key,_id:_id},k}}function toruleset(rs){const o={};if(rs&&rs.length)for(const r of rs)o[r.cod]=r;return o}function headerconvert(tt){const rr=muClComments(tt,!1);tt={};let grp={r:[]},fl=!1;for(const r of rr){const m=/^\s*\{(h|head|header)\s+(\w+)\}/im.exec(r);if(m)grp={cod:m[2],des:m[2],r:[]},fl=!1,tt[m[2]]=grp;else if(!/^\s*:/.exec(r)){const v=r.split(","),t={cod:clean(v[0])};let tm;tm=(v[1]||"").trim(),tm&&(t.des=tm),tm=clean(v[2]),tm&&(t.tipo=tm),tm=clean(v[3]),tm&&(t.alias=tm),tm=clean(v[4]),tm&&(t.valid=tm),tm=clean(v[5]),tm&&(t.visible=tm),t.cod&&(fl||"sep"!=t.tipo?grp.r.push(t):(grp.des=t.des,grp.valid=t.valid,grp.visible=t.visible,fl=!0))}}return tt}function aliasconvert(tt){const rr=muClComments(tt.toLowerCase(),!1),tx={};for(const r of rr)if(!/^\s*:/.exec(r)){const v=getcolonne(r);v[0]&&v[1]&&(tx[v[0]]={cod:v[1]})}return tx}class Ambiente{#headers=void 0;#alias=void 0;#deriva=void 0;#typos=void 0;constructor(cat=".",maxdelays=100,righevuote=!1){this.righevuote=righevuote,this.maxdelays=maxdelays,this.setcatalog(cat),this.fndotcallback=void 0,this.pick=new Pickers}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){
262
+ */function muParsecode(tt,isvar){tt||(tt=" "),tt.endsWith("\n")&&(tt+=" ");const tm=[{class:"",text:tt}];for(let i=0;i<tm.length;i++)if(!tm[i].class){{const{fl:fl,tk:tk}=parseexp(tm[i].text,/(\/\*[^]+?\*\/)/im,(m=>[{class:"comment",text:m[1]}]));fl&&tm.splice(i,1,...tk)}if(!tm[i].class){{const{fl:fl,tk:tk}=parseexp(tm[i].text,/(\/\/.*)$/im,(m=>[{class:"commento2",text:m[1]}]));fl&&tm.splice(i,1,...tk)}if(!tm[i].class){{const{fl:fl,tk:tk}=parseexp(tm[i].text,/(^\s*\{.+?\})/m,(m=>[{class:"header",text:m[1]}]));fl&&tm.splice(i,1,...tk)}if(!tm[i].class){{const{fl:fl,tk:tk}=parseexp(tm[i].text,/(^\s*:\w+)(.*?$)/m,(m=>[{class:"param",text:m[1]},{class:"param2",text:m[2]}]));fl&&tm.splice(i,1,...tk)}if(!isvar){if(tm[i].class)continue;{const{fl:fl,tk:tk}=parseexp(tm[i].text,/(^\s*!\w+)/m,(m=>[{class:"function",text:m[1]}]));fl&&tm.splice(i,1,...tk)}if(tm[i].class)continue;{const{fl:fl,tk:tk}=parseexp(tm[i].text,/(#let.? +)([\w_.]+)/im,(m=>[{class:"comando",text:m[1]},{class:"variabile",text:m[2]}]));fl&&tm.splice(i,1,...tk)}if(tm[i].class)continue;{const{fl:fl,tk:tk}=parseexp(tm[i].text,/(#(push|pop|ret|select|cases|endselect|ifndef|elseifndef|ifdef|endif|elseifdef|variante|forvar|for|endfor|continue|break|inc|macro|default|letm|lets|letv|lett|leto|cat))/im,(m=>[{class:"comando",text:m[1]}]));fl&&tm.splice(i,1,...tk)}if(tm[i].class)continue;{const{fl:fl,tk:tk}=parseexp(tm[i].text,/(#(if\s*|elseif\s*))/im,(m=>[{class:"comando",text:m[1]}]));fl&&tm.splice(i,1,...tk)}if(tm[i].class)continue;{const{fl:fl,tk:tk}=parseexp(tm[i].text,/(#(else|i |m |f |j |case|def ))/im,(m=>[{class:"comando",text:m[1]}]));fl&&tm.splice(i,1,...tk)}if(tm[i].class)continue;{const{fl:fl,tk:tk}=parsevariabili(tm[i].text);fl&&tm.splice(i,1,...tk)}if(tm[i].class)continue;{const{fl:fl,tk:tk}=parseexp(tm[i].text,/(\$[\w_.]+)/im,(m=>[{class:"variabile",text:m[1]}]));fl&&tm.splice(i,1,...tk)}}}}}}return tm}class Pickers{constructor(){this.clear()}clear(){this.d={},this.keypics={},this.key="",this.keypics[this.key]=0}reset(){this.keypics={},this.key="";for(let k in this.d)this.d[k]._invalid=!0}pack(){let cl=[];Object.entries(this.d).forEach((([k,v])=>{v._invalid&&cl.push(k),delete v._invalid}));for(let c of cl)delete this.d[c]}setkey(k){this.key=k,this.keypics[k]||(this.keypics[k]=0)}add(data){let _id=this.keypics[this.key]||0,k=`${this.key}_${_id}`;this.keypics[this.key]=_id+1;let d=this.d[k]??{};return data=data??{},this.d[k]={...d,...data,_invalid:!1,_key:this.key,_id:_id},k}}function toruleset(rs){const o={};if(rs&&rs.length)for(const r of rs)o[r.cod]=r;return o}function headerconvert(tt){const rr=muClComments(tt,!1);tt={};let grp={r:[]},fl=!1;for(const r of rr){const m=/^\s*\{(h|head|header)\s+(\w+)\}/im.exec(r);if(m)grp={cod:m[2],des:m[2],r:[]},fl=!1,tt[m[2]]=grp;else if(!/^\s*:/.exec(r)){const v=r.split(","),t={cod:clean(v[0])};let tm;tm=(v[1]||"").trim(),tm&&(t.des=tm),tm=clean(v[2]),tm&&(t.tipo=tm),tm=clean(v[3]),tm&&(t.alias=tm),tm=clean(v[4]),tm&&(t.valid=tm),tm=clean(v[5]),tm&&(t.visible=tm),t.cod&&(fl||"sep"!=t.tipo?grp.r.push(t):(grp.des=t.des,grp.valid=t.valid,grp.visible=t.visible,fl=!0))}}return tt}function aliasconvert(tt){const rr=muClComments(tt.toLowerCase(),!1),tx={};for(const r of rr)if(!/^\s*:/.exec(r)){const v=getcolonne(r);v[0]&&v[1]&&(tx[v[0]]={cod:v[1]})}return tx}class Ambiente{#headers=void 0;#alias=void 0;#deriva=void 0;#typos=void 0;constructor(cat=".",maxdelays=100,righevuote=!1){this.righevuote=righevuote,this.maxdelays=maxdelays,this.setcatalog(cat),this.fndotcallback=void 0,this.pick=new Pickers}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){
263
263
  /** @type {Variabile} */
264
264
  this.imgpreview={},this.vari=new Variabile,this.ruleset={},this.fndotcallback&&this.vari.setfndot(this.fndotcallback),this.ruleheader="",mode&&(
265
265
  /** @type {Object.<string, Macro>} */
266
266
  this.macro={},
267
267
  /** @type {Object.<string, Variante>} */
268
- this.varianti={},this.varelenco={},this.macroelenco={},this.scripts={},this.#headers=void 0,this.#alias=void 0,this.#deriva=void 0,this.#typos=void 0)}setimgpreview(cod,img){img?this.imgpreview[cod]=img:delete this.imgpreview[cod]}getimgpreview(cod){return this?.imgpreview[cod||""]}setfndot(fndotcallback){this.fndotcallback=fndotcallback,this.vari.setfndot(fndotcallback)}async#checkelencovar(cat){if(cbInfo&&!this.varelenco[cat]){const tm=await cbInfo("headers",cat,"_varianti");Array.isArray(tm)?this.varelenco[cat]=tm:tm.vars&&(this.varelenco[cat]=tm.vars,tm.alias&&(this.#alias=tm.alias)),this.varelenco[cat]||(this.varelenco[cat]=[])}}parseheaderfrominfo(tm){if(tm&&tm.length>0)for(const t of tm)switch(t.tipo){case"_headers":"string"==typeof t.value&&(t.value=headerconvert(t.value)),this.#headers=t.value||{};break;case"_alias":"string"==typeof t.value&&(t.value=aliasconvert(t.value)),this.#alias=t.value||{};break;case"_typos":if("string"==typeof t.value){const tips=fromjson(t.value);for(const tp in tips){const tq=tips[tp];tq.db&&(tq.db=muClean(muClComments(tq.db))),tq.list&&(tq.list=muClean(muClComments(tq.list)))}t.value=tips}this.#typos=t.value||{}}}setitem(item,rule,model,ruleset=[],datadelgiorno=0){this.item=clean(item,!0),this.rule=clean(rule,!0),this.model=clean(model,!0),this.ruleset=toruleset(ruleset),this.data=datadelgiorno||(new Date).toInt()}async getheader(cod){let tm;return!this.#headers&&cbInfo&&(tm=await cbInfo("headers",this.cat,"_headers"),this.parseheaderfrominfo(tm)),this.#headers||(this.#headers={}),this.#headers[cod]}async getalias(){let tm;return!this.#alias&&cbInfo&&(tm=await cbInfo("headers",this.cat,"_alias"),this.parseheaderfrominfo(tm)),this.#alias||(this.#alias={}),this.#alias}get deriva(){return this.#deriva,this.#deriva||[]}async getmacro(riga){try{if("string"==typeof riga&&(riga={tipo:"M",contenuto:riga}),!riga||!riga.contenuto)return;let ct=riga.contenuto;ct.startsWith("$")&&(ct=await this.vari.valuta(ct));const rr=/^([({}):$\w.\\/]+)[\s;,]*(.*)?$/im.exec(ct);if(!rr)return void errori.add("Macro non valida:"+ct,riga);let macro=clean(rr[1],!0);macro.includes("$")&&(macro=await this.vari.valuta(macro));const pars=getcolonne(rr[2]),{name:name,cat:cat}=checkmu(macro,this.cat);this.cat=cat;const ky=`${cat}/${name}`;if(!this.macro[ky]){const tm=new Macro(this,name);await tm.load()?this.macro[ky]=tm:errori.add(`macro fail to load ${ky}`,riga)}return macro=this.macro[ky],macro?{macro:macro,pars:pars}:(errori.add(`macro non trovata ${ky}`,riga),{})}catch(error){errori.add(geterrdes(error),`ambiente.getmacro: ${riga?.contenuto}`)}}async getvariante(cod){const{name:name,cat:cat}=checkmu(cod,this.cat);let n2=name,altri={};if(cat==this.cat&&this.#alias&&this.#alias[name]&&(altri=this.#alias[name]||{},n2=altri.cod),await this.#checkelencovar(cat),this.varelenco[cat]&&!this.varelenco[cat].includes(name))return;const key=`${cat}/${n2}`;let vv;return this.varianti[key]?vv=this.varianti[key]:(vv=new Variante(this),await vv.load(key,cat),this.varianti[key]=vv),altri&&(altri.des&&(vv.des=altri.des),altri.vdef&&(vv.vdef=altri.vdef)),vv}async varcompila(v,callback){const xx=new Variante(this);if(await xx.load(v,this.cat,!0),xx.alias){(await this.getalias())[v]=xx.alias}callback("variants",{cod:v,des:xx.des||"",alias:xx.alias,info:xx.alias?"":JSON.stringify(getOggetto(xx,["amb"]))})}async macrocompila(v,callback){const mac=new Macro(this,v);await mac.loadAndCompile(`${v}.mu`);const t=mac.getmacro();callback("macros",{cod:v,info:JSON.stringify(t),isgenera:mac.isgenera,isheader:mac.isheader,iscodice:mac.iscodice})}async barrecompila(articolibarre,titolibarre,callback){const cc=new CodiceBarra;await cc.compila(articolibarre,titolibarre);for(const x in cc.barre){callback("barcodes",{cod:x,des:"",info:JSON.stringify(cc.barre[x])})}return cc}async tojson(d){let tm;return cbFunc&&(tm=await cbFunc("json",d)),tm}async compila(info,callback){if(callback){for(const v of info.var)await this.varcompila(v,callback);for(const v of info.mu)await this.macrocompila(v,callback);if(callback("infos",{cod:"info",des:info.cat,info:JSON.stringify({cat:info.cat,md:info.info})}),this.#headers=void 0,this.#alias=void 0,this.#deriva=void 0,this.#typos=void 0,cbInfo){const tm=await cbInfo("headers",this.cat,["_headers","_alias","_deriva","_typos"]);this.parseheaderfrominfo(tm)}this.#headers?callback("infos",{cod:"headers",des:"",info:JSON.stringify(this.#headers)}):logga("missing headers"),this.#alias&&callback("infos",{cod:"alias",des:"",info:JSON.stringify(this.#alias)}),this.#deriva&&callback("infos",{cod:"deriva",des:"",info:JSON.stringify(this.#deriva)}),this.#typos&&callback("infos",{cod:"typos",des:"tipologie",info:JSON.stringify(this.#typos)})}}async checkvarianti(cat,vars){if(!cat||!vars?.length)return;cat=checkname(cat),await this.#checkelencovar(cat);const t=this.varelenco[cat],vn=[];for(let v of vars){v=clean(v,!0);const nn=`${cat}/${v}`;this.varianti[nn]||t&&t.includes(v)&&vn.push(v)}if(vn.length&&cbGetVariante){const xv=await cbGetVariante(cat,vn);if(xv&&xv.length)for(const x of xv){const{name:name,content:content}=x,vv=new Variante(this);vv.setheader(name,cat),content&&await vv.loadContentExtended(content),this.varianti[vv.key]=vv}}}async getheaderfromdb(name){const totale=await cbInfo("header",this.cat,name,!this.#deriva);let{head:head,rows:rows,macros:macros,deriva:deriva,llvars:llvars}=totale;for(const r of rows)r.cod=clean(r.cod),r.alias=clean(r.alias),r.t=clean(r.t);if(!llvars){llvars=new Set;for(const r of rows)if("p"==r.tipo);else{const nn=r.alias?r.alias:r.cod;llvars.add(nn)}llvars=[...llvars]}this.#deriva||(this.#deriva=deriva),await this.#checkelencovar(this.cat),head.cod=clean(head.cod),head.rule=clean(head.rule),head.ruledef=head.ruledef||[];const vn=[],t=this.varelenco[this.cat];for(const nn of llvars)this.varianti[`${this.cat}/${nn}`]||t&&t.includes(nn)&&vn.push(nn);if(vn.length&&cbGetVariante){const vars=await cbGetVariante(this.cat,vn);if(vars&&vars.length)for(const x of vars){const{name:name,content:content}=x,vv=new Variante(this);vv.setheader(name,this.cat),content&&await vv.loadContentExtended(content),this.varianti[vv.key]=vv}}return{head:head,rows:rows,macros:macros}}async getlinkedmacros(rule,macros){const getkey=n=>n.includes("/")?n:`${this.cat}/${n}`,cl=[];let k;if(rule&&(k=getkey(rule),this.macro[k]||cl.push(rule)),macros&&"string"==typeof macros){const vv=macros.split(";");for(const v of vv)k=getkey(v),this.macro[k]||cl.push(v)}if(cl&&cl.length>0&&cbGetMacro){const tm=await cbGetMacro(this.cat,cl);if(tm&&tm.length>0)for(const x of tm){this.checkscripts(x.content?.linkscript),delete x.content.linkscript;const m=new Macro(this,x.name);for(const t in x.content){const contenuto=x.content[t];m[t]=contenuto}this.macro[m.key]=m}}}checkscripts(vv){if(vv&&vv.length)for(let v of vv)this.scripts[v.name]||(this.scripts[v.name]=v.value)}async setruleheader(rule,pars,ruleset){const{name:name,cat:cat}=checkmu(rule,this.cat);ruleset&&ruleset.length&&(this.ruleset=toruleset(ruleset));const ky=`${cat}/${name}`;if(!this.macro[ky]){const totale=await this.getheaderfromdb(name),{head:head,rows:rows,macros:macros}=totale;await this.getlinkedmacros(head.rule,macros);const tm=new Macro(this,name);if(!head)return void errori.add("Missing rule: "+rule);if(head.rule){const k2=this.macro[`${cat}/${head.rule}`];if(k2)for(const x in k2)["cat","name","key"].includes(x)||(tm[x]=k2[x])}rows&&rows.length&&(tm.head=rows),this.macro[ky]=tm}this.ruleheader=ky;const mc=this.macro[ky];return errori.azzera(),await mc.setparametri(pars),mc}getruleheader(){return this.macro[this.ruleheader]}async setvariante(cod,opz){return await impostavariante(this,null,cod,opz)}async valuta(codice){let output;return"string"==typeof codice&&(codice=muClean(muClComments(codice,this.righevuote))),Array.isArray(codice)&&(logga("m1",codice),output=await muEval(this,null,codice)),output}setinfos(tm){tm&&(this.#headers=tm.headers,this.#alias=tm.alias,this.#deriva=void 0,this.#typos=tm.typos)}async splitteroggetti(name){let data=await this.getvariante(name),cl=[];return data?.rows&&Object.values(data.rows).forEach((v=>{cl.push({tipo:v.v[2]||"",cod:v.v[0]||"",des:v.v[1]||"",macro:v.v[4]||"",sps:parseInt(v.v[3])||0,isshape:parseInt(v.v[5])})})),cl.length||cl.push({tipo:"avob",cod:"__",des:"Vuoto",macro:"",sps:0}),cl}}function toJson(t){return JSON.stringify(t,null,2)}function clamp(n,min=-1/0,max=1/0){return(n=Number(n)||0)<min&&(n=min),n>max&&(n=max),n}function gettipocolonna(cod){return tipicolonna.find((x=>x.cod==cod))?.des||tipicolonna[0].des}function gettipofolder(cod){return tipicolonna.find((x=>x.cod==cod))?.folder||""}function newVariabile(){return new Variabile}async function newVariante(cod,cat,amb){const xx=new Variante(amb);return await xx.load(cod,cat),xx}function newAmbiente(cat,maxmillis=100){return new Ambiente(cat,maxmillis)}function newMacro(amb,name){return new Macro(amb,name)}function muValuta(mu,codice,azzera){azzera&&mu.azzera();return mu.valuta(codice)}function muInit(cat,cbGetMacro,cbGetVariante,cbFunc,cbInfo,cbGetFile,cbLogga){const mu=new Ambiente(cat);return setcallbacks(cbGetMacro,cbGetVariante,cbFunc,cbInfo,cbGetFile,cbLogga),mu}function muCompileScript(codice){return codice&&"object"==typeof codice?codice:codice.startsWith("{")&&codice.endsWith("}")||codice.startsWith("[")&&codice.endsWith("]")?JSON.stringify(codice):muClean(muClComments(codice))}async function muEvalScript(/** @type {Ambiente} */amb,codice,pars,reset=!0){if(codice=muCompileScript(codice),reset&&amb.azzera(),pars)for(const p of pars){const{v:v,o:o}=getcouple(p);amb.vari.add(v,o)}return{output:await muEval(amb,null,codice,{}),vari:amb.vari.dictionary,errori:errori}}const tonum=(s,dec=-1)=>{if(!s)return 0;let n=0;if("number"==typeof s)n=s||0;else if("string"==typeof s){const x=(s=s.replaceAll(",",".")).match(/^-?[0-9.]+$/);n=x&&x.length>0?Number(x[0])||0:muCalc(s)}if(dec>=0)switch(dec){case 0:n=Math.round(n);break;case 1:n=Math.round(10*n)/10;break;case 2:n=Math.round(100*n)/100;break;case 3:n=Math.round(1e3*n)/1e3;break;case 4:n=Math.round(1e4*n)/1e4;break;case 5:n=Math.round(1e5*n)/1e5;break;case 6:n=Math.round(1e6*n)/1e6}return n||0};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"}}};export{Ambiente,CodiceBarra,Macro,Variabile,Variante,checkmu,checkname,clamp,clean,dammivariante,errori,fromjson,getOggetto,getcolonne,getcouple,geterrdes,getheaddims,gettipocolonna,gettipofolder,hash,impostavariante,intvaluta,isJsonStr,isObject,muInit as jsTest,logga,muCalc,muClComments,muClean,muCompileScript,muEval,muEvalScript,muGenerate,muInit,muLimits,muParsecode,muValuta,mustr,newAmbiente,newMacro,newVariabile,newVariante,noquote,parselimitifromdb,parselimitifromrule,parsevar,poppars,pushpars,quote,setOggetto,sortrows,testsync,tipicolonna,tipifree,tipiheader,tk,toCadPars,toJson,tonum,xdt};
268
+ this.varianti={},this.varelenco={},this.macroelenco={},this.scripts={},this.#headers=void 0,this.#alias=void 0,this.#deriva=void 0,this.#typos=void 0)}setimgpreview(cod,img){img?this.imgpreview[cod]=img:delete this.imgpreview[cod]}getimgpreview(cod){return this?.imgpreview[cod||""]}setfndot(fndotcallback){this.fndotcallback=fndotcallback,this.vari.setfndot(fndotcallback)}async#checkelencovar(cat){if(cbInfo&&!this.varelenco[cat]){const tm=await cbInfo("headers",cat,"_varianti");Array.isArray(tm)?this.varelenco[cat]=tm:tm.vars&&(this.varelenco[cat]=tm.vars,tm.alias&&(this.#alias=tm.alias)),this.varelenco[cat]||(this.varelenco[cat]=[])}}parseheaderfrominfo(tm){if(tm&&tm.length>0)for(const t of tm)switch(t.tipo){case"_headers":"string"==typeof t.value&&(t.value=headerconvert(t.value)),this.#headers=t.value||{};break;case"_alias":"string"==typeof t.value&&(t.value=aliasconvert(t.value)),this.#alias=t.value||{};break;case"_typos":if("string"==typeof t.value){const tips=fromjson(t.value);for(const tp in tips){const tq=tips[tp];tq.db&&(tq.db=muClean(muClComments(tq.db))),tq.list&&(tq.list=muClean(muClComments(tq.list)))}t.value=tips}this.#typos=t.value||{}}}setitem(item,rule,model,ruleset=[],datadelgiorno=0){this.item=clean(item,!0),this.rule=clean(rule,!0),this.model=clean(model,!0),this.ruleset=toruleset(ruleset),this.data=datadelgiorno||(new Date).toInt()}async getheader(cod){let tm;return!this.#headers&&cbInfo&&(tm=await cbInfo("headers",this.cat,"_headers"),this.parseheaderfrominfo(tm)),this.#headers||(this.#headers={}),this.#headers[cod]}async getalias(){let tm;return!this.#alias&&cbInfo&&(tm=await cbInfo("headers",this.cat,"_alias"),this.parseheaderfrominfo(tm)),this.#alias||(this.#alias={}),this.#alias}get deriva(){return this.#deriva,this.#deriva||[]}async getmacro(riga){try{if("string"==typeof riga&&(riga={tipo:"M",contenuto:riga}),!riga||!riga.contenuto)return;let ct=riga.contenuto;ct.startsWith("$")&&(ct=await this.vari.valuta(ct));const rr=/^([({}):$\w.\\/]+)[\s;,]*(.*)?$/im.exec(ct);if(!rr)return void errori.add("Macro non valida:"+ct,riga);let macro=clean(rr[1],!0);macro.includes("$")&&(macro=await this.vari.valuta(macro));const pars=getcolonne(rr[2]),{name:name,cat:cat}=checkmu(macro,this.cat);this.cat=cat;const ky=`${cat}/${name}`;if(!this.macro[ky]){const tm=new Macro(this,name);await tm.load()?this.macro[ky]=tm:errori.add(`macro fail to load ${ky}`,riga)}return macro=this.macro[ky],macro?{macro:macro,pars:pars}:(errori.add(`macro non trovata ${ky}`,riga),{})}catch(error){errori.add(geterrdes(error),`ambiente.getmacro: ${riga?.contenuto}`)}}async getvariante(cod){const{name:name,cat:cat}=checkmu(cod,this.cat);let n2=name,altri={};if(cat==this.cat&&this.#alias&&this.#alias[name]&&(altri=this.#alias[name]||{},n2=altri.cod),await this.#checkelencovar(cat),this.varelenco[cat]&&!this.varelenco[cat].includes(name))return;const key=`${cat}/${n2}`;let vv;return this.varianti[key]?vv=this.varianti[key]:(vv=new Variante(this),await vv.load(key,cat),this.varianti[key]=vv),altri&&(altri.des&&(vv.des=altri.des),altri.vdef&&(vv.vdef=altri.vdef)),vv}async varcompila(v,callback){const xx=new Variante(this);if(await xx.load(v,this.cat,!0),xx.alias){(await this.getalias())[v]=xx.alias}callback("variants",{cod:v,des:xx.des||"",alias:xx.alias,info:xx.alias?"":JSON.stringify(getOggetto(xx,["amb"]))})}async macrocompila(v,callback){const mac=new Macro(this,v);await mac.loadAndCompile(`${v}.mu`);const t=mac.getmacro();callback("macros",{cod:v,info:JSON.stringify(t),isgenera:mac.isgenera,isheader:mac.isheader,iscodice:mac.iscodice})}async barrecompila(articolibarre,titolibarre,callback){const cc=new CodiceBarra;await cc.compila(articolibarre,titolibarre);for(const x in cc.barre){callback("barcodes",{cod:x,des:"",info:JSON.stringify(cc.barre[x])})}return cc}async tojson(d){let tm;return cbFunc&&(tm=await cbFunc("json",d)),tm}async compila(info,callback){if(callback){for(const v of info.var)await this.varcompila(v,callback);for(const v of info.mu)await this.macrocompila(v,callback);if(callback("infos",{cod:"info",des:info.cat,info:JSON.stringify({cat:info.cat,md:info.info})}),this.#headers=void 0,this.#alias=void 0,this.#deriva=void 0,this.#typos=void 0,cbInfo){const tm=await cbInfo("headers",this.cat,["_headers","_alias","_deriva","_typos"]);this.parseheaderfrominfo(tm)}this.#headers?callback("infos",{cod:"headers",des:"",info:JSON.stringify(this.#headers)}):logga("missing headers"),this.#alias&&callback("infos",{cod:"alias",des:"",info:JSON.stringify(this.#alias)}),this.#deriva&&callback("infos",{cod:"deriva",des:"",info:JSON.stringify(this.#deriva)}),this.#typos&&callback("infos",{cod:"typos",des:"tipologie",info:JSON.stringify(this.#typos)})}}async checkvarianti(cat,vars){if(!cat||!vars?.length)return;cat=checkname(cat),await this.#checkelencovar(cat);const t=this.varelenco[cat],vn=[];for(let v of vars){v=clean(v,!0);const nn=`${cat}/${v}`;this.varianti[nn]||t&&t.includes(v)&&vn.push(v)}if(vn.length&&cbGetVariante){const xv=await cbGetVariante(cat,vn);if(xv&&xv.length)for(const x of xv){const{name:name,content:content}=x,vv=new Variante(this);vv.setheader(name,cat),content&&await vv.loadContentExtended(content),this.varianti[vv.key]=vv}}}async getheaderfromdb(name){const totale=await cbInfo("header",this.cat,name,!this.#deriva);let{head:head,rows:rows,macros:macros,deriva:deriva,llvars:llvars}=totale;for(const r of rows)r.cod=clean(r.cod),r.alias=clean(r.alias),r.t=clean(r.t);if(!llvars){llvars=new Set;for(const r of rows)if("p"==r.tipo);else{const nn=r.alias?r.alias:r.cod;llvars.add(nn)}llvars=[...llvars]}this.#deriva||(this.#deriva=deriva),await this.#checkelencovar(this.cat),head.cod=clean(head.cod),head.rule=clean(head.rule),head.ruledef=head.ruledef||[];const vn=[],t=this.varelenco[this.cat];for(const nn of llvars)this.varianti[`${this.cat}/${nn}`]||t&&t.includes(nn)&&vn.push(nn);if(vn.length&&cbGetVariante){const vars=await cbGetVariante(this.cat,vn);if(vars&&vars.length)for(const x of vars){const{name:name,content:content}=x,vv=new Variante(this);vv.setheader(name,this.cat),content&&await vv.loadContentExtended(content),this.varianti[vv.key]=vv}}return{head:head,rows:rows,macros:macros}}async getlinkedmacros(rule,macros){const getkey=n=>n.includes("/")?n:`${this.cat}/${n}`,cl=[];let k;if(rule&&(k=getkey(rule),this.macro[k]||cl.push(rule)),macros&&"string"==typeof macros){const vv=macros.split(";");for(const v of vv)k=getkey(v),this.macro[k]||cl.push(v)}if(cl&&cl.length>0&&cbGetMacro){const tm=await cbGetMacro(this.cat,cl);if(tm&&tm.length>0)for(const x of tm){this.checkscripts(x.content?.linkscript),delete x.content?.linkscript;const m=new Macro(this,x.name);for(const t in x.content){const contenuto=x.content[t];m[t]=contenuto}this.macro[m.key]=m}}}checkscripts(vv){if(vv&&vv.length)for(let v of vv)this.scripts[v.name]||(this.scripts[v.name]=v.value)}async setruleheader(rule,pars,ruleset){const{name:name,cat:cat}=checkmu(rule,this.cat);ruleset&&ruleset.length&&(this.ruleset=toruleset(ruleset));const ky=`${cat}/${name}`;if(!this.macro[ky]){const totale=await this.getheaderfromdb(name),{head:head,rows:rows,macros:macros}=totale;await this.getlinkedmacros(head.rule,macros);const tm=new Macro(this,name);if(!head)return void errori.add("Missing rule: "+rule);if(head.rule){const k2=this.macro[`${cat}/${head.rule}`];if(k2)for(const x in k2)["cat","name","key"].includes(x)||(tm[x]=k2[x])}rows&&rows.length&&(tm.head=rows),this.macro[ky]=tm}this.ruleheader=ky;const mc=this.macro[ky];return errori.azzera(),await mc.setparametri(pars),mc}getruleheader(){return this.macro[this.ruleheader]}async setvariante(cod,opz){return await impostavariante(this,null,cod,opz)}async valuta(codice){let output;return"string"==typeof codice&&(codice=muClean(muClComments(codice,this.righevuote))),Array.isArray(codice)&&(logga("m1",codice),output=await muEval(this,null,codice)),output}setinfos(tm){tm&&(this.#headers=tm.headers,this.#alias=tm.alias,this.#deriva=void 0,this.#typos=tm.typos)}async splitteroggetti(name){let data=await this.getvariante(name),cl=[];return data?.rows&&Object.values(data.rows).forEach((v=>{cl.push({tipo:v.v[2]||"",cod:v.v[0]||"",des:v.v[1]||"",macro:v.v[4]||"",sps:parseInt(v.v[3])||0,isshape:parseInt(v.v[5])})})),cl.length||cl.push({tipo:"avob",cod:"__",des:"Vuoto",macro:"",sps:0}),cl}}function toJson(t){return JSON.stringify(t,null,2)}function clamp(n,min=-1/0,max=1/0){return(n=Number(n)||0)<min&&(n=min),n>max&&(n=max),n}function gettipocolonna(cod){return tipicolonna.find((x=>x.cod==cod))?.des||tipicolonna[0].des}function gettipofolder(cod){return tipicolonna.find((x=>x.cod==cod))?.folder||""}function newVariabile(){return new Variabile}async function newVariante(cod,cat,amb){const xx=new Variante(amb);return await xx.load(cod,cat),xx}function newAmbiente(cat,maxmillis=100){return new Ambiente(cat,maxmillis)}function newMacro(amb,name){return new Macro(amb,name)}function muValuta(mu,codice,azzera){azzera&&mu.azzera();return mu.valuta(codice)}function muInit(cat,cbGetMacro,cbGetVariante,cbFunc,cbInfo,cbGetFile,cbLogga){const mu=new Ambiente(cat);return setcallbacks(cbGetMacro,cbGetVariante,cbFunc,cbInfo,cbGetFile,cbLogga),mu}function muCompileScript(codice){return codice&&"object"==typeof codice?codice:codice.startsWith("{")&&codice.endsWith("}")||codice.startsWith("[")&&codice.endsWith("]")?JSON.stringify(codice):muClean(muClComments(codice))}async function muEvalScript(/** @type {Ambiente} */amb,codice,pars,reset=!0){if(codice=muCompileScript(codice),reset&&amb.azzera(),pars)for(const p of pars){const{v:v,o:o}=getcouple(p);amb.vari.add(v,o)}return{output:await muEval(amb,null,codice,{}),vari:amb.vari.dictionary,errori:errori}}const tonum=(s,dec=-1)=>{if(!s)return 0;let n=0;if("number"==typeof s)n=s||0;else if("string"==typeof s){const x=(s=s.replaceAll(",",".")).match(/^-?[0-9.]+$/);n=x&&x.length>0?Number(x[0])||0:muCalc(s)}if(dec>=0)switch(dec){case 0:n=Math.round(n);break;case 1:n=Math.round(10*n)/10;break;case 2:n=Math.round(100*n)/100;break;case 3:n=Math.round(1e3*n)/1e3;break;case 4:n=Math.round(1e4*n)/1e4;break;case 5:n=Math.round(1e5*n)/1e5;break;case 6:n=Math.round(1e6*n)/1e6}return n||0};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"}}};export{Ambiente,CodiceBarra,Macro,Variabile,Variante,checkmu,checkname,clamp,clean,dammivariante,errori,fromjson,getOggetto,getcolonne,getcouple,geterrdes,getheaddims,gettipocolonna,gettipofolder,hash,impostavariante,intvaluta,isJsonStr,isObject,muInit as jsTest,logga,muCalc,muClComments,muClean,muCompileScript,muEval,muEvalScript,muGenerate,muInit,muLimits,muParsecode,muValuta,mustr,newAmbiente,newMacro,newVariabile,newVariante,noquote,parselimitifromdb,parselimitifromrule,parsevar,poppars,pushpars,quote,setOggetto,sortrows,testsync,tipicolonna,tipifree,tipiheader,tk,toCadPars,toJson,tonum,xdt};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "markuno_lib",
3
- "version": "1.2.52",
3
+ "version": "1.2.54",
4
4
  "description": "Croswil Markuno Language Lib",
5
5
  "author": "Croswil SRL",
6
6
  "license": "SEE LICENSE IN LICENSE.txt",
@@ -145,6 +145,7 @@ export class Variabile {
145
145
  /**
146
146
  * Ripristina l'ultimo stato salvato delle variabili
147
147
  */ pop(): void;
148
+ savevars(str: any): void;
148
149
  /**
149
150
  * Rimuove tutte le variabili e pulisce lo stack
150
151
  */ clear(): void;