@expofp/floorplan
Version:
Interactive floor plan library for expos and events
2 lines (1 loc) • 2.08 kB
JavaScript
const M=document.createElement("canvas").getContext("2d");export default class I{maxMultilineFontSize;baseFontSize;fontSizes;ctx;spaceWidth;constructor(r,s,e){this.baseFontSize=this.maxMultilineFontSize=e,this.fontSizes=s,this.ctx=M,this.ctx.textAlign="center",this.ctx.textBaseline="alphabetic",this.ctx.font=r(this.baseFontSize),this.spaceWidth=this.ctx.measureText(" ").width}getStepsForRect(r,s,e){const t=r.split(/\s+/),c=t.map(o=>this.ctx.measureText(o).width),n=[];let i=1/0,h=0;for(const o of this.fontSizes){const d=o,l=o/this.baseFontSize,u=c.map(p=>p*l),f=this.spaceWidth*l,w=B(u,f,o>this.maxMultilineFontSize?1:1/0).filter(p=>p);for(let p=0;p<w.length;p++){const x=w[p],F=x,m=p+1,z=d*m,W=F/s,L=z/e,g=Math.max(L,W);if(g>i||m<h)continue;i=g,h=m;const v=y(x,m,u,f),S=H(v,u,f);if(!S)continue;const b=k(S,t);n.push({scaleFactor:g,value:o,lines:b,width:x})}}return n}}function B(a,r,s){const e=[];let t,c=1,n=1/0,i;for(;(i=T(n,a,r))&&i.length<=s;)c!==i.length&&(e[c-1]=t),c=i.length,t=Math.max(...i),n=t-1;return e[c-1]=t,e}function T(a,r,s){const e=[];let t,c=-1;function n(){c++,t=0}n();for(const i of r){const h=t+(t>0?s:0)+i;if(h>a){if(i>a)return null;n(),t=i}else t=h;e[c]=t}return e}function y(a,r,s,e){return t(r,0);function t(n,i){const h=c(i),o=[];for(const d of h){const l=i+d.length;if(l>=s.length){o.push([d]);break}if(n>0){const u=t(n-1,l);for(const f of u)f.length===n-1&&o.push([d,...f])}}return o}function c(n){if(n>=s.length)throw new Error("From exceed blocks length");const i=[0,-1];let h=0,o=0;for(;s.length>n+o&&(h+=(o>0?e:0)+s[n+o])&&h/a<1.001;)o++;return i.map(l=>o+l).filter(l=>l>0).map(l=>d(n,l));function d(l,u){const f=Array(u);for(;u--;)f[u]=u+l;return f}}}function H(a,r,s){const e=a.map(t=>{const c=t.map(i=>i.map(h=>r[h]).reduce((h,o,d)=>h+(d>0?s:0)+o),0),n=R(c);return{ll:t,dd:n}});return e.sort((t,c)=>t.dd-c.dd),e.map(t=>t.ll)[0]}function R(a){const r=a.length,s=a.reduce((e,t)=>e+t)/r;return Math.sqrt(a.map(e=>Math.pow(e-s,2)).reduce((e,t)=>e+t)/r)}function k(a,r){return a.map(s=>s.map(e=>r[e]).reduce((e,t,c)=>e+(c>0?" ":"")+t),"")}