UNPKG

@joemaddalone/path

Version:

a simple svg path generation utility

2 lines (1 loc) 8.42 kB
!function(t,s){"object"==typeof exports&&"undefined"!=typeof module?module.exports=s():"function"==typeof define&&define.amd?define(s):(t="undefined"!=typeof globalThis?globalThis:t||self).path=s()}(this,(function(){"use strict";function t(t,s,i){return s in t?Object.defineProperty(t,s,{value:i,enumerable:!0,configurable:!0,writable:!0}):t[s]=i,t}var s={A:{args:["rx","ry","rotation","arc","sweep","ex","ey"]},a:{args:["rx","ry","rotation","arc","sweep","ex","ey"]},C:{args:["cx1","cy1","cx2","cy2","ex","ey"]},c:{args:["cx1","cy1","cx2","cy2","ex","ey"]},H:{args:["x"]},h:{args:["x"]},L:{args:["x","y"]},l:{args:["x","y"]},M:{args:["x","y"]},m:{args:["x","y"]},Q:{args:["cx","cy","ex","ey"]},q:{args:["cx","cy","ex","ey"]},S:{args:["cx","cy","ex","ey"]},s:{args:["cx","cy","ex","ey"]},T:{args:["ex","ey"]},t:{args:["ex","ey"]},V:{args:["y"]},v:{args:["y"]},z:{args:[]}};class i{constructor(){return t(this,"attr",(t,s)=>(this.attributes[t]=s,this)),t(this,"fill",t=>this.attr("fill",t)),t(this,"stroke",t=>this.attr("stroke",t)),t(this,"strokeWidth",t=>this.attr("stroke-width",t)),t(this,"style",t=>this.attr("style",t)),t(this,"m",(t,s)=>this.moveTo(t,s,!0)),t(this,"M",(t,s)=>this.moveTo(t,s)),t(this,"moveTo",(t,s,i=!1)=>(this.pathData.push(`${i?"m":"M"}${t} ${s}`),this)),t(this,"l",(t,s)=>this.lineTo(t,s,!0)),t(this,"L",(t,s)=>this.lineTo(t,s)),t(this,"lineTo",(t,s,i=!1)=>(this.pathData.push(`${i?"l":"L"}${t} ${s}`),this)),t(this,"H",t=>this.horizontalTo(t)),t(this,"h",t=>this.horizontalTo(t,!0)),t(this,"horizontalTo",(t,s=!1)=>(this.pathData.push(`${s?"h":"H"}${t}`),this)),t(this,"V",t=>this.verticalTo(t)),t(this,"v",t=>this.verticalTo(t,!0)),t(this,"verticalTo",(t,s=!1)=>(this.pathData.push(`${s?"v":"V"}${t}`),this)),t(this,"Q",(t,s,i,r)=>this.qCurve(t,s,i,r)),t(this,"q",(t,s,i,r)=>this.qCurve(t,s,i,r,!0)),t(this,"qCurve",(t,s,i,r,h=!1)=>(this.pathData.push(`${h?"q":"Q"}${t} ${s} ${i} ${r}`),this)),t(this,"T",(t,s)=>this.tCurveTo(t,s)),t(this,"t",(t,s)=>this.tCurveTo(t,s,!0)),t(this,"tCurveTo",(t,s,i=!1)=>(this.pathData.push(`${i?"t":"T"}${t} ${s}`),this)),t(this,"C",(t,s,i,r,h,o)=>this.cCurve(t,s,i,r,h,o)),t(this,"c",(t,s,i,r,h,o)=>this.cCurve(t,s,i,r,h,o,!0)),t(this,"cCurve",(t,s,i,r,h,o,n=!1)=>(this.pathData.push(`${n?"c":"C"}${t} ${s} ${i} ${r} ${h} ${o}`),this)),t(this,"S",(t,s,i,r)=>this.sCurveTo(t,s,i,r)),t(this,"s",(t,s,i,r)=>this.sCurveTo(t,s,i,r,!0)),t(this,"sCurveTo",(t,s,i,r,h=!1)=>(this.pathData.push(`${h?"s":"S"}${t} ${s} ${i} ${r}`),this)),t(this,"A",(t,s,i,r,h,o,n)=>this.arc(t,s,i,r,h,o,n)),t(this,"a",(t,s,i,r,h,o,n)=>this.arc(t,s,i,r,h,o,n,!0)),t(this,"arc",(t,s,i,r,h,o,n,a=!1)=>(this.pathData.push(`${a?"a":"A"}${t} ${s} ${i} ${r} ${h} ${o} ${n}`),this)),t(this,"down",t=>this.v(t)),t(this,"up",t=>this.v(-1*t)),t(this,"right",t=>this.h(t)),t(this,"left",t=>this.h(-1*t)),t(this,"close",()=>(this.pathData.push("z"),this)),t(this,"toArray",()=>this.pathData),t(this,"toString",()=>this.pathData.join("")),t(this,"toCommands",()=>this.pathData.map(t=>{const s=[t.substr(0,1)],i=t.substr(1);return i.length&&s.push(...i.split(" ").map(Number)),s})),t(this,"toAnnotatedCommands",()=>this.toCommands().map(t=>{const i=t.shift(),r=s[i].args;return r.length?{fn:i,args:t.reduce((t,s,i)=>(t[r[i]]=s,t),{})}:{fn:i}})),t(this,"toElement",(t={})=>{const s={...this.attributes,...t},i=document.createElementNS("http://www.w3.org/2000/svg","path");return Object.keys(s).forEach(t=>{i.setAttribute(t,s[t])}),i.setAttribute("d",this.toString()),i}),this.pathData=[],this.attributes={},this}}return t(i,"angleInRadians",t=>t*Math.PI/180),t(i,"polarToCartesian",(t,s,r,h)=>{const o=i.angleInRadians(h);return{x:t+r*Math.cos(o),y:s+r*Math.sin(o)}}),t(i,"clockwisePoint",(t,s,r,h)=>{const o=h-90;return i.polarToCartesian(t,s,r,o)}),t(i,"radialPoints",(t,s,i,r,h,o=1)=>{h=h||-.5*Math.PI,t=t||1e-10;const n=2*Math.PI*o/r,a=Array.from(Array(r>=0?r:0).keys()),e=Math.max(0,4-Math.floor(Math.log10(t)));return a.map((r,o)=>{const a=o*n+h;return[(s+t*Math.cos(a)).toFixed(e),(i+t*Math.sin(a)).toFixed(e)]})}),t(i,"positionByArray",(t,s,i,r)=>{const h=[],o=t/2;return s.forEach((s,n)=>{s.forEach((s,a)=>{s&&h.push({size:t,cx:a*t+o+i,cy:n*t+o+r,ri:n,ci:a,value:s})})}),h}),t(i,"macro",(t,s)=>{i.prototype[t]=s}),i.macro("rect",(function(t,s,i,r,h=!0){return this.M(i-t/2,r-s/2).right(t).down(s).left(t).up(s),h&&this.M(i,r),this})),i.macro("square",(function(t,s,i,r=!0){return this.rect(t,t,s,i,r)})),i.macro("roundedSquare",(function(t,s,i,r,h=!0){return this.roundedRect(t,t,s,i,r,h)})),i.macro("roundedRect",(function(t,s,i,r,h,o=!0){const n=h-s/2,a=r-t/2,e=a+t,c=n+s;let u=Math.min(i,t/2);u=u<0?0:u;let l=Math.min(i,s/2);l=l<0?0:l;const p=Math.max(t-2*u,0),y=Math.max(s-2*l,0);return this.M(a+u,n).right(p).A(u,l,0,0,1,e,n+l).down(y).A(u,l,0,0,1,e-u,c).left(p).A(u,l,0,0,1,a,c-l).up(y).A(u,l,0,0,1,a+u,n).M(a,n),o&&this.M(r,h),this})),i.macro("circle",(function(t,s,i,r=!0){return this.ellipse(t,t,s,i,r)})),i.macro("ellipse",(function(t,s,i,r,h=!0){const o=t/2,n=s/2;return this.M(i+o,r).A(o,n,0,0,1,i-o,r).A(o,n,0,0,1,i+o,r).close(),h&&this.M(i,r),this})),i.macro("isocube",(function(t,s,i,r=!0){this.regPolygon(t,6,s,i,r);const h=this.constructor.radialPoints(0,s,i,6),o=this.constructor.radialPoints(t/2,s,i,6);return[1,3,5].forEach(t=>{this.M(h[t][0],h[t][1]).L(o[t][0],o[t][1])}),r&&this.M(s,i),this})),i.macro("kite",(function(t,s,i,r,h,o=!0){i=i||parseInt(.33*s,10);const[n,a,e]=this.constructor.radialPoints(s/2,r,h,4),c=parseInt(n[1],10)+i,u=[n,[r-t/2,c],e,[r+t/2,c]];return this.polyline(u).close()})),i.macro("lens",(function(t,s,i,r,h=!0){return this.M(i-t/2,r).Q(i,r-s,i+t/2,r).Q(i,r+s,i-t/2,r),h&&this.M(i,r),this})),i.macro("polyline",(function(t,s=!1){const i=[...t],r=i.shift(),h=s?this.m:this.M,o=s?this.l:this.L;return h.apply(null,r),i.forEach(t=>{o.apply(null,t)}),this})),i.macro("polygon",(function(t){return this.polyline(t).close(),this})),i.macro("regPolygon",(function(t,s,i,r,h=!0){return this.polygon(this.constructor.radialPoints(t/2,i,r,s)),h&&this.M(i,r),this})),i.macro("polygram",(function(t,s,i,r,h=2,o=!0){return this.polygon(this.constructor.radialPoints(t/2,i,r,s,null,h)),o&&this.M(i,r),this})),i.macro("radialLines",(function(t,s,i,r,h,o=!0){const n=this.constructor.radialPoints(s/2,r,h,i),a=this.constructor.radialPoints(t/2,r,h,i);return n.forEach((t,s)=>{this.M(t[0],t[1]).L(a[s][0],a[s][1])}),o&&this.M(r,h),this})),i.macro("star",(function(t,s,i,r,h,o=!0){const n=s/2,a=t/2,e=360/(2*i),c=Array.from({length:2*i}).map((t,s)=>{let i=s%2==0?a:n,c=e*s;const{x:u,y:l}=this.constructor.clockwisePoint(r,h,i,c,o);return[u,l]});return this.polygon(c),o&&this.M(r,h),this})),i.macro("triangle",(function(t,s,i,r=!0){const h=Math.sqrt(3),o=[s,i-h/3*t],n=[s-t/2,i+h/6*t],a=[s+t/2,i+h/6*t];return this.polygon([o,n,a]),r&&this.M(s,i),this})),i.macro("sector",(function(t,s,i,r,h,o=!0){const n=i/2,a=this.constructor.clockwisePoint(t,s,n,h),e=this.constructor.clockwisePoint(t,s,n,r),c=h-r<=180?0:1;return this.M(a.x,a.y).A(n,n,0,c,0,e.x,e.y).L(t,s).L(a.x,a.y),o&&this.M(t,s),this})),i.macro("segment",(function(t,s,i,r,h,o=!0){const n=i/2,a=this.constructor.clockwisePoint(t,s,n,h),e=this.constructor.clockwisePoint(t,s,n,r),c=h-r<=180?0:1;return this.M(a.x,a.y).A(n,n,0,c,0,e.x,e.y),o&&this.M(t,s),this})),i.macro("cross",(function(t,s,i,r,h=!0){const o=i-t/2,n=o+t,a=r-s/2,e=a+s;return this.M(o,r).L(n,r).M(i,e).L(i,a),h&&this.M(i,r),this})),i.macro("symH",(function(t,s,i,r,h=!0){const o=i-t/2,n=o+t,a=r-s/2,e=a+s;return this.M(o,a).L(o,e).M(o,r).L(n,r).M(n,a).L(n,e),h&&this.M(i,r),this})),i.macro("symI",(function(t,s,i,r,h=!0){const o=i-t/2,n=o+t,a=r-s/2,e=a+s;return this.M(o,a).L(n,a).M(i,a).L(i,e).M(o,e).L(n,e),h&&this.M(i,r),this})),i.macro("symV",(function(t,s,i,r,h=!0){const o=i-t/2,n=o+t,a=r-s/2,e=a+s;return this.M(o,a).L(i,e).L(n,a),h&&this.M(i,r),this})),i.macro("symX",(function(t,s,i,r,h=!0){const o=i-t/2,n=o+t,a=r-s/2,e=a+s;return this.M(o,a).L(n,e).M(o,e).L(n,a),h&&this.M(i,r),this})),i.macro("omino",(function(t,s,i,r,h=!1){return this.constructor.positionByArray(t,s,i,r).forEach((t,s,i)=>{const{cx:r,cy:o,ri:n,ci:a,size:e}=t,c=e/2,u=i.find(t=>t.ri===n&&t.ci===a-1),l=i.find(t=>t.ri===n&&t.ci===a+1),p=i.find(t=>t.ri===n-1&&t.ci===a),y=i.find(t=>t.ri===n+1&&t.ci===a),m=r-c,f=r+c,M=o-c,g=o+c;u&&!h||(this.M(m,M),this.v(e)),l||(this.M(f,M),this.v(e)),p&&!h||(this.M(m,M),this.h(e)),y||(this.M(m,g),this.h(e))}),this})),i}));