@sutton-signwriting/font-ttf
Version:
a javascript package for node that generates SVG and PNG images for individual symbols, complete signs, and structured text. The package covers the entire set of the International SignWritnig Alphabet 2010 (ISWA 2010).
3 lines (2 loc) • 37.4 kB
JavaScript
/* Sutton SignWriting TrueType Font Module v1.6.0 (https://github.com/sutton-signwriting/font-ttf), author: Steve Slevinski (https://SteveSlevinski.me), license: MIT */
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e(((t="undefined"!=typeof globalThis?globalThis:t||self).ssw=t.ssw||{},t.ssw.ttf={}))}(this,(function(t){"use strict";let e={};const o=152;let l;const i=function(t){if(t in e)return[...e[t]];if(!l){const t=document.createElement("canvas");t.width=o,t.height=o,l=t.getContext("2d",{willReadFrequently:!0})}l.clearRect(0,0,o,o),l.font="60px 'SuttonSignWritingLine'",l.fillText(String.fromCodePoint(t+983040),0,0);const i=l.getImageData(0,0,o,o).data;let n,s,a,r;t:for(n=151;n>=0;n--)for(s=0;s<o;s+=1)for(r=0;r<4;r+=1)if(a=4*n+4*s*o+r,i[a])break t;var d=n;t:for(s=151;s>=0;s--)for(n=0;n<d;n+=1)for(r=0;r<4;r+=1)if(a=4*n+4*s*o+r,i[a])break t;var c=s+1;if(d=Math.ceil(d/2),c=Math.ceil(c/2),14394==t&&(d=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(t)&&(d=20),31921==t&&(d=22),38460==t&&(d=23),[20164,20212].includes(t)&&(d=25),31894==t&&(d=28),46698==t&&(d=29),29606==t&&(d=30),44855==t&&(d=40),32667==t&&(d=50),[11088,11474,11490,11506].includes(t)&&(c=20),6285==t&&(c=21),40804==t&&(c=31),41475==t&&(c=36),0==d&&0==c){const e={9:[15,30],10:[21,30],11:[30,15],12:[30,21],13:[15,30],14:[21,30]};t in e&&(d=e[t][0],c=e[t][1])}return 0!=d||0!=c?(e[t]=[d,c],[d,c]):void 0},n=function(t){return String.fromCodePoint(t+983040)},s=function(t){return String.fromCodePoint(t+1048576)},a=function(t){return` <text class="sym-fill" fill="white" style="pointer-events:none;font-family:'SuttonSignWritingFill';font-size:30px;">${s(t)}</text>\n <text class="sym-line" fill="black" style="pointer-events:none;font-family:'SuttonSignWritingLine';font-size:30px;">${n(t)}</text>`},r=function(t){if(i(1))t();else{const e=setInterval((function(){i(1)&&(clearInterval(e),t())}),100)}},d=function(t){const e=function(){const t=document.createElement("canvas");t.width=15,t.height=30;const e=t.getContext("2d");e.font="30px 'SuttonSignWritingFill'",e.fillText(s(1),0,0);return!e.getImageData(0,0,15,30).data.every((t=>0===t))};if(e())t();else{const o=setInterval((function(){e()&&(clearInterval(o),t())}),100)}};var c=Object.freeze({__proto__:null,cssAppend:function(t=""){if(!document.getElementById("SgnwFontCss")){const e=document.createElement("style");e.setAttribute("id","SgnwFontCss"),e.appendChild(document.createTextNode(`\n @font-face {\n font-family: "SuttonSignWritingLine";\n src: \n local('SuttonSignWritingLine'),\n ${t?`url('${t}SuttonSignWritingLine.ttf') format('truetype'),`:""}\n url('https://cdn.jsdelivr.net/npm/@sutton-signwriting/font-ttf@1.0.0/font/SuttonSignWritingLine.ttf') format('truetype');\n }\n @font-face {\n font-family: "SuttonSignWritingFill";\n src: \n local('SuttonSignWritingFill'),\n ${t?`url('${t}SuttonSignWritingFill.ttf') format('truetype'),`:""}\n url('https://cdn.jsdelivr.net/npm/@sutton-signwriting/font-ttf@1.0.0/font/SuttonSignWritingFill.ttf') format('truetype');\n }\n @font-face {\n font-family: "SuttonSignWritingOneD";\n src: \n local('SuttonSignWritingOneD'),\n ${t?`url('${t}SuttonSignWritingOneD.ttf') format('truetype'),`:""}\n url('https://cdn.jsdelivr.net/npm/@sutton-signwriting/font-ttf@1.0.0/font/SuttonSignWritingOneD.ttf') format('truetype');\n }\n `)),document.head.appendChild(e)}},cssLoaded:function(t){let e=!1,o=!1;r((()=>{e=!0})),d((()=>{o=!0}));const l=setInterval((function(){e&&o&&(clearInterval(l),t())}),100)},cssLoadedLine:r,cssLoadedFill:d,symbolSize:i,symbolLine:n,symbolFill:s,symbolText:a});const m=t=>t.map((t=>(t=>String.fromCodePoint(120844+parseInt(t)-250))(t))).join(""),g=t=>parseInt(t.codePointAt(0)),p=t=>String.fromCodePoint(t),f=t=>g(t)-262144,y=t=>"S00000"===t?0:1+96*(parseInt(t.slice(1,4),16)-256)+16*parseInt(t.slice(4,5),16)+parseInt(t.slice(5,6),16),u=t=>{if(""===t)return"S00000";const e=g(t)-262145,o=parseInt(e/96),l=parseInt((e-96*o)/16),i=parseInt(e-96*o-16*l);return"S"+(o+256).toString(16)+l.toString(16)+i.toString(16)},b=t=>p("S00000"===t?262144:262145+96*(parseInt(t.slice(1,4),16)-256)+16*parseInt(t.slice(4,5),16)+parseInt(t.slice(5,6),16));let h={null:"S00000",symbol:"S[123][0-9a-f]{2}[0-5][0-9a-f]",coord:"[0-9]{3}x[0-9]{3}",sort:"A",box:"[BLMR]"};h.nullorsymbol=`(?:${h.null}|${h.symbol})`,h.prefix=`(?:${h.sort}${h.nullorsymbol}+)`,h.spatial=`${h.symbol}${h.coord}`,h.signbox=`${h.box}${h.coord}(?:${h.spatial})*`,h.sign=`${h.prefix}?${h.signbox}`,h.sortable=`${h.prefix}${h.signbox}`;let x={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)",classbase:"-?[_a-zA-Z][_a-zA-Z0-9-]{0,100}",id:"[a-zA-Z][_a-zA-Z0-9-]{0,100}"};x.colorbase=`(?:${x.colorhex}|${x.colorname})`,x.color=`_${x.colorbase}_`,x.colors=`_${x.colorbase}(?:,${x.colorbase})?_`,x.background=`G${x.color}`,x.detail=`D${x.colors}`,x.detailsym=`D[0-9]{2}${x.colors}`,x.classes=`${x.classbase}(?: ${x.classbase})*`,x.full=`-(${x.colorize})?(${x.padding})?(${x.background})?(${x.detail})?(${x.zoom})?(?:-((?:${x.detailsym})*))?(?:-(${x.classes})?!(?:(${x.id})!)?)?`;const $=t=>(new RegExp(`^${x.colorhex}$`).test(t)?"#":"")+t,v=t=>{const e=`^${x.full}`,o=("string"==typeof t?t.match(new RegExp(e)):[])||[];return l={colorize:o[1]?!!o[1]:void 0,padding:o[2]?parseInt(o[2].slice(1)):void 0,background:o[3]?$(o[3].slice(2,-1)):void 0,detail:o[4]?o[4].slice(2,-1).split(",").map($):void 0,zoom:o[5]?"Zx"===o[5]?"x":parseFloat(o[5].slice(1)):void 0,detailsym:o[6]?o[6].match(new RegExp(x.detailsym,"g")).map((t=>{const e=t.split("_"),o=e[1].split(",").map($);return{index:parseInt(e[0].slice(1)),detail:o}})):void 0,classes:o[7]?o[7]:void 0,id:o[8]?o[8]:void 0},Object.fromEntries(Object.entries(l).filter((([t,e])=>void 0!==e)));var l},w=t=>t.split("x").map((t=>parseInt(t))),z=t=>{const e=`^(${h.symbol})(${h.coord})?(${x.full})?`,o="string"==typeof t?t.match(new RegExp(e)):void 0;return{symbol:o?o[1]:void 0,coord:o&&o[2]?w(o[2]):void 0,style:o?o[3]:void 0}},S=t=>{const e=`^(${h.prefix})?(${h.signbox})(${x.full})?`,o="string"==typeof t?t.match(new RegExp(e)):void 0;return o?{sequence:o[1]?o[1].slice(1).match(/.{6}/g):void 0,box:o[2][0],max:w(o[2].slice(1,8)),spatials:o[2].length<9?void 0:o[2].slice(8).match(/(.{13})/g).map((t=>({symbol:t.slice(0,6),coord:[parseInt(t.slice(6,9)),parseInt(t.slice(10,13))]}))),style:o[3]}:{}},I=t=>{if("string"!=typeof t)return[];const e=`(${h.sign}(${x.full})?|${h.spatial}(${x.full})?)`,o=t.match(new RegExp(e,"g"));return o?[...o]:[]},k=t=>{if("string"==typeof t.symbol){const e=(t.symbol.match(h.symbol)||[""])[0];if(e){return e+((((t.coord&&t.coord[0]||"").toString()+"x"+(t.coord&&t.coord[1]||"").toString()).match(h.coord)||[""])[0]||"")+("string"==typeof t.style&&(t.style.match(x.full)||[""])[0]||"")}}},_=t=>{let e,o,l,i,n,s,a,r,d=S(t);d.spatials?(i=Math.min(...d.spatials.map((t=>t.coord[0]))),n=d.max[0],e=n-i,s=Math.min(...d.spatials.map((t=>t.coord[1]))),a=d.max[1],o=a-s,l="sign",r=d.box):(d=z(t),r="M",d.coord?(i=d.coord[0],e=2*(500-i),s=d.coord[1],o=2*(500-s),l="symbol"):(i=490,e=20,s=490,o=20,l="none"));let c=v(d.style),m=c.zoom||1,g=c.padding||0;return{minX:i,minY:s,width:e,height:o,segment:l,lane:{B:0,L:-1,M:0,R:1}[r],padding:g,zoom:m}},j={height:500,width:150,offset:50,pad:20,margin:5,dynamic:!1,background:void 0,punctuation:{spacing:!0,pad:30,pull:!0},style:{detail:["black","white"],zoom:1}},E=(t,e)=>{if("string"!=typeof t)return{};const o=(t=>("object"!=typeof t&&(t={}),{...j,...t,punctuation:{...j.punctuation,...t.punctuation},style:{...j.style,...t.style}}))(e);let l=I(t),i=0,n=[],s=[],a=0,r=parseInt(o.width/2),d=o.height-o.margin,c=!0,m=!1;for(let t of l){let e=_(t);i+=a,o.punctuation.spacing?i+="sign"==e.segment?o.pad:0:i+=o.pad,m=i+e.height>d,m&&"symbol"==e.segment&&o.punctuation.pull&&c&&(m=!1,c=!1),0==s.length&&(m=!1),m&&(i=o.pad,n.push(s),s=[],c=!0),s.push(Object.assign(e,{x:r+o.offset*e.lane-(500-e.minX)*e.zoom*o.style.zoom,y:i,text:t})),i+=e.height*e.zoom*o.style.zoom,a=o.punctuation.spacing?"sign"==e.segment?o.pad:o.punctuation.pad:o.pad}if(s.length&&n.push(s),o.punctuation.pull)for(let t of n){let e=t[t.length-1],l=e.y+e.height-(o.height-o.margin);if(l>0){let e=parseInt(l/t.length)+1;for(let o in t)t[o].y-=e*o+e}}let g=[];for(let t of n){let e=[r-o.offset-o.pad],l=[r+o.offset+o.pad];for(let i of t)e.push(i.x-o.pad),l.push(i.x+i.width+o.pad);e=Math.min(...e),l=Math.max(...l);let i=o.width,n=0;o.dynamic?(i=l-e,n=-e):n=r-parseInt((e+l)/2);for(let e of t)e.x+=n;g.push(i)}return{options:o,widths:g,columns:n}},F=[256,517,759,767,877,895,903],M=[767,876],C=[767,885],R=["#0000CC","#CC0000","#FF0099","#006600","#000000","#884411","#FF9900"],W=t=>{const e=z(t);let o="#000000";if(e.symbol){const t=parseInt(e.symbol.slice(1,4),16),l=F.findIndex((e=>e>t));o=R[l<0?6:l-1]}return o},A=function(t){if(z(t).symbol)return i(y(t))},L=function(t){return n(y(t))},O=function(t){return s(y(t))},P=function(t){return a(y(t))};let Z={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)",classbase:"-?[_a-zA-Z][_a-zA-Z0-9-]{0,100}",id:"[a-zA-Z][_a-zA-Z0-9-]{0,100}"};Z.colorbase=`(?:${Z.colorhex}|${Z.colorname})`,Z.color=`_${Z.colorbase}_`,Z.colors=`_${Z.colorbase}(?:,${Z.colorbase})?_`,Z.background=`G${Z.color}`,Z.detail=`D${Z.colors}`,Z.detailsym=`D[0-9]{2}${Z.colors}`,Z.classes=`${Z.classbase}(?: ${Z.classbase})*`,Z.full=`-(${Z.colorize})?(${Z.padding})?(${Z.background})?(${Z.detail})?(${Z.zoom})?(?:-((?:${Z.detailsym})*))?(?:-(${Z.classes})?!(?:(${Z.id})!)?)?`;const D=t=>(new RegExp(`^${Z.colorhex}$`).test(t)?"#":"")+t,T=t=>{const e=`^${Z.full}`,o=("string"==typeof t?t.match(new RegExp(e)):[])||[];return l={colorize:o[1]?!!o[1]:void 0,padding:o[2]?parseInt(o[2].slice(1)):void 0,background:o[3]?D(o[3].slice(2,-1)):void 0,detail:o[4]?o[4].slice(2,-1).split(",").map(D):void 0,zoom:o[5]?"Zx"===o[5]?"x":parseFloat(o[5].slice(1)):void 0,detailsym:o[6]?o[6].match(new RegExp(Z.detailsym,"g")).map((t=>{const e=t.split("_"),o=e[1].split(",").map(D);return{index:parseInt(e[0].slice(1)),detail:o}})):void 0,classes:o[7]?o[7]:void 0,id:o[8]?o[8]:void 0},Object.fromEntries(Object.entries(l).filter((([t,e])=>void 0!==e)));var l},B=t=>{if("object"!=typeof t||null===t)return;let e="-";e+=t.colorize?"C":"";const o=parseInt(t.padding);e+=!o||o<=0||o>99?"":"P"+(o>9?o:"0"+o);const l=t.background&&"string"==typeof t.background?t.background.match(Z.colorbase)[0]:void 0;e+=l?"G_"+l+"_":"";const i=t.detail&&t.detail[0]&&"string"==typeof t.detail[0]?t.detail[0].match(Z.colorbase)[0]:void 0,n=t.detail&&t.detail[1]&&"string"==typeof t.detail[1]?t.detail[1].match(Z.colorbase)[0]:void 0;i&&(e+="D_"+i,n&&(e+=","+n),e+="_");const s="x"===t.zoom?"x":parseFloat(t.zoom);e+=!s||s<=0?"":"Z"+s;let a="";const r=t.detailsym&&Array.isArray(t.detailsym)?t.detailsym.map((t=>{const e=parseInt(t.index);if(!e||e<=0||e>99)return"";let o="D"+(e>9?e:"0"+e);const l=t.detail&&t.detail[0]?t.detail[0].match(Z.colorbase)[0]:void 0,i=t.detail&&t.detail[1]?t.detail[1].match(Z.colorbase)[0]:void 0;return l&&(o+="_"+l,i&&(o+=","+i),o+="_"),o})):[];a+=r.join("");let d="";const c=t.classes&&"string"==typeof t.classes?t.classes.match(Z.classes)[0]:void 0;d+=c||"";const m=t.id&&"string"==typeof t.id?t.id.match(Z.id)[0]:void 0;return d+=c||m?"!":"",d+=m?m+"!":"",e+(a||d?"-"+a:"")+(d?"-"+d:"")},X=t=>{const e=z(t);if(!e.symbol)return"";let o,l,i,n,s=T(e.style);if(e.coord)o=e.coord[0],l=e.coord[1],i=500-o+500,n=500-l+500;else{let t=A(e.symbol);if(!t)return"";o=500-parseInt((t[0]+1)/2),l=500-parseInt((t[1]+1)/2),i=500-o+500,n=500-l+500}let a,r=P(e.symbol);r=` <g transform="translate(${o},${l})">\n${r}\n </g>`,s.colorize?a=W(e.symbol):s.detail&&(a=s.detail[0]),a&&(r=r.replace(/class="sym-line" fill="black"/,`class="sym-line" fill="${a}"`));let d=s.detail&&s.detail[1];d&&(r=r.replace(/class="sym-fill" fill="white"/,`class="sym-fill" fill="${d}"`));let c="";return s.padding&&(o-=s.padding,l-=s.padding,i+=s.padding,n+=s.padding),s.background&&(c=`\n <rect x="${o}" y="${l}" width="${i-o}" height="${n-l}" style="fill:${s.background};" />`),` <text font-size="0">${t}</text>${c}\n${r}`},Y=t=>{let e=S(t);if(e.spatials){let o=T(e.style);o.detailsym&&o.detailsym.forEach((t=>{e.spatials[t.index-1]&&(e.spatials[t.index-1].detail=t.detail)}));let l=Math.min(...e.spatials.map((t=>t.coord[0]))),i=Math.min(...e.spatials.map((t=>t.coord[1]))),n=e.max[0],s=e.max[1],a="";o.padding&&(l-=o.padding,i-=o.padding,n+=o.padding,s+=o.padding),o.background&&(a=`\n <rect x="${l}" y="${i}" width="${n-l}" height="${s-i}" style="fill:${o.background};" />`);let r=` <text font-size="0">${t}</text>${a}`;const d=o.detail&&o.detail[0],c=o.detail&&o.detail[1];return r+="\n"+e.spatials.map((t=>{let e=P(t.symbol),l=d;t.detail?l=t.detail[0]:o.colorize&&(l=W(t.symbol)),l&&(e=e.replace(/class="sym-line" fill="black"/,`class="sym-line" fill="${l}"`));let i=c;return t.detail&&t.detail[1]&&(i=t.detail[1]),i&&(e=e.replace(/class="sym-fill" fill="white"/,`class="sym-fill" fill="${i}"`)),` <g transform="translate(${t.coord[0]},${t.coord[1]})">\n${e}\n </g>`})).join("\n"),r}return""},q=(t,e)=>{"object"!=typeof e&&(e={});const o=Object.assign(j,e);let l=o.width,i=o.height,n="";o.background&&(n=`\n <rect x="0" y="0" width="${l-0}" height="${i-0}" style="fill:${o.background};" />`);let s=`<svg version="1.1" xmlns="http://www.w3.org/2000/svg"${` width="${o.width}" height="${o.height}"`} viewBox="0 0 ${l-0} ${i-0}">\n ${n}`;return s+=t.map((t=>{const e=t.text.indexOf("-");if(e>0){const l=t.text.substring(e),i={...o.style,...T(l)};t.text=t.text.replace(l,B(i))}else t.text+=B(o.style);return t.zoom=t.zoom*o.style.zoom,'<g transform="translate('+t.x+","+t.y+") scale("+t.zoom+") translate("+-t.minX+","+-t.minY+') ">'+("sign"==t.segment?Y(t.text):X(t.text))+"</g>"})).join("\n"),s+="\n</svg>",s},U=(t,e)=>{const o=function(t,e){"object"!=typeof e&&(e={});const o=Object.assign(j,e),l=document.createElement("canvas");l.width=o.width,l.height=o.height;const i=l.getContext("2d");return o.background&&(i.rect(0,0,o.width,o.height),i.fillStyle=o.background,i.fill()),t.map((t=>{const e=t.text.indexOf("-");if(e>0){const l=t.text.substring(e),i={...o.style,...T(l)};t.text=t.text.replace(l,B(i))}else t.text+=B(o.style);t.zoom=t.zoom*o.style.zoom;let l={};if("sign"==t.segment)l=S(t.text);else{let e=z(t.text);l.style=e.style,l.spatials=[e]}let n=T(l.style);n.background&&(i.fillStyle=n.background,i.fillRect(t.x-n.padding*t.zoom,t.y-n.padding*t.zoom,(t.width+2*n.padding)*t.zoom,(t.height+2*n.padding)*t.zoom)),n.detailsym&&n.detailsym.forEach((t=>{l.spatials[t.index-1]&&(l.spatials[t.index-1].detail=t.detail)}));const s=n.detail&&n.detail[0]||"black",a=n.detail&&n.detail[1]||"white";l.spatials.forEach((e=>{let o=s;e.detail?o=e.detail[0]:n.colorize&&(o=W(e.symbol));let l=a;e.detail&&e.detail[1]&&(l=e.detail[1]),i.font=30*t.zoom+"px 'SuttonSignWritingFill'",i.fillStyle=l,i.fillText(O(e.symbol),t.x+(e.coord[0]-t.minX)*t.zoom,t.y+(e.coord[1]-t.minY)*t.zoom),i.font=30*t.zoom+"px 'SuttonSignWritingLine'",i.fillStyle=o,i.fillText(L(e.symbol),t.x+(e.coord[0]-t.minX)*t.zoom,t.y+(e.coord[1]-t.minY)*t.zoom)}))})),l}(t,e),l=o.toDataURL("image/png");return o.remove(),l};var N=Object.freeze({__proto__:null,symbolSize:A,symbolLine:L,symbolFill:O,symbolText:P,symbolSvgBody:X,symbolSvg:t=>{const e=z(t),o='<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="1" height="1"></svg>';if(!e.symbol)return o;let l,i,n,s,a=T(e.style);if(e.coord)l=e.coord[0],i=e.coord[1],n=500-l+500,s=500-i+500;else{let t=A(e.symbol);if(!t)return o;l=parseInt(500-t[0]/2),i=parseInt(500-t[1]/2),n=l+t[0],s=i+t[1]}let r="";a.classes&&(r=` class="${a.classes}"`);let d="";a.id&&(d=` id="${a.id}"`),a.padding&&(l-=a.padding,i-=a.padding,n+=a.padding,s+=a.padding);let c="";return"x"!=a.zoom&&(c=` width="${(n-l)*(a.zoom?a.zoom:1)}" height="${(s-i)*(a.zoom?a.zoom:1)}"`),`<svg${r}${d} version="1.1" xmlns="http://www.w3.org/2000/svg"${c} viewBox="${l} ${i} ${n-l} ${s-i}">\n${X(t)}\n</svg>`},symbolPng:t=>{const e=function(t){const e=z(t);if(e.symbol){let t=A(e.symbol);if(t){const o=document.createElement("canvas"),l=o.getContext("2d");let i=T(e.style),n="black";i.colorize?n=W(e.symbol):i.detail&&(n=i.detail[0]);let s=i.detail&&i.detail[1]||"white",a=500,r=a+t[0],d=500,c=d+t[1];i.padding&&(a-=i.padding,d-=i.padding,r+=i.padding,c+=i.padding);let m=1;"x"!=i.zoom&&(m=i.zoom);let g=(r-a)*m,p=(c-d)*m;return o.width=g||1,o.height=p||1,i.background&&(l.rect(0,0,g,p),l.fillStyle=i.background,l.fill()),l.font=30*m+"px 'SuttonSignWritingFill'",l.fillStyle=s,l.fillText(O(e.symbol),(500-a)*m,(500-d)*m),l.font=30*m+"px 'SuttonSignWritingLine'",l.fillStyle=n,l.fillText(L(e.symbol),(500-a)*m,(500-d)*m),o}}}(t),o=e.toDataURL("image/png");return e.remove(),o},symbolNormalize:t=>{const e=z(t);if(!e.symbol)return null;{let t=A(e.symbol);if(t)return`${e.symbol}${500-parseInt((t[0]+1)/2)}x${500-parseInt((t[1]+1)/2)}${e.style||""}`}},symbolMirror:t=>{let e=z(t);if(!e.symbol)return t;if(!A(e.symbol))return t;const o=e.symbol.slice(0,4);let l=e.symbol.slice(4,5),i=parseInt(e.symbol.slice(5,6),16);const n=o+"18";var s;A(o+"08")||A(n)?s=8:(0!==i&&4!=i||(s=0),1!=i&&5!=i||(s=6),2!=i&&6!=i||(s=4),3!=i&&7!=i||(s=2));let a="";for(;!a||!A(a);)i+=s,i>7&&s<8&&(i-=8),i>15&&(i-=16),a=o+l+i.toString(16);return e.symbol=a,k(e)},symbolInvert:t=>{let e=z(t);if(!e.symbol)return t;if(!A(e.symbol))return t;const o=e.symbol.slice(0,4);let l=e.symbol.slice(4,5),i=e.symbol.slice(5,6);const n=o+"18";let s;if(s=A(o+"08")||A(n)?{0:"c",1:"d",2:"e",3:"f",4:"8",5:"9",6:"a",7:"b",c:"0",d:"1",e:"2",f:"3",8:"4",9:"5",a:"6",b:"7"}:{0:"4",1:"3",2:"2",3:"1",4:"0",5:"7",6:"6",7:"5"},i in s){const t=o+l+s[i];A(t)&&(e.symbol=t)}return k(e)},symbolRotate:(t,e=!0)=>{let o=z(t);if(!o.symbol)return t;if(!A(o.symbol))return t;const l=e?1:-1,i=o.symbol.slice(0,4);let n=o.symbol.slice(4,5),s=parseInt(o.symbol.slice(5,6),16),a="";for(;!a||!A(a);)s>7?(s+=l,s>15&&(s=8),s<8&&(s=15),a=i+n+s.toString(16)):(s-=l,s>7&&(s=0),s<0&&(s=7),a=i+n+s);return o.symbol=a,k(o)},symbolFlop:(t,e=!0)=>{let o=z(t);if(!o.symbol)return t;if(!A(o.symbol))return t;const l=e?1:-1,i=o.symbol.slice(0,4);let n=parseInt(o.symbol.slice(4,5)),s=o.symbol.slice(5,6),a="";for(;!a||!A(a);)n+=l,n>5&&(n=0),n<0&&(n=5),a=i+n+s;return o.symbol=a,k(o)},symbolScroll:(t,e=!0)=>{let o=z(t);if(!o.symbol)return t;if(!A(o.symbol))return t;const l=e?1:-1,i=parseInt(o.symbol.slice(1,4),16)+l,n=o.symbol.slice(4,5),s=o.symbol.slice(5,6),a="S"+i.toString(16)+n+s;return A(a)&&(o.symbol=a),k(o)},signSvgBody:Y,signSvg:t=>{let e=S(t);if(e.spatials){let o=T(e.style),l=Math.min(...e.spatials.map((t=>t.coord[0]))),i=Math.min(...e.spatials.map((t=>t.coord[1]))),n=e.max[0],s=e.max[1],a="";o.classes&&(a=` class="${o.classes}"`);let r="";o.id&&(r=` id="${o.id}"`),o.padding&&(l-=o.padding,i-=o.padding,n+=o.padding,s+=o.padding);let d="";"x"!=o.zoom&&(d=` width="${(n-l)*(o.zoom?o.zoom:1)}" height="${(s-i)*(o.zoom?o.zoom:1)}"`);let c=`<svg${a}${r} version="1.1" xmlns="http://www.w3.org/2000/svg"${d} viewBox="${l} ${i} ${n-l} ${s-i}">\n`;return c+=Y(t),c+="\n</svg>",c}return'<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="1" height="1"></svg>'},signPng:t=>{const e=function(t){const e=S(t);if(e.spatials){const t=document.createElement("canvas"),o=t.getContext("2d");let l=T(e.style);l.detailsym&&l.detailsym.forEach((t=>{e.spatials[t.index-1]&&(e.spatials[t.index-1].detail=t.detail)}));let i=Math.min(...e.spatials.map((t=>t.coord[0]))),n=Math.min(...e.spatials.map((t=>t.coord[1]))),s=e.max[0],a=e.max[1];l.padding&&(i-=l.padding,n-=l.padding,s+=l.padding,a+=l.padding);let r=1;"x"!=l.zoom&&(r=l.zoom);let d=(s-i)*r,c=(a-n)*r;t.width=d||1,t.height=c||1,l.background&&(o.rect(0,0,d,c),o.fillStyle=l.background,o.fill());const m=l.detail&&l.detail[0]||"black",g=l.detail&&l.detail[1]||"white";return e.spatials.forEach((t=>{let e=m;t.detail?e=t.detail[0]:l.colorize&&(e=W(t.symbol));let s=g;t.detail&&t.detail[1]&&(s=t.detail[1]),o.font=30*r+"px 'SuttonSignWritingFill'",o.fillStyle=s,o.fillText(O(t.symbol),(t.coord[0]-i)*r,(t.coord[1]-n)*r),o.font=30*r+"px 'SuttonSignWritingLine'",o.fillStyle=e,o.fillText(L(t.symbol),(t.coord[0]-i)*r,(t.coord[1]-n)*r)})),t}}(t),o=e.toDataURL("image/png");return e.remove(),o},signNormalize:t=>{const e=S(t);if(e.spatials){const t=e.spatials.reduce(((t,e)=>{const o=A(e.symbol);return t[e.symbol]={width:o[0],height:o[1]},t}),{}),o=e=>({x1:Math.min(...e.map((t=>t.coord[0]))),y1:Math.min(...e.map((t=>t.coord[1]))),x2:Math.max(...e.map((e=>e.coord[0]+parseInt(t[e.symbol].width)))),y2:Math.max(...e.map((e=>e.coord[1]+parseInt(t[e.symbol].height))))}),l=M,i=e.spatials.filter((t=>{const e=parseInt(t.symbol.slice(1,4),16);return l[0]<=e&&l[1]>=e})),n=C,s=e.spatials.filter((t=>{const e=parseInt(t.symbol.slice(1,4),16);return n[0]<=e&&n[1]>=e}));let a=o(e.spatials),r=[a.x2,a.y2];if(i.length){const t=o(i);a.x1=t.x1,a.x2=t.x2}if(s.length){const t=o(s);a.y1=t.y1,a.y2=t.y2}const d=[parseInt((a.x2+a.x1)/2)-500,parseInt((a.y2+a.y1)/2)-500];return(e.sequence?"A"+e.sequence.join(""):"")+e.box+(r[0]-d[0])+"x"+(r[1]-d[1])+e.spatials.map((t=>t.symbol+(t.coord[0]-d[0])+"x"+(t.coord[1]-d[1]))).join("")+(e.style||"")}},columnSvg:q,columnsSvg:function(t,e){"object"!=typeof e&&(e={});let o=E(t,e);return o.columns.map(((t,e)=>q(t,{...o.options,width:o.widths[e]})))},columnPng:U,columnsPng:function(t,e){"object"!=typeof e&&(e={});let o=E(t,e);return o.columns.map(((t,e)=>U(t,{...o.options,width:o.widths[e]})))}});let G={null:"",symbol:"(?:(?:\ud8c0[\udc01-\udfff])|(?:[\ud8c1-\ud8fc][\udc00-\udfff])|(?:\ud8fd[\udc00-\udc80]))",coord:"(?:\ud836[\udc0c-\uddff]){2}",sort:"𝠀",box:"\ud836[\udc01-\udc04]"};G.nullorsymbol=`(?:${G.null}|${G.symbol})`,G.prefix=`(?:${G.sort}(?:${G.nullorsymbol})+)`,G.spatial=`${G.symbol}${G.coord}`,G.signbox=`${G.box}${G.coord}(?:${G.spatial})*`,G.sign=`${G.prefix}?${G.signbox}`,G.sortable=`${G.prefix}${G.signbox}`;let H={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)",classbase:"-?[_a-zA-Z][_a-zA-Z0-9-]{0,100}",id:"[a-zA-Z][_a-zA-Z0-9-]{0,100}"};H.colorbase=`(?:${H.colorhex}|${H.colorname})`,H.color=`_${H.colorbase}_`,H.colors=`_${H.colorbase}(?:,${H.colorbase})?_`,H.background=`G${H.color}`,H.detail=`D${H.colors}`,H.detailsym=`D[0-9]{2}${H.colors}`,H.classes=`${H.classbase}(?: ${H.classbase})*`,H.full=`-(${H.colorize})?(${H.padding})?(${H.background})?(${H.detail})?(${H.zoom})?(?:-((?:${H.detailsym})*))?(?:-(${H.classes})?!(?:(${H.id})!)?)?`;const J=t=>(new RegExp(`^${H.colorhex}$`).test(t)?"#":"")+t,K=t=>{const e=`^${H.full}`,o=("string"==typeof t?t.match(new RegExp(e)):[])||[];return l={colorize:o[1]?!!o[1]:void 0,padding:o[2]?parseInt(o[2].slice(1)):void 0,background:o[3]?J(o[3].slice(2,-1)):void 0,detail:o[4]?o[4].slice(2,-1).split(",").map(J):void 0,zoom:o[5]?"Zx"===o[5]?"x":parseFloat(o[5].slice(1)):void 0,detailsym:o[6]?o[6].match(new RegExp(H.detailsym,"g")).map((t=>{const e=t.split("_"),o=e[1].split(",").map(J);return{index:parseInt(e[0].slice(1)),detail:o}})):void 0,classes:o[7]?o[7]:void 0,id:o[8]?o[8]:void 0},Object.fromEntries(Object.entries(l).filter((([t,e])=>void 0!==e)));var l},Q=t=>parseInt(t.codePointAt(0))-120844+250,V=t=>[Q(t.slice(0,2)),Q(t.slice(2,4))],tt=t=>t.map((t=>(t=>String.fromCodePoint(120844+parseInt(t)-250))(t))).join(""),et=t=>{const e=`^(${G.symbol})(${G.coord})?(${H.full})?`,o="string"==typeof t?t.match(new RegExp(e)):void 0;return{symbol:o?o[1]:void 0,coord:o&&o[2]?V(o[2]):void 0,style:o?o[3]:void 0}},ot=t=>{const e=`^(${G.prefix})?(${G.signbox})(${H.full})?`,o="string"==typeof t?t.match(new RegExp(e)):void 0;return o?{sequence:o[1]?o[1].slice(2).match(/.{2}/g):void 0,box:o[2].slice(0,2),max:V(o[2].slice(2,6)),spatials:o[2].length<7?void 0:o[2].slice(6).match(/(.{6})/g).map((t=>({symbol:t.slice(0,2),coord:V(t.slice(2))}))),style:o[3]}:{}},lt=t=>{if("string"!=typeof t)return[];const e=`(${G.sign}(${H.full})?|${G.spatial}(${H.full})?)`,o=t.match(new RegExp(e,"g"));return o?[...o]:[]},it=t=>{if("object"==typeof t&&null!==t&&"string"==typeof t.symbol){const e=(t.symbol.match(G.symbol)||[""])[0];if(e){const o=t.coord&&t.coord[0]||"",l=t.coord&&t.coord[1]||"";return e+(o&&l?tt([o,l]):"")+("string"==typeof t.style&&(t.style.match(H.full)||[""])[0]||"")}}},nt=t=>{let e,o,l,i,n,s,a,r,d=ot(t);d.spatials?(i=Math.min(...d.spatials.map((t=>t.coord[0]))),n=d.max[0],e=n-i,s=Math.min(...d.spatials.map((t=>t.coord[1]))),a=d.max[1],o=a-s,l="sign",r=d.box):(d=et(t),r="𝠃",d.coord?(i=d.coord[0],e=2*(500-i),s=d.coord[1],o=2*(500-s),l="symbol"):(i=490,e=20,s=490,o=20,l="none"));let c=K(d.style),m=c.zoom||1,g=c.padding||0;return{minX:i,minY:s,width:e,height:o,segment:l,lane:{"𝠁":0,"𝠂":-1,"𝠃":0,"𝠄":1}[r],padding:g,zoom:m}},st={height:500,width:150,offset:50,pad:20,margin:5,dynamic:!1,background:void 0,punctuation:{spacing:!0,pad:30,pull:!0},style:{detail:["black","white"],zoom:1}},at=(t,e)=>{if("string"!=typeof t)return{};const o=(t=>("object"!=typeof t&&(t={}),{...st,...t,punctuation:{...st.punctuation,...t.punctuation},style:{...st.style,...t.style}}))(e);let l=lt(t),i=0,n=[],s=[],a=0,r=parseInt(o.width/2),d=o.height-o.margin,c=!0,m=!1;for(let t of l){let e=nt(t);i+=a,o.punctuation.spacing?i+="sign"==e.segment?o.pad:0:i+=o.pad,m=i+e.height>d,m&&"symbol"==e.segment&&o.punctuation.pull&&c&&(m=!1,c=!1),0==s.length&&(m=!1),m&&(i=o.pad,n.push(s),s=[],c=!0),s.push(Object.assign(e,{x:r+o.offset*e.lane-(500-e.minX)*e.zoom*o.style.zoom,y:i,text:t})),i+=e.height*e.zoom*o.style.zoom,a=o.punctuation.spacing?"sign"==e.segment?o.pad:o.punctuation.pad:o.pad}if(s.length&&n.push(s),o.punctuation.pull)for(let t of n){let e=t[t.length-1],l=e.y+e.height-(o.height-o.margin);if(l>0){let e=parseInt(l/t.length)+1;for(let o in t)t[o].y-=e*o+e}}let g=[];for(let t of n){let e=[r-o.offset-o.pad],l=[r+o.offset+o.pad];for(let i of t)e.push(i.x-o.pad),l.push(i.x+i.width+o.pad);e=Math.min(...e),l=Math.max(...l);let i=o.width,n=0;o.dynamic?(i=l-e,n=-e):n=r-parseInt((e+l)/2);for(let e of t)e.x+=n;g.push(i)}return{options:o,widths:g,columns:n}},rt=[262145,287201,310433,311201,321761,323489,324257],dt=[311201,321760],ct=[311201,322624],mt=["#0000CC","#CC0000","#FF0099","#006600","#000000","#884411","#FF9900"],gt=t=>{const e=et(t);let o="#000000";if(e.symbol){const t=(t=>parseInt(t.codePointAt(0)))(e.symbol),l=rt.findIndex((e=>e>t));o=mt[l<0?6:l-1]}return o},pt=function(t){if(et(t).symbol)return i(f(t))},ft=function(t){return n(f(t))},yt=function(t){return s(f(t))},ut=function(t){return a(f(t))},bt=t=>{const e=et(t);if(!e.symbol)return"";let o,l,i,n,s=T(e.style);if(e.coord)o=e.coord[0],l=e.coord[1],i=500-o+500,n=500-l+500;else{let t=pt(e.symbol);if(!t)return"";o=500-parseInt((t[0]+1)/2),l=500-parseInt((t[1]+1)/2),i=500-o+500,n=500-l+500}let a,r=ut(e.symbol);r=` <g transform="translate(${o},${l})">\n${r}\n </g>`,s.colorize?a=gt(e.symbol):s.detail&&(a=s.detail[0]),a&&(r=r.replace(/class="sym-line" fill="black"/,`class="sym-line" fill="${a}"`));let d=s.detail&&s.detail[1];d&&(r=r.replace(/class="sym-fill" fill="white"/,`class="sym-fill" fill="${d}"`));let c="";return s.padding&&(o-=s.padding,l-=s.padding,i+=s.padding,n+=s.padding),s.background&&(c=`\n <rect x="${o}" y="${l}" width="${i-o}" height="${n-l}" style="fill:${s.background};" />`),` <text font-size="0">${t}</text>${c}\n${r}`},ht=t=>{let e=ot(t);if(e.spatials){let o=T(e.style);o.detailsym&&o.detailsym.forEach((t=>{e.spatials[t.index-1]&&(e.spatials[t.index-1].detail=t.detail)}));let l=Math.min(...e.spatials.map((t=>t.coord[0]))),i=Math.min(...e.spatials.map((t=>t.coord[1]))),n=e.max[0],s=e.max[1],a="";o.padding&&(l-=o.padding,i-=o.padding,n+=o.padding,s+=o.padding),o.background&&(a=`\n <rect x="${l}" y="${i}" width="${n-l}" height="${s-i}" style="fill:${o.background};" />`);let r=` <text font-size="0">${t}</text>${a}`;const d=o.detail&&o.detail[0],c=o.detail&&o.detail[1];return r+="\n"+e.spatials.map((t=>{let e=ut(t.symbol),l=d;t.detail?l=t.detail[0]:o.colorize&&(l=gt(t.symbol)),l&&(e=e.replace(/class="sym-line" fill="black"/,`class="sym-line" fill="${l}"`));let i=c;return t.detail&&t.detail[1]&&(i=t.detail[1]),i&&(e=e.replace(/class="sym-fill" fill="white"/,`class="sym-fill" fill="${i}"`)),` <g transform="translate(${t.coord[0]},${t.coord[1]})">\n${e}\n </g>`})).join("\n"),r}return""},xt=(t,e)=>{"object"!=typeof e&&(e={});const o=Object.assign(st,e);let l=o.width,i=o.height,n="";o.background&&(n=`\n <rect x="0" y="0" width="${l-0}" height="${i-0}" style="fill:${o.background};" />`);let s=`<svg version="1.1" xmlns="http://www.w3.org/2000/svg"${` width="${o.width}" height="${o.height}"`} viewBox="0 0 ${l-0} ${i-0}">\n <text font-size="0">0</text>${n}`;return s+=t.map((t=>{const e=t.text.indexOf("-");if(e>0){const l=t.text.substring(e),i={...o.style,...T(l)};t.text=t.text.replace(l,B(i))}else t.text+=B(o.style);return t.zoom=t.zoom*o.style.zoom,'<g transform="translate('+t.x+","+t.y+") scale("+t.zoom+") translate("+-t.minX+","+-t.minY+') ">'+("sign"==t.segment?ht(t.text):bt(t.text))+"</g>"})).join("\n"),s+="\n</svg>",s},$t=(t,e)=>{const o=function(t,e){"object"!=typeof e&&(e={});const o=Object.assign(st,e),l=document.createElement("canvas");l.width=o.width,l.height=o.height;const i=l.getContext("2d");return o.background&&(i.rect(0,0,o.width,o.height),i.fillStyle=o.background,i.fill()),t.map((t=>{const e=t.text.indexOf("-");if(e>0){const l=t.text.substring(e),i={...o.style,...T(l)};t.text=t.text.replace(l,B(i))}else t.text+=B(o.style);t.zoom=t.zoom*o.style.zoom;let l={};if("sign"==t.segment)l=ot(t.text);else{let e=et(t.text);l.style=e.style,l.spatials=[e]}let n=T(l.style);n.background&&(i.fillStyle=n.background,i.fillRect(t.x-n.padding*t.zoom,t.y-n.padding*t.zoom,(t.width+2*n.padding)*t.zoom,(t.height+2*n.padding)*t.zoom)),n.detailsym&&n.detailsym.forEach((t=>{l.spatials[t.index-1]&&(l.spatials[t.index-1].detail=t.detail)}));const s=n.detail&&n.detail[0]||"black",a=n.detail&&n.detail[1]||"white";l.spatials.forEach((e=>{let o=s;e.detail?o=e.detail[0]:n.colorize&&(o=gt(e.symbol));let l=a;e.detail&&e.detail[1]&&(l=e.detail[1]),i.font=30*t.zoom+"px 'SuttonSignWritingFill'",i.fillStyle=l,i.fillText(yt(e.symbol),t.x+(e.coord[0]-t.minX)*t.zoom,t.y+(e.coord[1]-t.minY)*t.zoom),i.font=30*t.zoom+"px 'SuttonSignWritingLine'",i.fillStyle=o,i.fillText(ft(e.symbol),t.x+(e.coord[0]-t.minX)*t.zoom,t.y+(e.coord[1]-t.minY)*t.zoom)}))})),l}(t,e),l=o.toDataURL("image/png");return o.remove(),l};var vt=Object.freeze({__proto__:null,symbolSize:pt,symbolLine:ft,symbolFill:yt,symbolText:ut,symbolSvgBody:bt,symbolSvg:t=>{const e=et(t),o='<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="1" height="1"></svg>';if(!e.symbol)return o;let l,i,n,s,a=T(e.style);if(e.coord)l=e.coord[0],i=e.coord[1],n=500-l+500,s=500-i+500;else{let t=pt(e.symbol);if(!t)return o;l=parseInt(500-t[0]/2),i=parseInt(500-t[1]/2),n=l+t[0],s=i+t[1]}let r="";a.classes&&(r=` class="${a.classes}"`);let d="";a.id&&(d=` id="${a.id}"`),a.padding&&(l-=a.padding,i-=a.padding,n+=a.padding,s+=a.padding);let c="";return"x"!=a.zoom&&(c=` width="${(n-l)*(a.zoom?a.zoom:1)}" height="${(s-i)*(a.zoom?a.zoom:1)}"`),`<svg${r}${d} version="1.1" xmlns="http://www.w3.org/2000/svg"${c} viewBox="${l} ${i} ${n-l} ${s-i}">\n${bt(t)}\n</svg>`},symbolPng:t=>{const e=function(t){const e=et(t);if(e.symbol){let t=pt(e.symbol);if(t){const o=document.createElement("canvas"),l=o.getContext("2d");let i=T(e.style),n="black";i.colorize?n=gt(e.symbol):i.detail&&(n=i.detail[0]);let s=i.detail&&i.detail[1]||"white",a=500,r=a+t[0],d=500,c=d+t[1];i.padding&&(a-=i.padding,d-=i.padding,r+=i.padding,c+=i.padding);let m=1;"x"!=i.zoom&&(m=i.zoom);let g=(r-a)*m,p=(c-d)*m;return o.width=g||1,o.height=p||1,i.background&&(l.rect(0,0,g,p),l.fillStyle=i.background,l.fill()),l.font=30*m+"px 'SuttonSignWritingFill'",l.fillStyle=s,l.fillText(yt(e.symbol),(500-a)*m,(500-d)*m),l.font=30*m+"px 'SuttonSignWritingLine'",l.fillStyle=n,l.fillText(ft(e.symbol),(500-a)*m,(500-d)*m),o}}}(t),o=e.toDataURL("image/png");return e.remove(),o},symbolNormalize:t=>{const e=et(t);if(!e.symbol)return null;{let t=pt(e.symbol);if(t)return`${e.symbol}${m([500-parseInt((t[0]+1)/2),500-parseInt((t[1]+1)/2)])}${e.style||""}`}},symbolMirror:t=>{let e=et(t);if(!e.symbol)return t;if(!pt(e.symbol))return t;e.symbol=u(e.symbol);const o=e.symbol.slice(0,4);let l=e.symbol.slice(4,5),i=parseInt(e.symbol.slice(5,6),16);const n=o+"18";var s;pt(b(o+"08"))||pt(b(n))?s=8:(0!==i&&4!=i||(s=0),1!=i&&5!=i||(s=6),2!=i&&6!=i||(s=4),3!=i&&7!=i||(s=2));let a="";for(;!a||!pt(b(a));)i+=s,i>7&&s<8&&(i-=8),i>15&&(i-=16),a=o+l+i.toString(16);return e.symbol=b(a),it(e)},symbolInvert:t=>{let e=et(t);if(!e.symbol)return t;if(!pt(e.symbol))return t;e.symbol=u(e.symbol);const o=e.symbol.slice(0,4);let l=e.symbol.slice(4,5),i=e.symbol.slice(5,6);const n=o+"18";let s;if(s=pt(b(o+"08"))||pt(b(n))?{0:"c",1:"d",2:"e",3:"f",4:"8",5:"9",6:"a",7:"b",c:"0",d:"1",e:"2",f:"3",8:"4",9:"5",a:"6",b:"7"}:{0:"4",1:"3",2:"2",3:"1",4:"0",5:"7",6:"6",7:"5"},i in s){const t=o+l+s[i];pt(b(t))&&(e.symbol=b(t))}return it(e)},symbolRotate:(t,e=!0)=>{let o=et(t);if(!o.symbol)return t;if(!pt(o.symbol))return t;o.symbol=u(o.symbol);const l=e?1:-1,i=o.symbol.slice(0,4);let n=o.symbol.slice(4,5),s=parseInt(o.symbol.slice(5,6),16),a="";for(;!a||!pt(b(a));)s>7?(s+=l,s>15&&(s=8),s<8&&(s=15),a=i+n+s.toString(16)):(s-=l,s>7&&(s=0),s<0&&(s=7),a=i+n+s);return o.symbol=b(a),it(o)},symbolFlop:(t,e=!0)=>{let o=et(t);if(!o.symbol)return t;if(!pt(o.symbol))return t;o.symbol=u(o.symbol);const l=e?1:-1,i=o.symbol.slice(0,4);let n=parseInt(o.symbol.slice(4,5)),s=o.symbol.slice(5,6),a="";for(;!a||!pt(b(a));)n+=l,n>5&&(n=0),n<0&&(n=5),a=i+n+s;return o.symbol=b(a),it(o)},symbolScroll:(t,e=!0)=>{let o=et(t);if(!o.symbol)return t;if(!pt(o.symbol))return t;o.symbol=u(o.symbol);const l=e?1:-1,i=parseInt(o.symbol.slice(1,4),16)+l,n=o.symbol.slice(4,5),s=o.symbol.slice(5,6),a="S"+i.toString(16)+n+s;return 6==a.length&&pt(b(a))&&(o.symbol=a),o.symbol=b(o.symbol),it(o)},signSvgBody:ht,signSvg:t=>{let e=ot(t);if(e.spatials){let o=T(e.style),l=Math.min(...e.spatials.map((t=>t.coord[0]))),i=Math.min(...e.spatials.map((t=>t.coord[1]))),n=e.max[0],s=e.max[1],a="";o.classes&&(a=` class="${o.classes}"`);let r="";o.id&&(r=` id="${o.id}"`),o.padding&&(l-=o.padding,i-=o.padding,n+=o.padding,s+=o.padding);let d="";"x"!=o.zoom&&(d=` width="${(n-l)*(o.zoom?o.zoom:1)}" height="${(s-i)*(o.zoom?o.zoom:1)}"`);let c=`<svg${a}${r} version="1.1" xmlns="http://www.w3.org/2000/svg"${d} viewBox="${l} ${i} ${n-l} ${s-i}">\n`;return c+=ht(t),c+="\n</svg>",c}return'<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="1" height="1"></svg>'},signPng:t=>{const e=function(t){const e=ot(t);if(e.spatials){const t=document.createElement("canvas"),o=t.getContext("2d");let l=T(e.style);l.detailsym&&l.detailsym.forEach((t=>{e.spatials[t.index-1]&&(e.spatials[t.index-1].detail=t.detail)}));let i=Math.min(...e.spatials.map((t=>t.coord[0]))),n=Math.min(...e.spatials.map((t=>t.coord[1]))),s=e.max[0],a=e.max[1];l.padding&&(i-=l.padding,n-=l.padding,s+=l.padding,a+=l.padding);let r=1;"x"!=l.zoom&&(r=l.zoom);let d=(s-i)*r,c=(a-n)*r;t.width=d||1,t.height=c||1,l.background&&(o.rect(0,0,d,c),o.fillStyle=l.background,o.fill());const m=l.detail&&l.detail[0]||"black",g=l.detail&&l.detail[1]||"white";return e.spatials.forEach((t=>{let e=m;t.detail?e=t.detail[0]:l.colorize&&(e=gt(t.symbol));let s=g;t.detail&&t.detail[1]&&(s=t.detail[1]),o.font=30*r+"px 'SuttonSignWritingFill'",o.fillStyle=s,o.fillText(yt(t.symbol),(t.coord[0]-i)*r,(t.coord[1]-n)*r),o.font=30*r+"px 'SuttonSignWritingLine'",o.fillStyle=e,o.fillText(ft(t.symbol),(t.coord[0]-i)*r,(t.coord[1]-n)*r)})),t}}(t),o=e.toDataURL("image/png");return e.remove(),o},signNormalize:t=>{const e=ot(t);if(e.spatials){const t=e.spatials.reduce(((t,e)=>{const o=pt(e.symbol);return t[e.symbol]={width:o[0],height:o[1]},t}),{}),o=e=>({x1:Math.min(...e.map((t=>t.coord[0]))),y1:Math.min(...e.map((t=>t.coord[1]))),x2:Math.max(...e.map((e=>e.coord[0]+parseInt(t[e.symbol].width)))),y2:Math.max(...e.map((e=>e.coord[1]+parseInt(t[e.symbol].height))))}),l=dt,i=e.spatials.filter((t=>{const e=parseInt(t.symbol.slice(1,4),16);return l[0]<=e&&l[1]>=e})),n=ct,s=e.spatials.filter((t=>{const e=parseInt(t.symbol.slice(1,4),16);return n[0]<=e&&n[1]>=e}));let a=o(e.spatials),r=[a.x2,a.y2];if(i.length){const t=o(i);a.x1=t.x1,a.x2=t.x2}if(s.length){const t=o(s);a.y1=t.y1,a.y2=t.y2}const d=[parseInt((a.x2+a.x1)/2)-500,parseInt((a.y2+a.y1)/2)-500];return(e.sequence?"𝠀"+e.sequence.join(""):"")+e.box+m([r[0]-d[0],r[1]-d[1]])+e.spatials.map((t=>t.symbol+m([t.coord[0]-d[0],t.coord[1]-d[1]]))).join("")+(e.style||"")}},columnSvg:xt,columnsSvg:function(t,e){"object"!=typeof e&&(e={});let o=at(t,e);return o.columns.map(((t,e)=>xt(t,{...o.options,width:o.widths[e]})))},columnPng:$t,columnsPng:function(t,e){"object"!=typeof e&&(e={});let o=at(t,e);return o.columns.map(((t,e)=>$t(t,{...o.options,width:o.widths[e]})))}});t.font=c,t.fsw=N,t.swu=vt,Object.defineProperty(t,"__esModule",{value:!0})}));