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