UNPKG

@bbob/parser

Version:

A BBCode to AST Parser part of @bbob

2 lines (1 loc) 8.99 kB
!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).BbobParser={})}(this,function(t){"use strict";let e="[",r="]";function s(t){return"object"==typeof t&&null!==t&&"tag"in t}function n(t,e,r){return Object.keys(t).reduce((r,s)=>e(r,s,t),r)}function i(t){return t.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;").replace(/(javascript|data|vbscript):/gi,"$1%3A")}function a(t,e){switch(typeof e){case"boolean":return e?""+t:"";case"number":return`${t}="${e}"`;case"string":return`${t}="${i(e)}"`;case"object":return`${t}="${i(JSON.stringify(e))}"`;default:return""}}function o(t){return null==t?"":n(t,(t,e,r)=>[...t,a(e,r[e])],[""]).join(" ")}let u=(t,e)=>{let r=n(e||{},(t,e,r)=>r[e]===e?r[e]:null,null);if(r){let s=a(t,r),n={...e};delete n[r+""];let i=o(n);return`${s}${i}`}return`${t}${o(e)}`},l=(t,e,r)=>{let n=t=>s(t)?t.toString({openTag:e,closeTag:r}):t+"";return Array.isArray(t)?t.reduce((t,e)=>null!==e?t+n(e):t,""):t?n(t):null};class h{attr(t,e){return void 0!==e&&(this.attrs[t]=e),this.attrs[t]}append(t){Array.isArray(this.content)&&this.content.push(t)}setStart(t){this.start=t}setEnd(t){this.end=t}get length(){return function t(e){return s(e)&&Array.isArray(e.content)?e.content.reduce((e,r)=>e+t(r),0):"string"==typeof e?(e+"").length:0}(this)}toTagStart({openTag:t=e,closeTag:s=r}={}){let n=u(this.tag+"",this.attrs);return`${t}${n}${s}`}toTagEnd({openTag:t=e,closeTag:s=r}={}){return`${t}/${this.tag}${s}`}toTagNode(){let t=new h((this.tag+"").toLowerCase(),this.attrs,this.content);return this.start&&t.setStart(this.start),this.end&&t.setEnd(this.end),t}toString({openTag:t=e,closeTag:s=r}={}){let n=this.content?l(this.content,t,s):"",i=this.toTagStart({openTag:t,closeTag:s});return null===this.content||Array.isArray(this.content)&&0===this.content.length?i:`${i}${n}${this.toTagEnd({openTag:t,closeTag:s})}`}static create(t,e={},r=null,s){let n=new h(t,e,r);return s&&n.setStart(s),n}static isOf(t,e){return t.tag===e}constructor(t,e,r){this.tag=t,this.attrs=e,this.content=r}}let g=t=>t&&void 0!==t.v?t.v:"",c=t=>t&&t.l||0,f=t=>t&&t.r||0,p=t=>t&&t.s||0,d=t=>t&&t.e||0,T=t=>!!t&&void 0!==t.t&&(5===t.t||6===t.t||1===t.t),b=t=>!!t&&void 0!==t.t&&2===t.t,y=t=>47===g(t).charCodeAt(0),A=t=>!y(t),x=t=>!!t&&void 0!==t.t&&3===t.t,k=t=>!!t&&void 0!==t.t&&4===t.t,C=t=>{let e=g(t);return y(t)?e.slice(1):e},N=(t,s=e,n=r)=>s+(g(t)+n);class S{get type(){return this.t}isEmpty(){return 0===this.t||isNaN(this.t)}isText(){return T(this)}isTag(){return b(this)}isAttrName(){return x(this)}isAttrValue(){return k(this)}isStart(){return A(this)}isEnd(){return y(this)}getName(){return C(this)}getValue(){return g(this)}getLine(){return c(this)}getColumn(){return f(this)}getStart(){return p(this)}getEnd(){return d(this)}toString({openTag:t=e,closeTag:s=r}={}){return N(this,t,s)}constructor(t,e,r=0,s=0,n=0,i=0){this.l=r,this.r=s,this.t=t||0,this.v=e+"",this.s=n,this.e=i}}class ${skip(t=1,e){this.c.pos+=t,this.o&&this.o.onSkip&&!e&&this.o.onSkip()}hasNext(){return this.c.len>this.c.pos}getCurr(){return void 0===this.s[this.c.pos]?"":this.s[this.c.pos]}getPos(){return this.c.pos}getLength(){return this.c.len}getRest(){return this.s.substring(this.c.pos)}getNext(){let t=this.c.pos+1;return t<=this.s.length-1?this.s[t]:null}getPrev(){let t=this.c.pos-1;return void 0===this.s[t]?null:this.s[t]}isLast(){return this.c.pos===this.c.len}includes(t){return this.s.indexOf(t,this.c.pos)>=0}grabWhile(t,e){let r=0;if(this.hasNext())for(r=this.c.pos;this.hasNext()&&t(this.getCurr());)this.skip(1,e);return this.s.substring(r,this.c.pos)}grabN(t=0){return this.s.substring(this.c.pos,this.c.pos+t)}substrUntilChar(t){let{pos:e}=this.c,r=this.s.indexOf(t,e);return r>=0?this.s.substring(e,r):""}constructor(t,e={}){this.s=t,this.c={pos:0,len:t.length},this.o=e}}let v=(t,e)=>new $(t,e),w=(t,e)=>{for(;t.charAt(0)===e;)t=t.substring(1);for(;t.charAt(t.length-1)===e;)t=t.substring(0,t.length-1);return t},L=t=>t.replace('\\"','"');function m(t,e,r=0,s=0,n=0,i=0){return new S(t,e,r,s,n,i)}let E=[" "," "],O=["="," "," "],P=t=>E.indexOf(t)>=0,W=t=>"\\"===t,V=t=>O.indexOf(t)>=0,j=t=>"\n"===t,F=t=>L(w(t,'"'));function z(t,s={}){let n=0,i=0,a=0,o=-1,u=0,l=0,h="",g=Array(Math.floor(t.length)),c=s.openTag||e,f=s.closeTag||r,p=!!s.enableEscapeTags,d=(s.contextFreeTags||[]).filter(Boolean).map(t=>t.toLowerCase()),T=s.caseFreeTags||!1,b=new Map,y=s.onToken||(()=>{}),A=[f,c,'"',"\\"," "," ","=","\n","!"],x=[c," "," ","\n"],k=t=>A.indexOf(t)>=0,C=t=>-1===x.indexOf(t),N=t=>t===c||t===f||"\\"===t,S=()=>{a++},$=(t,e)=>{""!==h&&e&&(h=""),""===h&&d.includes(t.toLowerCase())&&(h=t)},w=v(t,{onSkip:S});function L(t,e,r,s){let u=m(t,e,n,i,r,s);y(u),i=a,g[o+=1]=u}return{tokenize:function(){for(u=0;w.hasNext();)switch(u){case 1:u=function(){let t=w.getCurr(),e=w.getNext();w.skip();let r=w.substrUntilChar(f),s=0===r.length||r.indexOf(c)>=0;if(e&&k(e)||s||w.isLast())return L(1,t),0;let n=-1===r.indexOf("="),i="/"===r[0];if(n||i){let t=w.getPos()-1,e=w.grabWhile(t=>t!==f),r=t+e.length+2;return w.skip(),L(2,e,t,r),$(e,i),0}return 2}();break;case 2:u=function(){let t=w.getPos(),e=v(w.grabWhile(t=>t!==f,!0),{onSkip:S}),r=e.includes(" ");for(l=0;e.hasNext();)l=function(t,e,r){if(1===l){let e=t.grabWhile(t=>!("="===t||P(t))),r=t.isLast(),s="="!==t.getCurr();return(t.skip(),r||s?L(4,F(e)):L(3,e),r)?0:s?1:2}if(2===l){let r=!1,s=t.grabWhile(s=>{let n='"'===s,i=t.getPrev(),a=t.getNext(),o="="===a,u=P(s),l=a&&P(a);return!!(r&&V(s))||(!n||"\\"===i||!!(r=!r)||!!o||!!l)&&(!!e||!u)});return(t.skip(),L(4,F(s)),'"'===t.getPrev()&&i++,t.isLast())?0:1}let s=r+t.getPos()-1,n=t.grabWhile(e=>!("="===e||P(e)||t.isLast()));return(L(2,n,s,r+t.getLength()+1),$(n),t.skip(),i++,e)?2:t.includes("=")?1:2}(e,!r,t);return w.skip(),0}();break;default:u=function(){if(j(w.getCurr()))return L(6,w.getCurr()),w.skip(),a=0,i=0,n++,0;if(P(w.getCurr()))return L(5,w.grabWhile(P)),0;if(w.getCurr()===c){if(h){let t=c.length+1+h.length,e=`${c}/${h}`;if(w.grabN(t)===e)return 1}else if(w.includes(f))return 1;return L(1,w.getCurr()),w.skip(),i++,0}if(p){if(W(w.getCurr())){let t=w.getCurr(),e=w.getNext();return(w.skip(),e&&N(e))?(w.skip(),L(1,e)):L(1,t),0}return L(1,w.grabWhile(t=>C(t)&&!W(t))),0}return L(1,w.grabWhile(C)),0}()}return g.length=o+1,g},isTokenNested:function(e){let r=c+"/"+e;if(b.has(r))return!!b.get(r);{let e=T?t.toLowerCase().indexOf(r.toLowerCase())>-1:t.indexOf(r)>-1;return b.set(r,e),e}}}}class B{last(){return Array.isArray(this.n)&&this.n.length>0&&void 0!==this.n[this.n.length-1]?this.n[this.n.length-1]:null}flush(){return!!this.n.length&&this.n.pop()}push(t){this.n.push(t)}toArray(){return this.n}constructor(){this.n=[]}}let M=()=>new B;function U(t,n={}){let i=n.openTag||e,a=n.closeTag||r,o=(n.onlyAllowTags||[]).filter(Boolean).map(t=>t.toLowerCase()),u=n.caseFreeTags||!1,l=null,g=M(),c=M(),f=M(),p=M(),d=new Set;function T(t){return!!d.has(u?t.toLowerCase():t)}function b(){f.flush()&&p.flush()}function y(){let t=c.last();return t&&s(t)?t.content:g.toArray()}function A(t,e,r=!0){Array.isArray(t)&&void 0!==e&&(t.push(e.toTagStart({openTag:i,closeTag:a})),Array.isArray(e.content)&&e.content.length&&(e.content.forEach(e=>{t.push(e)}),r&&t.push(e.toTagEnd({openTag:i,closeTag:a}))))}function x(t,e){if(Array.isArray(t)&&void 0!==e){if(s(e)){var r;(r=e.tag,!o.length||o.indexOf(r.toLowerCase())>=0)?t.push(e.toTagNode()):A(t,e)}else t.push(e)}}(l=(n.createTokenizer?n.createTokenizer:z)(t,{onToken:function(t){t.isTag()?(t.isStart()&&function(t){b();let e=h.create(t.getValue(),{},[],{from:t.getStart(),to:t.getEnd()}),r=function(t){let e=t.getValue(),r=u?e.toLowerCase():e,{isTokenNested:s}=l||{};return!d.has(r)&&s&&s(r)?(d.add(r),!0):d.has(r)}(t);f.push(e),r?c.push(e):x(y(),e)}(t),t.isEnd()&&function(t){let e=t.getValue().slice(1),r=c.flush();if(b(),r){let e=y();s(r)&&r.setEnd({from:t.getStart(),to:t.getEnd()}),x(e,r)}else if(T(e)){if("function"==typeof n.onError){let e=t.getValue(),r=t.getLine(),s=t.getColumn();n.onError({tagName:e,lineNumber:r,columnNumber:s})}}else x(y(),t.toString({openTag:i,closeTag:a}))}(t)):!function(t){let e=f.last(),r=t.getValue(),s=T(t.toString()),n=y();if(null!==e){if(t.isAttrName()){p.push(r);let t=p.last();t&&e.attr(t,"")}else if(t.isAttrValue()){let t=p.last();t?(e.attr(t,r),p.flush()):e.attr(r,r)}else t.isText()?s?e.append(r):x(n,r):t.isTag()&&x(n,t.toString({openTag:i,closeTag:a}))}else t.isText()?x(n,r):t.isTag()&&x(n,t.toString({openTag:i,closeTag:a}))}(t)},openTag:i,closeTag:a,onlyAllowTags:n.onlyAllowTags,contextFreeTags:n.contextFreeTags,caseFreeTags:n.caseFreeTags,enableEscapeTags:n.enableEscapeTags})).tokenize();let k=c.flush();return null!==k&&k&&s(k)&&T(k.tag)&&A(y(),k,!1),g.toArray()}t.TagNode=h,t.createLexer=z,t.createTokenOfType=m,t.default=U,t.parse=U,Object.defineProperty(t,"__esModule",{value:!0})});