UNPKG

11.4 kBJavaScriptView Raw
1/* Sutton SignWriting TrueType Font Module v1.2.0 (https://github.com/sutton-signwriting/font-ttf), author: Steve Slevinski (https://SteveSlevinski.me), license: MIT */
2const o=o=>1+96*(parseInt(o.slice(1,4),16)-256)+16*parseInt(o.slice(4,5),16)+parseInt(o.slice(5,6),16);let t={};const e=document.createElement("canvas");e.width=152,e.height=152;const l=e.getContext("2d"),s=function(e){return function(o){if(o in t)return[...t[o]];l.clearRect(0,0,152,152),l.font="60px 'SuttonSignWritingLine'",l.fillText(String.fromCodePoint(o+983040),0,0);const e=l.getImageData(0,0,152,152).data;let s,i,a,n;o:for(s=151;s>=0;s--)for(i=0;i<152;i+=1)for(n=0;n<4;n+=1)if(a=4*s+4*i*152+n,e[a])break o;var r=s;o:for(i=151;i>=0;i--)for(s=0;s<r;s+=1)for(n=0;n<4;n+=1)if(a=4*s+4*i*152+n,e[a])break o;var d=i+1;if(r=Math.ceil(r/2),d=Math.ceil(d/2),14394==o&&(r=19),[10468,10480,10496,10512,10500,10532,10548,10862,10878,10894,11058,11074,11476,11488,11492,11504,11508,11520,10516,10910,10926,11042,11082,10942].includes(o)&&(r=20),31921==o&&(r=22),38460==o&&(r=23),[20164,20212].includes(o)&&(r=25),31894==o&&(r=28),46698==o&&(r=29),29606==o&&(r=30),44855==o&&(r=40),32667==o&&(r=50),[11088,11474,11490,11506].includes(o)&&(d=20),6285==o&&(d=21),40804==o&&(d=31),41475==o&&(d=36),0==r&&0==d){const t={9:[15,30],10:[21,30],11:[30,15],12:[30,21],13:[15,30],14:[21,30]};o in t&&(r=t[o][0],d=t[o][1])}return 0!=r||0!=d?(t[o]=[r,d],[r,d]):void 0}(o(e))},i=function(o){return String.fromCodePoint(o+983040)},a=function(o){return String.fromCodePoint(o+1048576)},n=function(t){return i(o(t))},r=function(t){return a(o(t))},d=function(t){return e=o(t),` <text class="sym-fill" fill="white" style="pointer-events:none;font-family:'SuttonSignWritingFill';font-size:30px;">${a(e)}</text>\n <text class="sym-line" fill="black" style="pointer-events:none;font-family:'SuttonSignWritingLine';font-size:30px;">${i(e)}</text>`;var e};let c={colorize:"C",colorhex:"(?:[0-9a-fA-F]{3}){1,2}",colorname:"[a-zA-Z]+",padding:"P[0-9]{2}",zoom:"Z(?:[0-9]+(?:\\.[0-9]+)?|x)",zoomsym:"Z[0-9]{2},[0-9]+(?:\\.[0-9]+)?(?:,[0-9]{3}x[0-9]{3})?",classbase:"-?[_a-zA-Z][_a-zA-Z0-9-]{0,100}",id:"[a-zA-Z][_a-zA-Z0-9-]{0,100}"};c.colorbase=`(?:${c.colorhex}|${c.colorname})`,c.color=`_${c.colorbase}_`,c.colors=`_${c.colorbase}(?:,${c.colorbase})?_`,c.background="G"+c.color,c.detail="D"+c.colors,c.detailsym="D[0-9]{2}"+c.colors,c.classes=`${c.classbase}(?: ${c.classbase})*`,c.full=`-(${c.colorize})?(${c.padding})?(${c.background})?(${c.detail})?(${c.zoom})?(?:-((?:${c.detailsym})*)((?:${c.zoomsym})*))?(?:-(${c.classes})?!(?:(${c.id})!)?)?`;const m=o=>(new RegExp(`^${c.colorhex}$`).test(o)?"#":"")+o,p=o=>{const t="^"+c.full,e=("string"==typeof o?o.match(new RegExp(t)):[])||[];return{colorize:e[1]?!!e[1]:void 0,padding:e[2]?parseInt(e[2].slice(1)):void 0,background:e[3]?m(e[3].slice(2,-1)):void 0,detail:e[4]?e[4].slice(2,-1).split(",").map(m):void 0,zoom:e[5]?"Zx"===e[5]?"x":parseFloat(e[5].slice(1)):void 0,detailsym:e[6]?e[6].match(new RegExp(c.detailsym,"g")).map(o=>{const t=o.split("_"),e=t[1].split(",").map(m);return{index:parseInt(t[0].slice(1)),detail:e}}):void 0,zoomsym:e[7]?e[7].match(new RegExp(c.zoomsym,"g")).map(o=>{const t=o.split(",");return{index:parseInt(t[0].slice(1)),zoom:parseFloat(t[1]),offset:t[2]?t[2].split("x").map(o=>parseInt(o)-500):void 0}}):void 0,classes:e[8]?e[8]:void 0,id:e[9]?e[9]:void 0}};let f={symbol:"S[123][0-9a-f]{2}[0-5][0-9a-f]",coord:"[0-9]{3}x[0-9]{3}",sort:"A",box:"[BLMR]"};f.prefix=`(?:${f.sort}(?:${f.symbol})+)`,f.spatial=`${f.symbol}${f.coord}`,f.signbox=`${f.box}${f.coord}(?:${f.spatial})*`,f.sign=`${f.prefix}?${f.signbox}`,f.sortable=`${f.prefix}${f.signbox}`;let g={colorize:"C",colorhex:"(?:[0-9a-fA-F]{3}){1,2}",colorname:"[a-zA-Z]+",padding:"P[0-9]{2}",zoom:"Z(?:[0-9]+(?:\\.[0-9]+)?|x)",zoomsym:"Z[0-9]{2},[0-9]+(?:\\.[0-9]+)?(?:,[0-9]{3}x[0-9]{3})?",classbase:"-?[_a-zA-Z][_a-zA-Z0-9-]{0,100}",id:"[a-zA-Z][_a-zA-Z0-9-]{0,100}"};g.colorbase=`(?:${g.colorhex}|${g.colorname})`,g.color=`_${g.colorbase}_`,g.colors=`_${g.colorbase}(?:,${g.colorbase})?_`,g.background="G"+g.color,g.detail="D"+g.colors,g.detailsym="D[0-9]{2}"+g.colors,g.classes=`${g.classbase}(?: ${g.classbase})*`,g.full=`-(${g.colorize})?(${g.padding})?(${g.background})?(${g.detail})?(${g.zoom})?(?:-((?:${g.detailsym})*)((?:${g.zoomsym})*))?(?:-(${g.classes})?!(?:(${g.id})!)?)?`;const x=o=>o.split("x").map(o=>parseInt(o)),$=o=>{const t=`^(${f.symbol})(${f.coord})?(${g.full})?`,e="string"==typeof o?o.match(new RegExp(t)):void 0;return{symbol:e?e[1]:void 0,coord:e&&e[2]?x(e[2]):void 0,style:e?e[3]:void 0}},y=o=>{const t=`^(${f.prefix})?(${f.signbox})(${g.full})?`,e="string"==typeof o?o.match(new RegExp(t)):void 0;return e?{sequence:e[1]?e[1].slice(1).match(/.{6}/g):void 0,box:e[2][0],max:x(e[2].slice(1,8)),spatials:e[2].length<9?void 0:e[2].slice(8).match(/(.{13})/g).map(o=>({symbol:o.slice(0,6),coord:[parseInt(o.slice(6,9)),parseInt(o.slice(10,13))]})),style:e[3]}:{}},b=[256,517,759,767,877,895,903],h=[767,876],u=[767,885],z=["#0000CC","#CC0000","#FF0099","#006600","#000000","#884411","#FF9900"],v=o=>{const t=$(o);let e="#000000";if(t.symbol){const o=parseInt(t.symbol.slice(1,4),16),l=b.findIndex(t=>t>o);e=z[l<0?6:l-1]}return e},w=o=>{const t=$(o);if(t.symbol){let e=s(t.symbol);if(e){let l,s=p(t.style),i=d(t.symbol);i=` <g transform="translate(500,500)">\n${i}\n </g>`,s.colorize?l=v(t.symbol):s.detail&&(l=s.detail[0]),l&&(i=i.replace(/class="sym-line" fill="black"/,`class="sym-line" fill="${l}"`));let a=s.detail&&s.detail[1];a&&(i=i.replace(/class="sym-fill" fill="white"/,`class="sym-fill" fill="${a}"`));let n=500,r=500,c="";s.padding&&(n-=s.padding,r-=s.padding,e[0]+=2*s.padding,e[1]+=2*s.padding),s.background&&(c=`\n <rect x="${n}" y="${r}" width="${e[0]}" height="${e[1]}" style="fill:${s.background};" />`);let m="";"x"!=s.zoom&&(m=` width="${e[0]*(s.zoom?s.zoom:1)}" height="${e[1]*(s.zoom?s.zoom:1)}"`);let f="";s.classes&&(f=` class="${s.classes}"`);let g="";return s.id&&(g=` id="${s.id}"`),`<svg${f}${g} version="1.1" xmlns="http://www.w3.org/2000/svg"${m} viewBox="${n} ${r} ${e[0]} ${e[1]}">\n <text font-size="0">${o}</text>${c}\n${i}\n</svg>`}}return'<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="1" height="1"></svg>'},S=o=>{const t=function(o){const t=$(o);if(t.symbol){let o=s(t.symbol);if(o){const e=document.createElement("canvas"),l=e.getContext("2d");let s=p(t.style),i="black";s.colorize?i=v(t.symbol):s.detail&&(i=s.detail[0]);let a=s.detail&&s.detail[1]||"white",d=500,c=d+o[0],m=500,f=m+o[1];s.padding&&(d-=s.padding,m-=s.padding,c+=s.padding,f+=s.padding);let g=1;"x"!=s.zoom&&(g=s.zoom);let x=(c-d)*g,$=(f-m)*g;return e.width=x||1,e.height=$||1,s.background&&(l.rect(0,0,x,$),l.fillStyle=s.background,l.fill()),l.font=30*g+"px 'SuttonSignWritingFill'",l.fillStyle=a,l.fillText(r(t.symbol),(500-d)*g,(500-m)*g),l.font=30*g+"px 'SuttonSignWritingLine'",l.fillStyle=i,l.fillText(n(t.symbol),(500-d)*g,(500-m)*g),e}}}(o),e=t.toDataURL("image/png");return t.remove(),e},I=o=>{const t=$(o);if(!t.symbol)return null;{let o=s(t.symbol);if(o)return`${t.symbol}${500-parseInt(o[0]/2)}x${500-parseInt(o[1]/2)}${t.style||""}`}},k=o=>{let t=y(o);if(t.spatials){let e=p(t.style);e.detailsym&&e.detailsym.forEach(o=>{t.spatials[o.index-1]&&(t.spatials[o.index-1].detail=o.detail)});let l=Math.min(...t.spatials.map(o=>o.coord[0])),i=Math.min(...t.spatials.map(o=>o.coord[1])),a=t.max[0],n=t.max[1];e.zoomsym&&e.zoomsym.forEach(o=>{if(t.spatials[o.index-1]){t.spatials[o.index-1].zoom=o.zoom,o.offset&&(t.spatials[o.index-1].coord[0]+=o.offset[0],t.spatials[o.index-1].coord[1]+=o.offset[1]);let e=s(t.spatials[o.index-1].symbol);a=Math.max(a,t.spatials[o.index-1].coord[0]+e[0]*o.zoom),n=Math.max(n,t.spatials[o.index-1].coord[1]+e[1]*o.zoom)}});let r="";e.classes&&(r=` class="${e.classes}"`);let c="";e.id&&(c=` id="${e.id}"`);let m="";e.padding&&(l-=e.padding,i-=e.padding,a+=e.padding,n+=e.padding),e.background&&(m=`\n <rect x="${l}" y="${i}" width="${a-l}" height="${n-i}" style="fill:${e.background};" />`);let f="";"x"!=e.zoom&&(f=` width="${(a-l)*(e.zoom?e.zoom:1)}" height="${(n-i)*(e.zoom?e.zoom:1)}"`);let g=`<svg${r}${c} version="1.1" xmlns="http://www.w3.org/2000/svg"${f} viewBox="${l} ${i} ${a-l} ${n-i}">\n <text font-size="0">${o}</text>${m}`;const x=e.detail&&e.detail[0],$=e.detail&&e.detail[1];return g+="\n"+t.spatials.map(o=>{let t=d(o.symbol),l=x;o.detail?l=o.detail[0]:e.colorize&&(l=v(o.symbol)),l&&(t=t.replace(/class="sym-line" fill="black"/,`class="sym-line" fill="${l}"`));let s=$;return o.detail&&o.detail[1]&&(s=o.detail[1]),s&&(t=t.replace(/class="sym-fill" fill="white"/,`class="sym-fill" fill="${s}"`)),o.zoom&&(t=`<g transform="scale(${o.zoom})">${t}</g>`),` <g transform="translate(${o.coord[0]},${o.coord[1]})">\n${t}\n </g>`}).join("\n"),g+="\n</svg>",g}return'<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="1" height="1"></svg>'},M=o=>{const t=function(o){const t=y(o);if(t.spatials){const o=document.createElement("canvas"),e=o.getContext("2d");let l=p(t.style);l.detailsym&&l.detailsym.forEach(o=>{t.spatials[o.index-1]&&(t.spatials[o.index-1].detail=o.detail)});let i=Math.min(...t.spatials.map(o=>o.coord[0])),a=Math.min(...t.spatials.map(o=>o.coord[1])),d=t.max[0],c=t.max[1];l.zoomsym&&l.zoomsym.forEach(o=>{if(t.spatials[o.index-1]){t.spatials[o.index-1].zoom=o.zoom,o.offset&&(t.spatials[o.index-1].coord[0]+=o.offset[0],t.spatials[o.index-1].coord[1]+=o.offset[1]);let e=s(t.spatials[o.index-1].symbol);d=Math.max(d,t.spatials[o.index-1].coord[0]+e[0]*o.zoom),c=Math.max(c,t.spatials[o.index-1].coord[1]+e[1]*o.zoom)}}),l.padding&&(i-=l.padding,a-=l.padding,d+=l.padding,c+=l.padding);let m=1;"x"!=l.zoom&&(m=l.zoom);let f=(d-i)*m,g=(c-a)*m;o.width=f||1,o.height=g||1,l.background&&(e.rect(0,0,f,g),e.fillStyle=l.background,e.fill());const x=l.detail&&l.detail[0]||"black",$=l.detail&&l.detail[1]||"white";return t.spatials.forEach(o=>{let t=x;o.detail?t=o.detail[0]:l.colorize&&(t=v(o.symbol));let s=$;o.detail&&o.detail[1]&&(s=o.detail[1]);let d=o.zoom||1;e.font=30*m*d+"px 'SuttonSignWritingFill'",e.fillStyle=s,e.fillText(r(o.symbol),(o.coord[0]-i)*m,(o.coord[1]-a)*m),e.font=30*m*d+"px 'SuttonSignWritingLine'",e.fillStyle=t,e.fillText(n(o.symbol),(o.coord[0]-i)*m,(o.coord[1]-a)*m)}),o}}(o),e=t.toDataURL("image/png");return t.remove(),e},Z=o=>{const t=y(o);if(t.spatials){const o=t.spatials.reduce((o,t)=>{const e=s(t.symbol);return o[t.symbol]={width:e[0],height:e[1]},o},{}),e=t=>({x1:Math.min(...t.map(o=>o.coord[0])),y1:Math.min(...t.map(o=>o.coord[1])),x2:Math.max(...t.map(t=>t.coord[0]+parseInt(o[t.symbol].width))),y2:Math.max(...t.map(t=>t.coord[1]+parseInt(o[t.symbol].height)))}),l=h,i=t.spatials.filter(o=>{const t=parseInt(o.symbol.slice(1,4),16);return l[0]<=t&&l[1]>=t}),a=u,n=t.spatials.filter(o=>{const t=parseInt(o.symbol.slice(1,4),16);return a[0]<=t&&a[1]>=t});let r=e(t.spatials),d=[r.x2,r.y2];if(i.length){const o=e(i);r.x1=o.x1,r.x2=o.x2}if(n.length){const o=e(n);r.y1=o.y1,r.y2=o.y2}const c=[parseInt((r.x2+r.x1)/2)-500,parseInt((r.y2+r.y1)/2)-500];return(t.sequence?"A"+t.sequence.join(""):"")+t.box+(d[0]-c[0])+"x"+(d[1]-c[1])+t.spatials.map(o=>o.symbol+(o.coord[0]-c[0])+"x"+(o.coord[1]-c[1])).join("")+(t.style||"")}};export{Z as signNormalize,M as signPng,k as signSvg,r as symbolFill,n as symbolLine,I as symbolNormalize,S as symbolPng,s as symbolSize,w as symbolSvg,d as symbolText};