markuno_lib 1.1.30 → 1.1.31
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/bus_utils.js +1 -1
- package/bin/markcad.js +6 -6
- package/bin/markcad3d.js +2 -2
- package/bin/marked.js +1 -1
- package/bin/markuno.js +6 -6
- package/package.json +1 -1
- package/types/bus_utils.d.ts +0 -1
- package/types/markcad.d.ts +7 -2
package/bin/bus_utils.js
CHANGED
|
@@ -73,4 +73,4 @@ function listfromstring(x){if(Array.isArray(x))return x;var cl=[],fl={};if(x){va
|
|
|
73
73
|
* - 'mese': nome mese
|
|
74
74
|
* @returns {string} Data formattata secondo il formato richiesto
|
|
75
75
|
*/
|
|
76
|
-
let __formati={};var strDate=(date,formato)=>{Date.prototype.getWeek||(Date.prototype.getWeek=function(){var onejan=new Date(this.getFullYear(),0,1);return Math.ceil(((this-onejan)/864e5+onejan.getDay()+1)/7)});if("object"!=typeof date){if(!(date=parseFloat(date||0)))return"";date=date.toDate()}if("week"==formato)return"w"+date.getWeek();if(!__formati[formato])switch(formato){case"giorni":{let x=date.toInt();var gg=x.diffgiorni((new Date).toInt());return 0==gg?"Oggi":-1==gg?"Domani":1==gg?"Ieri":Math.abs(gg)<6?new Intl.DateTimeFormat("it",{weekday:"long"}).format(date).trim():strDate(x,"ggmmm")}case"date":case"shortdate":__formati[formato]=new Intl.DateTimeFormat("it",{weekday:"short",day:"numeric",month:"short",year:"numeric"});break;case"ggmmaa":case"ggmmyy":__formati[formato]=new Intl.DateTimeFormat("it",{day:"2-digit",month:"2-digit",year:"2-digit"});break;case"datetime":__formati[formato]=new Intl.DateTimeFormat("it",{day:"2-digit",month:"2-digit",year:"numeric",hour12:!1,hour:"numeric",minute:"2-digit"});break;case"yyyy":case"anno":__formati[formato]=new Intl.DateTimeFormat("it",{year:"numeric"});break;case"ggmmaaaa":case"ggmmyyyy":__formati[formato]=new Intl.DateTimeFormat("it",{day:"2-digit",month:"2-digit",year:"numeric"});break;case"ggmm":__formati[formato]=new Intl.DateTimeFormat("it",{day:"2-digit",month:"2-digit"});break;case"giorno":case"gg":__formati[formato]=new Intl.DateTimeFormat("it",{day:"2-digit"});break;case"ggmmmaaaa":case"ggmmmyyyy":__formati[formato]=new Intl.DateTimeFormat("it",{day:"2-digit",month:"short",year:"numeric"});break;case"ggmmmaa":case"ggmmmyy":__formati[formato]=new Intl.DateTimeFormat("it",{day:"2-digit",month:"short",year:"2-digit"});break;case"ggmmm":__formati[formato]=new Intl.DateTimeFormat("it",{day:"2-digit",month:"short"});break;case"ggmmmm":__formati[formato]=new Intl.DateTimeFormat("it",{day:"2-digit",month:"long"});break;case"mmmyy":case"mmmaa":case"mmmyyyy":case"mmmaaaa":__formati[formato]=new Intl.DateTimeFormat("it",{month:"short",year:"numeric"});break;case"weekday":__formati[formato]=new Intl.DateTimeFormat("it",{weekday:"long"});break;case"hhmm":__formati[formato]=new Intl.DateTimeFormat("it",{hour12:!1,hour:"numeric",minute:"2-digit"});break;case"hhmmss":__formati[formato]=new Intl.DateTimeFormat("it",{hour12:!1,hour:"numeric",minute:"2-digit",second:"2-digit"});break;case"mese":__formati[formato]=new Intl.DateTimeFormat("it",{month:"long"});break;default:__formati[formato="."]||(__formati[formato]=new Intl.DateTimeFormat("it",{weekday:"long",day:"numeric",month:"long",year:"numeric",hour12:!1,hour:"numeric",minute:"2-digit"}))}return __formati[formato].format(date).trim()};
|
|
76
|
+
let __formati={};var strDate=(date,formato)=>{Date.prototype.getWeek||(Date.prototype.getWeek=function(){var onejan=new Date(this.getFullYear(),0,1);return Math.ceil(((this-onejan)/864e5+onejan.getDay()+1)/7)});if("object"!=typeof date){if(!(date=parseFloat(date||0)))return"";date=date.toDate()}if("week"==formato)return"w"+date.getWeek();if(!__formati[formato])switch(formato){case"giorni":{let x=date.toInt();var gg=x.diffgiorni((new Date).toInt());return 0==gg?"Oggi":-1==gg?"Domani":1==gg?"Ieri":Math.abs(gg)<6?new Intl.DateTimeFormat("it",{weekday:"long"}).format(date).trim():strDate(x,"ggmmm")}case"date":case"shortdate":__formati[formato]=new Intl.DateTimeFormat("it",{weekday:"short",day:"numeric",month:"short",year:"numeric"});break;case"ggmmaa":case"ggmmyy":__formati[formato]=new Intl.DateTimeFormat("it",{day:"2-digit",month:"2-digit",year:"2-digit"});break;case"datetime":__formati[formato]=new Intl.DateTimeFormat("it",{day:"2-digit",month:"2-digit",year:"numeric",hour12:!1,hour:"numeric",minute:"2-digit"});break;case"yyyy":case"anno":__formati[formato]=new Intl.DateTimeFormat("it",{year:"numeric"});break;case"ggmmaaaa":case"ggmmyyyy":__formati[formato]=new Intl.DateTimeFormat("it",{day:"2-digit",month:"2-digit",year:"numeric"});break;case"ggmm":__formati[formato]=new Intl.DateTimeFormat("it",{day:"2-digit",month:"2-digit"});break;case"giorno":case"gg":__formati[formato]=new Intl.DateTimeFormat("it",{day:"2-digit"});break;case"ggmmmaaaa":case"ggmmmyyyy":__formati[formato]=new Intl.DateTimeFormat("it",{day:"2-digit",month:"short",year:"numeric"});break;case"ggmmmaa":case"ggmmmyy":__formati[formato]=new Intl.DateTimeFormat("it",{day:"2-digit",month:"short",year:"2-digit"});break;case"ggmmm":__formati[formato]=new Intl.DateTimeFormat("it",{day:"2-digit",month:"short"});break;case"ggmmmm":__formati[formato]=new Intl.DateTimeFormat("it",{day:"2-digit",month:"long"});break;case"mmmyy":case"mmmaa":case"mmmyyyy":case"mmmaaaa":__formati[formato]=new Intl.DateTimeFormat("it",{month:"short",year:"numeric"});break;case"weekday":__formati[formato]=new Intl.DateTimeFormat("it",{weekday:"long"});break;case"hhmm":__formati[formato]=new Intl.DateTimeFormat("it",{hour12:!1,hour:"numeric",minute:"2-digit"});break;case"hhmmss":__formati[formato]=new Intl.DateTimeFormat("it",{hour12:!1,hour:"numeric",minute:"2-digit",second:"2-digit"});break;case"mese":__formati[formato]=new Intl.DateTimeFormat("it",{month:"long"});break;default:__formati[formato="."]||(__formati[formato]=new Intl.DateTimeFormat("it",{weekday:"long",day:"numeric",month:"long",year:"numeric",hour12:!1,hour:"numeric",minute:"2-digit"}))}return __formati[formato].format(date).trim()};export{bus,formatDate,getdim,listfromstring,myuuid,strDate,toDateStr,toEuro,tonum};
|
package/bin/markcad.js
CHANGED
|
@@ -103,14 +103,14 @@ constructor(p1,p2,x2=null,y2=null){"number"==typeof p1&&"number"==typeof p2&&nul
|
|
|
103
103
|
* Verifica se la linea è parallela a un'altra
|
|
104
104
|
* @param {Linea2} line2 - Seconda linea
|
|
105
105
|
* @returns {boolean} True se parallele
|
|
106
|
-
*/isparallela(line2){const det=this.dx*line2.dy-this.dy*line2.dx;return Math.abs(det)
|
|
106
|
+
*/isparallela(line2){const det=this.dx*line2.dy-this.dy*line2.dx;return Math.abs(det)<1}
|
|
107
107
|
/**
|
|
108
108
|
* Restituisce alcune info sul “quadrilatero” formato da questa linea e da line2,
|
|
109
109
|
* assumendo che siano parallele e abbiano verso invertito.
|
|
110
110
|
* @param {Linea2} line2
|
|
111
111
|
* @returns {Object|undefined}
|
|
112
112
|
* { angle, aini, afin, l, distanza } oppure undefined se non parallele o degenere
|
|
113
|
-
*/infoquad(line2){if(!this.isparallela(line2))return;const{p1:p1,p2:p2,normale:normale}=this;let{p1:p3,p2:p4}=line2;function wrapToPi(theta){return theta>Math.PI?theta-=2*Math.PI:theta<-Math.PI&&(theta+=2*Math.PI),theta}function getangle(a,b){return Math.atan2(b.y-a.y,b.x-a.x)}(p2.x-p1.x)*(p3.y-p2.y)-(p2.y-p1.y)*(p3.x-p2.x)<0&&([p3,p4]=[p4,p3]);const baseAng=getangle(p1,p2)
|
|
113
|
+
*/infoquad(line2){if(!this.isparallela(line2))return;const{p1:p1,p2:p2,normale:normale}=this;let{p1:p3,p2:p4}=line2;function wrapToPi(theta){return theta>Math.PI?theta-=2*Math.PI:theta<-Math.PI&&(theta+=2*Math.PI),theta}function getangle(a,b){return Math.atan2(b.y-a.y,b.x-a.x)}(p2.x-p1.x)*(p3.y-p2.y)-(p2.y-p1.y)*(p3.x-p2.x)<0&&([p3,p4]=[p4,p3]);const baseAng=getangle(p1,p2);function toDeg(x){return Math.round(18e4*x/Math.PI)/1e3}const afin=toDeg(wrapToPi(getangle(p2,p3)-baseAng)),aini=toDeg(wrapToPi(getangle(p1,p4)-baseAng)),l=Math.round(100*this.len)/100,dx=p3.x-p1.x,dy=p3.y-p1.y,distanza=Math.round(100*Math.abs(dx*normale.x+dy*normale.y))/100;return{angle:toDeg(baseAng),aini:aini,afin:afin,l:l,distanza:distanza,sx:p1.x,sy:p1.y}}
|
|
114
114
|
/**
|
|
115
115
|
* Verifica se la linea è perpendicolare a un'altra
|
|
116
116
|
* @param {Linea2} line2 - Seconda linea
|
|
@@ -268,7 +268,7 @@ function getshape(){let pt=[];
|
|
|
268
268
|
* Aggiunge punti da array di coordinate
|
|
269
269
|
* @param {Array<number>} aa - Array [x1,y1,x2,y2,...]
|
|
270
270
|
*/
|
|
271
|
-
function _addvec(aa){for(let i=0;i<aa.length;i+=2)pt.push({x:aa[i],y:aa[i+1]})}function dims(pts){let{p1:p1,p2:p2}=pts.reduce(((m,p)=>(m.p1.x=Math.min(m.p1.x,p.x),m.p2.x=Math.max(m.p2.x,p.x),m.p1.y=Math.min(m.p1.y,p.y),m.p2.y=Math.max(m.p2.y,p.y),m)),{p1:new Punto2(1/0,1/0),p2:new Punto2(-1/0,-1/0)}),isrect=!1;if(4==pts.length){const TOLL=.001;function findpunto(x,y){return!!pts.find((p=>Math.abs(p.x-x)<TOLL&&Math.abs(p.y-y)<TOLL))}findpunto(p1.x,p1.y)&&findpunto(p1.x,p2.y)&&findpunto(p2.x,p1.y)&&findpunto(p2.x,p2.y)&&(isrect=!0)}return{p1:p1,p2:p2,isrect:isrect,width:p2.x-p1.x,height:p2.y-p1.y}}return{get key(){return hash(tovec().join("\t"))},orienta:function orienta(p0,p1){if(!p0||!p1)return null;const dx=p1.x-p0.x,dy=p1.y-p0.y,angolo=180*Math.atan2(dy,dx)/Math.PI,matrix=new Matrix3D;matrix.rotateZ(-angolo),matrix.translate(-p0.x,-p0.y,0);const ptTrasformati=pt.map((p=>matrix.transform(p.x,p.y)));let mm=ptTrasformati.reduce(((m,p)=>(m.p1.x=Math.min(m.p1.x,p.x),m.p2.x=Math.max(m.p2.x,p.x),m.p1.y=Math.min(m.p1.y,p.y),m.p2.y=Math.max(m.p2.y,p.y),m)),{p1:new Punto2(1/0,1/0),p2:new Punto2(-1/0,-1/0)});return{shape:getshape().frompt(ptTrasformati),origine:new Punto2(p0.x,p0.y),angolo:angolo,mm:mm,width:mm.p2.x-mm.p1.x,height:mm.p2.y-mm.p1.y}},rebase:function rebase(angolo,forceorigin=!1,ox=0,oy=0){const matrix=new Matrix3D;matrix.rotateZ(-angolo);let ptTrasformati=pt.map((p=>matrix.transform(p.x,p.y))),{p1:p1,p2:p2,width:width,height:height}=dims(ptTrasformati);return forceorigin||(ox=p1.x,oy=p1.y),ptTrasformati=ptTrasformati.map((p=>new Punto2(p.x-ox,p.y-oy))),{shape:getshape().frompt(ptTrasformati),origine:new Punto2(ox,oy),angolo:angolo,width:width,height:height}},get pt(){return pt},get vec(){return tovec()},toJSON:()=>({vec:tovec(),orient:orientation()}),get orient(){return orientation()},clone:()=>getshape().frompt(pt),dims:()=>dims(pt),rotate(deg){if(!deg)return this;const r=deg*Math.PI/180,cosTheta=Math.cos(r),sinTheta=Math.sin(r);for(let p of pt){const xNew=p.x*cosTheta-p.y*sinTheta,yNew=p.x*sinTheta+p.y*cosTheta;p.x=xNew,p.y=yNew}return this},selezionaprimo:function selezionaprimo(idprimopunto){return(idprimopunto%=pt.length)>0&&(pt=[...pt.slice(idprimopunto),...pt.slice(0,idprimopunto)]),this},segment(i,inverse=!1){let n=pt.length;return new Linea2(pt[i%n],pt[(i+(inverse?-1:1))%n])},lineoffset(i1,i2,offset){if((i1=(i1||0)%pt.length)!=(i2=(i2||0)%pt.length)){let l2=new Linea2(pt[i1],pt[i2]);if(l2){return l2=l2.offsetline(-offset),this.intersectline(l2)}}},move(x=0,y=0){for(let p of pt)p.x+=x,p.y+=y;return this},mirrorx(value=0){for(let p of pt)p.x=2*value-p.x;return this},mirrory(value=0){for(let p of pt)p.y=2*value-p.y;return this},simplify(tolerance,hq){return pt=function simplify(points,tolerance,highestQuality){if(points.length<=2)return points;var sqTolerance=void 0!==tolerance?tolerance*tolerance:1;return simplifyDouglasPeucker(points=highestQuality?points:function simplifyRadialDist(points,sqTolerance){for(var point,p1,p2,dx,dy,prevPoint=points[0],newPoints=[prevPoint],i=1,len=points.length;i<len;i++)p2=prevPoint,dx=void 0,dy=void 0,(dx=(p1=point=points[i]).x-p2.x)*dx+(dy=p1.y-p2.y)*dy>sqTolerance&&(newPoints.push(point),prevPoint=point);return prevPoint!==point&&newPoints.push(point),newPoints}(points,sqTolerance),sqTolerance)}(pt,tolerance,hq),this},fromclip(vv){pt=[];for(let p of vv)pt.push({x:p.x/1e3,y:p.y/1e3});return this},infosegmento(i,open=!1){const n=pt.length;function clampIndex(idx){return(idx+n)%n}function angle(p1,p2){return Math.atan2(p2.y-p1.y,p2.x-p1.x)}function angleDiff(a,b){let diff=a-b;for(;diff>Math.PI;)diff-=2*Math.PI;for(;diff<-Math.PI;)diff+=2*Math.PI;return diff}const p1=pt[i];let p0,p2,p3;if(open)if(0===i){const dx=pt[1].x-pt[0].x,dy=pt[1].y-pt[0].y;p0={x:pt[0].x-dx,y:pt[0].y-dy},p2=pt[1],p3=pt[2]}else if(i===n-1){const dx=pt[n-1].x-pt[n-2].x,dy=pt[n-1].y-pt[n-2].y;p0=pt[n-2],p2={x:pt[n-1].x+dx,y:pt[n-1].y+dy},p3={x:p2.x+dx,y:p2.y+dy}}else p0=pt[i-1],p2=pt[i+1],p3=i+2<n?pt[i+2]:{x:pt[i+1].x+(pt[i+1].x-pt[i].x),y:pt[i+1].y+(pt[i+1].y-pt[i].y)};else{const i0=clampIndex(i-1),i2=clampIndex(i+1),i3=clampIndex(i+2);p0=pt[i0],p2=pt[i2],p3=pt[i3]}const ang12=angle(p1,p2),ang01=angle(p0,p1),ang23=angle(p2,p3);return{x:p1.x,y:p1.y,l:function length(p1,p2){const dx=p2.x-p1.x,dy=p2.y-p1.y;return Math.sqrt(dx*dx+dy*dy)}(p1,p2),ang:ang12/PIF,a1:angleDiff(ang12,ang01)/PIF,a2:angleDiff(ang23,ang12)/PIF}},fromvec(aa){return pt=[],_addvec(aa),this},addvec(vec){return _addvec(vec),this},frompt(pts){return pt=[...pts],pt=removeduplicate(pt),this},fromstr(str){return pt=removeduplicate(function processTokens(tokens){const points=[];for(let i=0;i<tokens.length;i++){const token=tokens[i];if("point"===token.type)points.push(token.point);else if("command"===token.type)switch(token.cmd){case"b":{if(points.length<2)continue;const npt=parseInt(token.params[0])||5,p1=points[points.length-2],p2=points[points.length-1];let p3="point"===tokens[i+1]?.type?tokens[i+1].point:void 0,p4="point"===tokens[i+2]?.type?tokens[i+2].point:void 0;p3?p4||(p4=points[0]):(p3=points[0],p4=points[1]);const raccordo=raccordabezier(p1,p2,p3,p4,npt);points.push(...raccordo),i+=1;break}case"r":{if(points.length<1)continue;const dist=parseFloat(token.params[0])||5,npt=parseInt(token.params[1])||10,p1=points[points.length-1];let p2="point"===tokens[i+1]?.type?tokens[i+1].point:void 0,p3="point"===tokens[i+2]?.type?tokens[i+2].point:"point"===tokens[i+3]?.type?tokens[i+3].point:void 0;p2?p3||(p3=points[0]):(p2=points[0],p3=points[1],points.splice(0,1));const raccordo=raccordabezier3(p1,p2,p3,dist,npt);points.push(...raccordo),i+=1;break}case"c":{const radius=parseFloat(token.params[0])||50,segments=parseInt(token.params[1])||12,center="point"===tokens[i+1]?.type?tokens[i+1].point:new Punto2(0,0);for(let j=0;j<segments;j++)points.push(new Punto2(center.x+radius*Math.cos(j/segments*Math.PI*2),center.y+radius*Math.sin(j/segments*Math.PI*2)));i+=1;break}case"a":{let npt,p1="point"===tokens[i+1]?.type?tokens[i+1].point:void 0,p2="point"===tokens[i+2]?.type?tokens[i+2].point:void 0,p3="point"===tokens[i+3]?.type?tokens[i+3].point:void 0;if(!p1||!p3)continue;if(p2)if(token.params[0])npt=clamp(parseInt(token.params[0]),1,24);else{const chord=Math.hypot(p3.x-p1.x,p3.y-p1.y),sagitta=Math.abs((p2.x-p1.x)*(p3.y-p1.y)-(p3.x-p1.x)*(p2.y-p1.y))/(2*chord);npt=Math.round(chord*Math.sqrt(sagitta/(chord+.1))*10),npt=clamp(npt,1,24),npt=1}else p2=p3,npt=0;const arcoPoints=arcfrom3point(npt,p1,p2,p3);points.push(...arcoPoints),i+=3;break}}}return points}(function tokenize(str){const tokens=[],values=str.toLowerCase().replace(/[\n\s]+/gm," ").split(/[,;]/).map((s=>s.trim()));for(let i=0;i<values.length;){const current=values[i];["b","r","c","a"].includes(current[0])?(tokens.push({type:"command",cmd:current[0],params:current.slice(1).split(":")}),i++):/[a-zA-Z]/.test(current[0])||(i<values.length-1?(tokens.push({type:"point",point:new Punto2(parseFloat(values[i]),parseFloat(values[i+1]))}),i+=2):i++)}return tokens}(str))),this},intersectline:l=>function _intersectline(shape,p3,p4){let n=shape.length,l=new Linea2(p3,p4);const intersezioni=[];for(let i=0;i<shape.length;i++){let l2=new Linea2(shape[i],shape[(i+1)%n]),p=l2.intersezione(l);p&&l2.onsegment(p)&&intersezioni.push(p)}if(intersezioni.length<2)return null;const{dx:dx,dy:dy}=l;intersezioni.sort(((a,b)=>(a.x-p3.x)*dx+(a.y-p3.y)*dy-((b.x-p3.x)*dx+(b.y-p3.y)*dy)));let pstart=new Punto2(intersezioni[0].x,intersezioni[0].y),pend=new Punto2(intersezioni[intersezioni.length-1].x,intersezioni[intersezioni.length-1].y);const vx1=pend.x-pstart.x,vy1=pend.y-pstart.y;return vx1*dx+vy1*dy<0&&([pstart,pend]=[pend,pstart]),new Linea2(pstart,pend)}(pt,l.p1,l.p2),addpt(pts){return pts?(Array.isArray(pts)||(pts=[pts]),pt=removeduplicate([...pt,...pts]),this):this},addracc(v1,v2,suddivisioni=2,addv1v2=!0){if(Array.isArray(v1)&&(v2={x:v1[2]||0,y:v1[3]||0},v1={x:v1[0]||0,y:v1[1]||0}),pt.length>=2){let tm=raccordabezier(pt[pt.length-2],pt[pt.length-1],v1,v2,suddivisioni);pt=[...pt,...tm],addv1v2&&(pt.push(v1),pt.push(v2))}return pt=removeduplicate(pt),this},setorient(mode){let p=orientation();return(1==p&&-1==mode||-1==p&&1==mode)&&pt.reverse(),this},reverse(){return pt.reverse(),this},pointinshape:p=>function isPointInPolygon(P){let x=P.x,y=P.y,inside=!1;for(let i=0,j=pt.length-1;i<pt.length;j=i++){let xi=pt[i].x,yi=pt[i].y,xj=pt[j].x,yj=pt[j].y;yi>y!=yj>y&&x<(xj-xi)*(y-yi)/(yj-yi)+xi&&(inside=!inside)}return inside}(p),azzera(){return pt=[],this},removeduplicate(delta=.005){return pt=removeduplicate(pt,delta),this},to3d(u0,alt=0,coeffa=0,coeffb=0,open=!1){pt=removeduplicate(pt);let tm=function genuvnormal(path,options){let{currentU:currentU=0,c:c=0,a:a=0,b:b=0,anglemin:anglemin=30,open:open=!1}=options;const pointsWithNormals=[],n=path.length;for(let i=0;i<n;i++){const prev=path[(i-1+n)%n],current=path[i],next=path[(i+1)%n],vPrev={x:current.x-prev.x,y:current.y-prev.y},vNext={x:next.x-current.x,y:next.y-current.y},normalPrev=normal2(prev,current),normalNext=normal2(current,next),angle=angle2vec(vPrev,vNext);let z=a*current.x+b*current.y+c;Math.abs(angle-180)<=anglemin?(normalPrev.nx,normalNext.nx,normalPrev.ny,normalNext.ny,pointsWithNormals.push({x:current.x,y:-current.y,z:z,u:currentU,v:z})):(pointsWithNormals.push({x:current.x,y:-current.y,z:z,u:currentU,v:z}),pointsWithNormals.push({x:current.x,y:-current.y,z:z,u:currentU,v:z}));const dx=next.x-current.x,dy=next.y-current.y;currentU+=Math.sqrt(dx*dx+dy*dy)}if(!open){let p=pointsWithNormals[0],pf=pointsWithNormals[pointsWithNormals.length-1];p.x==pf.x&&p.y==pf.y||pointsWithNormals.push({x:p.x,y:p.y,z:p.z,nx:p.nx,ny:p.ny,nz:p.nz,u:currentU,v:p.z})}return pointsWithNormals}(pt,{open:open,currentU:u0,c:alt,a:coeffa,b:coeffb,anglemin:30});return tm},getboundbox:()=>pt.length?pt.reduce(((box,p)=>(box.p1.x=Math.min(box.p1.x,p.x),box.p1.y=Math.min(box.p1.y,p.y),box.p2.x=Math.max(box.p2.x,p.x),box.p2.y=Math.max(box.p2.y,p.y),box)),{p1:new Punto2(1/0,1/0),p2:new Punto2(-1/0,-1/0)}):{p1:new Punto2(0,0),p2:new Punto2(0,0)},fittobox(p1,p2){if(!pt.length)return this;const currentBox=this.getboundbox(),currentWidth=currentBox.p2.x-currentBox.p1.x,currentHeight=currentBox.p2.y-currentBox.p1.y,targetWidth=p2.x-p1.x,targetHeight=p2.y-p1.y,scale=Math.min(targetWidth/(currentWidth||1),targetHeight/(currentHeight||1));for(let p of pt)p.x=(p.x-currentBox.p1.x)*scale,p.y=(p.y-currentBox.p1.y)*scale,p.x+=p1.x,p.y+=p1.y;return this}}}
|
|
271
|
+
function _addvec(aa){for(let i=0;i<aa.length;i+=2)pt.push({x:aa[i],y:aa[i+1]})}function dims(pts){let{p1:p1,p2:p2}=pts.reduce(((m,p)=>(m.p1.x=Math.min(m.p1.x,p.x),m.p2.x=Math.max(m.p2.x,p.x),m.p1.y=Math.min(m.p1.y,p.y),m.p2.y=Math.max(m.p2.y,p.y),m)),{p1:new Punto2(1/0,1/0),p2:new Punto2(-1/0,-1/0)}),isrect=!1;if(4==pts.length){const TOLL=.001;function findpunto(x,y){return!!pts.find((p=>Math.abs(p.x-x)<TOLL&&Math.abs(p.y-y)<TOLL))}findpunto(p1.x,p1.y)&&findpunto(p1.x,p2.y)&&findpunto(p2.x,p1.y)&&findpunto(p2.x,p2.y)&&(isrect=!0)}return{p1:p1,p2:p2,isrect:isrect,width:p2.x-p1.x,height:p2.y-p1.y}}return{get key(){return hash(tovec().join("\t"))},orienta:function orienta(p0,p1){if(!p0||!p1)return null;const dx=p1.x-p0.x,dy=p1.y-p0.y,angolo=180*Math.atan2(dy,dx)/Math.PI,matrix=new Matrix3D;matrix.rotateZ(-angolo),matrix.translate(-p0.x,-p0.y,0);const ptTrasformati=pt.map((p=>matrix.transform(p.x,p.y)));let mm=ptTrasformati.reduce(((m,p)=>(m.p1.x=Math.min(m.p1.x,p.x),m.p2.x=Math.max(m.p2.x,p.x),m.p1.y=Math.min(m.p1.y,p.y),m.p2.y=Math.max(m.p2.y,p.y),m)),{p1:new Punto2(1/0,1/0),p2:new Punto2(-1/0,-1/0)});return{shape:getshape().frompt(ptTrasformati),origine:new Punto2(p0.x,p0.y),angolo:angolo,mm:mm,width:mm.p2.x-mm.p1.x,height:mm.p2.y-mm.p1.y}},rebase:function rebase(angolo,forceorigin=!1,ox=0,oy=0){const matrix=new Matrix3D;matrix.rotateZ(-angolo);let ptTrasformati=pt.map((p=>matrix.transform(p.x,p.y))),{p1:p1,p2:p2,width:width,height:height}=dims(ptTrasformati);return forceorigin||(ox=p1.x,oy=p1.y),ptTrasformati=ptTrasformati.map((p=>new Punto2(p.x-ox,p.y-oy))),{shape:getshape().frompt(ptTrasformati),origine:new Punto2(ox,oy),angolo:angolo,width:width,height:height}},get pt(){return pt},get vec(){return tovec()},toJSON:()=>({vec:tovec(),orient:orientation()}),get orient(){return orientation()},clone:()=>getshape().frompt(pt),dims:()=>dims(pt),rotate(deg){if(!deg)return this;const r=deg*Math.PI/180,cosTheta=Math.cos(r),sinTheta=Math.sin(r);for(let p of pt){const xNew=p.x*cosTheta-p.y*sinTheta,yNew=p.x*sinTheta+p.y*cosTheta;p.x=xNew,p.y=yNew}return this},selezionaprimo:function selezionaprimo(idprimopunto){return(idprimopunto%=pt.length)>0&&(pt=[...pt.slice(idprimopunto),...pt.slice(0,idprimopunto)]),this},segment(i,inverse=!1){let n=pt.length;return new Linea2(pt[i%n],pt[(i+(inverse?-1:1))%n])},lineoffset(i1,i2,offset){if((i1=(i1||0)%pt.length)!=(i2=(i2||0)%pt.length)){let l2=new Linea2(pt[i1],pt[i2]);if(l2){return l2=l2.offsetline(-offset),this.intersectline(l2)}}},move(x=0,y=0){for(let p of pt)p.x+=x,p.y+=y;return this},mirrorx(value=0){for(let p of pt)p.x=2*value-p.x;return this},mirrory(value=0){for(let p of pt)p.y=2*value-p.y;return this},simplify(tolerance,hq){return pt=function simplify(points,tolerance,highestQuality){if(points.length<=2)return points;var sqTolerance=void 0!==tolerance?tolerance*tolerance:1;return simplifyDouglasPeucker(points=highestQuality?points:function simplifyRadialDist(points,sqTolerance){for(var point,p1,p2,dx,dy,prevPoint=points[0],newPoints=[prevPoint],i=1,len=points.length;i<len;i++)p2=prevPoint,dx=void 0,dy=void 0,(dx=(p1=point=points[i]).x-p2.x)*dx+(dy=p1.y-p2.y)*dy>sqTolerance&&(newPoints.push(point),prevPoint=point);return prevPoint!==point&&newPoints.push(point),newPoints}(points,sqTolerance),sqTolerance)}(pt,tolerance,hq),this},fromclip(vv){pt=[];for(let p of vv)pt.push({x:p.x/1e3,y:p.y/1e3});return this},infosegmento(i,open=!1){const n=pt.length;function clampIndex(idx){return(idx+n)%n}function angle(p1,p2){return Math.atan2(p2.y-p1.y,p2.x-p1.x)}function angleDiff(a,b){let diff=a-b;for(;diff>Math.PI;)diff-=2*Math.PI;for(;diff<-Math.PI;)diff+=2*Math.PI;return diff}const p1=pt[i];let p0,p2,p3;if(open)if(0===i){const dx=pt[1].x-pt[0].x,dy=pt[1].y-pt[0].y;p0={x:pt[0].x-dx,y:pt[0].y-dy},p2=pt[1],p3=pt[2]}else if(i===n-1){const dx=pt[n-1].x-pt[n-2].x,dy=pt[n-1].y-pt[n-2].y;p0=pt[n-2],p2={x:pt[n-1].x+dx,y:pt[n-1].y+dy},p3={x:p2.x+dx,y:p2.y+dy}}else p0=pt[i-1],p2=pt[i+1],p3=i+2<n?pt[i+2]:{x:pt[i+1].x+(pt[i+1].x-pt[i].x),y:pt[i+1].y+(pt[i+1].y-pt[i].y)};else{const i0=clampIndex(i-1),i2=clampIndex(i+1),i3=clampIndex(i+2);p0=pt[i0],p2=pt[i2],p3=pt[i3]}const ang12=angle(p1,p2),ang01=angle(p0,p1),ang23=angle(p2,p3);return{x:p1.x,y:p1.y,l:function length(p1,p2){const dx=p2.x-p1.x,dy=p2.y-p1.y;return Math.sqrt(dx*dx+dy*dy)}(p1,p2),ang:ang12/PIF,a1:angleDiff(ang12,ang01)/PIF,a2:angleDiff(ang23,ang12)/PIF}},fromvec(aa){return pt=[],_addvec(aa),this},addvec(vec){return _addvec(vec),this},frompt(pts){return pt=[...pts],pt=removeduplicate(pt),this},fromstr(str){return pt=removeduplicate(function processTokens(tokens){const points=[];for(let i=0;i<tokens.length;i++){const token=tokens[i];if("point"===token.type)points.push(token.point);else if("command"===token.type)switch(token.cmd){case"b":{if(points.length<2)continue;const npt=parseInt(token.params[0])||5,p1=points[points.length-2],p2=points[points.length-1];let p3="point"===tokens[i+1]?.type?tokens[i+1].point:void 0,p4="point"===tokens[i+2]?.type?tokens[i+2].point:void 0;p3?p4||(p4=points[0]):(p3=points[0],p4=points[1]);const raccordo=raccordabezier(p1,p2,p3,p4,npt);points.push(...raccordo),i+=1;break}case"r":{if(points.length<1)continue;const dist=parseFloat(token.params[0])||5,npt=parseInt(token.params[1])||10,p1=points[points.length-1];let p2="point"===tokens[i+1]?.type?tokens[i+1].point:void 0,p3="point"===tokens[i+2]?.type?tokens[i+2].point:"point"===tokens[i+3]?.type?tokens[i+3].point:void 0;p2?p3||(p3=points[0]):(p2=points[0],p3=points[1],points.splice(0,1));const raccordo=raccordabezier3(p1,p2,p3,dist,npt);points.push(...raccordo),i+=1;break}case"c":{const radius=parseFloat(token.params[0])||50,segments=parseInt(token.params[1])||12,center="point"===tokens[i+1]?.type?tokens[i+1].point:new Punto2(0,0);for(let j=0;j<segments;j++)points.push(new Punto2(center.x+radius*Math.cos(j/segments*Math.PI*2),center.y+radius*Math.sin(j/segments*Math.PI*2)));i+=1;break}case"a":{let npt,p1="point"===tokens[i+1]?.type?tokens[i+1].point:void 0,p2="point"===tokens[i+2]?.type?tokens[i+2].point:void 0,p3="point"===tokens[i+3]?.type?tokens[i+3].point:void 0;if(!p1||!p3)continue;if(p2)if(token.params[0])npt=clamp(parseInt(token.params[0]),1,24);else{const chord=Math.hypot(p3.x-p1.x,p3.y-p1.y),sagitta=Math.abs((p2.x-p1.x)*(p3.y-p1.y)-(p3.x-p1.x)*(p2.y-p1.y))/(2*chord);npt=Math.round(chord*Math.sqrt(sagitta/(chord+.1))*10),npt=clamp(npt,1,24),npt=1}else p2=p3,npt=0;const arcoPoints=arcfrom3point(npt,p1,p2,p3);points.push(...arcoPoints),i+=3;break}}}return points}(function tokenize(str){const tokens=[],values=str.toLowerCase().replace(/[\n\s]+/gm," ").split(/[,;]/).map((s=>s.trim()));for(let i=0;i<values.length;){const current=values[i];["b","r","c","a"].includes(current[0])?(tokens.push({type:"command",cmd:current[0],params:current.slice(1).split(":")}),i++):/[a-zA-Z]/.test(current[0])||(i<values.length-1?(tokens.push({type:"point",point:new Punto2(parseFloat(values[i]),parseFloat(values[i+1]))}),i+=2):i++)}return tokens}(str))),this},fromrect(w,h,sx,sy,bordo){w||(w=10),h||(h=10),bordo||(bordo=0),bordo=Math.min(Math.abs(bordo),Math.abs(.4*w),Math.abs(.4*h));let b1=w>0?bordo:-bordo,b2=h>0?bordo:-bordo;return pt=bordo?[{x:b1,y:0},{x:w-b1,y:0},{x:w,y:b2},{x:w,y:h-b2},{x:w-b1,y:h},{x:b1,y:h},{x:0,y:h-b2},{x:0,y:b2}]:[{x:0,y:0},{x:w,y:0},{x:w,y:h},{x:0,y:h}],this},intersectline:l=>function _intersectline(shape,p3,p4){let n=shape.length,l=new Linea2(p3,p4);const intersezioni=[];for(let i=0;i<shape.length;i++){let l2=new Linea2(shape[i],shape[(i+1)%n]),p=l2.intersezione(l);p&&l2.onsegment(p)&&intersezioni.push(p)}if(intersezioni.length<2)return null;const{dx:dx,dy:dy}=l;intersezioni.sort(((a,b)=>(a.x-p3.x)*dx+(a.y-p3.y)*dy-((b.x-p3.x)*dx+(b.y-p3.y)*dy)));let pstart=new Punto2(intersezioni[0].x,intersezioni[0].y),pend=new Punto2(intersezioni[intersezioni.length-1].x,intersezioni[intersezioni.length-1].y);const vx1=pend.x-pstart.x,vy1=pend.y-pstart.y;return vx1*dx+vy1*dy<0&&([pstart,pend]=[pend,pstart]),new Linea2(pstart,pend)}(pt,l.p1,l.p2),addpt(pts){return pts?(Array.isArray(pts)||(pts=[pts]),pt=removeduplicate([...pt,...pts]),this):this},addracc(v1,v2,suddivisioni=2,addv1v2=!0){if(Array.isArray(v1)&&(v2={x:v1[2]||0,y:v1[3]||0},v1={x:v1[0]||0,y:v1[1]||0}),pt.length>=2){let tm=raccordabezier(pt[pt.length-2],pt[pt.length-1],v1,v2,suddivisioni);pt=[...pt,...tm],addv1v2&&(pt.push(v1),pt.push(v2))}return pt=removeduplicate(pt),this},setorient(mode){let p=orientation();return(1==p&&-1==mode||-1==p&&1==mode)&&pt.reverse(),this},reverse(){return pt.reverse(),this},pointinshape:p=>function isPointInPolygon(P){let x=P.x,y=P.y,inside=!1;for(let i=0,j=pt.length-1;i<pt.length;j=i++){let xi=pt[i].x,yi=pt[i].y,xj=pt[j].x,yj=pt[j].y;yi>y!=yj>y&&x<(xj-xi)*(y-yi)/(yj-yi)+xi&&(inside=!inside)}return inside}(p),azzera(){return pt=[],this},removeduplicate(delta=.005){return pt=removeduplicate(pt,delta),this},to3d(u0,alt=0,coeffa=0,coeffb=0,open=!1){pt=removeduplicate(pt);let tm=function genuvnormal(path,options){let{currentU:currentU=0,c:c=0,a:a=0,b:b=0,anglemin:anglemin=30,open:open=!1}=options;const pointsWithNormals=[],n=path.length;for(let i=0;i<n;i++){const prev=path[(i-1+n)%n],current=path[i],next=path[(i+1)%n],vPrev={x:current.x-prev.x,y:current.y-prev.y},vNext={x:next.x-current.x,y:next.y-current.y},normalPrev=normal2(prev,current),normalNext=normal2(current,next),angle=angle2vec(vPrev,vNext);let z=a*current.x+b*current.y+c;Math.abs(angle-180)<=anglemin?(normalPrev.nx,normalNext.nx,normalPrev.ny,normalNext.ny,pointsWithNormals.push({x:current.x,y:-current.y,z:z,u:currentU,v:z})):(pointsWithNormals.push({x:current.x,y:-current.y,z:z,u:currentU,v:z}),pointsWithNormals.push({x:current.x,y:-current.y,z:z,u:currentU,v:z}));const dx=next.x-current.x,dy=next.y-current.y;currentU+=Math.sqrt(dx*dx+dy*dy)}if(!open){let p=pointsWithNormals[0],pf=pointsWithNormals[pointsWithNormals.length-1];p.x==pf.x&&p.y==pf.y||pointsWithNormals.push({x:p.x,y:p.y,z:p.z,nx:p.nx,ny:p.ny,nz:p.nz,u:currentU,v:p.z})}return pointsWithNormals}(pt,{open:open,currentU:u0,c:alt,a:coeffa,b:coeffb,anglemin:30});return tm},getboundbox:()=>pt.length?pt.reduce(((box,p)=>(box.p1.x=Math.min(box.p1.x,p.x),box.p1.y=Math.min(box.p1.y,p.y),box.p2.x=Math.max(box.p2.x,p.x),box.p2.y=Math.max(box.p2.y,p.y),box)),{p1:new Punto2(1/0,1/0),p2:new Punto2(-1/0,-1/0)}):{p1:new Punto2(0,0),p2:new Punto2(0,0)},fittobox(p1,p2){if(!pt.length)return this;const currentBox=this.getboundbox(),currentWidth=currentBox.p2.x-currentBox.p1.x,currentHeight=currentBox.p2.y-currentBox.p1.y,targetWidth=p2.x-p1.x,targetHeight=p2.y-p1.y,scale=Math.min(targetWidth/(currentWidth||1),targetHeight/(currentHeight||1));for(let p of pt)p.x=(p.x-currentBox.p1.x)*scale,p.y=(p.y-currentBox.p1.y)*scale,p.x+=p1.x,p.y+=p1.y;return this}}}
|
|
272
272
|
/**
|
|
273
273
|
* Calcola i punti di un arco passante per tre punti
|
|
274
274
|
* @param {number} segments - Numero di segmenti (punti-1)
|
|
@@ -486,7 +486,7 @@ ClipperLib.ExPolygon=function(){this.outer=null,this.holes=null},ClipperLib.JS.A
|
|
|
486
486
|
* @property {Function} inflate - Espande o contrae una forma
|
|
487
487
|
* @property {Function} unisci - Unisce più forme con gestione di fori e tagli
|
|
488
488
|
*/
|
|
489
|
-
function shapeclip(){function toclipformat(pts){let tm=pts.map((e=>({X:Math.round(1e4*e.x),Y:Math.round(1e4*e.y)})));return ensureOrientation(tm)}function fromclipformat(pts){return pts.map((e=>({x:e.X/1e4,y:e.Y/1e4})))}const ensureOrientation=poly=>ClipperLib.Clipper.Orientation(poly)?poly:poly.slice().reverse();function orientation(pt){if(!pt.length)return 0;let area=0;const n=pt.length;for(let i=0;i<n;i++){const current=pt[i],next=pt[(i+1)%n];area+=current.X*next.Y-next.X*current.Y}return area>0?1:area<0?-1:0}const _inflate=(pt,delta,cut=!1)=>{const co=new ClipperLib.ClipperOffset;co.MiterLimit=4,co.AddPath(pt,ClipperLib.JoinType.jtMiter,cut||2==pt.length?ClipperLib.EndType.etOpenButt:ClipperLib.EndType.etClosedPolygon);const solution=new ClipperLib.Paths;return co.Execute(solution,delta),solution};return{offset(shape,delta,full=!1){const co=new ClipperLib.ClipperOffset;co.MiterLimit=4,co.ArcTolerance=.25;const DD=1e4*Math.abs(delta),pshape=toclipformat(shape.pt);co.AddPath(pshape,ClipperLib.JoinType.jtMiter,ClipperLib.EndType.etOpenButt);const solution=new ClipperLib.Paths;co.Execute(solution,DD);let tm=fromclipformat(solution[0]);return full?getshape().frompt(tm):getshape().frompt(getptsoffset(shape.pt,tm,delta))},inflate(shape,delta=2,mantainorder=!1){let pshape=toclipformat(shape.pt),tm=_inflate(pshape,1e4*delta);let p2=getshape().frompt(fromclipformat(tm[0]));if(mantainorder&&shape.pt.length==p2.pt.length){p2.orient!=shape.orient&&p2.reverse();let p3=function alignByMinDist(sag1,sag2){const N=sag1.length;let bestOffset=0,minSum=1/0;for(let k=0;k<N;k++){let sum=0;for(let i=0;i<N;i++){const p=sag1[i],q=sag2[(i+k)%N],dx=p.x-q.x,dy=p.y-q.y;sum+=dx*dx+dy*dy}sum<minSum&&(minSum=sum,bestOffset=k)}return[...sag2.slice(bestOffset),...sag2.slice(0,bestOffset)]}(shape.pt,p2.pt);p2.frompt(p3)}return p2},intersecasplitter(areabase,forma1){const clipper=new ClipperLib.Clipper,pt1=[toclipformat(forma1.pt)],pt2=[toclipformat(areabase.pt)];clipper.AddPaths(pt1,ClipperLib.PolyType.ptSubject,!0),clipper.AddPaths(pt2,ClipperLib.PolyType.ptClip,!0);const solution=new ClipperLib.Paths;let res;if(clipper.Execute(ClipperLib.ClipType.ctIntersection,solution,ClipperLib.PolyFillType.pftNonZero,ClipperLib.PolyFillType.pftNonZero)&&solution.length>0){const path=solution[0];if(1===orientation(path)){res=getshape().frompt(fromclipformat(path)),res.orient!=forma1.orient&&res.reverse();for(let iu=0;iu<forma1.pt.length;iu++){let p2=forma1.pt[iu],id=res.pt.findIndex((p=>Math.abs(p.x-p2.x)<.01&&Math.abs(p.y-p2.y)<.01));if(id>0){id-=iu,0!=id&&res.selezionaprimo(id);break}}}}return res},offsetpts(pts,delta=.01){const DELTA=1e4*delta;let tm=_inflate(toclipformat(pts),DELTA);if(tm&&tm.length)return fromclipformat(tm[0])},areesplitter(shapept,clipspt,useInflatedClipping=!0){if(!Array.isArray(shapept)||shapept.length<3)return;if(!clipspt||0==clipspt.length)return[shapept];const subj=new ClipperLib.Paths,clip=new ClipperLib.Paths;let shape_in=useInflatedClipping?_inflate(toclipformat(shapept),-100):[toclipformat(shapept)],clips_in=useInflatedClipping?clipspt.flatMap((c=>_inflate(toclipformat(c),100))):clipspt.map((c=>toclipformat(c)));for(let s of shape_in)subj.push(s);for(let c of clips_in)clip.push(c);const clipper=new ClipperLib.Clipper;clipper.AddPaths(subj,ClipperLib.PolyType.ptSubject,!0),clipper.AddPaths(clip,ClipperLib.PolyType.ptClip,!0);const solution=new ClipperLib.Paths;if(!clipper.Execute(ClipperLib.ClipType.ctDifference,solution,ClipperLib.PolyFillType.pftNonZero,ClipperLib.PolyFillType.pftNonZero))return;let res=[];for(let x of solution)if(useInflatedClipping){const restored=_inflate(x,100);for(const r of restored)1===orientation(r)&&res.push(fromclipformat(r))}else if(x.length>4&&1==orientation(x)){const cleaned=_inflate(x,-100);if(cleaned.length>0)for(let cc of cleaned){const restored=_inflate(cc,100);for(const rr of restored)1===orientation(rr)&&res.push(fromclipformat(rr))}}else 1==orientation(x)&&res.push(fromclipformat(x));return res},unisci(shapes,holes,cuts){const subj=new ClipperLib.Paths,clip=new ClipperLib.Paths;for(let hh of shapes){let h2=[toclipformat(hh.pt)];for(let h of h2)subj.push(h)}if(holes&&holes.length)for(let hh of holes){let h1=toclipformat(hh.pt);clip.push(h1)}if(cuts&&cuts.length)for(let hh of cuts){let h1=toclipformat(hh.pt),h2=_inflate(h1,1,!0);for(let h of h2)clip.push(h)}const clipper=new ClipperLib.Clipper;clipper.AddPaths(subj,ClipperLib.PolyType.ptSubject,!0),clipper.AddPaths(clip,ClipperLib.PolyType.ptClip,!0);const solution=new ClipperLib.Paths;if(clipper.Execute(ClipperLib.ClipType.ctDifference,solution,ClipperLib.PolyFillType.pftNonZero,ClipperLib.PolyFillType.pftNonZero)){let res=[],holes=[];for(let x of solution)if(1==orientation(x)){let yy=[x];for(let y of yy)res.push({shape:getshape().frompt(fromclipformat(y)),holes:[]})}else holes.push(getshape().frompt(fromclipformat(x)));for(let h of holes)for(let s of res)if(s.shape.pointinshape(h.pt[0])){s.holes.push(h);break}return res}return[]}}}class Vis2d{constructor(name,p1,p2){this.name=name,this.clear(p1,p2)}clear(p1,p2){return this.vec=[],this.xp1=p1||new Punto2(-10,-10),this.xp2=p2||new Punto2(100,100),this}randomcolor(transp="100%"){return`hsl(${Math.floor(360*Math.random())}, 50%, 40%,${transp})`}addpoint(p,id=-1,color=void 0,spessore=1){return this.vec.push({type:"point",p:p,id:id,color:color,spessore:spessore}),this}addline(l,id=-1,color=void 0,spessore=1){return this.vec.push({type:"line",l:l,id:id,color:color,spessore:spessore}),this}addrect(l,id=-1,color=void 0,spessore=1){return this.vec.push({type:"rect",l:l,id:id,color:color,spessore:spessore}),this}addrecta(l,id=-1,color=void 0){return this.vec.push({type:"recta",l:l,id:id,color:color,spessore:0}),this}addshape(s,color=void 0,spessore=1){return this.vec.push({type:"shape",s:s,color:color||this.randomcolor(),spessore:spessore}),this}addshapelin(s,color=void 0,spessore=1){return this.vec.push({type:"shapelin",s:s,color:color||this.randomcolor(),spessore:spessore}),this}addarea(s,color=void 0){return this.vec.push({type:"area",s:s,color:color||this.randomcolor()}),this}addoffset(x,y){return this.vec.push({type:"offset",x:x||0,y:y||0}),this}}
|
|
489
|
+
function shapeclip(){function toclipformat(pts){let tm=pts.map((e=>({X:Math.round(1e4*e.x),Y:Math.round(1e4*e.y)})));return ensureOrientation(tm)}function fromclipformat(pts){return pts.map((e=>({x:e.X/1e4,y:e.Y/1e4})))}const ensureOrientation=poly=>ClipperLib.Clipper.Orientation(poly)?poly:poly.slice().reverse();function orientation(pt){if(!pt.length)return 0;let area=0;const n=pt.length;for(let i=0;i<n;i++){const current=pt[i],next=pt[(i+1)%n];area+=current.X*next.Y-next.X*current.Y}return area>0?1:area<0?-1:0}const _inflate=(pt,delta,cut=!1)=>{const co=new ClipperLib.ClipperOffset;co.MiterLimit=4,co.AddPath(pt,ClipperLib.JoinType.jtMiter,cut||2==pt.length?ClipperLib.EndType.etOpenButt:ClipperLib.EndType.etClosedPolygon);const solution=new ClipperLib.Paths;return co.Execute(solution,delta),solution};return{offset(shape,delta,full=!1){const co=new ClipperLib.ClipperOffset;co.MiterLimit=4,co.ArcTolerance=.25;const DD=1e4*Math.abs(delta),pshape=toclipformat(shape.pt);co.AddPath(pshape,ClipperLib.JoinType.jtMiter,ClipperLib.EndType.etOpenButt);const solution=new ClipperLib.Paths;co.Execute(solution,DD);let tm=fromclipformat(solution[0]);return full?getshape().frompt(tm):getshape().frompt(getptsoffset(shape.pt,tm,delta))},inflate(shape,delta=2,mantainorder=!1){let pshape=toclipformat(shape.pt),tm=_inflate(pshape,1e4*delta);let p2=getshape().frompt(fromclipformat(tm[0]));if(mantainorder&&shape.pt.length==p2.pt.length){p2.orient!=shape.orient&&p2.reverse();let p3=function alignByMinDist(sag1,sag2){const N=sag1.length;let bestOffset=0,minSum=1/0;for(let k=0;k<N;k++){let sum=0;for(let i=0;i<N;i++){const p=sag1[i],q=sag2[(i+k)%N],dx=p.x-q.x,dy=p.y-q.y;sum+=dx*dx+dy*dy}sum<minSum&&(minSum=sum,bestOffset=k)}return[...sag2.slice(bestOffset),...sag2.slice(0,bestOffset)]}(shape.pt,p2.pt);p2.frompt(p3)}return p2},intersecasplitter(areabase,forma1){const clipper=new ClipperLib.Clipper,pt1=[toclipformat(forma1.pt)],pt2=[toclipformat(areabase.pt)];clipper.AddPaths(pt1,ClipperLib.PolyType.ptSubject,!0),clipper.AddPaths(pt2,ClipperLib.PolyType.ptClip,!0);const solution=new ClipperLib.Paths;let res;if(clipper.Execute(ClipperLib.ClipType.ctIntersection,solution,ClipperLib.PolyFillType.pftNonZero,ClipperLib.PolyFillType.pftNonZero)&&solution.length>0){const path=solution[0];if(1===orientation(path)){res=getshape().frompt(fromclipformat(path)),res.orient!=forma1.orient&&res.reverse();for(let iu=0;iu<forma1.pt.length;iu++){let p2=forma1.pt[iu],id=res.pt.findIndex((p=>Math.abs(p.x-p2.x)<.01&&Math.abs(p.y-p2.y)<.01));if(id>0){id-=iu,0!=id&&res.selezionaprimo(id);break}}}}return res},offsetpts(pts,delta=.01){const DELTA=1e4*delta;let tm=_inflate(toclipformat(pts),DELTA);if(tm&&tm.length)return fromclipformat(tm[0])},areesplitter(shapept,clipspt,useInflatedClipping=!0){if(!Array.isArray(shapept)||shapept.length<3)return;if(!clipspt||0==clipspt.length)return[shapept];const subj=new ClipperLib.Paths,clip=new ClipperLib.Paths;let shape_in=useInflatedClipping?_inflate(toclipformat(shapept),-100):[toclipformat(shapept)],clips_in=useInflatedClipping?clipspt.flatMap((c=>_inflate(toclipformat(c),100))):clipspt.map((c=>toclipformat(c)));for(let s of shape_in)subj.push(s);for(let c of clips_in)clip.push(c);const clipper=new ClipperLib.Clipper;clipper.AddPaths(subj,ClipperLib.PolyType.ptSubject,!0),clipper.AddPaths(clip,ClipperLib.PolyType.ptClip,!0);const solution=new ClipperLib.Paths;if(!clipper.Execute(ClipperLib.ClipType.ctDifference,solution,ClipperLib.PolyFillType.pftNonZero,ClipperLib.PolyFillType.pftNonZero))return;let res=[];for(let x of solution)if(useInflatedClipping){const restored=_inflate(x,100);for(const r of restored)1===orientation(r)&&res.push(fromclipformat(r))}else if(x.length>4&&1==orientation(x)){const cleaned=_inflate(x,-100);if(cleaned.length>0)for(let cc of cleaned){const restored=_inflate(cc,100);for(const rr of restored)1===orientation(rr)&&res.push(fromclipformat(rr))}}else 1==orientation(x)&&res.push(fromclipformat(x));return res},unisci(shapes,holes,cuts){const subj=new ClipperLib.Paths,clip=new ClipperLib.Paths;for(let hh of shapes){let h2=[toclipformat(hh.pt)];for(let h of h2)subj.push(h)}if(holes&&holes.length)for(let hh of holes){let h1=toclipformat(hh.pt);clip.push(h1)}if(cuts&&cuts.length)for(let hh of cuts){let h1=toclipformat(hh.pt),h2=_inflate(h1,1,!0);for(let h of h2)clip.push(h)}const clipper=new ClipperLib.Clipper;clipper.AddPaths(subj,ClipperLib.PolyType.ptSubject,!0),clipper.AddPaths(clip,ClipperLib.PolyType.ptClip,!0);const solution=new ClipperLib.Paths;if(clipper.Execute(ClipperLib.ClipType.ctDifference,solution,ClipperLib.PolyFillType.pftNonZero,ClipperLib.PolyFillType.pftNonZero)){let res=[],holes=[];for(let x of solution)if(1==orientation(x)){let yy=[x];for(let y of yy)res.push({shape:getshape().frompt(fromclipformat(y)),holes:[]})}else holes.push(getshape().frompt(fromclipformat(x)));for(let h of holes)for(let s of res)if(s.shape.pointinshape(h.pt[0])){s.holes.push(h);break}return res}return[]}}}class Vis2d{constructor(name,p1,p2){this.name=name,this.clear(p1,p2)}clear(p1,p2){return this.vec=[],this.xp1=p1||new Punto2(-10,-10),this.xp2=p2||new Punto2(100,100),this}push(x,y,rot=0){this.vec.push({type:"push",x:x,y:y,rot:rot})}pop(){this.vec.push({type:"pop"})}randomcolor(transp="100%"){return`hsl(${Math.floor(360*Math.random())}, 50%, 40%,${transp})`}addpoint(p,id=-1,color=void 0,spessore=1){return this.vec.push({type:"point",p:p,id:id,color:color,spessore:spessore}),this}addline(l,id=-1,color=void 0,spessore=1){return this.vec.push({type:"line",l:l,id:id,color:color,spessore:spessore}),this}addrect(l,id=-1,color=void 0,spessore=1){return this.vec.push({type:"rect",l:l,id:id,color:color,spessore:spessore}),this}addrecta(l,id=-1,color=void 0){return this.vec.push({type:"recta",l:l,id:id,color:color,spessore:0}),this}addshape(s,color=void 0,spessore=1){return this.vec.push({type:"shape",s:s,color:color||this.randomcolor(),spessore:spessore}),this}addshapelin(s,color=void 0,spessore=1){return this.vec.push({type:"shapelin",s:s,color:color||this.randomcolor(),spessore:spessore}),this}addarea(s,color=void 0){return this.vec.push({type:"area",s:s,color:color||this.randomcolor()}),this}addoffset(x,y){return this.vec.push({type:"offset",x:x||0,y:y||0}),this}}
|
|
490
490
|
/**
|
|
491
491
|
* Genera segmenti basati su intervalli e punti di interruzione
|
|
492
492
|
* @param {Array<{a: number, b: number}>} t1 - Array di oggetti che rappresentano intervalli con coordinate a e b
|
|
@@ -494,7 +494,7 @@ function shapeclip(){function toclipformat(pts){let tm=pts.map((e=>({X:Math.roun
|
|
|
494
494
|
* @param {boolean} [interna=false] - Se true, usa i bordi interni degli intervalli
|
|
495
495
|
* @param {boolean} [allbreak=false] - Se true, considera ogni punto degli intervalli come una rottura
|
|
496
496
|
* @returns {Array<{a: number, b: number}>} Array di segmenti generati
|
|
497
|
-
*/function generatesegments(t1,t2,interna=!1,allbreak=!1){let t3=[];if(t1?.length
|
|
497
|
+
*/function generatesegments(t1,t2,interna=!1,allbreak=!1){let t3=[];if(t1?.length>=2){if(allbreak){let tm=[];for(let t of t1)tm.push({a:t.a,b:t.a}),t.a!=t.b&&tm.push({a:t.b,b:t.b});t1=tm}if(t1=t1.sort(((a,b)=>a.a-b.a)),t2?.length){let j=0;for(let i=1;i<t1.length;i++){const ε=1e-6;t2.find((e=>e>t1[i-1].b+ε&&e<t1[i].a-ε))&&(i-1>j&&(interna?t3.push({a:t1[j].b,b:t1[i-1].a}):t3.push({a:t1[j].a,b:t1[i-1].b})),j=i)}j<t1.length-1&&(interna?t3.push({a:t1[j].b,b:t1[t1.length-1].a}):t3.push({a:t1[j].a,b:t1[t1.length-1].b}))}else t3.push({a:t1[0].b,b:t1[t1.length-1].a})}return t3}function bordi(ff){function getbordo(b1,b2){let b=b1??b2??{s:0};return"number"==typeof b?{s:b}:"number"==typeof b?.s?b:{s:0}}let bt,bb,bl,br;return"a"==ff.tipo?bt=bb=bl=br=getbordo(ff.bordo,ff.bordo):(bt=getbordo(ff.bt,ff.bordo),bb=getbordo(ff.bb,ff.bordo),bl=getbordo(ff.bl,ff.bordo),br=getbordo(ff.br,ff.bordo)),{bt:bt,bb:bb,bl:bl,br:br}}function internalshape(ff,shape){let shape2,CLP=shapeclip(),{bt:bt,bb:bb,bl:bl,br:br}=bordi(ff);if(bt==br&&bb==br&&bl==br||"a"==ff.tipo)shape2=CLP.inflate(shape,-bt.s,!0);else{let n=shape.pt.length,ll=[];for(let i=0;i<n;i++){let ofs=0==i?bl.s:i==n-2?br.s:i==n-1?bb.s:bt.s;ll.push(shape.segment(i).offset(-ofs))}let pts=[];for(let i=0;i<n;i++){let j=(i+n-1)%n,p=ll[i].intersezione(ll[j]);p||(p=shape.pt[i]),pts.push(p)}shape2=getshape().frompt(pts)}return shape2}const tipi={i:"inclinato",a:"arco",d:"diagonali",s:"smussato",x:"normale"},priorita={v:"verticale",h:"orizzontale"},tagli={d:"diagonale",v:"verticale",h:"orizzontale",o:"orizzontale"};function ordinabase(hh,dd,minvano,b1,b2,tipo){let d1=[];if(hh){for(var h of hh){let x=0;switch(h.tipo){case"d-":x=dd-h.p;break;case"p":x=dd*h.p/100;break;case"p-":x=dd*(100-h.p)/100;break;default:x=h.p}let sp=h.sps||0;if(sp&&"c"==h.align?x-=sp/2:sp&&"r"==h.align&&(x-=sp),x=Math.round(10*x)/10,x>b1&&x<dd-b2){let cuts=[];h.cuttings&&h.cuttings.length&&h.cuttings.forEach((c=>{cuts.push(c<0?dd+c:c)})),d1.push({id:h.id,x:x,sp:sp,cuts:cuts,des:h.des})}}d1.sort(((a,b)=>a.x-b.x))}let d2=[],p0=b1;"a"==tipo&&(dd*=1.3);for(let i=0;i<d1.length;i++){let d=d1[i];d.x>=p0+minvano&&d.x+d.sp<=dd-b2-minvano&&(d.min=p0+minvano,d.max=dd-b2-minvano,d2.length>0&&(d2[d2.length-1].max=d.x-minvano),d2.push(d),p0=d.x+d.sp)}let d3=[];d3.push({a:b1,b:b1});for(let d of d2)d3.push({a:d.x,b:d.x+d.sp});return d3.push({a:dd-b2,b:dd-b2}),{dati:d2,punti:d3}}const tipocut={d:"dist. positiva","d-":"dist. negativa",p:"perc. positiva","p-":"perc negativa"},tipoalign={l:"left",c:"center",r:"right"};function newcount(ff){return ff.countid++,ff.countid}function addtaglio(ff,dir,tipodim,dim,sps,des,align="c",cuts=[]){return{dir:dir,id:newcount(ff),tipo:tipocut[tipodim]?tipodim:"d",align:tipoalign[align]?align:"c",p:dim,sps:sps,des:des,cuttings:cuts||[]}}function pushlineare(ff,type,des,l0,l1,id=-1,shapecontorno=void 0,areas){let tm;if(id<0&&(id=newcount(ff)),"l"==type)Array.isArray(areas)&&areas.push([l0.p1,l0.p2]);else{let ptx=[l0.p1,l0.p2,l1.p2,l1.p1];Array.isArray(areas)&&areas.push(ptx);let s1=getshape().frompt(ptx);if(shapecontorno?.pt&&"x"!=ff.tipo&&(s1=shapeclip().intersecasplitter(shapecontorno,s1)),s1){let info=l0.infoquad(l1);if(info&&info.distanza){let s2=s1.clone();(info.sx||info.sy)&&s2.move(-info.sx||0,-info.sy||0),info.angle&&s2.rotate(-info.angle||0),tm={id:id,type:type,des:des,shape:s2.pt,info:info},ff.dati.push(tm)}}}return tm}function pushshape(ff,type,des,shape,info,id=-1){let tm;return id<0&&(id=newcount(ff)),info||(info={}),info={isshape:!0},shape?.pt&&(tm={id:id,type:type,des:des,shape:shape.pt,info:info},ff.dati.push(tm)),tm}function creabordi(ff,shape,shape2){let l1,n=shape.pt.length,draws=[];function addlineare(type,des,l0,l1){let tm=pushlineare(ff,type,des,l0,l1);tm?.shape&&draws.push({pt:tm.shape,type:type,sx:tm.info.sx,sy:tm.info.sy,rot:tm.info.angle})}if("a"!=ff.tipo)for(let i=1;i<n-2;i++)addlineare("bt","sopra",shape.segment(i),shape2.segment(i));else{let p1=[...shape.pt].slice(1,-1),p2=[...shape2.pt].slice(1,-1).reverse(),sa=getshape().frompt([...p1,...p2]);pushshape(ff,"bt","sopra",sa,{isarco:!0}),draws.push({pt:sa.pt,type:"bs"})}switch(ff.taglio){case"o":case"h":{let p1=shape2.segment(n-1).intersezione(shape.segment(0)),p2=shape2.segment(n-1).intersezione(shape.segment(n-2));l1=new Linea2(p1,shape.pt[1]),addlineare("bl","sx",l1,shape2.segment(0)),l1=new Linea2(shape.pt[n-2],p2),addlineare("br","dx",l1,shape2.segment(n-2)),l1=new Linea2(p2,p1),addlineare("bb","sotto",shape.segment(n-1),l1);break}case"v":{let p1=shape2.segment(0).intersezione(shape.segment(n-1)),p2=shape2.segment(n-2).intersezione(shape.segment(n-1));l1=new Linea2(p1,shape2.pt[1]),addlineare("bl","sx",shape.segment(0),l1),l1=new Linea2(shape2.pt[n-2],p2),addlineare("br","sx",shape.segment(n-2),l1),l1=new Linea2(p2,p1),addlineare("bb","sotto",l1,shape2.segment(n-1));break}default:addlineare("bl","sx",shape.segment(0),shape2.segment(0)),addlineare("br","dx",shape.segment(n-2),shape2.segment(n-2)),addlineare("bb","sotto",shape.segment(n-1),shape2.segment(n-1))}return draws}var SP=Object.freeze({__proto__:null,addhoriz:function addhoriz(ff,tipodim,dim,sps,des,align,cuts){Array.isArray(align)&&(cuts=align,align="c");let tm=addtaglio(ff,"h",tipodim,dim,sps,des,align,cuts);ff.horiz.push(tm)},addvert:function addvert(ff,tipodim,dim,sps,des,align,cuts){Array.isArray(align)&&(cuts=align,align="c");let tm=addtaglio(ff,"v",tipodim,dim,sps,des,align,cuts);ff.vert.push(tm)},bordi:bordi,calcoladivisioni:
|
|
498
498
|
/**
|
|
499
499
|
* Ordina e calcola le posizioni di taglio lungo una dimensione, gestendo bordi e spazi minimi
|
|
500
500
|
* @param {Array<Object>} hh - Array di oggetti che definiscono i tagli
|
|
@@ -505,4 +505,4 @@ function shapeclip(){function toclipformat(pts){let tm=pts.map((e=>({X:Math.roun
|
|
|
505
505
|
* - dati: Array di oggetti con le posizioni elaborate dei tagli
|
|
506
506
|
* - punti: Array di oggetti {a,b} che definiscono inizio e fine di ogni segmento
|
|
507
507
|
*/
|
|
508
|
-
function calcoladivisioni(ff,shape,shape2){let draws=creabordi(ff,shape,shape2)||[],areas=[],{x:dx,y:dy,horiz:horiz,vert:vert,tipo:tipo,priority:priority,minvano:minvano,minvanox:minvanox,minvanoy:minvanoy}=ff,{bl:bl,br:br,bt:bt,bb:bb}=bordi(ff);minvanox=minvanox||minvano||50,minvanoy=minvanoy||minvano||50;let{dati:h1,punti:ph}=ordinabase(horiz,dy,minvanoy,bb.s,bt.s),{dati:v1,punti:pv}=ordinabase(vert,dx,minvanox,bl.s,br.s);function adddatilin(type,des,l0,l1,id){let tm=pushlineare(ff,type,des,l0,l1,id,shape2,areas);tm?.shape&&draws.push({pt:tm.shape,type:type})}function isinseg(segs,v){return!!segs.find((e=>e.a<=v&&e.b>=v))}for(var h of(v1.forEach(((v,i)=>{v.segs=generatesegments(ph,v.cuts,!0),v.segs.forEach(((s,j)=>{let l0=new Linea2({x:v.x,y:s.a},{x:v.x,y:s.b}),l1=new Linea2({x:v.x+v.sp,y:s.a},{x:v.x+v.sp,y:s.b});adddatilin(v.sp?"v":"l","vert",l0,l1,v.id)}))})),h1)){let cuts=[...h.cuts],pv1=[...pv];for(var v of v1)pv1.push({a:v.x,b:v.x+v.sp}),isinseg(v.segs,h.x+h.sp/2)&&cuts.push(v.x+v.sp/2);h.segs=generatesegments(pv1,cuts,!0,!0);for(let s of h.segs){let l0=new Linea2({x:s.a,y:h.x+h.sp},{x:s.b,y:h.x+h.sp}),l1=new Linea2({x:s.a,y:h.x},{x:s.b,y:h.x});adddatilin(h.sp?"h":"l","oriz",l0,l1,h.id)}}let res=shapeclip().areesplitter(shape2.pt,areas);for(let d of res){let s=getshape().frompt(d),{p1:p1,width:width,height:height,isrect:isrect}=s.dims(),ix=s.pt.findIndex((p=>Math.abs(p.x-p1.x)<.001&&Math.abs(p.y-p1.y)<.001));ix>0&&s.selezionaprimo(ix),ff.dati.push({id:-1,type:"a",des:"
|
|
508
|
+
function calcoladivisioni(ff,shape,shape2){let draws=creabordi(ff,shape,shape2)||[],areas=[],{x:dx,y:dy,horiz:horiz,vert:vert,tipo:tipo,priority:priority,minvano:minvano,minvanox:minvanox,minvanoy:minvanoy}=ff,{bl:bl,br:br,bt:bt,bb:bb}=bordi(ff);minvanox=minvanox||minvano||50,minvanoy=minvanoy||minvano||50;let{dati:h1,punti:ph}=ordinabase(horiz,dy,minvanoy,bb.s,bt.s,tipo),{dati:v1,punti:pv}=ordinabase(vert,dx,minvanox,bl.s,br.s);function adddatilin(type,des,l0,l1,id){let tm=pushlineare(ff,type,des,l0,l1,id,shape2,areas);tm?.shape&&draws.push({pt:tm.shape,type:type,sx:tm.info.sx,sy:tm.info.sy,rot:tm.info.angle})}function isinseg(segs,v){return!!segs.find((e=>e.a<=v&&e.b>=v))}for(var h of(v1.forEach(((v,i)=>{v.segs=generatesegments(ph,v.cuts,!0),v.segs.forEach(((s,j)=>{let l0=new Linea2({x:v.x,y:s.a},{x:v.x,y:s.b}),l1=new Linea2({x:v.x+v.sp,y:s.a},{x:v.x+v.sp,y:s.b});adddatilin(v.sp?"v":"l","vert",l0,l1,v.id)}))})),h1)){let cuts=[...h.cuts],pv1=[...pv];for(var v of v1)pv1.push({a:v.x,b:v.x+v.sp}),isinseg(v.segs,h.x+h.sp/2)&&cuts.push(v.x+v.sp/2);h.segs=generatesegments(pv1,cuts,!0,!0);for(let s of h.segs){let l0=new Linea2({x:s.a,y:h.x+h.sp},{x:s.b,y:h.x+h.sp}),l1=new Linea2({x:s.a,y:h.x},{x:s.b,y:h.x});adddatilin(h.sp?"h":"l","oriz",l0,l1,h.id)}}let res=shapeclip().areesplitter(shape2.pt,areas);for(let d of res){let s=getshape().frompt(d),{p1:p1,width:width,height:height,isrect:isrect}=s.dims(),ix=s.pt.findIndex((p=>Math.abs(p.x-p1.x)<.001&&Math.abs(p.y-p1.y)<.001));ix>0&&s.selezionaprimo(ix),s.pt.length&&(s.move(-p1.x,-p1.y),1==s.orient&&s.reverse()),ff.dati.push({id:-1,type:"a",des:"_",shape:isrect?null:s.pt,info:{isrect:isrect?1:0,sx:p1.x,sy:p1.y,rot:0,width:width,height:height}}),draws.push({pt:s.pt,sx:p1.x,sy:p1.y,rot:0,type:isrect?"a":"as"})}return{ff:ff,h1:h1,ph:ph,v1:v1,pv:pv,draws:draws,areas:areas}},creabordi:creabordi,create:function create(x,y,bordo,options){options||(options={});let{minvano:minvano,priority:priority,taglio:taglio,tagliov:tagliov,tipo:tipo,h1:h1,h2:h2,d1:d1,d2:d2,l1:l1,l2:l2,x1:x1,x2:x2,y1:y1,y2:y2}=options;minvano||(minvano=50);let ff={x:x||1e3,y:y||1e3,bordo:bordo||0,minvano:minvano||50,priority:priorita[priority]?priority:"v",taglio:tagli[taglio]?taglio:"d",tagliov:tagli[tagliov]?tagliov:"d",tipo:tipi[tipo]?tipo:"x",h1:h1||y1||0,h2:h2||y2||0,l1:l1||d1||x1||0,l2:l2||d2||x2||0,vert:[],horiz:[],dati:[],countid:1e3};return delete options.x1,delete options.x2,delete options.d1,delete options.d2,delete options.y1,delete options.y2,ff={...options,...ff},ff},findid:function findid(ff,id){let f=ff.vert.find((e=>e.id==id));return f||(f=ff.horiz.find((e=>e.id==id))),{f:f}},generatesegments:generatesegments,internalshape:internalshape,makeshape:function makeshape(ff){let shape,{x:x,y:y,tipo:tipo,h1:h1,h2:h2,l1:l1,l2:l2}=ff;if(x>0&&y>0){let pts=[0,0];switch(tipo){case"i":pts.push(0,h1>0&&h1<y?y-h1:y),pts.push(x,h2>0&&h2<y&&h2!=h1?y-h2:y),pts.push(x,0),shape=getshape().fromvec(pts);break;case"a":if(h2=h2||h1||0,y-h1>=y-x/2&&y-h1<=y&&y-h2>=y-x/2&&y-h2<=y){let str=`0;0;a30;0;${y-h1};${x/2};${y};${x};${y-h2};${x};0`.replaceAll(",",".");shape=getshape().fromstr(str)}else pts.push(x,y,0,y),shape=getshape().fromvec(pts);break;case"s":case"d":l1=l1||0,l2=l2||0,l1&&l1<x&&h1>0&&h1<y?pts.push(0,y-h1,l1,y):pts.push(0,y),l2&&l2+l1<x&&h2>0&&h2<y?pts.push(x-l2,y,x,y-h2):0==l2&&l1>0&&l1<x&&h2>0&&h2<y?pts.push(x,y-h2):(l2=0,pts.push(x,y)),pts.push(x,0),shape=getshape().fromvec(pts);break;default:pts.push(0,y,x,y,x,0),shape=getshape().fromvec(pts)}}return ff.dati=[],{shape:shape,internalshape:internalshape(ff,shape)}},priorita:priorita,pushlineare:pushlineare,pushshape:pushshape,tagli:tagli,tipi:tipi,tipoalign:tipoalign,tipocut:tipocut});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 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&¯o.head&¯o.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))}if(p2=[],cadv={},iscad=!1,des="",fatti={},progetto&&progetto.keys&&progetto.keys[id]){let px=progetto.keys[id].pars;if(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&¶metri.length)for(const param of parametri)await _parsepars(param);if(macro&¯o.head&¯o.head.length){let tm=macro.head.filter((e=>!["g"].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);let ruleid=rulespec[id];if(id&&isheader&&ruleid&&ruleid.pars&&(out.pars=ruleid.pars,options.leveleval++,await macro.setparametri(ruleid.pars)),out.rows=await muEval(amb,macro,macro.codice,options),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)&&v&&(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]),delete pars[l]);output.push({t:"fn",fn:fn,id:id,pars:pars,p2:p2})}});return isfnreload&&"function"==typeof fnreload&&await fnreload(),{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 getprojectkeys(project){return project.keys={},function _getkeys(node){if(node.rows&&node.rows.length)for(let x of node.rows)ismacro(x)&&(x.id&&x.isheader&&x.pars&&(project.keys[x.id]={name:x.name,des:x.des||"",pars:x.pars}),_getkeys(x))}(project),project}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")}function clean(k,locase=!1){return locase?(k||"").trim().toLowerCase():(k||"").trim()}async function evalcustomfunction(amb,code,values,objects){try{values||(values={}),objects||(objects={});let params={GCAD:!1,...values,A:amb,V:amb.vari,amb:amb,log:console.log,Math:Math,clean:clean,SP:SP,Punto2:Punto2,Linea2:Linea2,clamp:clamp,hash:hash,PIF:PIF,getshape:getshape,shapeclip:shapeclip,...objects};const fn=new Function(...Object.keys(params),`try {\n return (async () => {\n ${code}\n })();\n } catch (err) {\n err.stack = '[SCRIPT] ' + err.stack;\n throw err;\n }`);return await fn(...Object.values(params))}catch(error){throw console.error("Errore durante l'esecuzione:",error),error}}export{Linea2,Matrix3D,PIF,Punto2,SP,Vis2d,angle2vec,angle3point,clamp,clean,evalcustomfunction,getdumpmacro,getnodebyid,getprojectkeys,getptsoffset,getshape,getsubrules,hash,isfn,ismacro,normal2,raccordabezier,shapeclip,valutagrafica};
|
package/bin/markcad3d.js
CHANGED
|
@@ -93,7 +93,7 @@ function getcilindro(gcad,ori,h,r1,r2,mats=mwhite,options){options||(options={})
|
|
|
93
93
|
* @param {THREE.Material} mat - Materiale da applicare
|
|
94
94
|
* @param {Object} options - Opzioni di configurazione
|
|
95
95
|
* @returns {Promise<THREE.Group>} Gruppo contenente il box
|
|
96
|
-
*/function getface(gcad,x,y,mat,scaled=!1){let ky=hash(`f:${x}|${y}|${scaled?1:0}`);if(!gcad.geo[ky]){const geometry=new THREE.PlaneGeometry(x,y),uvs=geometry.attributes.uv,positions=geometry.attributes.position;for(let i=0;i<positions.count;i++)uvs.setXY(i,scaled?positions.getX(i):positions.getX(i)/(.001*x),scaled?positions.getY(i):positions.getY(i)/(.001*y));gcad.geo[ky]=geometry}const plane=new THREE.Mesh(gcad.geo[ky],mat);return plane.position.set(x/2,y/2,0),mat?.transparent&&plane.layers.set(2),plane}function getbox(gcad,x,y,z,mat,options){options||(options={});let grp=new THREE.Group;const box=function boxgeometry(gcad,x,y,z){let ky=hash(`b:${x}|${y}|${
|
|
96
|
+
*/function getface(gcad,x,y,mat,scaled=!1){let ky=hash(`f:${x}|${y}|${scaled?1:0}`);if(!gcad.geo[ky]){const geometry=new THREE.PlaneGeometry(x,y),uvs=geometry.attributes.uv,positions=geometry.attributes.position;for(let i=0;i<positions.count;i++)uvs.setXY(i,scaled?positions.getX(i):positions.getX(i)/(.001*x),scaled?positions.getY(i):positions.getY(i)/(.001*y));gcad.geo[ky]=geometry}const plane=new THREE.Mesh(gcad.geo[ky],mat);return plane.position.set(x/2,y/2,0),mat?.transparent&&plane.layers.set(2),plane}function getbox(gcad,x,y,z,mat,options){options||(options={});let grp=new THREE.Group;const box=function boxgeometry(gcad,x,y,z){let ky=hash(`b:${x}|${y}|${z}`);if(!gcad.geo[ky]){const bx=new THREE.BoxGeometry(x,y,z);gcad.geo[ky]=bx}return gcad.geo[ky]}(gcad,x,y,z);if(grp.position.set(x/2,y/2,z/2),!options.nolines){let segments=edgesfromgeometry(box);grp.add(segments)}return grp.add(getmesh(box,mat||mwhite)),grp}
|
|
97
97
|
/**
|
|
98
98
|
* @param {BufferGeometry} geometry
|
|
99
99
|
* @param {number} tolerance
|
|
@@ -108,7 +108,7 @@ function getcilindro(gcad,ori,h,r1,r2,mats=mwhite,options){options||(options={})
|
|
|
108
108
|
* @param {Array} mats - Array di materiali
|
|
109
109
|
* @param {Object} options - Opzioni di configurazione
|
|
110
110
|
* @returns {THREE.Group} Gruppo contenente la geometria estrusa
|
|
111
|
-
*/function estruso(gcad,orient,hshape,shape,holes,mats,options){options||(options={}),mats||(mats=[]);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),open=options.open||!1,grp=new THREE.Group;if(!options.nobase){let g1=bottomgeomfromshape(gcad,!1,shape,open?[]:holes,p0,coeffbase1,coeffbase2);options.nolines||grp.add(edgesfromgeometry(g1)),grp.add(getmesh(g1,mats[0]||mwhite))}if(!options.notop){let g3=bottomgeomfromshape(gcad,!0,shape,open?[]:holes,p1,coefftop1,coefftop2);grp.add(getmesh(g3,mats[1]||mats[0]||mwhite)),options.nolines||grp.add(edgesfromgeometry(g3))}if(!options.nosides){let pat1=shape.to3d(0,p0,coeffbase1
|
|
111
|
+
*/function estruso(gcad,orient,hshape,shape,holes,mats,options){options||(options={}),mats||(mats=[]);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),open=options.open||!1,grp=new THREE.Group;if(!options.nobase){let g1=bottomgeomfromshape(gcad,!1,shape,open?[]:holes,p0,coeffbase1,coeffbase2);options.nolines||grp.add(edgesfromgeometry(g1)),grp.add(getmesh(g1,mats[0]||mwhite))}if(!options.notop){let g3=bottomgeomfromshape(gcad,!0,shape,open?[]:holes,p1,coefftop1,coefftop2);grp.add(getmesh(g3,mats[1]||mats[0]||mwhite)),options.nolines||grp.add(edgesfromgeometry(g3))}if(!options.nosides){let pat1=shape.to3d(0,p0,coeffbase1,-coeffbase2,open),pat2=shape.to3d(1,p1,coefftop1,-coefftop2,open),ky=`${shape.key}|${p0}|${p1}|${coeffbase1}|${coeffbase2}|${coefftop1}|${coefftop2}|${open}`,geo1=sidegeomfromshapes(gcad,ky,pat1,pat2,!1);if(options.nolines||options.nosidelines||grp.add(edgesfromgeometry(geo1)),grp.add(getmesh(geo1,mats[2]||mats[0]||mwhite)),holes&&!open)for(var h of holes){pat1=h.to3d(0,p0,coeffbase1,coeffbase2),pat2=h.to3d(0,p1,coefftop1,coefftop2),ky=`${h.key}|${p0}|${p1}|${coeffbase1}|${coeffbase2}|${coefftop1}|${coefftop2}`;let geo2=sidegeomfromshapes(gcad,ky,pat1,pat2,!0);options.nolines||options.nosidelines||grp.add(edgesfromgeometry(geo2)),grp.add(getmesh(geo2,mats[3]||mats[0]||mwhite))}}return estrusorotate(orient,grp,hshape)}function revolve(gcad,shape,orient,mat,options){options||(options={});let segmenti=options.segmenti??12,ky=hash(`rev|${shape.key}|${orient}|${segmenti}`),geometria=gcad.geo[ky],grp=new THREE.Group;if(!geometria){const punti3D=shape.pt.map((p=>new THREE.Vector3(p.x,p.y,0)));geometria=new THREE.LatheGeometry(punti3D,segmenti,0,2*Math.PI),gcad.geo[ky]=geometria}const mesh=new THREE.Mesh(geometria,mat);return grp.add(mesh),options.nolines||options.nosidelines||grp.add(edgesfromgeometry(geometria)),grp}
|
|
112
112
|
/**
|
|
113
113
|
* Crea una geometria estrusa con opzioni avanzate
|
|
114
114
|
* @param {string} orient - Orientamento dell'estrusione
|
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(){var 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){var retro={};for(let x in alias)alias[x]&&(retro[alias[x]]=x);return retro}(this.alias),rr=`^\\s*\\:(${(rr=[...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();var xx=data,res={};info&&((res=Object.assign(res,info)).info=!0);var 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;var 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;var 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;var 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){var 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)),checkcols((v2=v1.split("|")).length),0==fl&&/^[- :]+\|[- :|]*$/im.test(v1)){for(let i=0;i<v2.length;i++){var v=v2[i],x1=v.slice(0,1),x2=v.slice(-1);tb.align[i]=":"==x1&&":"==x2?"center":":"==x2?"right":"left"}fl=!0}else{var r=[];for(let i=0;i<v2.length;i++){let v=v2[i];if(fl){var 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){var 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))&&(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){var counter=[space];for(tokens.push({type:"list_start",ordered:ordered});;){var cap=/^( *)([*\-+])[\s$]/im.exec(src);if(!cap){_pushtoken(tokens,src);break}cap.index&&_pushtoken(tokens,src.substring(0,cap.index));var sl=cap[1].length;if(sl>counter[counter.length-1])tokens.push({type:"list_start",ordered:ordered}),counter.push(sl);else for(;;){var 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"})}var _tokenize=(tokens,src,top,bq)=>{let cap;for(src=src.replace(/^ +$/gm,"");src;){if(easylen){var 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);var 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);var res=/([^]*?)(\n\n|\n\s*[#>])/im.exec(src+"\n\n");res?(_parselista(tokens,"*"==cap[2],cap[1].length,res[1]),src=src.substring(res[1].length)):tokens.push({type:"text??",text:cap[0]})}}return tokens},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;var rr=rg.exec(tm);rr&&0==rr.index&&(tm=tm.replace(rg,""))}return tm}(src,noheader),_tokenize([],src,!0)},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){var 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=>({"<":"<",">":">"}[tag]))),escapeHTML=str=>str.replace(/[&<>'"]/g,(tag=>({"&":"&","<":"<",">":">","'":"'",'"':"""}[tag]))),unescapeHTML=str=>str.replace(/&/g,"&").replace(/"/g,'"').replace(/'/g,"'").replace(/>/g,">").replace(/</g,"<");function xelang(str,lang,punct){var gspan=(str,cls)=>(cls&&(cls=cls.replace(/(\b)(\w+)(\b)/g,"$1_$2$3")),`☉☊${cls||""}☊☉${(str=escapeTag(str))||""}☉☋`);let 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};var out=[],r=0,ids=[];if(lang){controls[lang]||(lang="js");var rg=regex("script");if(rg){for(var st1=[];;){var 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,"<").replace(/>/g,">");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))}var xx=out.join("\n");return xx=xx.replace(/☉☋/gmu,"</span>").replace(/☉☊([^]*?)☊☉/gmu,((p,p1)=>{if(p1){var 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>"}))}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");var 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){var 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){return header?`<th style="text-align:center;">${content}</th>\n`:`<td style="${align?"text-align:"+align+";":""}">${content}</td>`}colorbase(text){return`<span class='tilde'>${text}</span>`}formula(text,full=!1){if(this.easy)return"";var 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{var 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"";var v=text.split("|"),out="";let 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){var 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`}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;var tokenparser=(res,render,maxlen=0)=>{for(var totl=0,checklen=body=>{if(maxlen>0&&body.length>maxlen-totl){var q=(body=body.substring(0,maxlen-totl)).lastIndexOf(" ");q>0&&(body=body.substring(0,q))}return body},next=()=>token=tokens.pop(),parseText=()=>{for(var body=token.text;"text"===(tokens[tokens.length-1]||0).type;)body+="\n"+next().text;return output(checklen(body))},outputLink=(cap,link)=>{var 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]))},output=src=>{for(var link,text,href,cap,out="";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),href="@"===cap[2]?`mailto:${text=":"===cap[1].charAt(6)?cap[1].substring(7):cap[1]}`:text=escape(cap[1]),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.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),href=text=escape(cap[1]),out+=render.link(href,null,text);return out},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":for(var body="";"list_title_end"!==next().type;)body+=tok();return render.listtitle(body);case"list_item_start":{let body="";for(var num=token.num;"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(),token=void 0,inLink=!1,links={},codes=[],out=[];next();){var 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){var rr;function pb(exp,cl,callback){if(rr=exp.exec(tt)){__parselist(tt.slice(0,rr.index),tm);var 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=>{var vv=r.split(".");vv.shift();var cl=[];for(let v of vv)v.length&&cl.push(" ");return cl.push("-"),cl.join("")}))||tm.push({class:"",text:tt})))}function parselist(text,title=""){var tm=[];__parselist(text,tm);var counter=[],space=0;for(let ii=0;ii<tm.length;ii++){var t=tm[ii];if("list"==t.class){var sl=t.text.replace("\n","").length;if(sl>space)counter.push({space:sl,id:1}),space=sl;else for(;;){var 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=""){var rr;function parse3(exp,cl){return!!(rr=exp.exec(tt))&&(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))&&(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){var rr;function pb(exp,cl,row=!1){return!!(rr=exp.exec(tt))&&(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))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+=" ");var tm=[];return parseblock$1(tt,tm),tm}function parserow(tt,tm,classe=""){var rr;function parse1(exp,cl){return!!(rr=exp.exec(tt))&&(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)){var 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|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){var rr;(function pb(exp,cl,row=!1){return!!(rr=exp.exec(tt))&&(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+=" ");var tm=[];return parseblock(tt,tm),tm}function formatrule(code){let lines=code.split("\n"),formattedCode=[],indentLevel=0;for(let i=0;i<lines.length;i++){let line=lines[i].trim(),indent=" ".repeat(indentLevel>=0?indentLevel:0),command="";(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){var r=v;if(vars)for(var x in vars){var v2=vars[x]||`..${x}..`;r=r.replace(new RegExp(`\\[${x}\\]`,"gim"),v2)}return r}var parseinfomd=(data,info,mappa)=>aliasInfo.parse(data,info,mappa),mark=(xx,baseurl,notitle=!1,parsedlist=!1,callback)=>{var res;if(parsedlist)res=tokenize(xx,0,notitle);else{var{txt:txt}=parselist(xx);res=tokenize(txt,0,notitle)}return tokenparser(res,new Render(baseurl,!1,callback))},markeasy=(xx,maxlen=400,notitle=!1)=>{var 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(){var 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){var retro={};for(let x in alias)alias[x]&&(retro[alias[x]]=x);return retro}(this.alias),rr=`^\\s*\\:(${(rr=[...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();var xx=data,res={};info&&((res=Object.assign(res,info)).info=!0);var 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;var 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;var 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;var 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){var 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)),checkcols((v2=v1.split("|")).length),0==fl&&/^[- :]+\|[- :|]*$/im.test(v1)){for(let i=0;i<v2.length;i++){var v=v2[i],x1=v.slice(0,1),x2=v.slice(-1);tb.align[i]=":"==x1&&":"==x2?"center":":"==x2?"right":"left"}fl=!0}else{var r=[];for(let i=0;i<v2.length;i++){let v=v2[i];if(fl){var 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){var 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))&&(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){var counter=[space];for(tokens.push({type:"list_start",ordered:ordered});;){var cap=/^( *)([*\-+])[\s$]/im.exec(src);if(!cap){_pushtoken(tokens,src);break}cap.index&&_pushtoken(tokens,src.substring(0,cap.index));var sl=cap[1].length;if(sl>counter[counter.length-1])tokens.push({type:"list_start",ordered:ordered}),counter.push(sl);else for(;;){var 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"})}var _tokenize=(tokens,src,top,bq)=>{let cap;for(src=src.replace(/^ +$/gm,"");src;){if(easylen){var 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);var 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);var res=/([^]*?)(\n\n|\n\s*[#>])/im.exec(src+"\n\n");res?(_parselista(tokens,"*"==cap[2],cap[1].length,res[1]),src=src.substring(res[1].length)):tokens.push({type:"text??",text:cap[0]})}}return tokens},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;var rr=rg.exec(tm);rr&&0==rr.index&&(tm=tm.replace(rg,""))}return tm}(src,noheader),_tokenize([],src,!0)},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){var 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=>({"<":"<",">":">"}[tag]))),escapeHTML=str=>str.replace(/[&<>'"]/g,(tag=>({"&":"&","<":"<",">":">","'":"'",'"':"""}[tag]))),unescapeHTML=str=>str.replace(/&/g,"&").replace(/"/g,'"').replace(/'/g,"'").replace(/>/g,">").replace(/</g,"<");function xelang(str,lang,punct){var gspan=(str,cls)=>(cls&&(cls=cls.replace(/(\b)(\w+)(\b)/g,"$1_$2$3")),`☉☊${cls||""}☊☉${(str=escapeTag(str))||""}☉☋`);let 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};var out=[],r=0,ids=[];if(lang){controls[lang]||(lang="js");var rg=regex("script");if(rg){for(var st1=[];;){var 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,"<").replace(/>/g,">");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))}var xx=out.join("\n");return xx=xx.replace(/☉☋/gmu,"</span>").replace(/☉☊([^]*?)☊☉/gmu,((p,p1)=>{if(p1){var 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>"}))}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");var 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){var 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){return header?`<th style="text-align:center;">${content}</th>\n`:`<td style="${align?"text-align:"+align+";":""}">${content}</td>`}colorbase(text){return`<span class='tilde'>${text}</span>`}formula(text,full=!1){if(this.easy)return"";var 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{var 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"";var v=text.split("|"),out="";let 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){var 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`}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;var tokenparser=(res,render,maxlen=0)=>{for(var totl=0,checklen=body=>{if(maxlen>0&&body.length>maxlen-totl){var q=(body=body.substring(0,maxlen-totl)).lastIndexOf(" ");q>0&&(body=body.substring(0,q))}return body},next=()=>token=tokens.pop(),parseText=()=>{for(var body=token.text;"text"===(tokens[tokens.length-1]||0).type;)body+="\n"+next().text;return output(checklen(body))},outputLink=(cap,link)=>{var 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]))},output=src=>{for(var link,text,href,cap,out="";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),href="@"===cap[2]?`mailto:${text=":"===cap[1].charAt(6)?cap[1].substring(7):cap[1]}`:text=escape(cap[1]),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.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),href=text=escape(cap[1]),out+=render.link(href,null,text);return out},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":for(var body="";"list_title_end"!==next().type;)body+=tok();return render.listtitle(body);case"list_item_start":{let body="";for(var num=token.num;"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(),token=void 0,inLink=!1,links={},codes=[],out=[];next();){var 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){var rr;function pb(exp,cl,callback){if(rr=exp.exec(tt)){__parselist(tt.slice(0,rr.index),tm);var 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=>{var vv=r.split(".");vv.shift();var cl=[];for(let v of vv)v.length&&cl.push(" ");return cl.push("-"),cl.join("")}))||tm.push({class:"",text:tt})))}function parselist(text,title=""){var tm=[];__parselist(text,tm);var counter=[],space=0;for(let ii=0;ii<tm.length;ii++){var t=tm[ii];if("list"==t.class){var sl=t.text.replace("\n","").length;if(sl>space)counter.push({space:sl,id:1}),space=sl;else for(;;){var 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=""){var rr;function parse3(exp,cl){return!!(rr=exp.exec(tt))&&(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))&&(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){var rr;function pb(exp,cl,row=!1){return!!(rr=exp.exec(tt))&&(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))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+=" ");var tm=[];return parseblock$1(tt,tm),tm}function parserow(tt,tm,classe=""){var rr;function parse1(exp,cl){return!!(rr=exp.exec(tt))&&(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)){var 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|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){var rr;(function pb(exp,cl,row=!1){return!!(rr=exp.exec(tt))&&(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+=" ");var 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){var r=v;if(vars)for(var x in vars){var v2=vars[x]||`..${x}..`;r=r.replace(new RegExp(`\\[${x}\\]`,"gim"),v2)}return r}var parseinfomd=(data,info,mappa)=>aliasInfo.parse(data,info,mappa),mark=(xx,baseurl,notitle=!1,parsedlist=!1,callback)=>{var res;if(parsedlist)res=tokenize(xx,0,notitle);else{var{txt:txt}=parselist(xx);res=tokenize(txt,0,notitle)}return tokenparser(res,new Render(baseurl,!1,callback))},markeasy=(xx,maxlen=400,notitle=!1)=>{var 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
|
@@ -123,7 +123,7 @@ function setOggetto(objDestinazione,objSorgente){"object"==typeof objDestinazion
|
|
|
123
123
|
* Supporta operazioni matematiche di base, funzioni trigonometriche,
|
|
124
124
|
* operatori di confronto e operazioni logiche.
|
|
125
125
|
* Le funzioni supportate includono: sqrt, floor, abs, sin, cos, random, clamp, round
|
|
126
|
-
*/function muCalc(expression){if(!expression)return 0;if("number"==typeof expression)return expression||0;if("string"!=typeof expression)return 0;var s=expression.replaceAll(",",".");return REGEX_NUMERO.test(s)?Number(s)||0:valutaparentesi(expression)||0}function valutavar(sh,res){var vv=res[0]||"";if(!vv)return"";if(sh.counter>=100)return vv;let vx,tmps1=valuta0(sh,vv);if(sh.stl[tmps1])vx=`-- R:${tmps1} --`;else{let 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]){var cols=getcolonne(vx);if("l"==res[1])return String(cols.length);var col=muCalc(valuta0(sh,res[1]));if(!(col>=0&&col<cols.length))return"";vx=valuta0(sh,cols[col])}if(res[2]){var c1=muCalc(valuta0(sh,res[2]));if(c1){var c2=0;return res[3]&&(c2=muCalc(valuta0(sh,res[3]))),c1<0?vx.slice(c1):c2?vx.substring(c1-1,c1+c2-1):vx.substring(c1-1)}}return vx}function valutaquadra(sh,res){var vv=getcolonne(res||""),r1=clean(vv[0]);function replacecharcode(str){return"\\t"==str?"\t":"\\n"==str?"\n":(str||"").replace(/&(\d+)/g,((match,m1)=>String.fromCharCode(parseInt(m1))))}switch(r1){case"set":{let m1=valuta0(sh,vv[1]||""),m2=valuta0(sh,vv[2]||"");sh.add(m1,sh.var(m2))}break;case"ex":{let m1=valuta0(sh,vv[1]||""),m2=valuta0(sh,vv[2]||"");m2||(m2=",");let m3=muCalc(valuta0(sh,vv[3]||""));var tm=m1.split(m2);return m3>0&&tm[m3-1]||""}case"ex2":{let sep=replacecharcode(vv[1]||""),pos=muCalc(valuta0(sh,vv[2]||""));return vv.splice(0,3),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"),replace=replacecharcode(vv[2]||"").trim();return vv.splice(0,3),search=search.replace(/&(\d+)/g,((match,code)=>`\\u${parseInt(code).toString(16).padStart(4,"0")}`)),vv.join(";").replace(new RegExp(search,"im"),replace)}catch(error){return""}case"look":case"lookb":{let val=parseFloat(vv[1]||"");if(vv=vv.slice(2).map((e=>parseFloat(e)||0)),"lookb"==r1){const filtered=vv.filter((v=>v<=val));return filtered.length?Math.max(...filtered):val}{const filtered=vv.filter((v=>v>=val));return filtered.length?Math.min(...filtered):val}}case"tk":{let pos=muCalc(valuta0(sh,vv[1]||""))||0;if(!pos){pos=muCalc(valuta0(sh,vv[2]||""));let 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":{let 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":{let 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":{let str=muCalc(vv[1]),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":{let str1=vv[1]||"",str2=vv[2]||"";return str1.toLowerCase().indexOf(str2.toLowerCase())+1}case"instr2":{let str2=vv[1]||"";return vv.splice(0,2),vv.join(";").toLowerCase().indexOf(str2.toLowerCase())+1}default:return{fun:r1,pars:vv}}}function valuta0(sh,ex){if(ex+="",sh.counter>=100)return ex;for(;;){const rt=/\$([{(])/im.exec(ex);if(!rt)break;{var i1=rt.index,{i:i,res:res}="("==rt[1]?parsevar(ex,i1+2,"(",")"):parsevar(ex,i1+2,"{","}");let 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)=>{for(var m2="";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;let cl=[];for(let i=+p1;i<=+p2;i+=p4)cl.push(i.toString());return cl.join(";")})),ex}function valutabase(sh,ex){return ex&&(sh.counter++,sh.counter<=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}
|
|
126
|
+
*/function muCalc(expression){if(!expression)return 0;if("number"==typeof expression)return expression||0;if("string"!=typeof expression)return 0;var s=expression.replaceAll(",",".");return REGEX_NUMERO.test(s)?Number(s)||0:valutaparentesi(expression)||0}function valutavar(sh,res){var vv=res[0]||"";if(!vv)return"";if(sh.counter>=100)return vv;let vx,tmps1=valuta0(sh,vv);if(sh.stl[tmps1])vx=`-- R:${tmps1} --`;else{let 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]){var cols=getcolonne(vx);if("l"==res[1])return String(cols.length);var col=muCalc(valuta0(sh,res[1]));if(!(col>=0&&col<cols.length))return"";vx=valuta0(sh,cols[col])}if(res[2]){var c1=muCalc(valuta0(sh,res[2]));if(c1){var c2=0;return res[3]&&(c2=muCalc(valuta0(sh,res[3]))),c1<0?vx.slice(c1):c2?vx.substring(c1-1,c1+c2-1):vx.substring(c1-1)}}return vx}function valutaquadra(sh,res){var vv=getcolonne(res||""),r1=clean(vv[0]);function replacecharcode(str){return"\\t"==str?"\t":"\\n"==str?"\n":(str||"").replace(/&(\d+)/g,((match,m1)=>String.fromCharCode(parseInt(m1))))}switch(r1){case"set":{let m1=valuta0(sh,vv[1]||""),m2=valuta0(sh,vv[2]||"");sh.add(m1,sh.var(m2))}break;case"ex":{let m1=valuta0(sh,vv[1]||""),m2=valuta0(sh,vv[2]||"");m2||(m2=",");let m3=muCalc(valuta0(sh,vv[3]||""));var tm=m1.split(m2);return m3>0&&tm[m3-1]||""}case"ex2":{let sep=replacecharcode(vv[1]||""),pos=muCalc(valuta0(sh,vv[2]||""));return vv.splice(0,3),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"),replace=replacecharcode(vv[2]||"").trim();return vv.splice(0,3),search=search.replace(/&(\d+)/g,((match,code)=>`\\u${parseInt(code).toString(16).padStart(4,"0")}`)),vv.join(";").replace(new RegExp(search,"im"),replace)}catch(error){return""}case"look":case"lookb":{let val=parseFloat(vv[1]||"");if(vv=vv.slice(2).map((e=>parseFloat(e)||0)),"lookb"==r1){const filtered=vv.filter((v=>v<=val));return filtered.length?Math.max(...filtered):val}{const filtered=vv.filter((v=>v>=val));return filtered.length?Math.min(...filtered):val}}case"tk":{let pos=muCalc(valuta0(sh,vv[1]||""))||0;if(!pos){pos=muCalc(valuta0(sh,vv[2]||""));let 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":{let 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":{let 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":{let str=muCalc(vv[1]),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":{let str1=vv[1]||"",str2=vv[2]||"";return str1.toLowerCase().indexOf(str2.toLowerCase())+1}case"instr2":{let 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;{var i1=rt.index,{i:i,res:res}="("==rt[1]?parsevar(ex,i1+2,"(",")"):parsevar(ex,i1+2,"{","}");let 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)=>{for(var m2="";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;let cl=[];for(let i=+p1;i<=+p2;i+=p4)cl.push(i.toString());return cl.join(";")})),ex}function valutabase(sh,ex){return ex&&(sh.counter++,sh.counter<=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}
|
|
127
127
|
/**
|
|
128
128
|
* Salva lo stato corrente delle variabili nello stack
|
|
129
129
|
*/push(){this.vec.push({...this.dictionary})}
|
|
@@ -138,13 +138,13 @@ function setOggetto(objDestinazione,objSorgente){"object"==typeof objDestinazion
|
|
|
138
138
|
*/;var(key){let fmt="";const pp=/^(\d+)\.\.(\d+)$/.exec(key);if(pp){var n1=parseInt(pp[1]),n2=parseInt(pp[2]),cl=[];n1>n2&&([n1,n2]=[n2,n1]);for(var i=n1;i<=n2;i++)cl.push(i+"");return cl}if(key.indexOf("|")>=0){let tm=key.split("|");key=tm[0],fmt=tm[1]}function toformat(val,fmt){switch(fmt.trim().toLowerCase()){case"0":return String(parseInt(val)||0);case"-":return String((parseInt(val)||1)-1);case"+":return String((parseInt(val)||0)+1);case"data":return date=parseFloat(val)||0,new Intl.DateTimeFormat("it",{day:"2-digit",month:"short",year:"2-digit"}).format(date.toDate());case"euro":return((n,valorezero="")=>{if(n){var xx=Intl.NumberFormat("en",{style:"currency",currency:"EUR"}).format(n);return xx.replace(/€/g,"").replace(/\./g,";").replace(/,/g,".").replace(/;/g,",")+"€"}return valorezero})(parseFloat(val));case"num":return((n,dec=-1)=>{const num="string"==typeof n?parseFloat(n)||0:n;if(dec<0)return num||0;const factor=Math.pow(10,dec);return Math.round(num*factor)/factor||0})(parseFloat(val));default:return val}var date}const sanitizedKey=Variabile.sanitizeKey(key);if(sanitizedKey.startsWith(".")&&this.fndotcallback){let tm=this.fndotcallback(sanitizedKey.toLowerCase());if(tm)return toformat(tm,fmt)}if(Variabile.isValidKey(sanitizedKey)){const lowercaseKey=sanitizedKey.toLowerCase();var rr=/^([\w][\w\d]*)[.[]/.exec(lowercaseKey);if(rr){var tm=this.dictionary[rr[1]];if(tm&&"object"==typeof tm)return toformat(function objval(tm,key){for(var parts=key.split("."),obj=tm,i=0;i<parts.length;i++){var part=parts[i],match=part.match(/(.*?)\[(\d*)\]/);if(match){if(void 0===(obj=obj[match[1]]))return"";obj=obj[parseInt(match[2],10)||0]}else switch(part){case"_k":obj=(Object.keys(obj)||[]).join(",");break;case"_v":obj=Object.values(obj)||[];break;case"_l":obj=obj.length||0;break;default:obj=obj[part]}if(void 0===obj)return""}return"number"==typeof obj?obj+"":obj}(tm,lowercaseKey.substring(rr[0].length)),fmt)}return toformat(this.dictionary[lowercaseKey]||"",fmt)}return""}getvar(key){return this.var(key)}colonna(value,index){return getcolonne[index]||value}
|
|
139
139
|
/**
|
|
140
140
|
* Restituisce un dump delle variabili
|
|
141
|
-
*/dump(isstr=!1){var cl=[];for(var t in this.dictionary)cl.push({cod:t,val:this.dictionary[t]});return cl=cl.sort(((a,b)=>a.cod>b.cod)),isstr?cl.map((e=>`${e.cod} = ${e.val}`)):cl}
|
|
141
|
+
*/dump(isstr=!1){var cl=[];for(var t in this.dictionary)cl.push({cod:t,val:this.dictionary[t]});return cl=cl.sort(((a,b)=>a.cod>b.cod)),isstr?cl.map((e=>`${e.cod} = ${isObject(e.val)?JSON.stringify(e.val,null,2):e.val}`)):cl}
|
|
142
142
|
/**
|
|
143
143
|
* Aggiunge o rimuove una variabile
|
|
144
144
|
*/add(key,value){"number"==typeof value&&(value=String(value));const sanitizedKey=Variabile.sanitizeKey(key);if(Variabile.isValidKey(sanitizedKey)){const lowercaseKey=sanitizedKey.toLowerCase();0===value||value?this.dictionary[lowercaseKey]=value:delete this.dictionary[lowercaseKey]}else logga(`Invalid key: ${key}`)}
|
|
145
145
|
/**
|
|
146
146
|
* Valuta un'espressione con supporto per callback asincroni
|
|
147
|
-
*/valutasync(str){return valutabase(this,str)}async valuta(ex,callback){this.stl={};var tm=await async function valutafunc(sh,ex,callback){if(ex){for(var ii=0;ii<20;ii++){var i1=ex.lastIndexOf("$[");if(!(i1>=0)){ex=valutabase(sh,ex);break}var{i:i,res:res}=parsevar(ex,i1+2,"[","]"),t1=valutabase(sh,ex.substring(0,i1)),t2=res?valutabase(sh,res[0]):"",t3=i>=0?valutabase(sh,ex.substring(i+1)):"",t4=valutaquadra(sh,t2);"object"==typeof t4&&(t4=callback?await callback(t4?.fun,t4.pars):`** fun: ${t4.fun} ** `),ex=t1+
|
|
147
|
+
*/valutasync(str){return valutabase(this,str)}async valuta(ex,callback){this.stl={};var tm=await async function valutafunc(sh,ex,callback){if(ex){for(var ii=0;ii<20;ii++){var i1=ex.lastIndexOf("$[");if(!(i1>=0)){ex=valutabase(sh,ex);break}var{i:i,res:res}=parsevar(ex,i1+2,"[","]"),t1=valutabase(sh,ex.substring(0,i1)),t2=res?res[0].startsWith(".")?valutabase(sh,res.join(":")):valutabase(sh,res[0]):"",t3=i>=0?valutabase(sh,ex.substring(i+1)):"",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(;;){var i1=ex.indexOf("{");if(!(i1>=0))break;var{i:i,res:res}=parsevar(ex,i1+1,"{","}");if(i<0)return ex;ex=ex.substring(0,i1)+muCalc(res[0])+(i>=0?ex.substring(i+1):"")}return ex})(tm)),tm}async parametrokeyval(p){if("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||"";let getcode0=async(codicebarra,liv)=>{var barra=this.barre[codicebarra];if(!barra&&callback&&((barra=await callback(codicebarra))||(barra={t:"1",r:[]}),this.barre[codicebarra]=barra,barra.coderr&&"errore"!=barra.coderr||(barra.coderr=`#err_${codicebarra}`)),!barra||0==barra.r.length)return{extra:{err:"missing codicebarra"},c:`#err_${codicebarra}`,fm:10};var{t:t,x:x,y:y,z:z}=this.oriented(codicebarra,l,a,p),extra={barra:codicebarra,fm:barra.fm,t:t,liv:liv,items:barra.r.length,err:""},bx=barra.r;if(z){var t2=bx.filter((e=>e.z===z||!e.z));t2.length>0?bx=t2:extra.err=`spessore non coerente: ${z}`}if("l"==t||"a"==t||"p"==t){let 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={});var barre={};if(Array.isArray(vettore)){for(var r of vettore)if(r.cod=clean(r.cod),r.barcode=clean(r.barcode),r.barcode.length>2&&"+"==r.barcode[0]){r.barcode=r.barcode.substr(1);var tm=this.oriented(r.barcode.substr(0,1),r.l,r.a,r.p);tm.c=r.modello?{c:r.cod,m:r.modello}:r.cod,barre[r.barcode]||(barre[r.barcode]={t:r.barcode.substr(0,1),r:[]},headers[r.barcode]&&(barre[r.barcode]=Object.assign(headers[r.barcode],barre[r.barcode]))),barre[r.barcode].r.push(tm)}for(var x in barre){barre[x].r.sort(((a,b)=>a.y?1e4*(a.x-b.x)+(a.y-b.y):a.x-b.x))}}this.barre=barre}}
|
|
148
148
|
/**
|
|
149
149
|
* Costanti e espressioni regolari utilizzate nel modulo
|
|
150
150
|
*/const keys="IFDEF|IFNDEF|CACHE|CVAR|LOOK|LOOKB|SELECT|CASES|CASE|LOG|MSG|DEFAULT|ELSEIFDEF|ELSEIFNDEF|ELSEIF|ELSE|ENDIF|ENDSELECT|PUSH|POP|FUNC|MACRO|LETS|LETO|LETM|LETT|LETV|LETM|LET|DEF|DO|VARIANTE|FORVAR|FOR|LOOP|ENDFOR|BREAK|EXIT|EXITFOR|CONTINUE|IF|INC|I|F|M|J|:P".split("|");function toCadPars(str){let t0=muClComments(str),t2=[];for(let row of t0){let t1=getcolonne(row,!0),fl=!1;for(let t of t1)!t.startsWith('"')&&t.includes("=")?(t2.push(t),fl=!0):fl&&(t2[t2.length-1]+=","+t)}let pars={};for(let x of t2){let{v:v,o:o}=getcouple(x,"=",!1);v&&o&&(/^[-+]?\d*\.?\d+$/.test(o)&&(o=parseFloat(o)),pars[v]=o)}return pars}
|
|
@@ -233,7 +233,7 @@ this.amb=amb}
|
|
|
233
233
|
* Trova la prima opzione valida tra quelle disponibili
|
|
234
234
|
* @param {string} opz - Opzione da controllare per prima
|
|
235
235
|
* @returns {string|undefined} Prima opzione valida trovata o undefined
|
|
236
|
-
*/firstvalid(opz){if(opz&&this.isvalidopz(opz))return opz;if(this.vdef&&this.vdef.length)for(var o of this.vdef)if(this.isvalidopz(o))return o;for(var x in this.rows)if(this.isvalidopz(x))return x}
|
|
236
|
+
*/firstvalid(opz){let i=opz.indexOf(",");if(i>0&&(opz=opz.slice(0,i).trim()),opz&&this.isvalidopz(opz))return opz;if(this.vdef&&this.vdef.length)for(var o of this.vdef)if(this.isvalidopz(o))return o;for(var x in this.rows)if(this.isvalidopz(x))return x}
|
|
237
237
|
/**
|
|
238
238
|
* Resetta tutti i filtri applicati alla variante
|
|
239
239
|
*/resetfilter(){for(var x in delete this._valids,this.rows)this.rows[x].annulla=0}
|
|
@@ -249,8 +249,8 @@ this.amb=amb}
|
|
|
249
249
|
* Carica il contenuto esteso della variante
|
|
250
250
|
* @param {Object|string} content - Contenuto da caricare, può essere un oggetto o una stringa
|
|
251
251
|
* @returns {Promise<void>} Promise che si risolve al completamento del caricamento
|
|
252
|
-
*/async loadContentExtended(content){if("object"==typeof content){for(var x in content)["rows","des","h","alias","obbligo"].includes(x)&&(this[x]=content[x]);"string"==typeof content.def&&content.def.length&&(this.vdef=getcolonne(content.def.trim().toLowerCase())),content.filter&&content.filter.length&&(this.limits=parselimitifromdb(content.filter))}else await this._loadContent(muClComments(content,!1))}todata(){return{name:this.name,des:this.des,alias:this.alias,obbligo:this.obbligo,h:this.h,rows:this.rows,limits:this.limits,key:this.key}}}let _nofunc={};async function getcbfunc(tm,cmd,pars,vari,amb,output){if(cbFunc){if(_nofunc[cmd])return"";let a=await cbFunc(cmd,pars,vari,amb,output);return a=(a||"").trim(),"!"==a&&(_nofunc[cmd]=!0,a=""),a}return tm}async function intvaluta(amb,mac,str){return await amb.vari.valuta(str,(async(fun,pars)=>{if("dim"===fun){var dm=muCalc(pars[1]),vv=await dammivariante(amb,mac,pars[2]),col=parseInt(pars[3])||2;return vv&&vv.fromdim?vv.fromdim(dm,col):dm}return await getcbfunc(`**fun:${fun}**`,fun,pars,amb.vari,amb)}))}async function dammivariante(amb,macro,ky){return macro&¯o?.localvar&¯o.localvar[ky]?macro.localvar[ky]:await amb.getvariante(ky)}async function impostavariante(amb,macro,a,b,head){let tm,ky=a;if((b=b||"")&&"string"==typeof b){var k=b.indexOf(":");k>=0&&(k>0&&(ky=clean(b.slice(0,k))),b=b.slice(k+1))}
|
|
253
|
-
/** @type {Variante} */if(head&&head.alias&&(ky=head.alias),macro&¯o.paralias&¯o.paralias[a]&&(ky=macro.paralias[a]),tm=await dammivariante(amb,macro,ky),tm)if(head&&head.t){head.des||(head.des=tm.des);let x8=head?.filtra||"";if(x8.includes("$")&&(x8=await amb.vari.valuta(x8)),"m"===head.t){var col=2;if(b.includes(":")){var xx=b.split(":");col=parseInt(xx[1]),b=xx[0]}tm.limita(x8),b=tm.fromdim(parseFloat(b),col)}else{tm.limita(x8);let b1=tm.firstvalid(b);b=tm.tovar(b1)}}else tm.resetfilter(),b=tm.firstvalid(b),b=tm.tovar(b);else head&&head.t&&head.t;return amb.vari.add(a,b),b}async function pushpars(amb,macro,parsfunzione,parsinit){var fatti={},vals=[];if(parsfunzione)for(let x of parsfunzione){var{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(let x of parsinit){let{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(let x of tm)amb.vari.add(x.v,x.o)}const outpush=(output,a)=>{null!=a&&null!=a&&("string"==typeof a&&a.startsWith("_ ")&&output.length>0&&"string"==typeof output[output.length-1]?output[output.length-1]+=a.slice(2):output.push(...a.split("\n")))};async function muEval(amb,mac,codice,options){if(!Array.isArray(codice))return errori.add("codice is not a valid parsed array"),[];options||(options={}),options.id||(options.id="_"),options._stackmacro||(options._stackmacro=0),options.limited||(options.limited=!1),amb||errori.add("amb deve essere definito");let vari=amb.vari;amb.maxdelays,amb.cat;let output=[];xdt();for(let ii=0;ii<codice.length;){var riga=codice[ii];switch(riga.tipo){case"IFDEF":case"IFNDEF":case"IF":{let tm="IF"==riga.tipo?muCalc(await intvaluta(amb,mac,riga.contenuto)):"IFDEF"==riga.tipo?""!=await intvaluta(amb,mac,riga.contenuto):""==await intvaluta(amb,mac,riga.contenuto);riga.next?(codice[riga.next].jlast=tm?1:0,tm||(ii=riga.next-1)):errori.add("Troppo tempo",riga)}break;case"SELECT":riga.next?(codice[riga.next].t1=await intvaluta(amb,mac,riga.contenuto),ii=riga.next-1):errori.add("manca endselect",riga);break;case"CASE":case"CASES":case"DEFAULT":if(riga.next)if(riga.jlast)riga.jlast=0,ii=riga.last-1;else{let vv,tm=1;var _getvv=async()=>{var vv=await intvaluta(amb,mac,riga.contenuto);return vv=vv.includes(":")&&!vv.includes(",")?vv.split(":").map((e=>(e||"").trim())):getcolonne(vv)};if("CASE"==riga.tipo){tm=0,vv=await _getvv();let tmx=muCalc(riga.t1||"");vv.find((v=>muCalc(v)==tmx))&&(tm=1)}else if("CASES"==riga.tipo){tm=0,vv=await _getvv();let tmx=riga.t1||"";vv.find((v=>v==tmx))&&(tm=1)}codice[riga.next].jlast=tm?1:0,codice[riga.next].t1=riga.t1,tm||(ii=riga.next-1)}else errori.add("manca select",riga);break;case"ELSEIF":case"ELSEIFDEF":case"ELSEIFNDEF":case"ELSE":if(riga.next)if(riga.jlast)riga.jlast=0,ii=riga.last-1;else{let tm="ELSE"==riga.tipo?1:"ELSEIF"==riga.tipo?muCalc(await intvaluta(amb,mac,riga.contenuto)):"ELSEIFDEF"==riga.tipo?""!=await intvaluta(amb,mac,riga.contenuto):""==await intvaluta(amb,mac,riga.contenuto);codice[riga.next].jlast=tm?1:0,tm||(ii=riga.next-1)}else errori.add("manca endif",riga);break;case"ENDIF":case"ENDSELECT":case"CACHE":case"CVAR":break;case"PUSH":vari.push();break;case"POP":vari.pop();break;case"J":await getcbfunc("$$","$$",await intvaluta(amb,mac,riga.contenuto),vari,amb,output);break;case"INC":case"I":if(options._stackmacro>500)errori.add("stack chiamate macro troppo profondo!",riga);else{var{macro:macro,pars:pars,xid:xid}=await amb.getmacro(riga)||{};if(macro){options._inc=!0,options._stackmacro++;let saved={},parametri=macro.parametri?._;if(parametri&¶metri.length)for(let x of parametri){let x1=clean(x.split("=")[0]||"",!0);x1&&(saved[x1]=vari.dictionary[x1])}await macro.impostaparametri(parametri,pars);let rs1=await muEval(amb,macro,macro.codice,options);for(let v in saved)saved[v]?vari.dictionary[v]=saved[v]:delete vari.dictionary[v];output.push(...rs1),options._stackmacro--,options._inc=!1}}break;case"MACRO":case"M":case"FUNC":case"F":if(options._stackmacro>500)errori.add("stack chiamate macro troppo profondo!",riga);else{let{macro:macro,pars:pars,xid:xid}=await amb.getmacro(riga)||{};if(macro){let ismacro=options.grafica||["F","FUNC"].includes(riga.tipo),optid=options.id||"",parametri=macro.parametri?._,saved={};if(ismacro)vari.push();else{if(macro.head)for(let x in macro.head)saved[x]=amb.vari.var(x);if(parametri&¶metri.length)for(let x of parametri){let x1=(x.split("=")[0]||"").trim().toLowerCase();x1&&(saved[x1]=vari.dictionary[x1])}}if(macro.codice.length){if(options._stackmacro++,options.grafica&&"function"==typeof options.grafica){let f="",xid="";pars&&pars.length?(f=pars.find((e=>e.startsWith("#id"))),f?(f=await vari.valuta(f.slice(3)),options.id=hash(`${ii}${macro.name}${optid}${f}`),pars=pars.filter((e=>!e.startsWith("#id"))),xid=options.id):options.id=hash(`z${optid}${ii}`)):options.id=hash(`z${optid}${ii}`);let out=await options.grafica({tipo:riga.tipo,id:xid,pars:pars,parametri:parametri,macro:macro,options:options,vari:amb.vari,amb:amb});output.push(out)}else{await macro.impostaparametri(parametri,pars);let rs1=await muEval(amb,macro,macro.codice,options);output.push(...rs1)}options._stackmacro--}if(ismacro)vari.pop();else for(let v in saved)saved[v]?vari.dictionary[v]=saved[v]:delete vari.dictionary[v];options.id=optid}else errori.add("Macro non trovata!",riga)}break;case"LET":case"LETS":{let i=riga.contenuto.indexOf("="),j=-1;if(i>=0&&(j=riga.contenuto.indexOf("=",i+1)),j<0){var v=riga.contenuto;if(i=v.indexOf("="),i>0){let a=await intvaluta(amb,mac,v.slice(0,i).trim()),b=v.slice(i+1).trim();b="LET"==riga.tipo?muCalc(await intvaluta(amb,mac,b))||"":await intvaluta(amb,mac,b),vari.add(a,b)}}else{var vv=getcolonne(riga.contenuto);for(let v of vv)if(i=v.indexOf("="),i>0){let a=await intvaluta(amb,mac,v.slice(0,i)),b=v.slice(i+1).trim();b="LET"==riga.tipo?muCalc(await intvaluta(amb,mac,b))||"":await intvaluta(amb,mac,b),vari.add(a,b)}}}break;case"LETT":{let i=riga.contenuto.indexOf("=");if(i>0){let a=await intvaluta(amb,mac,riga.contenuto.slice(0,i).trim()),b=riga.contenuto.slice(i+1).trim();vari.add(a,b)}}break;case"LOOK":case"LOOKB":{let cc=getcolonne(await intvaluta(amb,mac,riga.contenuto)),base=muCalc(cc[1]),col=muCalc(cc[3]),ww=await dammivariante(amb,macro,cc[2]);if(ww&&ww.rows){let rr=Object.values(ww.rows).reduce(((t,e)=>{let val=parseInt(e.v[col?col-1:0]);return val&&("LOOKB"==riga.tipo?val<=base&&val>t.v&&(t.v=val,t.c=e.v[0]):val>=base&&val<t.v&&(t.v=val,t.c=e.v[0])),t}),{v:"LOOKB"==riga.tipo?0:1/0,c:""});rr&&rr.c&&(amb.vari.add(cc[0],ww.tovar(rr.c)),options.checkheader&&"function"==typeof options.checkheader&&await options.checkheader({variante:cc[0],valore:ww.tovar(rr.c),riga:riga}))}else amb.vari.add(cc[0],`${base},no,no`)}break;case"LETV":case"LETM":case"DEF":{let tm=getcolonne(riga.contenuto);if(tm)for(let x of tm){let{v:v,o:o,fl:fl}=getcouple(x);if(fl){v=await vari.valuta(v),o=await intvaluta(amb,mac,o);let valore=await impostavariante(amb,mac,v.trim().toLowerCase(),o.trim().toLowerCase(),"LETM"==riga.tipo?{t:"m"}:{t:"v"});options._stackmacro<=0&&options.checkheader&&"function"==typeof options.checkheader&&await options.checkheader({variante:v,valore:valore,riga:riga})}}}break;case"DO":var valido=(riga.contenuto||"").trim(),fl=!0;valido&&!muCalc(await intvaluta(amb,mac,valido))&&(fl=!1),riga.next&&(fl||(ii=riga.next+1));break;case"VARIANTE":case"FORVAR":case"FOR":{let vv,valido,elenco,v;if(options.oldstyle?(vv=riga.contenuto.split(","),v=vv[2]||"i",elenco=vv[0],valido=vv[1]):(vv=getcolonne(riga.contenuto||""),v=vv[0]||"",elenco=clean(vv[1],!0),valido=vv[2]||""),v=v.includes("$")?await intvaluta(amb,mac,v):v||"","FORVAR"==riga.tipo||"VARIANTE"==riga.tipo){let tm=await intvaluta(amb,mac,elenco);var xx=tm?await dammivariante(amb,mac,tm):void 0;xx?elenco=xx.tovec():(elenco=[],errori.add("getvariante not found!",riga))}else{var txx=await intvaluta(amb,mac,elenco||"");elenco=elenco?getcolonne(txx):void 0}elenco=elenco||[];let nc=0;if(riga.next){codice[riga.next].for={v:v,elenco:elenco,nc:nc,valido:valido};let fl=!0;var voce;v&&elenco.length>0?nc>=elenco.length?fl=!1:(voce=elenco[nc],vari.add(v,voce),valido&&(fl=!muCalc(await intvaluta(amb,mac,valido)))):fl=!1,fl||(ii=riga.next-1)}else errori.add("manca endfor/loop",riga)}break;case"LOOP":{let fl=!0;riga.contenuto&&!muCalc(await intvaluta(amb,mac,riga.contenuto))&&(fl=!1),fl&&(ii=riga.prev-1);break}case"ENDFOR":if(!riga.contenuto||muCalc(await intvaluta(amb,mac,riga.contenuto)))if(riga.for){let{v:v,elenco:elenco,valido:valido}=riga.for;if(v&&elenco.length>0&&riga.for.nc<500)for(;;){if(riga.for.nc++,riga.for.nc<elenco.length){if(vari.add(v,elenco[riga.for.nc]),valido&&muCalc(await intvaluta(amb,mac,valido)))continue;ii=riga.prev;break}break}}else errori.add("manca istruzione for",riga);break;case"BREAK":case"EXIT":case"EXITFOR":riga.next?riga.contenuto.trim()?muCalc(await intvaluta(amb,mac,riga.contenuto))&&(ii=riga.next):ii=riga.next:errori.add("break outside loop",riga);break;case"CONTINUE":riga.next?riga.contenuto&&!muCalc(await intvaluta(amb,mac,riga.contenuto))||(ii=riga.next-1):errori.add("continue outside loop",riga);break;case"MSG":case"LOG":{let tm99=await intvaluta(amb,mac,riga.contenuto);logga(tm99),errori.add(tm99)}break;default:{let tm;if(riga.contenuto.startsWith("!")){tm=await intvaluta(amb,mac,riga.contenuto);let a="",rr=/^!(\w+)[\s;,]\s*(.+)?$/gim.exec(tm);if(rr){let cmd=rr[1].toLowerCase(),pars=getcolonne(rr[2]||"");a=await getcbfunc(tm,cmd,pars,vari,amb)}a&&outpush(output,a)}else options.parsefnpunto&&"function"==typeof options.parsefnpunto&&riga.contenuto.startsWith(".")?await options.parsefnpunto({dati:riga.contenuto,output:output,id:options.id,vari:amb.vari,amb:amb}):(tm=await intvaluta(amb,mac,riga.contenuto),outpush(output,tm))}}ii++}return output}async function muGenerate(macro,amb,genera,callback,isTestmode=0){if(macro.isgenera&&callback){var output={counter:0,keys:{},isTestmode:isTestmode};if(genera){if(!macro.genera[genera])return!1;await muGenerate_0(macro,amb,genera,callback,output)}else for(let gg in macro.genera)await muGenerate_0(macro,amb,gg,callback,output);return!0}}async function muGenerate_0(mac,amb,genera,callback,output){var xgen=mac.genera[genera];if(xgen){output.counter2=0;var working_variant={},levels=[];async function processavariante(liv){if(!(output.isTestmode&&output.counter>output.isTestmode)){if(liv<xgen.vars.length){var xx=xgen.vars[liv];if(!working_variant[xx]){var xvar=await dammivariante(amb,mac,xx),keys=Object.keys(xvar.rows);if(keys&&keys.length>0){for(let k of keys)levels.push(k),amb.vari.add(xvar.name,xvar.tovar(k)),working_variant[xx]=!0,await processavariante(liv+1),working_variant[xx]=!1,levels.pop();return}logga("manca la variante",xx)}}for(let x of xgen.calcola)mac.formula[x]&&await muEval(amb,mac,mac.formula[x],{limited:!0});for(let x of xgen.exclude)if(mac.formula[x]){let vvv=await muEval(amb,mac,mac.formula[x],{limited:!0});if(vvv)for(let v of vvv){if(muCalc(v))return}}var out1=await muEval(amb,mac,xgen.codice,{limited:!0,localvar:mac.localvar}),bb={};for(let x of xgen.bom)if(mac.formula[x]){let vvv=await muEval(amb,mac,mac.formula[x],{limited:!0});vvv=vvv.join("\n").split("\n");for(let v of vvv)if(v){var tm=getcolonne(v);bb[x]||(bb[x]=[]);var t={};for(let i=0;i<tm.length;i++)t[`c${i}`]=tm[i];bb[x].push(t)}}await async function docallback(callback,out1,bom,xgen,genera,output){var fl=!0;for(let x of out1){var tm=getcolonne(x);if(tm[0]&&!output[tm[0]]){output[tm[0]]=1,output.counter++,output.counter2++;var o={__id:output.counter};for(let i=0;i<tm.length;i++){var key=xgen.head[i]?xgen.head[i]:`c${i}`;"#"==key[0]?o[key=key.substr(1)]=muCalc(tm[i]):o[key]=tm[i]}await callback(genera,o,fl?bom:void 0,output.counter,output.counter2),fl=!1}}}(callback,out1,bb,xgen,genera,output)}}await processavariante(0)}}const DIMS=["l","a","p"],rx1=/^\{(:?(var|valid|formula|genera|header|v|f|g|h))[\s|}]/im,tipifree=["s","g","h","p","q"],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){var vv=str.split("\n");for(let v of vv)if(v.trim()){if(muCalc(vari.valutasync(v)))return!0}return!1}class Macro{constructor(amb,_name){let{name:name,cat:cat}=checkmu(_name,amb.cat||"");this.name=name,this.cat=cat,
|
|
252
|
+
*/async loadContentExtended(content){if("object"==typeof content){for(var x in content)["rows","des","h","alias","obbligo"].includes(x)&&(this[x]=content[x]);"string"==typeof content.def&&content.def.length&&(this.vdef=getcolonne(content.def.trim().toLowerCase())),content.filter&&content.filter.length&&(this.limits=parselimitifromdb(content.filter))}else await this._loadContent(muClComments(content,!1))}todata(){return{name:this.name,des:this.des,alias:this.alias,obbligo:this.obbligo,h:this.h,rows:this.rows,limits:this.limits,key:this.key}}}let _nofunc={};async function getcbfunc(tm,cmd,pars,vari,amb,output){if(cbFunc){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){var dm=muCalc(pars[1]),vv=await dammivariante(amb,mac,pars[2]),col=parseInt(pars[3])||2;return vv&&vv.fromdim?vv.fromdim(dm,col):dm}return await getcbfunc(`**fun:${fun}**`,fun,pars,amb.vari,amb)}))}async function dammivariante(amb,macro,ky){return macro&¯o?.localvar&¯o.localvar[ky]?macro.localvar[ky]:await amb.getvariante(ky)}async function impostavariante(amb,macro,a,b,head){let tm,ky=a;if((b=b||"")&&"string"==typeof b){var k=b.indexOf(":");k>=0&&(k>0&&(ky=clean(b.slice(0,k))),b=b.slice(k+1))}
|
|
253
|
+
/** @type {Variante} */if(head&&head.alias&&(ky=head.alias),macro&¯o.paralias&¯o.paralias[a]&&(ky=macro.paralias[a]),tm=await dammivariante(amb,macro,ky),tm)if(head&&head.t){head.des||(head.des=tm.des);let x8=head?.filtra||"";if(x8.includes("$")&&(x8=await amb.vari.valuta(x8)),"m"===head.t){var col=2;if(b.includes(":")){var xx=b.split(":");col=parseInt(xx[1]),b=xx[0]}tm.limita(x8),b=tm.fromdim(parseFloat(b),col)}else{tm.limita(x8);let b1=tm.firstvalid(b);b=tm.tovar(b1)}}else tm.resetfilter(),b=tm.firstvalid(b),b=tm.tovar(b);else head&&head.t&&head.t;return amb.vari.add(a,b),b}async function pushpars(amb,macro,parsfunzione,parsinit){var fatti={},vals=[];if(parsfunzione)for(let x of parsfunzione){var{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(let x of parsinit){let{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(let x of tm)amb.vari.add(x.v,x.o)}const outpush=(output,a)=>{null!=a&&null!=a&&("string"==typeof a&&a.startsWith("_ ")&&output.length>0&&"string"==typeof output[output.length-1]?output[output.length-1]+=a.slice(2):output.push(...a.split("\n")))};async function muEval(amb,mac,codice,options){if(!Array.isArray(codice))return errori.add("codice is not a valid parsed array"),[];options||(options={}),options.id||(options.id="_"),options._stackmacro||(options._stackmacro=0),options.limited||(options.limited=!1),amb||errori.add("amb deve essere definito");let vari=amb.vari;amb.maxdelays,amb.cat;let output=[];tk();for(let ii=0;ii<codice.length;){var riga=codice[ii];switch(riga.tipo){case"IFDEF":case"IFNDEF":case"IF":{let tm="IF"==riga.tipo?muCalc(await intvaluta(amb,mac,riga.contenuto)):"IFDEF"==riga.tipo?""!=await intvaluta(amb,mac,riga.contenuto):""==await intvaluta(amb,mac,riga.contenuto);riga.next?(codice[riga.next].jlast=tm?1:0,tm||(ii=riga.next-1)):errori.add("Troppo tempo",riga)}break;case"SELECT":riga.next?(codice[riga.next].t1=await intvaluta(amb,mac,riga.contenuto),ii=riga.next-1):errori.add("manca endselect",riga);break;case"CASE":case"CASES":case"DEFAULT":if(riga.next)if(riga.jlast)riga.jlast=0,ii=riga.last-1;else{let vv,tm=1;var _getvv=async()=>{var vv=await intvaluta(amb,mac,riga.contenuto);return vv=vv.includes(":")&&!vv.includes(",")?vv.split(":").map((e=>(e||"").trim())):getcolonne(vv)};if("CASE"==riga.tipo){tm=0,vv=await _getvv();let tmx=muCalc(riga.t1||"");vv.find((v=>muCalc(v)==tmx))&&(tm=1)}else if("CASES"==riga.tipo){tm=0,vv=await _getvv();let tmx=riga.t1||"";vv.find((v=>v==tmx))&&(tm=1)}codice[riga.next].jlast=tm?1:0,codice[riga.next].t1=riga.t1,tm||(ii=riga.next-1)}else errori.add("manca select",riga);break;case"ELSEIF":case"ELSEIFDEF":case"ELSEIFNDEF":case"ELSE":if(riga.next)if(riga.jlast)riga.jlast=0,ii=riga.last-1;else{let tm="ELSE"==riga.tipo?1:"ELSEIF"==riga.tipo?muCalc(await intvaluta(amb,mac,riga.contenuto)):"ELSEIFDEF"==riga.tipo?""!=await intvaluta(amb,mac,riga.contenuto):""==await intvaluta(amb,mac,riga.contenuto);codice[riga.next].jlast=tm?1:0,tm||(ii=riga.next-1)}else errori.add("manca endif",riga);break;case"ENDIF":case"ENDSELECT":case"CACHE":case"CVAR":break;case"PUSH":vari.push();break;case"POP":vari.pop();break;case"INC":case"I":if(options._stackmacro>500)errori.add("stack chiamate macro troppo profondo!",riga);else{var{macro:macro,pars:pars,xid:xid}=await amb.getmacro(riga)||{};if(macro){options._inc=!0,options._stackmacro++;let saved={},parametri=macro.parametri?._;if(parametri&¶metri.length)for(let x of parametri){let x1=clean(x.split("=")[0]||"",!0);x1&&(saved[x1]=vari.dictionary[x1])}await macro.impostaparametri(parametri,pars);let rs1=await muEval(amb,macro,macro.codice,options);for(let v in saved)saved[v]?vari.dictionary[v]=saved[v]:delete vari.dictionary[v];output.push(...rs1),options._stackmacro--,options._inc=!1}}break;case"MACRO":case"M":case"FUNC":case"F":if(options._stackmacro>500)errori.add("stack chiamate macro troppo profondo!",riga);else{let{macro:macro,pars:pars,xid:xid}=await amb.getmacro(riga)||{};if(macro){let ismacro=options.grafica||["F","FUNC"].includes(riga.tipo),optid=options.id||"",parametri=macro.parametri?._,saved={};if(ismacro)vari.push();else{if(macro.head)for(let x of macro.head)saved[x.cod]=amb.vari.var(x.cod);if(parametri&¶metri.length)for(let x of parametri){let x1=(x.split("=")[0]||"").trim().toLowerCase();x1&&(saved[x1]=vari.dictionary[x1])}}if(macro.codice.length){if(options._stackmacro++,options.grafica&&"function"==typeof options.grafica){let f="",xid="";pars&&pars.length?(f=pars.find((e=>e.startsWith("#id"))),f?(f=await vari.valuta(f.slice(3)),options.id=hash(`${ii}${macro.name}${optid}${f}`),pars=pars.filter((e=>!e.startsWith("#id"))),xid=options.id):options.id=hash(`z${optid}${ii}`)):options.id=hash(`z${optid}${ii}`);let out=await options.grafica({tipo:riga.tipo,id:xid,pars:pars,parametri:parametri,macro:macro,options:options,vari:amb.vari,amb:amb});output.push(out)}else{await macro.impostaparametri(parametri,pars);let rs1=await muEval(amb,macro,macro.codice,options);output.push(...rs1)}options._stackmacro--}if(ismacro)vari.pop();else for(let v in saved)saved[v]?vari.dictionary[v]=saved[v]:delete vari.dictionary[v];options.id=optid}else errori.add("Macro non trovata!",riga)}break;case"LET":case"LETS":{let i=riga.contenuto.indexOf("="),j=-1;if(i>=0&&(j=riga.contenuto.indexOf("=",i+1)),j<0){var v=riga.contenuto;if(i=v.indexOf("="),i>0){let a=await intvaluta(amb,mac,v.slice(0,i).trim()),b=v.slice(i+1).trim();b="LET"==riga.tipo?muCalc(await intvaluta(amb,mac,b))||"":await intvaluta(amb,mac,b),vari.add(a,b)}}else{var vv=getcolonne(riga.contenuto);for(let v of vv)if(i=v.indexOf("="),i>0){let a=await intvaluta(amb,mac,v.slice(0,i)),b=v.slice(i+1).trim();b="LET"==riga.tipo?muCalc(await intvaluta(amb,mac,b))||"":await intvaluta(amb,mac,b),vari.add(a,b)}}}break;case"LETT":{let i=riga.contenuto.indexOf("=");if(i>0){let a=await intvaluta(amb,mac,riga.contenuto.slice(0,i).trim()),b=riga.contenuto.slice(i+1).trim();vari.add(a,b)}}break;case"LOOK":case"LOOKB":{let cc=getcolonne(await intvaluta(amb,mac,riga.contenuto)),base=muCalc(cc[1]),col=muCalc(cc[3]),ww=await dammivariante(amb,macro,cc[2]);if(ww&&ww.rows){let rr=Object.values(ww.rows).reduce(((t,e)=>{let val=parseInt(e.v[col?col-1:0]);return val&&("LOOKB"==riga.tipo?val<=base&&val>t.v&&(t.v=val,t.c=e.v[0]):val>=base&&val<t.v&&(t.v=val,t.c=e.v[0])),t}),{v:"LOOKB"==riga.tipo?0:1/0,c:""});rr&&rr.c&&(amb.vari.add(cc[0],ww.tovar(rr.c)),options.checkheader&&"function"==typeof options.checkheader&&await options.checkheader({variante:cc[0],valore:ww.tovar(rr.c),riga:riga}))}else amb.vari.add(cc[0],`${base},no,no`)}break;case"LETV":case"LETM":case"DEF":{let tm=getcolonne(riga.contenuto);if(tm)for(let x of tm){let{v:v,o:o,fl:fl}=getcouple(x);if(fl){v=await vari.valuta(v),o=await intvaluta(amb,mac,o);let valore=await impostavariante(amb,mac,v.trim().toLowerCase(),o.trim().toLowerCase(),"LETM"==riga.tipo?{t:"m"}:{t:"v"});options._stackmacro<=0&&options.checkheader&&"function"==typeof options.checkheader&&await options.checkheader({variante:v,valore:valore,riga:riga})}}}break;case"DO":var valido=(riga.contenuto||"").trim(),fl=!0;valido&&!muCalc(await intvaluta(amb,mac,valido))&&(fl=!1),riga.next&&(fl||(ii=riga.next+1));break;case"VARIANTE":case"FORVAR":case"FOR":{let vv,valido,elenco,v;if(options.oldstyle?(vv=riga.contenuto.split(","),v=vv[2]||"i",elenco=vv[0],valido=vv[1]):(vv=getcolonne(riga.contenuto||""),v=vv[0]||"",elenco=clean(vv[1],!0),valido=vv[2]||""),v=v.includes("$")?await intvaluta(amb,mac,v):v||"","FORVAR"==riga.tipo||"VARIANTE"==riga.tipo){let tm=await intvaluta(amb,mac,elenco);var xx=tm?await dammivariante(amb,mac,tm):void 0;xx?elenco=xx.tovec():(elenco=[],errori.add("getvariante not found!",riga))}else{var txx=await intvaluta(amb,mac,elenco||"");elenco=elenco?getcolonne(txx):void 0}elenco=elenco||[];let nc=0;if(riga.next){codice[riga.next].for={v:v,elenco:elenco,nc:nc,valido:valido};let fl=!0;var voce;v&&elenco.length>0?nc>=elenco.length?fl=!1:(voce=elenco[nc],vari.add(v,voce),valido&&(fl=!muCalc(await intvaluta(amb,mac,valido)))):fl=!1,fl||(ii=riga.next-1)}else errori.add("manca endfor/loop",riga)}break;case"LOOP":{let fl=!0;riga.contenuto&&!muCalc(await intvaluta(amb,mac,riga.contenuto))&&(fl=!1),fl&&(ii=riga.prev-1);break}case"ENDFOR":if(!riga.contenuto||muCalc(await intvaluta(amb,mac,riga.contenuto)))if(riga.for){let{v:v,elenco:elenco,valido:valido}=riga.for;if(v&&elenco.length>0&&riga.for.nc<500)for(;;){if(riga.for.nc++,riga.for.nc<elenco.length){if(vari.add(v,elenco[riga.for.nc]),valido&&muCalc(await intvaluta(amb,mac,valido)))continue;ii=riga.prev;break}break}}else errori.add("manca istruzione for",riga);break;case"BREAK":case"EXIT":case"EXITFOR":riga.next?riga.contenuto.trim()?muCalc(await intvaluta(amb,mac,riga.contenuto))&&(ii=riga.next):ii=riga.next:errori.add("break outside loop",riga);break;case"CONTINUE":riga.next?riga.contenuto&&!muCalc(await intvaluta(amb,mac,riga.contenuto))||(ii=riga.next-1):errori.add("continue outside loop",riga);break;case"MSG":case"LOG":{let tm99=await intvaluta(amb,mac,riga.contenuto);logga(tm99),errori.add(tm99)}break;default:{let tm;if(riga.contenuto.startsWith("!")){tm=await intvaluta(amb,mac,riga.contenuto);let a="",rr=/^!(.\w+)[\s;,]\s*(.+)?$/gim.exec(tm);if(rr)if(rr[1].startsWith("."))await getcbfunc(tm,tm.slice(1),[],vari,amb),a="";else{let cmd=rr[1].toLowerCase(),pars=getcolonne(rr[2]||"");a=await getcbfunc(tm,cmd,pars,vari,amb)}a&&outpush(output,a)}else options.parsefnpunto&&"function"==typeof options.parsefnpunto&&riga.contenuto.startsWith(".")?await options.parsefnpunto({dati:riga.contenuto,output:output,id:options.id,vari:amb.vari,amb:amb}):(tm=await intvaluta(amb,mac,riga.contenuto),outpush(output,tm))}}ii++}return output}async function muGenerate(macro,amb,genera,callback,isTestmode=0){if(macro.isgenera&&callback){var output={counter:0,keys:{},isTestmode:isTestmode};if(genera){if(!macro.genera[genera])return!1;await muGenerate_0(macro,amb,genera,callback,output)}else for(let gg in macro.genera)await muGenerate_0(macro,amb,gg,callback,output);return!0}}async function muGenerate_0(mac,amb,genera,callback,output){var xgen=mac.genera[genera];if(xgen){output.counter2=0;var working_variant={},levels=[];async function processavariante(liv){if(!(output.isTestmode&&output.counter>output.isTestmode)){if(liv<xgen.vars.length){var xx=xgen.vars[liv];if(!working_variant[xx]){var xvar=await dammivariante(amb,mac,xx),keys=Object.keys(xvar.rows);if(keys&&keys.length>0){for(let k of keys)levels.push(k),amb.vari.add(xvar.name,xvar.tovar(k)),working_variant[xx]=!0,await processavariante(liv+1),working_variant[xx]=!1,levels.pop();return}logga("manca la variante",xx)}}for(let x of xgen.calcola)mac.formula[x]&&await muEval(amb,mac,mac.formula[x],{limited:!0});for(let x of xgen.exclude)if(mac.formula[x]){let vvv=await muEval(amb,mac,mac.formula[x],{limited:!0});if(vvv)for(let v of vvv){if(muCalc(v))return}}var out1=await muEval(amb,mac,xgen.codice,{limited:!0,localvar:mac.localvar}),bb={};for(let x of xgen.bom)if(mac.formula[x]){let vvv=await muEval(amb,mac,mac.formula[x],{limited:!0});vvv=vvv.join("\n").split("\n");for(let v of vvv)if(v){var tm=getcolonne(v);bb[x]||(bb[x]=[]);var t={};for(let i=0;i<tm.length;i++)t[`c${i}`]=tm[i];bb[x].push(t)}}await async function docallback(callback,out1,bom,xgen,genera,output){var fl=!0;for(let x of out1){var tm=getcolonne(x);if(tm[0]&&!output[tm[0]]){output[tm[0]]=1,output.counter++,output.counter2++;var o={__id:output.counter};for(let i=0;i<tm.length;i++){var key=xgen.head[i]?xgen.head[i]:`c${i}`;"#"==key[0]?o[key=key.substr(1)]=muCalc(tm[i]):o[key]=tm[i]}await callback(genera,o,fl?bom:void 0,output.counter,output.counter2),fl=!1}}}(callback,out1,bb,xgen,genera,output)}}await processavariante(0)}}const DIMS=["l","a","p"],rx1=/^\{(:?(var|valid|formula|genera|header|v|f|g|h))[\s|}]/im,tipifree=["s","g","h","p","q"],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){var vv=str.split("\n");for(let v of vv)if(v.trim()){if(muCalc(vari.valutasync(v)))return!0}return!1}class Macro{constructor(amb,_name){let{name:name,cat:cat}=checkmu(_name,amb.cat||"");this.name=name,this.cat=cat,
|
|
254
254
|
/** @type {Ambiente} */
|
|
255
255
|
this.amb=amb,this.azzera()}azzera(){this.key=`${this.cat}/${this.name}`,this.localvar={},this.head=[],this.frontend=!1,this.valid=[],this.parametri={},this.paralias={},this.formula={},this.settings={},this.errori=[],this.codice=[],this.genera={}}get isgenera(){return Object.keys(this.genera).length||0}get iscodice(){return this.codice.length||0}get isheader(){return this.head?.length||0}geterrori(){var cl=[];return this.errori.forEach((e=>cl.push({e:e}))),cl}getparametri(){let s={};if(this.dims&&DIMS.forEach((k=>{let t=muCalc(this.amb.vari.var(k));t&&(s[k]=String(t))})),this.head){for(let x of this.head)if(!x._h){let tm=this.amb.vari.var(x.cod);tipifree.includes(x.t)||"string"==typeof tm&&(tm=tm.split(",")[0]),s[x.cod]=tm}}else if(this.parametri?._)for(let x of this.parametri._){let x1=(x.split("=")[0]||"").trim().toLowerCase(),tm=this.amb.vari.var[x1];tm=(tm||"").split(",")[0],s[x1]=tm}return s}async setparametri(pars){let ff={};pars||(pars={}),this.dims&&DIMS.forEach((e=>{let t=pars[e]||this.dims[e].val;t=parseFloat(t)||0,this.dims[e].visible&&(t<this.dims[e].min&&(t=this.dims[e].min),t>this.dims[e].max&&(t=this.dims[e].max)),pars[e]=String(t)}));for(let x of this.head)"g"!=x.t&&("z"!=x.t||pars[x.cod]||(pars[x.cod]="1"),x._v=pars[x.cod],ff[x.cod]=!0);for(let x in pars)ff[x]||(ff[x]=!0,await impostavariante(this.amb,this,x,pars[x]));return this.head?.length>0&&await this.setparametro(this.head[0].cod,pars[this.head[0].cod]||void 0,!0),this.getparametri()}async setparametro(name,value,propaga=!1){if(value&&value.includes("$")&&(value=await intvaluta(this.amb,this,value)),this.head){const _imposta=async(riga,vv,id)=>{let nn=riga?.cod;if(riga.valid&&!riga._h1){let t0=!valutaCondizioniTestata(this.amb.vari,riga.valid);if(riga._h!=t0&&(riga._h=t0,["g","g1","g2"].includes(riga.t)))for(let i=id+1;i<this.head.length;i++){let tm1=this.head[i];if(tm1){if(["g","g1","g2"].includes(tm1.t))break;tm1._h1=riga._h}}}if(riga._h||riga._h1)return this.amb.vari.add(nn,""),riga._v=void 0,"";{if(delete riga._h2,riga.visible){let t0=!valutaCondizioniTestata(this.amb.vari,riga.visible);if(t0&&(riga._h2=t0),["g","g1","g2"].includes(riga.t))for(let i=id+1;i<this.head.length;i++){let tm1=this.head[i];if(tm1){if(["g","g1","g2"].includes(tm1.t))break;riga._h2?tm1._h3=riga._h2:delete tm1._h3}}}let tx=this.amb.vari.var(nn)||"";if("string"==typeof tx&&(tx=tx.split(",")[0]),"z"!=riga.t||tx||(this.amb.vari.add(nn,"1"),tx="1"),"m"==riga.t&&riga.spars){let vspars=getcolonne(riga.spars);tx=parseFloat(tx||vspars[0])||0,vspars[1]&&parseFloat(tx)<vspars[1]&&(tx=parseFloat(vspars[1])||0),vspars[2]&&parseFloat(tx)>vspars[2]&&(tx=parseFloat(vspars[2])||0),tx=String(tx),this.amb.vari.add(nn,tx)}let tmimposta=await impostavariante(this.amb,this,nn,vv||riga._v||tx,riga);return riga._v=void 0,tx=this.amb.vari.var(nn)||"",this.amb&&this.amb.deriva&&this.amb.deriva.length>0&&this.amb.deriva.filter((e=>e.cod==nn&&((!e.item||e.item==this.amb.item)&&((!e.model||e.model==this.amb.model)&&((!e.rule||e.rule==this.amb.rule)&&(!e.opz||e.opz==vv)))))),tmimposta}};let tm,i0=-1;if("#dim"==name)propaga=1;else{if(i0=this.head.findIndex((e=>e.cod===name)),i0<0)return;let hh=this.head[i0];tm=await _imposta(hh,value,i0),delete hh._d}if(propaga)for(let i=i0+1;i<this.head.length;i++)await _imposta(this.head[i],void 0,i);return tm}return await impostavariante(this.amb,this,name,value)}async impostaparametri(parimposta,parcall,ismacro=!1){if(this.head){this.paralias||(this.paralias={}),Array.isArray(this.head)||(this.head=[]);for(let i of this.head)i._v="",delete i._h,delete i._h1,delete i._h2,i.alias&&(this.paralias[i.cod]=i.alias)}parimposta||(parimposta=[]),parcall||(parcall=[]);for(let x of[...parimposta,...parcall]){var i=x.indexOf("=");if(i>0){let a=clean(x.substr(0,i));a.includes("$")&&(a=await intvaluta(this.amb,this,a));let t,b=x.substr(i+1);b.includes("$")&&(b=await intvaluta(this.amb,this,b)),this.head&&(t=this.head.find((e=>e.cod==a)))?t._v=b:await impostavariante(this.amb,this,a,b)}}if(this.head){let fl=!0;for(let h of this.head){let fl2=await this.checkvalid(h.valid);ismacro&&(fl2=!0),["g","g1","g2"].includes(h.t)?fl=fl2:fl&&fl2&&await this.setparametro(h.cod,h._v)}}}async checkvalid(formula){if(!formula)return!0;return!!muCalc(await intvaluta(this.amb,this,formula))}getmacrostr(){return JSON.stringify(this.getmacro())}getmacro(){return getOggetto(this,["amb"])}setmacro(vv){if(setOggetto(this,fromjson(vv,{})),this.localvar)for(let x in this.localvar){let vv=new Variante;setOggetto(vv,this.localvar[x]),this.localvar[x]=vv}}async load(xname,xcat){try{var tm,{name:name,cat:cat}=checkmu(xname||this.name,xcat||this.cat||"");if(this.name||(this.name=name),this.cat||(this.cat=cat),this.azzera(),cbGetMacro&&("string"==typeof(tm=await cbGetMacro(cat,name))&&(tm.startsWith("{")||tm.startsWith("["))&&(tm=fromjson(tm)),tm&&tm.head&&!Array.isArray(tm.head)&&(tm.head=[]),tm.head&&(tm.dims=getheaddims(tm.dims))),tm){if("string"==typeof tm)await this.parsedata(tm);else for(let x in tm)this[x]=tm[x];return!0}errori.add(`missing cbGetFile: ${cat}/${name}`)}catch(error){errori.add(geterrdes(error),`macro.load: ${name}/${cat}`)}}async loadAndCompile(file,_cat,acapo=!1){var res,{name:name,cat:cat}=checkmu(file,this.cat||_cat);return this.azzera(),cbGetFile&&(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){var res,{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]);var tm=muClComments(res),t2=[];flin&&(tm=tm.filter((t=>!/^\{(:?(var|valid|formula|header|genera|v|f|h))[\s|}]/im.test(t))));for(let t of tm){const rr=rx1.exec(t);if(rr)flin=!rr[1].startsWith(":"),t2.push(t);else{const r1=/^\s*\{i\s(.+)?\}/im.exec(t);if(r1){let pp=getcolonne(r1[1]);if(!stak.includes(pp[0])){stak.push(pp[0]);var t3=await this.loadinclude(pp[0],flin,stak,pp);Array.isArray(t3)&&t2.push(...t3),stak.pop()}}else t2.push(t)}}return t2}async parsedata(res,acapo=!1){if(this.azzera(),!res)return;var t2=[];let tm=muClComments(res);var flin=!1;let lochead=[];for(let t of tm){const rr=rx1.exec(t);if(rr)flin=!rr[1].startsWith(":"),t2.push(t);else{const r1=/^\s*\{i\s(.+)?\}/im.exec(t);if(r1){var pp=getcolonne(r1[1]),t3=await this.#loadinclude(pp[0],flin,[pp[0]],pp);Array.isArray(t3)&&t2.push(...t3)}else t2.push(t)}}flin=!1;var out=this.codice;for(let t of t2){const rr=rx1.exec(t);if(rr)if(rr[1].startsWith(":"))out=this.codice;else switch(rr[1]){case"genera":case"g":var r2=/^\s*\{(genera|g)\s+(.+)?\}/im.exec(t);if(r2){var name=checkname(getcolonne(r2[2])[0]);this.genera[name]=[],out=this.genera[name]}else(out=this.errori).push(t);break;case"valid":out=this.valid;break;case"var":case"v":{let r2=/^\s*\{(var|v)\s+(.+)?\}/im.exec(t);if(r2){let nn=getcolonne(r2[2]),name=checkname(nn[0]);this.localvar[name]={name:name,des:nn[1]||"",rows:[]},out=this.localvar[name].rows}else(out=this.errori).push(t)}break;case"formula":case"f":{let r2=/^\s*\{(formula|f)\s+(.+)?\}/im.exec(t);if(r2){let name=checkname(r2[2]);this.formula[name]=[],out=this.formula[name]}else(out=this.errori).push(t)}break;case"h":case"header":out=lochead;break;default:this.errori.push(t),out=this.errori}else t.startsWith("{")&&(out=this.codice),out.push(t)}this.parametri={},this.codice=this.cleanfiltraparametri("_",this.codice,acapo);for(let f in this.formula)this.formula[f]=this.cleanfiltraparametri(f,this.formula[f],acapo);for(let f in this.localvar){var vv=new Variante,v=this.localvar[f];vv.setheader(f,this.cat),vv.rows={};for(let x of v.rows){var c=getcolonne(x),k=c[0].trim().toLowerCase();vv.rows[k]={annulla:0,v:c}}v.des&&(vv.des=v.des),this.localvar[f]=vv}tm=this.valid,this.valid=[];for(let t of tm){var p=getcouple(t,",");(p={v:p.v,msg:p.o}).v&&(p.v.startsWith("#")?this.formula[p.v.substring(1)]&&this.valid.push(p):this.valid.push(p))}tm=lochead;var head=[];for(let t of tm){var rr=/^\s*([\w\-_]+)+[;,\s]\s*(.*)?$/im.exec(t);if(rr){let ht,pp=getcolonne(rr[2]),c=clean(rr[1]);if(c){ht=head.find((e=>e.cod==c)),ht||(ht={cod:c,t:"t"},head.push(ht));for(let tp of pp){let p=getcouple(tp);switch(p.v){case"t":ht.t=p.o;break;case"def":case"default":ht.def=p.o;break;case"valid":case"colonna":case"hidden":p.o.startsWith("#")?this.formula[p.o.substring(1)]&&(ht[p.v]=p.o):ht[p.v]=p.o;break;default:ht[p.v]=p.o}}}}}this.head=head,tm=this.genera;var genera={};for(let kk in tm)if(Array.isArray(tm[kk])){var gen={codice:[],head:"",calcola:[],bom:[],vars:[],exclude:[]};const regx=/^\s*[!:]\s*(\w+)\s*(.*)$/i;for(let k2 of tm[kk]){let rr=regx.exec(clean(k2));if(rr)switch(rr[1]){case"calcola":case"c":gen.calcola=[...gen.calcola,...getcolonne(rr[2])];break;case"exclude":case"e":case"escludi":gen.exclude=[...gen.exclude,...getcolonne(rr[2])];break;case"bom":case"db":gen.bom=[...gen.bom,...getcolonne(rr[2])];break;case"vars":case"v":gen.vars=[...gen.vars,...getcolonne(rr[2])];break;case"head":case"h":gen.head=getcolonne(rr[2]);break;default:this.errori.push(`genera ${kk} => ${k2}`)}else gen.codice.push(k2)}gen.codice=muClean(gen.codice,!0),genera[kk]=gen}this.genera=genera}cleanfiltraparametri(key,codice,acapo){if(this.paralias||(this.paralias={}),codice&&codice.length){var fl=!1;const getparalias=dati=>{let cl=[],co=getcolonne(dati);for(let c of co)if(c.includes(":")){let v=c.split(":");this.paralias[v[0]]=v[1],cl.push(v[0])}else cl.push(c);return cl};for(let i=0;i<codice.length;i++){let rr=/^:p[;,\s]+(.*)?$/im.exec(codice[i]);if(rr)codice[i]=null,fl=!0,this.parametri[key]=getparalias(rr[1]);else{let rr=/^!(parametri|pars|p)[;,\s]+(.*)?$/im.exec(codice[i]);rr&&(codice[i]=null,fl=!0,this.parametri[key]=getparalias(rr[2]))}}fl&&(codice=codice.filter((e=>null!=e)))}return codice=muClean(codice,acapo)}}function parsevariabili(text){for(var fl=!1,tk=[];;){let m=/\$([{[(])/m.exec(text);if(!m){text&&fl&&tk.push({class:"",text:text});break}{fl=!0;var classe="["==m[1]?"inline":"variabile";m.index>0&&tk.push({class:"",text:text.substring(0,m.index)});let{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");for(var fl=!1,tk=[];;){let 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}}
|
|
256
256
|
/**
|
package/package.json
CHANGED
package/types/bus_utils.d.ts
CHANGED
|
@@ -22,7 +22,6 @@
|
|
|
22
22
|
$off(des: any, func: any): void;
|
|
23
23
|
$emit(des: any, ...args: any[]): void;
|
|
24
24
|
};
|
|
25
|
-
export function evalcustomfunction(amb: any, code: any, vv: any, objects: any): Promise<any>;
|
|
26
25
|
/**
|
|
27
26
|
* Formatta una data nel formato YYYY-MM-DD
|
|
28
27
|
* @param {string|Date} dateString - La data da formattare
|
package/types/markcad.d.ts
CHANGED
|
@@ -171,7 +171,7 @@ export class Punto2 {
|
|
|
171
171
|
* @returns {Punto2} Nuovo punto con le coordinate normalizzate
|
|
172
172
|
*/ dir(): Punto2;
|
|
173
173
|
}
|
|
174
|
-
|
|
174
|
+
export var SP: Readonly<{
|
|
175
175
|
__proto__: any;
|
|
176
176
|
addhoriz: (ff: any, tipodim: any, dim: any, sps: any, des: any, align: any, cuts: any) => void;
|
|
177
177
|
addvert: (ff: any, tipodim: any, dim: any, sps: any, des: any, align: any, cuts: any) => void;
|
|
@@ -185,6 +185,7 @@ declare var splitter: Readonly<{
|
|
|
185
185
|
minvano: any;
|
|
186
186
|
priority: any;
|
|
187
187
|
taglio: any;
|
|
188
|
+
tagliov: any;
|
|
188
189
|
tipo: any;
|
|
189
190
|
h1: any;
|
|
190
191
|
h2: any;
|
|
@@ -214,6 +215,7 @@ declare var splitter: Readonly<{
|
|
|
214
215
|
d: string;
|
|
215
216
|
v: string;
|
|
216
217
|
h: string;
|
|
218
|
+
o: string;
|
|
217
219
|
};
|
|
218
220
|
tipi: {
|
|
219
221
|
i: string;
|
|
@@ -241,6 +243,8 @@ export class Vis2d {
|
|
|
241
243
|
vec: any[];
|
|
242
244
|
xp1: any;
|
|
243
245
|
xp2: any;
|
|
246
|
+
push(x: any, y: any, rot?: number): void;
|
|
247
|
+
pop(): void;
|
|
244
248
|
randomcolor(transp?: string): string;
|
|
245
249
|
addpoint(p: any, id?: number, color?: any, spessore?: number): this;
|
|
246
250
|
addline(l: any, id?: number, color?: any, spessore?: number): this;
|
|
@@ -268,6 +272,7 @@ export class Vis2d {
|
|
|
268
272
|
* Classe per la gestione degli errori con funzionalità di accumulo e formattazione
|
|
269
273
|
*/ export function clamp(n: any, min?: number, max?: number): any;
|
|
270
274
|
export function clean(k: any, locase?: boolean): any;
|
|
275
|
+
export function evalcustomfunction(amb: any, code: any, values: any, objects: any): Promise<any>;
|
|
271
276
|
export function getdumpmacro(nodo: any): string;
|
|
272
277
|
export function getnodebyid(id: any, nodocorrente: any): any;
|
|
273
278
|
export function getprojectkeys(project: any): any;
|
|
@@ -410,4 +415,4 @@ declare function pushshape(ff: any, type: any, des: any, shape: any, info: any,
|
|
|
410
415
|
shape: any;
|
|
411
416
|
info: any;
|
|
412
417
|
};
|
|
413
|
-
export {
|
|
418
|
+
export {};
|