UNPKG

9.36 kBJavaScriptView Raw
1/* Sutton SignWriting Core Module v1.3.1 (https://github.com/sutton-signwriting/core), author: Steve Slevinski (https://SteveSlevinski.me), license: MIT */
2let e={base:"[123][0-9a-f]{2}",coord:"(?:[0-9]{3}x[0-9]{3})?",var:"V[0-9]+"};e.symbol=`S${e.base}[0-5u][0-9a-fu]`,e.range=`R${e.base}t${e.base}`,e.item=`(?:${e.symbol}|${e.range})`,e.list=`${e.item}(?:o${e.item})*`,e.prefix=`(?:A(?:${e.list})+)?T`,e.signbox=`(?:${e.list}${e.coord})*`,e.full=`Q(${e.prefix})?(${e.signbox})?(${e.var})?(-?)`;let a={symbol:"S[123][0-9a-f]{2}[0-5][0-9a-f]",coord:"[0-9]{3}x[0-9]{3}",sort:"A",box:"[BLMR]"};a.prefix=`(?:${a.sort}(?:${a.symbol})+)`,a.spatial=`${a.symbol}${a.coord}`,a.signbox=`${a.box}${a.coord}(?:${a.spatial})*`,a.sign=`${a.prefix}?${a.signbox}`,a.sortable=`${a.prefix}${a.signbox}`;const s=e=>e.split("x").map((e=>parseInt(e))),r=a=>a.match(new RegExp(`(${e.list}${e.coord})`,"g")).map((e=>{let a,r;return e.includes("x")?(a=s(e.slice(-7)),r=e.slice(0,-7)):r=e,r.includes("o")?{or:r.split("o").map((e=>e.includes("S")?e:e.slice(1).split("t"))),coord:a,coord:a}:r.includes("S")?{symbol:r,coord:a}:{range:r.slice(1).split("t"),coord:a}})),t=a=>{const s="string"==typeof a?a.match(new RegExp(`^${e.full}`)):void 0;return{query:!!s||void 0,prefix:s&&s[1]?(t=s[1],{required:!0,parts:"T"==t?void 0:t.match(new RegExp(`${e.list}`,"g")).map((a=>a.includes("o")?["or"].concat(a.match(new RegExp(`(${e.item})`,"g")).map((e=>"S"==e[0]?e:e.slice(1).split("t")))):"S"==a[0]?a:a.slice(1).split("t")))}):void 0,signbox:s&&s[2]?r(s[2]):void 0,variance:s&&s[3]?parseInt(s[3].slice(1)):void 0,style:!(!s||!s[4])||void 0};var t},i=a=>{if(!a||!a.query)return;let s="Q";return a.prefix&&a.prefix.required&&(Array.isArray(a.prefix.parts)&&(s+="A",s+=a.prefix.parts.map((e=>"string"==typeof e?e:Array.isArray(e)&&2==e.length?`R${e[0]}t${e[1]}`:Array.isArray(e)&&e.length>2&&"or"==e[0]?(e.shift(),e.map((e=>"string"==typeof e?e:Array.isArray(e)&&2==e.length?`R${e[0]}t${e[1]}`:void 0)).join("o")):void 0)).join("")),s+="T"),Array.isArray(a.signbox)&&(s+=a.signbox.map((e=>{let a;return e.or?a=e.or.map((e=>"string"==typeof e?e:Array.isArray(e)&&2==e.length?`R${e[0]}t${e[1]}`:void 0)).join("o"):e.symbol?a=e.symbol:e.range&&Array.isArray(e.range)&&2==e.range.length&&(a=`R${e.range[0]}t${e.range[1]}`),a+(Array.isArray(e.coord)&&2==e.coord.length?e.coord.join("x"):"")})).join("")),s+=a.style?"-":"",s=s.match(new RegExp(`^${e.full}`))[0],s};let o={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}"};o.colorbase=`(?:${o.colorhex}|${o.colorname})`,o.color=`_${o.colorbase}_`,o.colors=`_${o.colorbase}(?:,${o.colorbase})?_`,o.background=`G${o.color}`,o.detail=`D${o.colors}`,o.detailsym=`D[0-9]{2}${o.colors}`,o.classes=`${o.classbase}(?: ${o.classbase})*`,o.full=`-(${o.colorize})?(${o.padding})?(${o.background})?(${o.detail})?(${o.zoom})?(?:-((?:${o.detailsym})*)((?:${o.zoomsym})*))?(?:-(${o.classes})?!(?:(${o.id})!)?)?`;const n=e=>{const r=`^(${a.prefix})?(${a.signbox})(${o.full})?`,t="string"==typeof e?e.match(new RegExp(r)):void 0;return t?{sequence:t[1]?t[1].slice(1).match(/.{6}/g):void 0,box:t[2][0],max:s(t[2].slice(1,8)),spatials:t[2].length<9?void 0:t[2].slice(8).match(/(.{13})/g).map((e=>({symbol:e.slice(0,6),coord:[parseInt(e.slice(6,9)),parseInt(e.slice(10,13))]}))),style:t[3]}:{}},c=(e,a)=>{let s="";const r=n(e);if(r.box){const e=a.indexOf("A")>-1,t=a.indexOf("a")>-1,i=a.indexOf("S")>-1,o=a.indexOf("s")>-1,n=a.indexOf("L")>-1;return(e||t||i||o)&&((e||t)&&r.sequence&&(s+="A",s+=r.sequence.map((e=>e.slice(0,4)+(t?"uu":e.slice(4,6)))).join(""),s+="T"),(i||o)&&r.spatials&&(s+=r.spatials.map((e=>e.symbol.slice(0,4)+(o?"uu":e.symbol.slice(4,6))+(n?e.coord.join("x"):""))).join(""))),s?"Q"+s:void 0}},l=(e,a,s)=>{let r,t,i,o,n,c,l;if(s||(s=""),r="",(e=("000"+e).slice(-3))===(a=""+a))return e;if(t=[],(e[0]!=a[0]||e[1]!=a[1])&&"0"!=e[2])if(r=e[0]+e[1],s){switch(e[2]){case"f":r+="f";break;case"e":r+="[ef]";break;case"d":case"c":case"b":case"a":r+="["+e[2]+"-f]";break;default:switch(e[2]){case"9":r+="[9a-f]";break;case"8":r+="[89a-f]";break;default:r+="["+e[2]+"-9a-f]"}}i=15-parseInt(e[2],16)+1,e=""+(parseInt(e,16)+i).toString(16),t.push(r)}else{switch(e[2]){case"9":r+="9";break;case"8":r+="[89]";break;default:r+="["+e[2]+"-9]"}i=9-e[2]+1,e=""+(1*e+i),t.push(r)}if(r="",e[0]!=a[0]&&"0"!=e[1])if(s){switch(r=e[0],e[1]){case"f":r+="f";break;case"e":r+="[ef]";break;case"d":case"c":case"b":case"a":r+="["+e[1]+"-f]";break;case"9":r+="[9a-f]";break;case"8":r+="[89a-f]";break;default:r+="["+e[1]+"-9a-f]"}r+="[0-9a-f]",i=15-parseInt(e[1],16)+1,e=""+(parseInt(e,16)+16*i).toString(16),t.push(r)}else{switch(r=e[0],i=9-e[1]+1,e[1]){case"9":r+="9";break;case"8":r+="[89]";break;default:r+="["+e[1]+"-9]"}r+="[0-9]",i=9-e[1]+1,e=""+(1*e+10*i),t.push(r)}if(r="",e[0]!=a[0])if(s){switch(i=parseInt(a[0],16)-parseInt(e[0],16),o=(parseInt(e[0],16)+i-1).toString(16),i){case 1:r=e[0];break;case 2:r="["+e[0]+o+"]";break;default:switch(c=parseInt(e[0],16)>9?"h":"d",l=parseInt(o,16)>9?"h":"d",c+l){case"dd":case"hh":r+="["+e[0]+"-"+o+"]";break;case"dh":switch(i=9-e[0],i){case 0:r+="[9";break;case 1:r+="[89";break;default:r+="["+e[0]+"-9"}switch(o[0]){case"a":r+="a]";break;case"b":r+="ab]";break;default:r+="a-"+o+"]"}}}r+="[0-9a-f][0-9a-f]",i=parseInt(a[0],16)-parseInt(e[0],16),e=""+(parseInt(e,16)+256*i).toString(16),t.push(r)}else{switch(i=a[0]-e[0],o=1*e[0]+i-1,i){case 1:r=e[0];break;case 2:r="["+e[0]+o+"]";break;default:r="["+e[0]+"-"+o+"]"}r+="[0-9][0-9]",e=""+(1*e+100*i),t.push(r)}if(r="",e[1]!=a[1])if(s){switch(i=parseInt(a[1],16)-parseInt(e[1],16),o=(parseInt(e[1],16)+i-1).toString(16),r=e[0],i){case 1:r+=e[1];break;case 2:r+="["+e[1]+o+"]";break;default:switch(c=parseInt(e[1],16)>9?"h":"d",l=parseInt(o,16)>9?"h":"d",c+l){case"dd":r+="["+e[1],i>1&&(r+="-"),r+=o+"]";break;case"dh":switch(i=9-e[1],i){case 0:r+="[9";break;case 1:r+="[89";break;default:r+="["+e[1]+"-9"}switch(a[1]){case"a":r+="]";break;case"b":r+="a]";break;default:r+="a-"+(parseInt(a[1],16)-1).toString(16)+"]"}break;case"hh":r+="["+e[1],i>1&&(r+="-"),r+=(parseInt(a[1],16)-1).toString(16)+"]"}}r+="[0-9a-f]",i=parseInt(a[1],16)-parseInt(e[1],16),e=""+(parseInt(e,16)+16*i).toString(16),t.push(r)}else{switch(i=a[1]-e[1],o=1*e[1]+i-1,r=e[0],i){case 1:r+=e[1];break;case 2:r+="["+e[1]+o+"]";break;default:r+="["+e[1]+"-"+o+"]"}r+="[0-9]",e=""+(1*e+10*i),t.push(r)}if(r="",e[2]!=a[2])if(s){switch(r=e[0]+e[1],i=parseInt(a[2],16)-parseInt(e[2],16),c=parseInt(e[2],16)>9?"h":"d",l=parseInt(a[2],16)>9?"h":"d",c+l){case"dd":case"hh":r+="["+e[2],i>1&&(r+="-"),r+=a[2]+"]";break;case"dh":switch(i=9-e[2],i){case 0:r+="[9";break;case 1:r+="[89";break;default:r+="["+e[2]+"-9"}switch(a[2]){case"a":r+="a]";break;case"b":r+="ab]";break;default:r+="a-"+a[2]+"]"}}i=parseInt(a[2],16)-parseInt(e[2],16),e=""+(parseInt(e,16)+i).toString(16),t.push(r)}else{switch(i=a[2]-e[2],r=e[0]+e[1],i){case 0:r+=e[2];break;case 1:r+="["+e[2]+a[2]+"]";break;default:r+="["+e[2]+"-"+a[2]+"]"}e=""+(1*e+i),t.push(r)}return r="","0"==e[2]&&"0"==a[2]&&(r=a,t.push(r)),r="",n=t.length,1==n?r=t[0]:(r=t.join(")|("),r="(("+r+"))"),r},p=e=>{let a=e.slice(0,4),s=e.slice(4,5);a+="u"==s?"[0-5]":s;let r=e.slice(5,6);return a+="u"==r?"[0-9a-f]":r,a},f=e=>{let a=e.slice(1,4),s=e.slice(5,8);return"S"+l(a,s,"hex")+"[0-5][0-9a-f]"},b=r=>{if(!(r=r.match(new RegExp(`^${e.full}`))[0]))return"";var t,i,n,c,b,d,g,h,u,x,m,$=20,y="("+o.full+")?";if("Q"==r)return[a.prefix+"?"+a.signbox];if("Q-"==r)return[a.prefix+"?"+a.signbox+y];if("QT"==r)return[a.prefix+a.signbox];if("QT-"==r)return[a.prefix+a.signbox+y];var k=[],w=r.indexOf("T")+1;if(w){m="(A";var I=r.slice(0,w);if(r=r.replace(I,""),"QT"==I)m+="("+a.symbol+")+)";else if(t=I.match(new RegExp("("+e.list+")","g"))){for(b=0;b<t.length;b+=1)if(c=[],i=t[b].match(new RegExp("("+e.symbol+"|"+e.range+")","g"))){for(d=0;d<i.length;d+=1)(n=i[d].match(new RegExp(e.symbol)))?c.push(p(n[0])):c.push(f(i[d]));1==c.length?m+=c[0]:m+="("+c.join("|")+")"}m+="("+a.symbol+")*)"}}if((t=r.match(new RegExp(e.var,"g")))&&($=1*t.toString().slice(1)),t=r.match(new RegExp(e.list+e.coord,"g")))for(b=0;b<t.length;b+=1){if(c=[],i=t[b].match(new RegExp("("+e.symbol+"|"+e.range+")","g"))){for(d=0;d<i.length;d+=1)(n=i[d].match(new RegExp(e.symbol)))?c.push(p(n[0])):c.push(f(i[d]));g=1==c.length?c[0]:"("+c.join("|")+")"}t[b].includes("x")?(u=(h=s(t[b].slice(-7)))[0],x=h[1],g+=l(u-$,u+$),g+="x",g+=l(x-$,x+$)):g+=a.coord,g=a.signbox+g+"("+a.symbol+a.coord+")*",g=w?m+g:a.prefix+"?"+g,r.indexOf("-")>0&&(g+=y),k.push(g)}return k.length||(r.indexOf("-")>0&&(g+=y),k.push(m+a.signbox)),k},d=(e,a)=>{if(!a)return[];let s,r,t,i,o,n=b(e);if(!n)return[];for(o=0;o<n.length;o+=1)s=n[o],r=a.match(new RegExp(s,"g")),a=r?r.join(" "):"";return a?(t=a.split(" "),i=t.filter((function(e){return!(e in t)&&(t[e]=!0)}),{})):i=[],i},g=(e,a)=>{if(!a)return[];let s,r,t,i,o,n=b(e);if(!n)return[];for(o=0;o<n.length;o+=1)s=n[o],s="^"+s+".*",r=a.match(new RegExp(s,"mg")),a=r?r.join("\n"):"";return a?(t=a.split("\n"),i=t.filter((function(e){return!(e in t)&&(t[e]=!0)}),{})):i=[],i};export{i as compose,c as fsw2query,g as lines,t as parse,l as range,e as re,b as regex,d as results};