From 38447df39603e590348c1c7ee7b58b837c698765 Mon Sep 17 00:00:00 2001 From: Alteras1 <42795314+Alteras1@users.noreply.github.com> Date: Fri, 17 Jan 2025 08:35:22 -0800 Subject: [PATCH] Fix Cannot use mismatching cases for start and end tag #135 --- assets/bundled/bbcode-parser.min.js | 2 +- assets/bundled/bbcode-parser.min.js.map | 2 +- bbcode-src/index.js | 1 + package.json | 14 +- public/javascripts/bbscript-parser.min.js.map | 2 +- yarn.lock | 269 ++++++++++-------- 6 files changed, 168 insertions(+), 122 deletions(-) diff --git a/assets/bundled/bbcode-parser.min.js b/assets/bundled/bbcode-parser.min.js index a2ef22f..4b2b347 100644 --- a/assets/bundled/bbcode-parser.min.js +++ b/assets/bundled/bbcode-parser.min.js @@ -1,3 +1,3 @@ /* Source code in bbcode-src */ -!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).bbcodeParser={})}(this,(function(t){"use strict";const e="\n",n="\t",s="=",r='"',o=" ",a="[",i="]",c="/",l="\\";function u(t){return"object"==typeof t&&null!==t&&"tag"in t}function d(t){return"string"==typeof t}function g(t,e,n){return Object.keys(t).reduce(((n,s)=>e(n,s,t)),n)}function h(t){return u(t)&&Array.isArray(t.content)?t.content.reduce(((t,e)=>t+h(e)),0):d(t)?String(t).length:0}function p(t){return t.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'").replace(/(javascript|data|vbscript):/gi,"$1%3A")}function f(t,e){switch(typeof e){case"boolean":return e?`${t}`:"";case"number":return`${t}="${e}"`;case"string":return`${t}="${p(e)}"`;case"object":return`${t}="${p(JSON.stringify(e))}"`;default:return""}}function b(t){return null==t?"":g(t,((t,e,n)=>[...t,f(e,n[e])]),[""]).join(" ")}const m=(t,e)=>{const n=g(e||{},((t,e,n)=>n[e]===e?n[e]:null),null);if(n){const s=f(t,n),r={...e};delete r[String(n)];return`${s}${b(r)}`}return`${t}${b(e)}`};class y{attr(t,e){return void 0!==e&&(this.attrs[t]=e),this.attrs[t]}append(t){return function(t,e){Array.isArray(t.content)&&t.content.push(e)}(this,t)}setStart(t){this.start=t}setEnd(t){this.end=t}get length(){return h(this)}toTagStart({openTag:t=a,closeTag:e=i}={}){return`${t}${m(String(this.tag),this.attrs)}${e}`}toTagEnd({openTag:t=a,closeTag:e=i}={}){return`${t}${c}${this.tag}${e}`}toTagNode(){const t=new y(String(this.tag).toLowerCase(),this.attrs,this.content);return this.start&&t.setStart(this.start),this.end&&t.setEnd(this.end),t}toString({openTag:t=a,closeTag:e=i}={}){const n=this.content?((t,e,n)=>{const s=t=>u(t)?t.toString({openTag:e,closeTag:n}):String(t);return Array.isArray(t)?t.reduce(((t,e)=>null!==e?t+s(e):t),""):t?s(t):null})(this.content,t,e):"",s=this.toTagStart({openTag:t,closeTag:e});return null===this.content||Array.isArray(this.content)&&0===this.content.length?s:`${s}${n}${this.toTagEnd({openTag:t,closeTag:e})}`}static create(t,e={},n=null,s){const r=new y(t,e,n);return s&&r.setStart(s),r}static isOf(t,e){return t.tag===e}constructor(t,e,n){this.tag=t,this.attrs=e,this.content=n}}const w="t",v=t=>t&&void 0!==t.v?t.v:"",x=t=>v(t).charCodeAt(0)===c.charCodeAt(0);class ${get type(){return this[w]}isEmpty(){return 0===this[w]||isNaN(this[w])}isText(){return!(!(t=this)||void 0===t[w]||5!==t[w]&&6!==t[w]&&1!==t[w]);var t}isTag(){return!(!(t=this)||void 0===t[w])&&2===t[w];var t}isAttrName(){return!(!(t=this)||void 0===t[w])&&3===t[w];var t}isAttrValue(){return!(!(t=this)||void 0===t[w])&&4===t[w];var t}isStart(){return!x(this)}isEnd(){return x(this)}getName(){return(t=>{const e=v(t);return x(t)?e.slice(1):e})(this)}getValue(){return v(this)}getLine(){return(t=this)&&t.l||0;var t}getColumn(){return(t=this)&&t.r||0;var t}getStart(){return(t=this)&&t.s||0;var t}getEnd(){return(t=this)&&t.e||0;var t}toString(){return(t=>{let e=a;return e+=v(t),e+=i,e})(this)}constructor(t,e,n=0,s=0,r=0,o=0){this.l=n,this.r=s,this[w]=t||0,this.v=String(e),this.s=r,this.e=o}}const k=1,T=2,A=3,S=4,_=5,C=6;class j{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(){const t=this.c.pos+1;return t<=this.s.length-1?this.s[t]:null}getPrev(){const 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 n=0;if(this.hasNext())for(n=this.c.pos;this.hasNext()&&t(this.getCurr());)this.skip(1,e);return this.s.substring(n,this.c.pos)}grabN(t=0){return this.s.substring(this.c.pos,this.c.pos+t)}substrUntilChar(t){const{pos:e}=this.c,n=this.s.indexOf(t,e);return n>=0?this.s.substring(e,n):""}constructor(t,e={}){this.s=t,this.c={pos:0,len:t.length},this.o=e}}const L=(t,e)=>new j(t,e),N="!";const O=0,E=1,W=2,I=0,U=1,V=2,D=[o,n],G=[s,o,n],q=2,z=t=>D.indexOf(t)>=0,P=t=>t===l,M=t=>G.indexOf(t)>=0,B=t=>t===e,R=t=>((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})(t,r).replace(l+r,r);function F(t,u={}){let d=0,g=0,h=0,p=-1,f=O,b=I,m="";const y=new Array(Math.floor(t.length)),w=u.openTag||a,v=u.closeTag||i,x=!!u.enableEscapeTags,j=(u.contextFreeTags||[]).filter(Boolean).map((t=>t.toLowerCase())),D=new Map,G=u.onToken||(()=>{}),F=[v,w,r,l,o,n,s,e,N],J=[w,o,n,e],Z=t=>F.indexOf(t)>=0,H=t=>-1===J.indexOf(t),K=t=>t===w||t===v||t===l,Q=()=>{h++},X=(t,e)=>{""!==m&&e&&(m=""),""===m&&j.includes(t.toLowerCase())&&(m=t)},Y=L(t,{onSkip:Q});function tt(t,e,n,s){const r=function(t,e,n=0,s=0,r=0,o=0){return new $(t,e,n,s,r,o)}(t,e,d,g,n,s);G(r),g=h,p+=1,y[p]=r}function et(t,e,n){if(b===U){const e=t=>!(t===s||z(t)),n=t.grabWhile(e),r=t.isLast(),o=t.getCurr()!==s;return t.skip(),r||o?tt(S,R(n)):tt(A,n),r?I:o?U:V}if(b===V){let n=!1;const o=o=>{const a=o===r,i=t.getPrev(),c=t.getNext(),u=i===l,d=c===s,g=z(o),h=c&&z(c);return!(!n||!M(o))||!!(!a||u||(n=!n,n||d||h))&&(!!e||!g)},a=t.grabWhile(o);return t.skip(),tt(S,R(a)),t.getPrev()===r&&g++,t.isLast()?I:U}const o=n+t.getPos()-1,a=t.grabWhile((e=>!(e===s||z(e)||t.isLast())));if(tt(T,a,o,n+t.getLength()+1),X(a),t.skip(),g++,e)return V;return t.includes(s)?U:V}function nt(){const t=Y.getCurr(),e=Y.getNext();Y.skip();const n=Y.substrUntilChar(v),r=0===n.length||n.indexOf(w)>=0;if(e&&Z(e)||r||Y.isLast())return tt(k,t),O;const o=-1===n.indexOf(s),a=n[0]===c;if(o||a){const t=Y.getPos()-1,e=Y.grabWhile((t=>t!==v)),n=t+e.length+q;return Y.skip(),tt(T,e,t,n),X(e,a),O}return W}function st(){const t=Y.getPos(),e=Y.grabWhile((t=>t!==v),!0),n=L(e,{onSkip:Q}),s=n.includes(o);for(b=I;n.hasNext();)b=et(n,!s,t);return Y.skip(),O}function rt(){if(B(Y.getCurr()))return tt(C,Y.getCurr()),Y.skip(),h=0,g=0,d++,O;if(z(Y.getCurr())){const t=Y.grabWhile(z);return tt(_,t),O}if(Y.getCurr()===w){if(m){const t=w.length+c.length+m.length,e=`${w}${c}${m}`;if(Y.grabN(t)===e)return E}else if(Y.includes(v))return E;return tt(k,Y.getCurr()),Y.skip(),g++,O}if(x){if(P(Y.getCurr())){const t=Y.getCurr(),e=Y.getNext();return Y.skip(),e&&K(e)?(Y.skip(),tt(k,e),O):(tt(k,t),O)}const t=t=>H(t)&&!P(t),e=Y.grabWhile(t);return tt(k,e),O}const t=Y.grabWhile(H);return tt(k,t),O}return{tokenize:function(){for(f=O;Y.hasNext();)switch(f){case E:f=nt();break;case W:f=st();break;default:f=rt()}return y.length=p+1,y},isTokenNested:function(e){const n=w+c+e.getValue();if(D.has(n))return!!D.get(n);{const e=t.indexOf(n)>-1;return D.set(n,e),e}}}}class J{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=[]}}const Z=()=>new J;function H(t,e={}){const n=e,s=n.openTag||a,r=n.closeTag||i,o=(n.onlyAllowTags||[]).filter(Boolean).map((t=>t.toLowerCase()));let c=null;const l=Z(),d=Z(),g=Z(),h=Z(),p=new Set;function f(t){return Boolean(p.has(t))}function b(){g.flush()&&h.flush()}function m(){const t=d.last();return t&&u(t)?t.content:l.toArray()}function w(t,e,n=!0){Array.isArray(t)&&void 0!==e&&(t.push(e.toTagStart({openTag:s,closeTag:r})),Array.isArray(e.content)&&e.content.length&&(e.content.forEach((e=>{t.push(e)})),n&&t.push(e.toTagEnd({openTag:s,closeTag:r}))))}function v(t,e){var n;Array.isArray(t)&&void 0!==e&&(u(e)?(n=e.tag,!o.length||o.indexOf(n.toLowerCase())>=0?t.push(e.toTagNode()):w(t,e)):t.push(e))}function x(t){b();const e=y.create(t.getValue(),{},[],{from:t.getStart(),to:t.getEnd()}),n=function(t){const e=t.getValue(),{isTokenNested:n}=c||{};return!p.has(e)&&n&&n(t)?(p.add(e),!0):p.has(e)}(t);if(g.push(e),n)d.push(e);else{v(m(),e)}}function $(t){t.isStart()&&x(t),t.isEnd()&&function(t){const e=d.last();u(e)&&e.setEnd({from:t.getStart(),to:t.getEnd()}),b();const s=d.flush();if(s)v(m(),s);else if("function"==typeof n.onError){const e=t.getValue(),s=t.getLine(),r=t.getColumn();n.onError({tagName:e,lineNumber:s,columnNumber:r})}}(t)}const k=e.createTokenizer?e.createTokenizer:F;c=k(t,{onToken:function(t){t.isTag()?$(t):function(t){const e=g.last(),n=t.getValue(),s=f(t.toString()),r=m();if(null!==e)if(t.isAttrName()){h.push(n);const t=h.last();t&&e.attr(t,"")}else if(t.isAttrValue()){const t=h.last();t?(e.attr(t,n),h.flush()):e.attr(n,n)}else t.isText()?s?e.append(n):v(r,n):t.isTag()&&v(r,t.toString());else t.isText()?v(r,n):t.isTag()&&v(r,t.toString())}(t)},openTag:s,closeTag:r,onlyAllowTags:n.onlyAllowTags,contextFreeTags:n.contextFreeTags,enableEscapeTags:n.enableEscapeTags}),c.tokenize();const T=d.flush();return null!==T&&T&&u(T)&&f(T.tag)&&w(m(),T,!1),l.toArray()}const K=t=>"object"==typeof t&&null!==t,Q=t=>"boolean"==typeof t;function X(t,e){const n=t;if(Array.isArray(n))for(let t=0;t[].some.call(e,(e=>Y(t,e))))):!(!K(t)||!K(e))&&Object.keys(t).every((n=>{const s=e[n],r=t[n];return K(r)&&K(s)?Y(r,s):Q(r)?r!==(null===s):s===r})):t===e)}function tt(t,e){const n=t;return n.messages=[...n.messages||[]],n.options={...e,...n.options},n.walk=function(t){return X(this,t)},n.match=function(t,e){return function(t,e,n){return Array.isArray(e)?X(t,(t=>{for(let s=0;sY(e,t)?n(t):t))}(this,t,e)},n}const et="/>",nt="";function ot(t,e){const{stripTags:n=!1}=e||{};if(null==t)return"";if("string"==typeof t||"number"==typeof t)return String(t);if(Array.isArray(t))return at(t,e);if(u(t)){if(n)return at(t.content,e);const s=b(t.attrs);return null===t.content?st+t.tag+s+et:st+t.tag+s+rt+at(t.content,e)+nt+t.tag+rt}return""}function at(t,e){return t&&Array.isArray(t)?t.reduce(((t,n)=>t+ot(n,e)),""):t?ot(t,e):""}const it=(t,e,n=[])=>({tag:t,attrs:e,content:n,gen:!0}),ct=(t,e)=>{const n=Object.keys(t.attrs).join(" "),s=Object.values(t.attrs).join(" ");if(n!==s)return t.attrs;if(!e||!t.start)return{_default:s};const r=e.substring(t.start.from,t.start.to);if(!r.includes("="))return t.attrs;const o=r.split("=");if(2!==o.length)return t.attrs;let a=o[1].slice(0,-1).trim();return a.startsWith('"')&&a.endsWith('"')&&(a=a.slice(1,-1)),{_default:a}},lt=(t,e)=>{if(t.start)return e.substring(t.start.from,t.start.to);if(!t.attrs)return`[${t.tag}]`;const n=ct(t,e);return n._default?`[${t.tag}=${n._default}]`:t.toTagStart()},ut=(t,e)=>t.end?e.substring(t.end.from,t.end.to):t.toTagEnd(),dt=(t,e,n)=>{const s=t.substring(n||0).search(e);return s>=0?s+(n||0):s},gt="\x3c!-- bbcode injected newlines --\x3e\n\n",ht="\n\n\x3c!-- bbcode pre injected newlines --\x3e",pt="\x3c!-- bbcode injected newlines --\x3e",ft=new RegExp(`^${/(http|ftp|https|upload):\/\/([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:\/~+#-]*[\w@?^=%&\/~+#-])/.source}|${/\!?\[.*\]\((http|ftp|https|upload):\/\/([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:\/~+#-]*[\w@?^=%&\/~+#-])\)/.source}$`),bt=/((\n|^)(?```+|~~~+)(?.*\n))|(?\[(?i?code|plain)(=.*)?\])|(?(?`{1,2})(.*)(?\k))/im,mt=/^(\|[^\n]+\|\r?\n)((?:\| ?:?[-]+:? ?)+\|)(\n(?:\|[^\n]+\|\r?\n?)*)?$/m;function yt(){let t=(new Date).getTime();return window.performance&&"function"==typeof window.performance.now&&(t+=performance.now()),"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,(function(e){const n=(t+16*Math.random())%16|0;return t=Math.floor(t/16),("x"===e?n:3&n|8).toString(16)}))}const wt=t=>"string"==typeof t,vt=(t,n=!1)=>{const s=t;if(Array.isArray(s)){s.some(wt)&&(s.unshift(gt),s.push(gt));for(let t=0;t{const e=t;if(Array.isArray(e))for(let t=0;t1&&" "===e[0]){let t=e.length;return[String.fromCharCode(160).repeat(t)]}return e};function $t(t,e,n,s){return e.walk((e=>{if(u(e)){const r=e.tag,o=t[r];if("function"==typeof o)return o(e,n,s)}return e}))}const kt=Symbol("slide-title-open"),Tt=Symbol("slide-title-close"),At=Symbol("slide-close"),St=/(?\{slide=)|(?\})|(?\{\/slide\})/i;function _t(t){switch(t){case kt:return"{slide=";case Tt:return"}";case At:return"{/slide}";default:return t}}const Ct={accordion:(t,e)=>{const n=yt(),s=function(t){t=[...t];const e=[];for(;t.length>0;){const n=t[0];if(u(n)){e.push(t.shift());continue}const s=dt(n,St);if(-1===s){e.push(t.shift());continue}const r=n.match(St),o=n.slice(0,s),a=n.slice(s+r[0].length);o.length&&e.push(o),r.groups.slideTitleOpen&&e.push(kt),r.groups.slideTitleClose&&e.push(Tt),r.groups.slideClose&&e.push(At),a.length?t[0]=a:t.shift()}return e}(t.content),r=function(t){const e=[];let n=null,s=null;for(const r of t)if(r===kt&&null===s)n=y.create("slide"),n.content=[],n.customTitle=[],s=kt;else{if(r===Tt&&s===kt){s=Tt;continue}r===At&&n&&s===Tt?(e.push(n),n=null,s=null):n?s===kt?n.customTitle.push(_t(r)):n.content.push(_t(r)):e.push(_t(r))}return e}(s),o=r.filter((t=>u(t)&&"slide"===t.tag)).map((t=>(t.isValid=!0,t.groupId=n,t)));if(!o.length)return[lt(t,e.data.raw),...t.content,ut(t,e.data.raw)];const a=ct(t,e.data.raw);if(a._default){const t=a._default.split("|").map((t=>t.trim())),e=t.filter((t=>["bright","bcenter","bleft","fleft","fright"].includes(t))).pop();e&&(a.align??=e),(t.some((t=>t.endsWith("px")))||t.some((t=>t.endsWith("%"))))&&(a.width??=t.find((t=>t.endsWith("px")||t.endsWith("%"))))}let i=a.align?.toLowerCase()||"",c="";return(a.width?.endsWith("px")||a.width?.endsWith("%"))&&(c=`width: ${a.width};`),it("div",{class:"bb-accordion "+i,"data-group-id":n,style:c},o)},slide:(t,e)=>{if(!t.isValid)return[lt(t,e.data.raw),...t.content,ut(t,e.data.raw)];const n=ct(t,e.data.raw);let s=[n.title||n._default||"Slide"],r=!!n.open||!1,o=n.left?"left":n.right?"right":n.center?"center":"left";if(t.customTitle?.length){s=t.customTitle;const e=s.filter((t=>"string"==typeof t)).join("").toLowerCase().split("|").map((t=>t.trim()));e.includes("open")&&(r=!0),e.includes("right")&&(o="right"),e.includes("center")&&(o="center"),e.includes("left")&&(o="left"),s=s.map((t=>(d(t)&&(t=t.replace(/\|(open|right|center|left)/gi,"")),t)))}return[it("details",{class:"bb-slide",open:r},[it("summary",{class:"bb-slide-title",style:`text-align: ${o}; ${n.style||""}`},s),it("div",{class:"bb-slide-content"},t.content)])]}},jt={left:t=>it("div",{class:"bb-left"},t.content),center:t=>it("div",{class:"bb-center"},t.content),right:t=>it("div",{class:"bb-right"},t.content)},Lt={a:(t,e)=>{const n=ct(t,e.data.raw)._default||"";return it("a",{id:`user-anchor-${n.trim()}`,name:`user-anchor-${n.trim()}`},t.content)},goto:(t,e)=>{const n=ct(t,e.data.raw)._default||"";return it("a",{href:`#user-anchor-${n.trim()}`},t.content)}},Nt=["arial","book antiqua","courier new","georgia","tahoma","times new roman","trebuchet ms","verdana"],Ot={thin:"100",extralight:"200",light:"300",regular:"400",medium:"500",semibold:"600",bold:"700",extrabold:"800",black:"900"},Et=["ital","opsz","slnt","wdth","wght"],Wt=/(?[a-zA-Z]*)?\s?(?[0-9]*)?\s?(?italic)?/;const It=it("div",{class:"bb-email-header"},""),Ut=it("div",{class:"bb-email-footer"},it("div",{class:"bb-email-button"},"")),Vt={row:t=>it("div",{class:"bb-row"},t.content),column:(t,e)=>{const n=ct(t,e.data.raw)._default||"8",s=n.startsWith("span")?`column-width-${n}`:`column-width-span${n}`;return it("div",{class:"bb-column","data-span":s},t.content)}},Dt=["init","click","change","input","dblclick","mouseenter","mouseleave","scroll"];const Gt=["me","them","right","left"],qt={textmessage:(t,e)=>{const n=ct(t,e.data.raw)._default||"Recipient",s=n&&""!==n.trim()?n:"Recipient";return it("div",{class:"bb-textmessage"},[it("div",{class:"bb-textmessage-name"},s),it("div",{class:"bb-textmessage-overflow"},[it("div",{class:"bb-textmessage-content"},t.content)])])},message:(t,e)=>{let n=ct(t,e.data.raw)._default.toLowerCase();Gt.includes(n)&&"right"!==n||(n="me"),"left"===n&&(n="them");return it("div",{class:"me"===n?"bb-message-me":"bb-message-them"},[it("div",{class:"bb-message-content"},t.content)])}},zt={...Ct,...jt,...Lt,animation:(t,e)=>{e.data.previewing||e.data.commonGUID||(e.data.commonGUID="post-"+Math.random().toString(36).substring(2,7));const n=e.data.previewing?"preview":e.data.commonGUID,s=ct(t,e.data.raw)?._default||"",r=t.content.filter((t=>u(t)&&"keyframe"===t.tag)).map((t=>{t.isValid=!0;const n=ct(t,e.data.raw)._default||"";t.ident=n+(n.match(/^\d+$/)?"%":"");const s=t.content.filter(d).join("").replaceAll(/[\[\]\{\}]/g,"");return t.formatted=`${t.ident}{ ${s} }`,t})),o=`@keyframes ${n}${s} { ${r.map((t=>t.formatted)).join("\n")} }`;return e.data.styles.push(o),[]},bg:(t,e)=>{const n=ct(t,e.data.raw)._default;return it("div",{style:`background-color: ${n};`,class:"bb-background"},t.content)},block:(t,e)=>{const n="block",s=(ct(t,e.data.raw)._default||n).toLowerCase(),r=["block","dice","dice10","setting","warning","storyteller","announcement","important","question","encounter","information","character","treasure"].includes(s)?s:n;return it("table",{class:"bb-block","data-bb-block":r},[it("tbody",[it("tr",[it("td",{class:"bb-block-icon"}),it("td",{class:"bb-block-content"},t.content)])])])},blockquote:(t,e)=>{const n=ct(t,e.data.raw)._default||"";return it("div",{class:"bb-blockquote"},[it("div",{class:"bb-blockquote-left"}),it("div",{class:"bb-blockquote-content"},[t.content,it("div",{class:"bb-blockquote-speaker"},""!==n?`- ${n}`:"")]),it("div",{class:"bb-blockquote-right"})])},border:(t,e)=>{const n=ct(t,e.data.raw)._default;return it("div",{style:`border: ${n};`,class:"bb-border"},t.content)},br:()=>it("br",{},null),centerblock:(t,e)=>{const n=ct(t,e.data.raw)._default||"50";return it("div",{style:`margin: 0 auto; width: ${n}%`},t.content)},check:(t,e)=>{const n=ct(t,e.data.raw)._default||"dot";return it("div",{class:"bb-check","data-type":n},t.content)},class:(t,e)=>{const n=ct(t),s=n.name||n._default;e.data.previewing||e.data.commonGUID||(e.data.commonGUID="post-"+Math.random().toString(36).substring(2,7));const r=e.data.previewing?"preview":e.data.commonGUID,o=s+"__"+r,a=t.content.filter(d).map((t=>t.replaceAll("{post_id}",r).replaceAll(/[\[\]\{\}]/g,"")));let i="";const c=[];return["hover","focus","active","focus-within","focus-visible"].includes(n.state?.toLowerCase())&&(i=":"+n.state.toLowerCase()),n.selector&&(i=n.selector.replace(/[,{}\\\n]/g,"")),n.minWidth?.match(/^[0-9]+[a-z]+$/)&&c.push(`(min-width: ${n.minWidth})`),n.maxWidth?.match(/^[0-9]+[a-z]+$/)&&c.push(`(max-width: ${n.maxWidth})`),a.unshift(`.${o}${i} {`),a.push("}"),c.length&&(a.unshift(`@media ${c.join(" and ")} {`),a.push("}")),e.data.styles.push(a.join("")),[]},code:t=>({isWhitespaceSensitive:!0,content:["```"+(ct(t)._default||"bbcode")+"\n",t.content,"\n```\n"]}),color:t=>{const e=ct(t)._default||"";return""===e.trim()?t.content:it("span",{style:`color: ${e}`},t.content)},comment:t=>it("span",{class:"hidden"},t.content),div:(t,e)=>{if(t.gen)return t;const n=ct(t,e.data.raw),s=n.style||n._default,r=n.class;if(!r?.trim())return it("div",{style:s},t.content);e.data.previewing||e.data.commonGUID||(e.data.commonGUID="post-"+Math.random().toString(36).substring(2,7));const o=e.data.previewing?"preview":e.data.commonGUID,a=r.split(" ").map((t=>t+"__"+o)).join(" ");return it("div",{class:a,style:s},t.content)},divide:t=>{const e=(ct(t)._default||"").toLowerCase();return it("span",{class:"bb-divide","data-type":e},t.content)},fieldset:(t,e)=>{const n=ct(t,e.data.raw)._default||"";return it("fieldset",{class:"bb-fieldset"},[it("legend",{class:"bb-fieldset-legend"},n),it("div",{class:"bb-fieldset"},t.content)])},fa:t=>{const e=t.attrs;let n=e.style||"";return n+=e["primary-color"]?`--fa-primary-color: ${e["primary-color"]};`:"",n+=e["secondary-color"]?`--fa-secondary-color: ${e["secondary-color"]};`:"",n+=e["primary-opacity"]?`--fa-primary-opacity: ${e["primary-opacity"]};`:"",n+=e["secondary-opacity"]?`--fa-secondary-opacity: ${e["secondary-opacity"]};`:"",n+=e["rotate-angle"]?`--fa-rotate-angle: ${e["rotate-angle"]};`:"",it("i",{"data-bbcode-fa":null},[it("i",{class:(t.content||[]).join(""),style:n,"data-fa-transform":e["fa-transform"]||""},[])])},font:(t,e)=>{const n=ct(t,e.data.raw),s=n?._default||n.family||n.name;if(""===s.trim())return t.content;if(Nt.includes(s.trim().toLowerCase()))return it("span",{style:`font-family: '${s}'`},t.content);const r=(t=>{let e={ital:0,wght:400};if(t?.style){const n=t.style.trim().toLowerCase(),s=Wt.exec(n).groups||{};s?.italic&&(e.ital=1);const r=s.weight;r&&r>=0&&r<=900?e.wght=r:Object.keys(Ot).includes(s.named_weight||"")&&(e.wght=Ot[s.named_weight]),e={...e,...Object.fromEntries(Object.entries(t).filter((([t])=>Et.includes(t))))}}return e})(n),o=((t,e)=>(t=t.replaceAll(" ","+"),e=Object.keys(e).sort().reduce(((t,n)=>(t[n]=e[n],t)),{}),"https://fonts.googleapis.com/css2?family="+t+":"+Object.keys(e).join(",")+"@"+Object.values(e).join(",")))(s,r);e.data.fonts.add(o);const a=1===r.ital?"italic":"normal",i=Object.entries(r).filter((([t])=>"wght"!==t&&"ital"!==t));let c="";return i.length&&(c="font-variation-settings: "+i.map((([t,e])=>`'${t}' ${e}`)).join(", ")+";"),it("span",{style:`font-family: '${s}'; font-weight: ${r.wght}; font-style: ${a}; ${c}`,"data-font":o},t.content)},h:t=>it("h1",{},t.content),h1:t=>it("h1",{},t.content),h2:t=>it("h2",{},t.content),h3:t=>it("h3",{},t.content),h4:t=>it("h4",{},t.content),h5:t=>it("h5",{},t.content),h6:t=>it("h6",{},t.content),heightrestrict:t=>{const e=function(t){const e=t&&""!==t.trim()?t.replace(/[^\d.]/g,""):0;return e&&e>=0&&e<=700?e:0===e?0:700}(ct(t)._default).toString();return it("div","0"===e?{class:"bb-height-restrict"}:{class:"bb-height-restrict",style:`height: ${e}px;`},t.content)},highlight:t=>it("span",{class:"bb-highlight"},t.content),icode:t=>({isWhitespaceSensitive:!0,content:["`",t.content,"`"]}),imagefloat:t=>{const e=ct(t)._default||"";return it("div",{class:`bb-float-${e}`},t.content)},inlinespoiler:t=>it("span",{class:"bb-inline-spoiler"},t.content),justify:t=>it("div",{class:"bb-justify"},t.content),keyframe:(t,e)=>t.isValid?[]:[lt(t,e.data.raw),...t.content,ut(t,e.data.raw)],mail:t=>{const e=t.attrs;let n={mailOption:(e.type||"send").toLowerCase(),person:e.person||"Unknown",subject:e.subject||"Empty"};return it("div",{class:"bb-email","data-bb-email":n.mailOption},[It,(o=n.person,it("div",{class:"bb-email-address"},o)),(r=n.subject,it("div",{class:"bb-email-subject"},r)),(s=t.content,it("div",{class:"bb-email-content"},s)),Ut]);var s,r,o},newspaper:t=>it("div",{class:"bb-newspaper"},t.content),nobr:t=>({disableLineBreakConversion:!0,content:t.content}),note:t=>it("div",{class:"bb-note"},[it("div",{class:"bb-note-tape"},""),it("div",{class:"bb-note-content"},[t.content,it("div",{class:"bb-note-footer"},"")])]),ooc:t=>it("div",{class:"bb-ooc"},t.content),pindent:t=>it("span",{class:"bb-pindent"},t.content),plain:t=>t.content,print:t=>{const e="print",n=(ct(t)._default||e).toLowerCase(),s=["print","line","graph","parchment"].includes(n)?n:e;return it("div",{class:s===e?"bb-print":`bb-print-${s}`},t.content)},progress:t=>{const e=ct(t)._default;return it("div",{class:"bb-progress"},[it("div",{class:"bb-progress-text"},t.content),it("div",{class:"bb-progress-bar",style:`width: calc(${e}% - 6px)`},""),it("div",{class:"bb-progress-bar-other"},"")])},quote:(t,e)=>{const n=ct(t,e.data.raw);return"\n"===t.content[0]&&t.content.shift(),[`\n[${t.tag}="${n._default}"]\n\n`,...t.content,"\n\n[/quote]\n"]},...Vt,thinprogress:(t,e)=>{const n=ct(t,e.data.raw)._default;return it("div",{class:"bb-progress-thin"},[it("div",{class:"bb-progress-text"},t.content),it("div",{class:"bb-progress-bar",style:`width: calc(${n}% - 6px)`},""),it("div",{class:"bb-progress-bar-other"},"")])},savenl:t=>({isWhitespaceSensitive:!0,content:t.content}),sh:t=>it("h2",{},t.content),script:(t,e)=>{const n=ct(t,e.data.raw);e.data.previewing||e.data.commonGUID||(e.data.commonGUID="post-"+Math.random().toString(36).substring(2,7));const s=e.data.previewing?"preview":e.data.commonGUID,r=Dt.includes(n.on?.toLowerCase()||"init")&&n.on?.toLowerCase()||"init",o={id:s,class:n.class||"",on:r,version:n.version||"",content:t.content.join("")};return e.data.bbscripts.push(o),[]},scroll:(t,e)=>{const n=function(t){const e=t&&""!==t.trim()?t.replace(/[^\d.]/g,""):0;return e&&e>=0&&e<=700?e:0===e?0:700}(ct(t,e.data.raw)._default);return it("div",{class:"bb-scroll",style:`height: ${n}px`},t.content)},side:t=>{const e=ct(t)._default||"left";return it("div",{class:"bb-side","data-side":e},t.content)},size:t=>{const e=function(t){let e,n={valid:!0};const s=/(\d+\.?\d?)(px|rem)?/i.exec(t),r=36,o=8,a=3,i=.2,c=7,l=1;if(s&&(e=s[1])){switch(n.unit=(s[2]||"").toLowerCase(),n.unit){case"px":e>r?e=r:ea?e=a:ec?e=c:e{const n=ct(t,e.data.raw)._default;return it("details",{class:"bb-spoiler"},[it("summary",{},"Spoiler"+(n?`: ${n}`:"")),it("div",{class:"bb-spoiler-content"},t.content)])},sub:t=>it("sub",{},t.content),sup:t=>it("sup",{},t.content),tab:(t,e)=>{if(!t.isValid)return[lt(t,e.data.raw),...t.content,ut(t,e.data.raw)];const n=ct(t,e.data.raw),s=n._default||n.name||"Tab",r=`tab-${s.replace(/\W/g,"_")}-${yt()}`;return[it("input",{type:"radio",id:r,name:"tab-group-"+t.groupId,class:"bb-tab",checked:t.open}),it("label",{class:"bb-tab-label",for:r,style:n.style},s),it("div",{class:"bb-tab-content"},t.content)]},tabs:(t,e)=>{const n=t.content.filter((t=>u(t)&&"tab"===t.tag)),s=yt();return n.forEach((t=>{t.isValid=!0,t.groupId=s})),n.length?(n[0].open=!0,it("div",{class:"bb-tabs"},n)):[lt(t,e.data.raw),...t.content,ut(t,e.data.raw)]},...qt,b:t=>it("span",{class:"bbcode-b"},t.content),i:t=>t.gen?t:it("span",{class:"bbcode-i"},t.content),u:t=>it("span",{class:"bbcode-u"},t.content),s:t=>it("span",{class:"bbcode-s"},t.content)},Pt=Object.keys(zt),Mt=function t(e,n=$t){const s=t=>{function r(t,r){return n(e,t,r,s.options||{})}return s.options=Object.assign(s.options||{},t),r.options=s.options,r};return s.extend=function(r){return t(r(e,s.options),n)},s}(zt);function Bt(t){return t.replaceAll(gt,"").replaceAll(ht,"").replaceAll("\n"+pt,"").replaceAll(pt+"\n","").replaceAll(pt,"")}function Rt(t,e){const n=e.hoistMap;for(const[e,s]of Object.entries(n))t=t.replaceAll(e,s);return t}function Ft(t,e){if(0===e.styles.length)return t;return'"+t}function Jt(t,e){if(0===e.bbscripts.length)return t;return e.bbscripts.map((t=>``)).join("")+t}function Zt(t,e){const n={};let s=0;const r=(e,s,r,o=!1)=>{const a=yt();return-1!==s?(n[a]=t.substring(e,s),t=t.substring(0,e)+a+t.substring(s)):(n[a]=t.substring(e),t=t.substring(0,e)+a+r),o&&(n[a].startsWith("\n")&&(n[a]=n[a].substring(1)),n[a].endsWith("\n")&&(n[a]=n[a].substring(0,n[a].length-1))),e+a.length+r.length};for(;-1!==(s=dt(t,bt,s));){const e=bt.exec(t.substring(s));if(e.groups?.fence){const r=e.groups.fence,o=e.groups.fenceInfo;"\n"===t[s]&&(s+=1);const a=new RegExp("\n"+r+"(\n|$)"),i=dt(t,a,s+r.length),c=yt();n[c]=-1!==i?t.substring(s+r.length+o.length,i):t.substring(s+r.length+o.length);const l=`[saveNL]\n${r}${o}${c}\n${r}\n[/saveNL]`;t=t.substring(0,s)+l+(-1!==i?t.substring(i+1+r.length):""),s+=l.length}else if(e.groups?.bbcode){const n=e.groups.bbcode,o=`[/${e.groups.bbcodeTag.toLowerCase()}]`,a=t.toLowerCase().indexOf(o,s+1);s=r(s+n.length,a,o,!0)}else if(e.groups.backtick){const t=e.groups.backtick,n=e.groups.tickStart,o=e.groups.tickEnd;s=r(s+n.length,s+t.length-o.length,o)}}return e.hoistMap=n,[t,e]}function Ht(t,e){let n=0;for(;-1!==(n=dt(t,mt,n));){const e=mt.exec(t.substring(n))[0],s=`[saveNL]\n${e}\n[/saveNL]`;t=t.substring(0,n)+s+t.substring(n+e.length),n+=s.length}return[t,e]}const Kt={onlyAllowTags:[...Pt],contextFreeTags:["plain","code","icode","class","fa"],enableEscapeTags:!0,onError:t=>{Kt.previewing&&console.warn(t.message,t.lineNumber,t.columnNumber)}},Qt=Mt();t.RpNBBCode=(t,e)=>{const n=[Qt];e.preserveWhitespace&&n.push((t=>xt(t))),n.push((t=>vt(t)));const[s,r]=function(t){let e={};const n=[Zt,Ht];for(const s of n)[t,e]=s(t,e);return[t,e]}(t);return function(t){const e="function"==typeof t?[t]:t||[],n=()=>"";return{process(t,s){const r=s||{skipParse:!1,parser:H,render:n,data:null},o=r.parser||H,a=r.render,i=r.data||null;if("function"!=typeof o)throw new Error("C1");const c=r.skipParse&&Array.isArray(t)?t:o(t,r);let l=r.skipParse&&Array.isArray(t)?tt(t||[],r):tt(c,r);for(let t=0;te(n,s,t)),n)}function h(t){return u(t)&&Array.isArray(t.content)?t.content.reduce(((t,e)=>t+h(e)),0):d(t)?String(t).length:0}function p(t){return t.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'").replace(/(javascript|data|vbscript):/gi,"$1%3A")}function f(t,e){switch(typeof e){case"boolean":return e?`${t}`:"";case"number":return`${t}="${e}"`;case"string":return`${t}="${p(e)}"`;case"object":return`${t}="${p(JSON.stringify(e))}"`;default:return""}}function b(t){return null==t?"":g(t,((t,e,n)=>[...t,f(e,n[e])]),[""]).join(" ")}const m=(t,e)=>{const n=g(e||{},((t,e,n)=>n[e]===e?n[e]:null),null);if(n){const s=f(t,n),r={...e};delete r[String(n)];return`${s}${b(r)}`}return`${t}${b(e)}`};class y{attr(t,e){return void 0!==e&&(this.attrs[t]=e),this.attrs[t]}append(t){return function(t,e){Array.isArray(t.content)&&t.content.push(e)}(this,t)}setStart(t){this.start=t}setEnd(t){this.end=t}get length(){return h(this)}toTagStart({openTag:t=a,closeTag:e=i}={}){return`${t}${m(String(this.tag),this.attrs)}${e}`}toTagEnd({openTag:t=a,closeTag:e=i}={}){return`${t}${c}${this.tag}${e}`}toTagNode(){const t=new y(String(this.tag).toLowerCase(),this.attrs,this.content);return this.start&&t.setStart(this.start),this.end&&t.setEnd(this.end),t}toString({openTag:t=a,closeTag:e=i}={}){const n=this.content?((t,e,n)=>{const s=t=>u(t)?t.toString({openTag:e,closeTag:n}):String(t);return Array.isArray(t)?t.reduce(((t,e)=>null!==e?t+s(e):t),""):t?s(t):null})(this.content,t,e):"",s=this.toTagStart({openTag:t,closeTag:e});return null===this.content||Array.isArray(this.content)&&0===this.content.length?s:`${s}${n}${this.toTagEnd({openTag:t,closeTag:e})}`}static create(t,e={},n=null,s){const r=new y(t,e,n);return s&&r.setStart(s),r}static isOf(t,e){return t.tag===e}constructor(t,e,n){this.tag=t,this.attrs=e,this.content=n}}const w="t",v=t=>t&&void 0!==t.v?t.v:"",x=t=>v(t).charCodeAt(0)===c.charCodeAt(0);class ${get type(){return this[w]}isEmpty(){return 0===this[w]||isNaN(this[w])}isText(){return!(!(t=this)||void 0===t[w]||5!==t[w]&&6!==t[w]&&1!==t[w]);var t}isTag(){return!(!(t=this)||void 0===t[w])&&2===t[w];var t}isAttrName(){return!(!(t=this)||void 0===t[w])&&3===t[w];var t}isAttrValue(){return!(!(t=this)||void 0===t[w])&&4===t[w];var t}isStart(){return!x(this)}isEnd(){return x(this)}getName(){return(t=>{const e=v(t);return x(t)?e.slice(1):e})(this)}getValue(){return v(this)}getLine(){return(t=this)&&t.l||0;var t}getColumn(){return(t=this)&&t.r||0;var t}getStart(){return(t=this)&&t.s||0;var t}getEnd(){return(t=this)&&t.e||0;var t}toString(){return(t=>{let e=a;return e+=v(t),e+=i,e})(this)}constructor(t,e,n=0,s=0,r=0,o=0){this.l=n,this.r=s,this[w]=t||0,this.v=String(e),this.s=r,this.e=o}}const k=1,T=2,A=3,S=4,_=5,C=6;class j{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(){const t=this.c.pos+1;return t<=this.s.length-1?this.s[t]:null}getPrev(){const 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 n=0;if(this.hasNext())for(n=this.c.pos;this.hasNext()&&t(this.getCurr());)this.skip(1,e);return this.s.substring(n,this.c.pos)}grabN(t=0){return this.s.substring(this.c.pos,this.c.pos+t)}substrUntilChar(t){const{pos:e}=this.c,n=this.s.indexOf(t,e);return n>=0?this.s.substring(e,n):""}constructor(t,e={}){this.s=t,this.c={pos:0,len:t.length},this.o=e}}const L=(t,e)=>new j(t,e),N="!";const O=0,E=1,W=2,I=0,U=1,V=2,D=[o,n],G=[s,o,n],q=2,z=t=>D.indexOf(t)>=0,P=t=>t===l,M=t=>G.indexOf(t)>=0,B=t=>t===e,R=t=>((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})(t,r).replace(l+r,r);function F(t,u={}){let d=0,g=0,h=0,p=-1,f=O,b=I,m="";const y=new Array(Math.floor(t.length)),w=u.openTag||a,v=u.closeTag||i,x=!!u.enableEscapeTags,j=(u.contextFreeTags||[]).filter(Boolean).map((t=>t.toLowerCase())),D=new Map,G=u.onToken||(()=>{}),F=[v,w,r,l,o,n,s,e,N],J=[w,o,n,e],Z=t=>F.indexOf(t)>=0,H=t=>-1===J.indexOf(t),K=t=>t===w||t===v||t===l,Q=()=>{h++},X=(t,e)=>{""!==m&&e&&(m=""),""===m&&j.includes(t.toLowerCase())&&(m=t)},Y=L(t,{onSkip:Q});function tt(t,e,n,s){const r=function(t,e,n=0,s=0,r=0,o=0){return new $(t,e,n,s,r,o)}(t,e,d,g,n,s);G(r),g=h,p+=1,y[p]=r}function et(t,e,n){if(b===U){const e=t=>!(t===s||z(t)),n=t.grabWhile(e),r=t.isLast(),o=t.getCurr()!==s;return t.skip(),r||o?tt(S,R(n)):tt(A,n),r?I:o?U:V}if(b===V){let n=!1;const o=o=>{const a=o===r,i=t.getPrev(),c=t.getNext(),u=i===l,d=c===s,g=z(o),h=c&&z(c);return!(!n||!M(o))||!!(!a||u||(n=!n,n||d||h))&&(!!e||!g)},a=t.grabWhile(o);return t.skip(),tt(S,R(a)),t.getPrev()===r&&g++,t.isLast()?I:U}const o=n+t.getPos()-1,a=t.grabWhile((e=>!(e===s||z(e)||t.isLast())));if(tt(T,a,o,n+t.getLength()+1),X(a),t.skip(),g++,e)return V;return t.includes(s)?U:V}function nt(){const t=Y.getCurr(),e=Y.getNext();Y.skip();const n=Y.substrUntilChar(v),r=0===n.length||n.indexOf(w)>=0;if(e&&Z(e)||r||Y.isLast())return tt(k,t),O;const o=-1===n.indexOf(s),a=n[0]===c;if(o||a){const t=Y.getPos()-1,e=Y.grabWhile((t=>t!==v)),n=t+e.length+q;return Y.skip(),tt(T,e,t,n),X(e,a),O}return W}function st(){const t=Y.getPos(),e=Y.grabWhile((t=>t!==v),!0),n=L(e,{onSkip:Q}),s=n.includes(o);for(b=I;n.hasNext();)b=et(n,!s,t);return Y.skip(),O}function rt(){if(B(Y.getCurr()))return tt(C,Y.getCurr()),Y.skip(),h=0,g=0,d++,O;if(z(Y.getCurr())){const t=Y.grabWhile(z);return tt(_,t),O}if(Y.getCurr()===w){if(m){const t=w.length+c.length+m.length,e=`${w}${c}${m}`;if(Y.grabN(t)===e)return E}else if(Y.includes(v))return E;return tt(k,Y.getCurr()),Y.skip(),g++,O}if(x){if(P(Y.getCurr())){const t=Y.getCurr(),e=Y.getNext();return Y.skip(),e&&K(e)?(Y.skip(),tt(k,e),O):(tt(k,t),O)}const t=t=>H(t)&&!P(t),e=Y.grabWhile(t);return tt(k,e),O}const t=Y.grabWhile(H);return tt(k,t),O}return{tokenize:function(){for(f=O;Y.hasNext();)switch(f){case E:f=nt();break;case W:f=st();break;default:f=rt()}return y.length=p+1,y},isTokenNested:function(e){const n=w+c+e.getValue();if(D.has(n))return!!D.get(n);{const e=t.indexOf(n)>-1;return D.set(n,e),e}}}}class J{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=[]}}const Z=()=>new J;function H(t,e={}){const n=e,s=n.openTag||a,r=n.closeTag||i,o=(n.onlyAllowTags||[]).filter(Boolean).map((t=>t.toLowerCase()));let c=null;const l=Z(),d=Z(),g=Z(),h=Z(),p=new Set;function f(t){return Boolean(p.has(t))}function b(){g.flush()&&h.flush()}function m(){const t=d.last();return t&&u(t)?t.content:l.toArray()}function w(t,e,n=!0){Array.isArray(t)&&void 0!==e&&(t.push(e.toTagStart({openTag:s,closeTag:r})),Array.isArray(e.content)&&e.content.length&&(e.content.forEach((e=>{t.push(e)})),n&&t.push(e.toTagEnd({openTag:s,closeTag:r}))))}function v(t,e){var n;Array.isArray(t)&&void 0!==e&&(u(e)?(n=e.tag,!o.length||o.indexOf(n.toLowerCase())>=0?t.push(e.toTagNode()):w(t,e)):t.push(e))}function x(t){b();const e=y.create(t.getValue(),{},[],{from:t.getStart(),to:t.getEnd()}),n=function(t){const e=t.getValue(),{isTokenNested:n}=c||{};return!p.has(e)&&n&&n(t)?(p.add(e),!0):p.has(e)}(t);if(g.push(e),n)d.push(e);else{v(m(),e)}}function $(t){t.isStart()&&x(t),t.isEnd()&&function(t){const e=d.last();u(e)&&e.setEnd({from:t.getStart(),to:t.getEnd()}),b();const s=d.flush();if(s)v(m(),s);else if("function"==typeof n.onError){const e=t.getValue(),s=t.getLine(),r=t.getColumn();n.onError({tagName:e,lineNumber:s,columnNumber:r})}}(t)}const k=e.createTokenizer?e.createTokenizer:F;c=k(t,{onToken:function(t){t.isTag()?$(t):function(t){const e=g.last(),n=t.getValue(),s=f(t.toString()),r=m();if(null!==e)if(t.isAttrName()){h.push(n);const t=h.last();t&&e.attr(t,"")}else if(t.isAttrValue()){const t=h.last();t?(e.attr(t,n),h.flush()):e.attr(n,n)}else t.isText()?s?e.append(n):v(r,n):t.isTag()&&v(r,t.toString());else t.isText()?v(r,n):t.isTag()&&v(r,t.toString())}(t)},openTag:s,closeTag:r,onlyAllowTags:n.onlyAllowTags,contextFreeTags:n.contextFreeTags,enableEscapeTags:n.enableEscapeTags}),c.tokenize();const T=d.flush();return null!==T&&T&&u(T)&&f(T.tag)&&w(m(),T,!1),l.toArray()}const K=t=>"object"==typeof t&&null!==t,Q=t=>"boolean"==typeof t;function X(t,e){const n=t;if(Array.isArray(n))for(let t=0;t[].some.call(e,(e=>Y(t,e))))):!(!K(t)||!K(e))&&Object.keys(t).every((n=>{const s=e[n],r=t[n];return K(r)&&K(s)?Y(r,s):Q(r)?r!==(null===s):s===r})):t===e)}function tt(t,e){const n=t;return n.messages=[...n.messages||[]],n.options={...e,...n.options},n.walk=function(t){return X(this,t)},n.match=function(t,e){return function(t,e,n){return Array.isArray(e)?X(t,(t=>{for(let s=0;sY(e,t)?n(t):t))}(this,t,e)},n}const et="/>",nt="";function ot(t,e){const{stripTags:n=!1}=e||{};if(null==t)return"";if("string"==typeof t||"number"==typeof t)return String(t);if(Array.isArray(t))return at(t,e);if(u(t)){if(n)return at(t.content,e);const s=b(t.attrs);return null===t.content?st+t.tag+s+et:st+t.tag+s+rt+at(t.content,e)+nt+t.tag+rt}return""}function at(t,e){return t&&Array.isArray(t)?t.reduce(((t,n)=>t+ot(n,e)),""):t?ot(t,e):""}const it=(t,e,n=[])=>({tag:t,attrs:e,content:n,gen:!0}),ct=(t,e)=>{const n=Object.keys(t.attrs).join(" "),s=Object.values(t.attrs).join(" ");if(n!==s)return t.attrs;if(!e||!t.start)return{_default:s};const r=e.substring(t.start.from,t.start.to);if(!r.includes("="))return t.attrs;const o=r.split("=");if(2!==o.length)return t.attrs;let a=o[1].slice(0,-1).trim();return a.startsWith('"')&&a.endsWith('"')&&(a=a.slice(1,-1)),{_default:a}},lt=(t,e)=>{if(t.start)return e.substring(t.start.from,t.start.to);if(!t.attrs)return`[${t.tag}]`;const n=ct(t,e);return n._default?`[${t.tag}=${n._default}]`:t.toTagStart()},ut=(t,e)=>t.end?e.substring(t.end.from,t.end.to):t.toTagEnd(),dt=(t,e,n)=>{const s=t.substring(n||0).search(e);return s>=0?s+(n||0):s},gt="\x3c!-- bbcode injected newlines --\x3e\n\n",ht="\n\n\x3c!-- bbcode pre injected newlines --\x3e",pt="\x3c!-- bbcode injected newlines --\x3e",ft=new RegExp(`^${/(http|ftp|https|upload):\/\/([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:\/~+#-]*[\w@?^=%&\/~+#-])/.source}|${/\!?\[.*\]\((http|ftp|https|upload):\/\/([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:\/~+#-]*[\w@?^=%&\/~+#-])\)/.source}$`),bt=/((\n|^)(?```+|~~~+)(?.*\n))|(?\[(?i?code|plain)(=.*)?\])|(?(?`{1,2})(.*)(?\k))/im,mt=/^(\|[^\n]+\|\r?\n)((?:\| ?:?[-]+:? ?)+\|)(\n(?:\|[^\n]+\|\r?\n?)*)?$/m;function yt(){let t=(new Date).getTime();return window.performance&&"function"==typeof window.performance.now&&(t+=performance.now()),"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,(function(e){const n=(t+16*Math.random())%16|0;return t=Math.floor(t/16),("x"===e?n:3&n|8).toString(16)}))}const wt=t=>"string"==typeof t,vt=(t,n=!1)=>{const s=t;if(Array.isArray(s)){s.some(wt)&&(s.unshift(gt),s.push(gt));for(let t=0;t{const e=t;if(Array.isArray(e))for(let t=0;t1&&" "===e[0]){let t=e.length;return[String.fromCharCode(160).repeat(t)]}return e};function $t(t,e,n,s){return e.walk((e=>{if(u(e)){const r=e.tag,o=t[r];if("function"==typeof o)return o(e,n,s)}return e}))}const kt=Symbol("slide-title-open"),Tt=Symbol("slide-title-close"),At=Symbol("slide-close"),St=/(?\{slide=)|(?\})|(?\{\/slide\})/i;function _t(t){switch(t){case kt:return"{slide=";case Tt:return"}";case At:return"{/slide}";default:return t}}const Ct={accordion:(t,e)=>{const n=yt(),s=function(t){t=[...t];const e=[];for(;t.length>0;){const n=t[0];if(u(n)){e.push(t.shift());continue}const s=dt(n,St);if(-1===s){e.push(t.shift());continue}const r=n.match(St),o=n.slice(0,s),a=n.slice(s+r[0].length);o.length&&e.push(o),r.groups.slideTitleOpen&&e.push(kt),r.groups.slideTitleClose&&e.push(Tt),r.groups.slideClose&&e.push(At),a.length?t[0]=a:t.shift()}return e}(t.content),r=function(t){const e=[];let n=null,s=null;for(const r of t)if(r===kt&&null===s)n=y.create("slide"),n.content=[],n.customTitle=[],s=kt;else{if(r===Tt&&s===kt){s=Tt;continue}r===At&&n&&s===Tt?(e.push(n),n=null,s=null):n?s===kt?n.customTitle.push(_t(r)):n.content.push(_t(r)):e.push(_t(r))}return e}(s),o=r.filter((t=>u(t)&&"slide"===t.tag)).map((t=>(t.isValid=!0,t.groupId=n,t)));if(!o.length)return[lt(t,e.data.raw),...t.content,ut(t,e.data.raw)];const a=ct(t,e.data.raw);if(a._default){const t=a._default.split("|").map((t=>t.trim())),e=t.filter((t=>["bright","bcenter","bleft","fleft","fright"].includes(t))).pop();e&&(a.align??=e),(t.some((t=>t.endsWith("px")))||t.some((t=>t.endsWith("%"))))&&(a.width??=t.find((t=>t.endsWith("px")||t.endsWith("%"))))}let i=a.align?.toLowerCase()||"",c="";return(a.width?.endsWith("px")||a.width?.endsWith("%"))&&(c=`width: ${a.width};`),it("div",{class:"bb-accordion "+i,"data-group-id":n,style:c},o)},slide:(t,e)=>{if(!t.isValid)return[lt(t,e.data.raw),...t.content,ut(t,e.data.raw)];const n=ct(t,e.data.raw);let s=[n.title||n._default||"Slide"],r=!!n.open||!1,o=n.left?"left":n.right?"right":n.center?"center":"left";if(t.customTitle?.length){s=t.customTitle;const e=s.filter((t=>"string"==typeof t)).join("").toLowerCase().split("|").map((t=>t.trim()));e.includes("open")&&(r=!0),e.includes("right")&&(o="right"),e.includes("center")&&(o="center"),e.includes("left")&&(o="left"),s=s.map((t=>(d(t)&&(t=t.replace(/\|(open|right|center|left)/gi,"")),t)))}return[it("details",{class:"bb-slide",open:r},[it("summary",{class:"bb-slide-title",style:`text-align: ${o}; ${n.style||""}`},s),it("div",{class:"bb-slide-content"},t.content)])]}},jt={left:t=>it("div",{class:"bb-left"},t.content),center:t=>it("div",{class:"bb-center"},t.content),right:t=>it("div",{class:"bb-right"},t.content)},Lt={a:(t,e)=>{const n=ct(t,e.data.raw)._default||"";return it("a",{id:`user-anchor-${n.trim()}`,name:`user-anchor-${n.trim()}`},t.content)},goto:(t,e)=>{const n=ct(t,e.data.raw)._default||"";return it("a",{href:`#user-anchor-${n.trim()}`},t.content)}},Nt=["arial","book antiqua","courier new","georgia","tahoma","times new roman","trebuchet ms","verdana"],Ot={thin:"100",extralight:"200",light:"300",regular:"400",medium:"500",semibold:"600",bold:"700",extrabold:"800",black:"900"},Et=["ital","opsz","slnt","wdth","wght"],Wt=/(?[a-zA-Z]*)?\s?(?[0-9]*)?\s?(?italic)?/;const It=it("div",{class:"bb-email-header"},""),Ut=it("div",{class:"bb-email-footer"},it("div",{class:"bb-email-button"},"")),Vt={row:t=>it("div",{class:"bb-row"},t.content),column:(t,e)=>{const n=ct(t,e.data.raw)._default||"8",s=n.startsWith("span")?`column-width-${n}`:`column-width-span${n}`;return it("div",{class:"bb-column","data-span":s},t.content)}},Dt=["init","click","change","input","dblclick","mouseenter","mouseleave","scroll"];const Gt=["me","them","right","left"],qt={textmessage:(t,e)=>{const n=ct(t,e.data.raw)._default||"Recipient",s=""!==n.trim()?n:"Recipient";return it("div",{class:"bb-textmessage"},[it("div",{class:"bb-textmessage-name"},s),it("div",{class:"bb-textmessage-overflow"},[it("div",{class:"bb-textmessage-content"},t.content)])])},message:(t,e)=>{let n=ct(t,e.data.raw)._default.toLowerCase();Gt.includes(n)&&"right"!==n||(n="me"),"left"===n&&(n="them");return it("div",{class:"me"===n?"bb-message-me":"bb-message-them"},[it("div",{class:"bb-message-content"},t.content)])}},zt={...Ct,...jt,...Lt,animation:(t,e)=>{e.data.previewing||e.data.commonGUID||(e.data.commonGUID="post-"+Math.random().toString(36).substring(2,7));const n=e.data.previewing?"preview":e.data.commonGUID,s=ct(t,e.data.raw)?._default||"",r=t.content.filter((t=>u(t)&&"keyframe"===t.tag)).map((t=>{t.isValid=!0;const n=ct(t,e.data.raw)._default||"";t.ident=n+(n.match(/^\d+$/)?"%":"");const s=t.content.filter(d).join("").replaceAll(/[\[\]\{\}]/g,"");return t.formatted=`${t.ident}{ ${s} }`,t})),o=`@keyframes ${n}${s} { ${r.map((t=>t.formatted)).join("\n")} }`;return e.data.styles.push(o),[]},bg:(t,e)=>{const n=ct(t,e.data.raw)._default;return it("div",{style:`background-color: ${n};`,class:"bb-background"},t.content)},block:(t,e)=>{const n="block",s=(ct(t,e.data.raw)._default||n).toLowerCase(),r=["block","dice","dice10","setting","warning","storyteller","announcement","important","question","encounter","information","character","treasure"].includes(s)?s:n;return it("table",{class:"bb-block","data-bb-block":r},[it("tbody",[it("tr",[it("td",{class:"bb-block-icon"}),it("td",{class:"bb-block-content"},t.content)])])])},blockquote:(t,e)=>{const n=ct(t,e.data.raw)._default||"";return it("div",{class:"bb-blockquote"},[it("div",{class:"bb-blockquote-left"}),it("div",{class:"bb-blockquote-content"},[t.content,it("div",{class:"bb-blockquote-speaker"},""!==n?`- ${n}`:"")]),it("div",{class:"bb-blockquote-right"})])},border:(t,e)=>{const n=ct(t,e.data.raw)._default;return it("div",{style:`border: ${n};`,class:"bb-border"},t.content)},br:()=>it("br",{},null),centerblock:(t,e)=>{const n=ct(t,e.data.raw)._default||"50";return it("div",{style:`margin: 0 auto; width: ${n}%`},t.content)},check:(t,e)=>{const n=ct(t,e.data.raw)._default||"dot";return it("div",{class:"bb-check","data-type":n},t.content)},class:(t,e)=>{const n=ct(t),s=n.name||n._default;e.data.previewing||e.data.commonGUID||(e.data.commonGUID="post-"+Math.random().toString(36).substring(2,7));const r=e.data.previewing?"preview":e.data.commonGUID,o=s+"__"+r,a=t.content.filter(d).map((t=>t.replaceAll("{post_id}",r).replaceAll(/[\[\]\{\}]/g,"")));let i="";const c=[];return["hover","focus","active","focus-within","focus-visible"].includes(n.state?.toLowerCase())&&(i=":"+n.state.toLowerCase()),n.selector&&(i=n.selector.replace(/[,{}\\\n]/g,"")),n.minWidth?.match(/^[0-9]+[a-z]+$/)&&c.push(`(min-width: ${n.minWidth})`),n.maxWidth?.match(/^[0-9]+[a-z]+$/)&&c.push(`(max-width: ${n.maxWidth})`),a.unshift(`.${o}${i} {`),a.push("}"),c.length&&(a.unshift(`@media ${c.join(" and ")} {`),a.push("}")),e.data.styles.push(a.join("")),[]},code:t=>({isWhitespaceSensitive:!0,content:["```"+(ct(t)._default||"bbcode")+"\n",t.content,"\n```\n"]}),color:t=>{const e=ct(t)._default||"";return""===e.trim()?t.content:it("span",{style:`color: ${e}`},t.content)},comment:t=>it("span",{class:"hidden"},t.content),div:(t,e)=>{if(t.gen)return t;const n=ct(t,e.data.raw),s=n.style||n._default,r=n.class;if(!r?.trim())return it("div",{style:s},t.content);e.data.previewing||e.data.commonGUID||(e.data.commonGUID="post-"+Math.random().toString(36).substring(2,7));const o=e.data.previewing?"preview":e.data.commonGUID,a=r.split(" ").map((t=>t+"__"+o)).join(" ");return it("div",{class:a,style:s},t.content)},divide:t=>{const e=(ct(t)._default||"").toLowerCase();return it("span",{class:"bb-divide","data-type":e},t.content)},fieldset:(t,e)=>{const n=ct(t,e.data.raw)._default||"";return it("fieldset",{class:"bb-fieldset"},[it("legend",{class:"bb-fieldset-legend"},n),it("div",{class:"bb-fieldset"},t.content)])},fa:t=>{const e=t.attrs;let n=e.style||"";return n+=e["primary-color"]?`--fa-primary-color: ${e["primary-color"]};`:"",n+=e["secondary-color"]?`--fa-secondary-color: ${e["secondary-color"]};`:"",n+=e["primary-opacity"]?`--fa-primary-opacity: ${e["primary-opacity"]};`:"",n+=e["secondary-opacity"]?`--fa-secondary-opacity: ${e["secondary-opacity"]};`:"",n+=e["rotate-angle"]?`--fa-rotate-angle: ${e["rotate-angle"]};`:"",it("i",{"data-bbcode-fa":null},[it("i",{class:(t.content||[]).join(""),style:n,"data-fa-transform":e["fa-transform"]||""},[])])},font:(t,e)=>{const n=ct(t,e.data.raw),s=n?._default||n.family||n.name;if(""===s.trim())return t.content;if(Nt.includes(s.trim().toLowerCase()))return it("span",{style:`font-family: '${s}'`},t.content);const r=(t=>{let e={ital:0,wght:400};if(t?.style){const n=t.style.trim().toLowerCase(),s=Wt.exec(n).groups||{};s?.italic&&(e.ital=1);const r=s.weight;r&&r>=0&&r<=900?e.wght=r:Object.keys(Ot).includes(s.named_weight||"")&&(e.wght=Ot[s.named_weight]),e={...e,...Object.fromEntries(Object.entries(t).filter((([t])=>Et.includes(t))))}}return e})(n),o=((t,e)=>(t=t.replaceAll(" ","+"),e=Object.keys(e).sort().reduce(((t,n)=>(t[n]=e[n],t)),{}),"https://fonts.googleapis.com/css2?family="+t+":"+Object.keys(e).join(",")+"@"+Object.values(e).join(",")))(s,r);e.data.fonts.add(o);const a=1===r.ital?"italic":"normal",i=Object.entries(r).filter((([t])=>"wght"!==t&&"ital"!==t));let c="";return i.length&&(c="font-variation-settings: "+i.map((([t,e])=>`'${t}' ${e}`)).join(", ")+";"),it("span",{style:`font-family: '${s}'; font-weight: ${r.wght}; font-style: ${a}; ${c}`,"data-font":o},t.content)},h:t=>it("h1",{},t.content),h1:t=>it("h1",{},t.content),h2:t=>it("h2",{},t.content),h3:t=>it("h3",{},t.content),h4:t=>it("h4",{},t.content),h5:t=>it("h5",{},t.content),h6:t=>it("h6",{},t.content),heightrestrict:t=>{const e=function(t){const e=t&&""!==t.trim()?t.replace(/[^\d.]/g,""):0;return e&&e>=0&&e<=700?e:0===e?0:700}(ct(t)._default).toString();return it("div","0"===e?{class:"bb-height-restrict"}:{class:"bb-height-restrict",style:`height: ${e}px;`},t.content)},highlight:t=>it("span",{class:"bb-highlight"},t.content),icode:t=>({isWhitespaceSensitive:!0,content:["`",t.content,"`"]}),imagefloat:t=>{const e=ct(t)._default||"";return it("div",{class:`bb-float-${e}`},t.content)},inlinespoiler:t=>it("span",{class:"bb-inline-spoiler"},t.content),justify:t=>it("div",{class:"bb-justify"},t.content),keyframe:(t,e)=>t.isValid?[]:[lt(t,e.data.raw),...t.content,ut(t,e.data.raw)],mail:t=>{const e=t.attrs;let n={mailOption:(e.type||"send").toLowerCase(),person:e.person||"Unknown",subject:e.subject||"Empty"};return it("div",{class:"bb-email","data-bb-email":n.mailOption},[It,(o=n.person,it("div",{class:"bb-email-address"},o)),(r=n.subject,it("div",{class:"bb-email-subject"},r)),(s=t.content,it("div",{class:"bb-email-content"},s)),Ut]);var s,r,o},newspaper:t=>it("div",{class:"bb-newspaper"},t.content),nobr:t=>({disableLineBreakConversion:!0,content:t.content}),note:t=>it("div",{class:"bb-note"},[it("div",{class:"bb-note-tape"},""),it("div",{class:"bb-note-content"},[t.content,it("div",{class:"bb-note-footer"},"")])]),ooc:t=>it("div",{class:"bb-ooc"},t.content),pindent:t=>it("span",{class:"bb-pindent"},t.content),plain:t=>t.content,print:t=>{const e="print",n=(ct(t)._default||e).toLowerCase(),s=["print","line","graph","parchment"].includes(n)?n:e;return it("div",{class:s===e?"bb-print":`bb-print-${s}`},t.content)},progress:t=>{const e=ct(t)._default;return it("div",{class:"bb-progress"},[it("div",{class:"bb-progress-text"},t.content),it("div",{class:"bb-progress-bar",style:`width: calc(${e}% - 6px)`},""),it("div",{class:"bb-progress-bar-other"},"")])},quote:(t,e)=>{const n=ct(t,e.data.raw);return"\n"===t.content[0]&&t.content.shift(),[`\n[${t.tag}="${n._default}"]\n\n`,...t.content,"\n\n[/quote]\n"]},...Vt,thinprogress:(t,e)=>{const n=ct(t,e.data.raw)._default;return it("div",{class:"bb-progress-thin"},[it("div",{class:"bb-progress-text"},t.content),it("div",{class:"bb-progress-bar",style:`width: calc(${n}% - 6px)`},""),it("div",{class:"bb-progress-bar-other"},"")])},savenl:t=>({isWhitespaceSensitive:!0,content:t.content}),sh:t=>it("h2",{},t.content),script:(t,e)=>{const n=ct(t,e.data.raw);e.data.previewing||e.data.commonGUID||(e.data.commonGUID="post-"+Math.random().toString(36).substring(2,7));const s=e.data.previewing?"preview":e.data.commonGUID,r=Dt.includes(n.on?.toLowerCase()||"init")&&n.on?.toLowerCase()||"init",o={id:s,class:n.class||"",on:r,version:n.version||"",content:t.content.join("")};return e.data.bbscripts.push(o),[]},scroll:(t,e)=>{const n=function(t){const e=t&&""!==t.trim()?t.replace(/[^\d.]/g,""):0;return e&&e>=0&&e<=700?e:0===e?0:700}(ct(t,e.data.raw)._default);return it("div",{class:"bb-scroll",style:`height: ${n}px`},t.content)},side:t=>{const e=ct(t)._default||"left";return it("div",{class:"bb-side","data-side":e},t.content)},size:t=>{const e=function(t){let e,n={valid:!0};const s=/(\d+\.?\d?)(px|rem)?/i.exec(t),r=36,o=8,a=3,i=.2,c=7,l=1;if(s&&(e=s[1])){switch(n.unit=(s[2]||"").toLowerCase(),n.unit){case"px":e>r?e=r:ea?e=a:ec?e=c:e{const n=ct(t,e.data.raw)._default;return it("details",{class:"bb-spoiler"},[it("summary",{},"Spoiler"+(n?`: ${n}`:"")),it("div",{class:"bb-spoiler-content"},t.content)])},sub:t=>it("sub",{},t.content),sup:t=>it("sup",{},t.content),tab:(t,e)=>{if(!t.isValid)return[lt(t,e.data.raw),...t.content,ut(t,e.data.raw)];const n=ct(t,e.data.raw),s=n._default||n.name||"Tab",r=`tab-${s.replace(/\W/g,"_")}-${yt()}`;return[it("input",{type:"radio",id:r,name:"tab-group-"+t.groupId,class:"bb-tab",checked:t.open}),it("label",{class:"bb-tab-label",for:r,style:n.style},s),it("div",{class:"bb-tab-content"},t.content)]},tabs:(t,e)=>{const n=t.content.filter((t=>u(t)&&"tab"===t.tag)),s=yt();return n.forEach((t=>{t.isValid=!0,t.groupId=s})),n.length?(n[0].open=!0,it("div",{class:"bb-tabs"},n)):[lt(t,e.data.raw),...t.content,ut(t,e.data.raw)]},...qt,b:t=>it("span",{class:"bbcode-b"},t.content),i:t=>t.gen?t:it("span",{class:"bbcode-i"},t.content),u:t=>it("span",{class:"bbcode-u"},t.content),s:t=>it("span",{class:"bbcode-s"},t.content)},Pt=Object.keys(zt),Mt=function t(e,n=$t){const s=t=>{function r(t,r){return n(e,t,r,s.options||{})}return s.options=Object.assign(s.options||{},t),r.options=s.options,r};return s.extend=function(r){return t(r(e,s.options),n)},s}(zt);function Bt(t){return t.replaceAll(gt,"").replaceAll(ht,"").replaceAll("\n"+pt,"").replaceAll(pt+"\n","").replaceAll(pt,"")}function Rt(t,e){const n=e.hoistMap;for(const[e,s]of Object.entries(n))t=t.replaceAll(e,s);return t}function Ft(t,e){if(0===e.styles.length)return t;return'"+t}function Jt(t,e){if(0===e.bbscripts.length)return t;return e.bbscripts.map((t=>``)).join("")+t}function Zt(t,e){const n={};let s=0;const r=(e,s,r,o=!1)=>{const a=yt();return-1!==s?(n[a]=t.substring(e,s),t=t.substring(0,e)+a+t.substring(s)):(n[a]=t.substring(e),t=t.substring(0,e)+a+r),o&&(n[a].startsWith("\n")&&(n[a]=n[a].substring(1)),n[a].endsWith("\n")&&(n[a]=n[a].substring(0,n[a].length-1))),e+a.length+r.length};for(;-1!==(s=dt(t,bt,s));){const e=bt.exec(t.substring(s));if(e.groups?.fence){const r=e.groups.fence,o=e.groups.fenceInfo;"\n"===t[s]&&(s+=1);const a=new RegExp("\n"+r+"(\n|$)"),i=dt(t,a,s+r.length),c=yt();n[c]=-1!==i?t.substring(s+r.length+o.length,i):t.substring(s+r.length+o.length);const l=`[saveNL]\n${r}${o}${c}\n${r}\n[/saveNL]`;t=t.substring(0,s)+l+(-1!==i?t.substring(i+1+r.length):""),s+=l.length}else if(e.groups?.bbcode){const n=e.groups.bbcode,o=`[/${e.groups.bbcodeTag.toLowerCase()}]`,a=t.toLowerCase().indexOf(o,s+1);s=r(s+n.length,a,o,!0)}else if(e.groups.backtick){const t=e.groups.backtick,n=e.groups.tickStart,o=e.groups.tickEnd;s=r(s+n.length,s+t.length-o.length,o)}}return e.hoistMap=n,[t,e]}function Ht(t,e){let n=0;for(;-1!==(n=dt(t,mt,n));){const e=mt.exec(t.substring(n))[0],s=`[saveNL]\n${e}\n[/saveNL]`;t=t.substring(0,n)+s+t.substring(n+e.length),n+=s.length}return[t,e]}const Kt={onlyAllowTags:[...Pt],caseFreeTags:!0,contextFreeTags:["plain","code","icode","class","fa"],enableEscapeTags:!0,onError:t=>{Kt.previewing&&console.warn(t.message,t.lineNumber,t.columnNumber)}},Qt=Mt();t.RpNBBCode=(t,e)=>{const n=[Qt];e.preserveWhitespace&&n.push((t=>xt(t))),n.push((t=>vt(t)));const[s,r]=function(t){let e={};const n=[Zt,Ht];for(const s of n)[t,e]=s(t,e);return[t,e]}(t);return function(t){const e="function"==typeof t?[t]:t,n=()=>"";return{process(t,s){const r=s||{skipParse:!1,parser:H,render:n,data:null},o=r.parser||H,a=r.render,i=r.data||null;if("function"!=typeof o)throw new Error("C1");const c=r.skipParse&&Array.isArray(t)?t:o(t,r);let l=r.skipParse&&Array.isArray(t)?tt(t||[],r):tt(c,r);for(let t=0;treduce(acc, key, obj), def);\n}\nfunction getNodeLength(node) {\n if (isTagNode(node) && Array.isArray(node.content)) {\n return node.content.reduce((count, contentNode)=>{\n return count + getNodeLength(contentNode);\n }, 0);\n }\n if (isStringNode(node)) {\n return String(node).length;\n }\n return 0;\n}\nfunction appendToNode(node, value) {\n if (Array.isArray(node.content)) {\n node.content.push(value);\n }\n}\n/**\n * Replaces \" to &qquot;\n * @param {string} value\n */ function escapeAttrValue(value) {\n return value.replace(/&/g, '&').replace(//g, '>').replace(/\"/g, '"').replace(/'/g, ''')// eslint-disable-next-line no-script-url\n .replace(/(javascript|data|vbscript):/gi, '$1%3A');\n}\n/**\n * @deprecated use escapeAttrValue\n */ const escapeHTML = escapeAttrValue;\n/**\n * Accept name and value and return valid html5 attribute string\n */ function attrValue(name, value) {\n // in case of performance\n switch(typeof value){\n case 'boolean':\n return value ? `${name}` : '';\n case 'number':\n return `${name}=\"${value}\"`;\n case 'string':\n return `${name}=\"${escapeAttrValue(value)}\"`;\n case 'object':\n return `${name}=\"${escapeAttrValue(JSON.stringify(value))}\"`;\n default:\n return '';\n }\n}\n/**\n * Transforms attrs to html params string\n * @example\n * attrsToString({ 'foo': true, 'bar': bar' }) => 'foo=\"true\" bar=\"bar\"'\n */ function attrsToString(values) {\n // To avoid some malformed attributes\n if (values == null) {\n return '';\n }\n return keysReduce(values, (arr, key, obj)=>[\n ...arr,\n attrValue(key, obj[key])\n ], [\n ''\n ]).join(' ');\n}\n/**\n * Gets value from\n * @example\n * getUniqAttr({ 'foo': true, 'bar': bar' }) => 'bar'\n */ function getUniqAttr(attrs) {\n return keysReduce(attrs || {}, (res, key, obj)=>obj[key] === key ? obj[key] : null, null);\n}\nexport { attrsToString, attrValue, appendToNode, escapeHTML, escapeAttrValue, getNodeLength, getUniqAttr, isTagNode, isStringNode, isEOL };\n","import { OPEN_BRAKET, CLOSE_BRAKET, SLASH } from './char';\nimport { getUniqAttr, getNodeLength, appendToNode, attrsToString, attrValue, isTagNode } from './helpers';\nconst getTagAttrs = (tag, params)=>{\n const uniqAttr = getUniqAttr(params);\n if (uniqAttr) {\n const tagAttr = attrValue(tag, uniqAttr);\n const attrs = {\n ...params\n };\n delete attrs[String(uniqAttr)];\n const attrsStr = attrsToString(attrs);\n return `${tagAttr}${attrsStr}`;\n }\n return `${tag}${attrsToString(params)}`;\n};\nconst renderContent = (content, openTag, closeTag)=>{\n const toString = (node)=>{\n if (isTagNode(node)) {\n return node.toString({\n openTag,\n closeTag\n });\n }\n return String(node);\n };\n if (Array.isArray(content)) {\n return content.reduce((r, node)=>{\n if (node !== null) {\n return r + toString(node);\n }\n return r;\n }, '');\n }\n if (content) {\n return toString(content);\n }\n return null;\n};\nexport class TagNode {\n attr(name, value) {\n if (typeof value !== 'undefined') {\n this.attrs[name] = value;\n }\n return this.attrs[name];\n }\n append(value) {\n return appendToNode(this, value);\n }\n setStart(value) {\n this.start = value;\n }\n setEnd(value) {\n this.end = value;\n }\n get length() {\n return getNodeLength(this);\n }\n toTagStart({ openTag = OPEN_BRAKET, closeTag = CLOSE_BRAKET } = {}) {\n const tagAttrs = getTagAttrs(String(this.tag), this.attrs);\n return `${openTag}${tagAttrs}${closeTag}`;\n }\n toTagEnd({ openTag = OPEN_BRAKET, closeTag = CLOSE_BRAKET } = {}) {\n return `${openTag}${SLASH}${this.tag}${closeTag}`;\n }\n toTagNode() {\n const newNode = new TagNode(String(this.tag).toLowerCase(), this.attrs, this.content);\n if (this.start) {\n newNode.setStart(this.start);\n }\n if (this.end) {\n newNode.setEnd(this.end);\n }\n return newNode;\n }\n toString({ openTag = OPEN_BRAKET, closeTag = CLOSE_BRAKET } = {}) {\n const content = this.content ? renderContent(this.content, openTag, closeTag) : '';\n const tagStart = this.toTagStart({\n openTag,\n closeTag\n });\n if (this.content === null || Array.isArray(this.content) && this.content.length === 0) {\n return tagStart;\n }\n return `${tagStart}${content}${this.toTagEnd({\n openTag,\n closeTag\n })}`;\n }\n static create(tag, attrs = {}, content = null, start) {\n const node = new TagNode(tag, attrs, content);\n if (start) {\n node.setStart(start);\n }\n return node;\n }\n static isOf(node, type) {\n return node.tag === type;\n }\n constructor(tag, attrs, content){\n this.tag = tag;\n this.attrs = attrs;\n this.content = content;\n }\n}\n","import { OPEN_BRAKET, CLOSE_BRAKET, SLASH } from '@bbob/plugin-helper';\n// type, value, line, row, start pos, end pos\nconst TOKEN_TYPE_ID = 't'; // 0;\nconst TOKEN_VALUE_ID = 'v'; // 1;\nconst TOKEN_COLUMN_ID = 'r'; // 2;\nconst TOKEN_LINE_ID = 'l'; // 3;\nconst TOKEN_START_POS_ID = 's'; // 4;\nconst TOKEN_END_POS_ID = 'e'; // 5;\nconst TOKEN_TYPE_WORD = 1; // 'word';\nconst TOKEN_TYPE_TAG = 2; // 'tag';\nconst TOKEN_TYPE_ATTR_NAME = 3; // 'attr-name';\nconst TOKEN_TYPE_ATTR_VALUE = 4; // 'attr-value';\nconst TOKEN_TYPE_SPACE = 5; // 'space';\nconst TOKEN_TYPE_NEW_LINE = 6; // 'new-line';\nconst getTokenValue = (token)=>{\n if (token && typeof token[TOKEN_VALUE_ID] !== 'undefined') {\n return token[TOKEN_VALUE_ID];\n }\n return '';\n};\nconst getTokenLine = (token)=>token && token[TOKEN_LINE_ID] || 0;\nconst getTokenColumn = (token)=>token && token[TOKEN_COLUMN_ID] || 0;\nconst getStartPosition = (token)=>token && token[TOKEN_START_POS_ID] || 0;\nconst getEndPosition = (token)=>token && token[TOKEN_END_POS_ID] || 0;\nconst isTextToken = (token)=>{\n if (token && typeof token[TOKEN_TYPE_ID] !== 'undefined') {\n return token[TOKEN_TYPE_ID] === TOKEN_TYPE_SPACE || token[TOKEN_TYPE_ID] === TOKEN_TYPE_NEW_LINE || token[TOKEN_TYPE_ID] === TOKEN_TYPE_WORD;\n }\n return false;\n};\nconst isTagToken = (token)=>{\n if (token && typeof token[TOKEN_TYPE_ID] !== 'undefined') {\n return token[TOKEN_TYPE_ID] === TOKEN_TYPE_TAG;\n }\n return false;\n};\nconst isTagEnd = (token)=>getTokenValue(token).charCodeAt(0) === SLASH.charCodeAt(0);\nconst isTagStart = (token)=>!isTagEnd(token);\nconst isAttrNameToken = (token)=>{\n if (token && typeof token[TOKEN_TYPE_ID] !== 'undefined') {\n return token[TOKEN_TYPE_ID] === TOKEN_TYPE_ATTR_NAME;\n }\n return false;\n};\nconst isAttrValueToken = (token)=>{\n if (token && typeof token[TOKEN_TYPE_ID] !== 'undefined') {\n return token[TOKEN_TYPE_ID] === TOKEN_TYPE_ATTR_VALUE;\n }\n return false;\n};\nconst getTagName = (token)=>{\n const value = getTokenValue(token);\n return isTagEnd(token) ? value.slice(1) : value;\n};\nconst tokenToText = (token)=>{\n let text = OPEN_BRAKET;\n text += getTokenValue(token);\n text += CLOSE_BRAKET;\n return text;\n};\n/**\n * @export\n * @class Token\n */ class Token {\n get type() {\n return this[TOKEN_TYPE_ID];\n }\n isEmpty() {\n return this[TOKEN_TYPE_ID] === 0 || isNaN(this[TOKEN_TYPE_ID]);\n }\n isText() {\n return isTextToken(this);\n }\n isTag() {\n return isTagToken(this);\n }\n isAttrName() {\n return isAttrNameToken(this);\n }\n isAttrValue() {\n return isAttrValueToken(this);\n }\n isStart() {\n return isTagStart(this);\n }\n isEnd() {\n return isTagEnd(this);\n }\n getName() {\n return getTagName(this);\n }\n getValue() {\n return getTokenValue(this);\n }\n getLine() {\n return getTokenLine(this);\n }\n getColumn() {\n return getTokenColumn(this);\n }\n getStart() {\n return getStartPosition(this);\n }\n getEnd() {\n return getEndPosition(this);\n }\n toString() {\n return tokenToText(this);\n }\n constructor(type, value, row = 0, col = 0, start = 0, end = 0){\n this[TOKEN_LINE_ID] = row;\n this[TOKEN_COLUMN_ID] = col;\n this[TOKEN_TYPE_ID] = type || 0;\n this[TOKEN_VALUE_ID] = String(value);\n this[TOKEN_START_POS_ID] = start;\n this[TOKEN_END_POS_ID] = end;\n }\n}\nexport const TYPE_ID = TOKEN_TYPE_ID;\nexport const VALUE_ID = TOKEN_VALUE_ID;\nexport const LINE_ID = TOKEN_LINE_ID;\nexport const COLUMN_ID = TOKEN_COLUMN_ID;\nexport const START_POS_ID = TOKEN_START_POS_ID;\nexport const END_POS_ID = TOKEN_END_POS_ID;\nexport const TYPE_WORD = TOKEN_TYPE_WORD;\nexport const TYPE_TAG = TOKEN_TYPE_TAG;\nexport const TYPE_ATTR_NAME = TOKEN_TYPE_ATTR_NAME;\nexport const TYPE_ATTR_VALUE = TOKEN_TYPE_ATTR_VALUE;\nexport const TYPE_SPACE = TOKEN_TYPE_SPACE;\nexport const TYPE_NEW_LINE = TOKEN_TYPE_NEW_LINE;\nexport { Token };\nexport default Token;\n","import { QUOTEMARK, BACKSLASH } from '@bbob/plugin-helper';\nexport class CharGrabber {\n skip(num = 1, silent) {\n this.c.pos += num;\n if (this.o && this.o.onSkip && !silent) {\n this.o.onSkip();\n }\n }\n hasNext() {\n return this.c.len > this.c.pos;\n }\n getCurr() {\n if (typeof this.s[this.c.pos] === 'undefined') {\n return '';\n }\n return this.s[this.c.pos];\n }\n getPos() {\n return this.c.pos;\n }\n getLength() {\n return this.c.len;\n }\n getRest() {\n return this.s.substring(this.c.pos);\n }\n getNext() {\n const nextPos = this.c.pos + 1;\n return nextPos <= this.s.length - 1 ? this.s[nextPos] : null;\n }\n getPrev() {\n const prevPos = this.c.pos - 1;\n if (typeof this.s[prevPos] === 'undefined') {\n return null;\n }\n return this.s[prevPos];\n }\n isLast() {\n return this.c.pos === this.c.len;\n }\n includes(val) {\n return this.s.indexOf(val, this.c.pos) >= 0;\n }\n grabWhile(condition, silent) {\n let start = 0;\n if (this.hasNext()) {\n start = this.c.pos;\n while(this.hasNext() && condition(this.getCurr())){\n this.skip(1, silent);\n }\n }\n return this.s.substring(start, this.c.pos);\n }\n grabN(num = 0) {\n return this.s.substring(this.c.pos, this.c.pos + num);\n }\n /**\n * Grabs rest of string until it find a char\n */ substrUntilChar(char) {\n const { pos } = this.c;\n const idx = this.s.indexOf(char, pos);\n return idx >= 0 ? this.s.substring(pos, idx) : '';\n }\n constructor(source, options = {}){\n this.s = source;\n this.c = {\n pos: 0,\n len: source.length\n };\n this.o = options;\n }\n}\n/**\n * Creates a grabber wrapper for source string, that helps to iterate over string char by char\n */ export const createCharGrabber = (source, options)=>new CharGrabber(source, options);\n/**\n * Trims string from start and end by char\n * @example\n * trimChar('*hello*', '*') ==> 'hello'\n */ export const trimChar = (str, charToRemove)=>{\n while(str.charAt(0) === charToRemove){\n // eslint-disable-next-line no-param-reassign\n str = str.substring(1);\n }\n while(str.charAt(str.length - 1) === charToRemove){\n // eslint-disable-next-line no-param-reassign\n str = str.substring(0, str.length - 1);\n }\n return str;\n};\n/**\n * Unquotes \\\" to \"\n */ export const unquote = (str)=>str.replace(BACKSLASH + QUOTEMARK, QUOTEMARK);\n","/* eslint-disable no-plusplus,no-param-reassign */ import { OPEN_BRAKET, CLOSE_BRAKET, QUOTEMARK, BACKSLASH, SLASH, SPACE, TAB, EQ, N } from '@bbob/plugin-helper';\nimport { Token, TYPE_ATTR_NAME, TYPE_ATTR_VALUE, TYPE_NEW_LINE, TYPE_SPACE, TYPE_TAG, TYPE_WORD } from './Token';\nimport { createCharGrabber, trimChar, unquote } from './utils';\n// for cases \nconst EM = '!';\nexport function createTokenOfType(type, value, r = 0, cl = 0, p = 0, e = 0) {\n return new Token(type, value, r, cl, p, e);\n}\nconst STATE_WORD = 0;\nconst STATE_TAG = 1;\nconst STATE_TAG_ATTRS = 2;\nconst TAG_STATE_NAME = 0;\nconst TAG_STATE_ATTR = 1;\nconst TAG_STATE_VALUE = 2;\nconst WHITESPACES = [\n SPACE,\n TAB\n];\nconst SPECIAL_CHARS = [\n EQ,\n SPACE,\n TAB\n];\nconst END_POS_OFFSET = 2; // length + start position offset\nconst isWhiteSpace = (char)=>WHITESPACES.indexOf(char) >= 0;\nconst isEscapeChar = (char)=>char === BACKSLASH;\nconst isSpecialChar = (char)=>SPECIAL_CHARS.indexOf(char) >= 0;\nconst isNewLine = (char)=>char === N;\nconst unq = (val)=>unquote(trimChar(val, QUOTEMARK));\nexport function createLexer(buffer, options = {}) {\n let row = 0;\n let prevCol = 0;\n let col = 0;\n let tokenIndex = -1;\n let stateMode = STATE_WORD;\n let tagMode = TAG_STATE_NAME;\n let contextFreeTag = '';\n const tokens = new Array(Math.floor(buffer.length));\n const openTag = options.openTag || OPEN_BRAKET;\n const closeTag = options.closeTag || CLOSE_BRAKET;\n const escapeTags = !!options.enableEscapeTags;\n const contextFreeTags = (options.contextFreeTags || []).filter(Boolean).map((tag)=>tag.toLowerCase());\n const nestedMap = new Map();\n const onToken = options.onToken || (()=>{});\n const RESERVED_CHARS = [\n closeTag,\n openTag,\n QUOTEMARK,\n BACKSLASH,\n SPACE,\n TAB,\n EQ,\n N,\n EM\n ];\n const NOT_CHAR_TOKENS = [\n openTag,\n SPACE,\n TAB,\n N\n ];\n const isCharReserved = (char)=>RESERVED_CHARS.indexOf(char) >= 0;\n const isCharToken = (char)=>NOT_CHAR_TOKENS.indexOf(char) === -1;\n const isEscapableChar = (char)=>char === openTag || char === closeTag || char === BACKSLASH;\n const onSkip = ()=>{\n col++;\n };\n const checkContextFreeMode = (name, isClosingTag)=>{\n if (contextFreeTag !== '' && isClosingTag) {\n contextFreeTag = '';\n }\n if (contextFreeTag === '' && contextFreeTags.includes(name.toLowerCase())) {\n contextFreeTag = name;\n }\n };\n const chars = createCharGrabber(buffer, {\n onSkip\n });\n /**\n * Emits newly created token to subscriber\n * @param {Number} type\n * @param {String} value\n */ function emitToken(type, value, startPos, endPos) {\n const token = createTokenOfType(type, value, row, prevCol, startPos, endPos);\n onToken(token);\n prevCol = col;\n tokenIndex += 1;\n tokens[tokenIndex] = token;\n }\n function nextTagState(tagChars, isSingleValueTag, masterStartPos) {\n if (tagMode === TAG_STATE_ATTR) {\n const validAttrName = (char)=>!(char === EQ || isWhiteSpace(char));\n const name = tagChars.grabWhile(validAttrName);\n const isEnd = tagChars.isLast();\n const isValue = tagChars.getCurr() !== EQ;\n tagChars.skip();\n if (isEnd || isValue) {\n emitToken(TYPE_ATTR_VALUE, unq(name));\n } else {\n emitToken(TYPE_ATTR_NAME, name);\n }\n if (isEnd) {\n return TAG_STATE_NAME;\n }\n if (isValue) {\n return TAG_STATE_ATTR;\n }\n return TAG_STATE_VALUE;\n }\n if (tagMode === TAG_STATE_VALUE) {\n let stateSpecial = false;\n const validAttrValue = (char)=>{\n // const isEQ = char === EQ;\n const isQM = char === QUOTEMARK;\n const prevChar = tagChars.getPrev();\n const nextChar = tagChars.getNext();\n const isPrevSLASH = prevChar === BACKSLASH;\n const isNextEQ = nextChar === EQ;\n const isWS = isWhiteSpace(char);\n // const isPrevWS = isWhiteSpace(prevChar);\n const isNextWS = nextChar && isWhiteSpace(nextChar);\n if (stateSpecial && isSpecialChar(char)) {\n return true;\n }\n if (isQM && !isPrevSLASH) {\n stateSpecial = !stateSpecial;\n if (!stateSpecial && !(isNextEQ || isNextWS)) {\n return false;\n }\n }\n if (!isSingleValueTag) {\n return !isWS;\n // return (isEQ || isWS) === false;\n }\n return true;\n };\n const name = tagChars.grabWhile(validAttrValue);\n tagChars.skip();\n emitToken(TYPE_ATTR_VALUE, unq(name));\n if (tagChars.getPrev() === QUOTEMARK) {\n prevCol++;\n }\n if (tagChars.isLast()) {\n return TAG_STATE_NAME;\n }\n return TAG_STATE_ATTR;\n }\n const start = masterStartPos + tagChars.getPos() - 1;\n const validName = (char)=>!(char === EQ || isWhiteSpace(char) || tagChars.isLast());\n const name = tagChars.grabWhile(validName);\n emitToken(TYPE_TAG, name, start, masterStartPos + tagChars.getLength() + 1);\n checkContextFreeMode(name);\n tagChars.skip();\n prevCol++;\n // in cases when we has [url=someval]GET[/url] and we dont need to parse all\n if (isSingleValueTag) {\n return TAG_STATE_VALUE;\n }\n const hasEQ = tagChars.includes(EQ);\n return hasEQ ? TAG_STATE_ATTR : TAG_STATE_VALUE;\n }\n function stateTag() {\n const currChar = chars.getCurr();\n const nextChar = chars.getNext();\n chars.skip();\n // detect case where we have '[My word [tag][/tag]' or we have '[My last line word'\n const substr = chars.substrUntilChar(closeTag);\n const hasInvalidChars = substr.length === 0 || substr.indexOf(openTag) >= 0;\n if (nextChar && isCharReserved(nextChar) || hasInvalidChars || chars.isLast()) {\n emitToken(TYPE_WORD, currChar);\n return STATE_WORD;\n }\n // [myTag ]\n const isNoAttrsInTag = substr.indexOf(EQ) === -1;\n // [/myTag]\n const isClosingTag = substr[0] === SLASH;\n if (isNoAttrsInTag || isClosingTag) {\n const startPos = chars.getPos() - 1;\n const name = chars.grabWhile((char)=>char !== closeTag);\n const endPos = startPos + name.length + END_POS_OFFSET;\n chars.skip(); // skip closeTag\n emitToken(TYPE_TAG, name, startPos, endPos);\n checkContextFreeMode(name, isClosingTag);\n return STATE_WORD;\n }\n return STATE_TAG_ATTRS;\n }\n function stateAttrs() {\n const startPos = chars.getPos();\n const silent = true;\n const tagStr = chars.grabWhile((char)=>char !== closeTag, silent);\n const tagGrabber = createCharGrabber(tagStr, {\n onSkip\n });\n const hasSpace = tagGrabber.includes(SPACE);\n tagMode = TAG_STATE_NAME;\n while(tagGrabber.hasNext()){\n tagMode = nextTagState(tagGrabber, !hasSpace, startPos);\n }\n chars.skip(); // skip closeTag\n return STATE_WORD;\n }\n function stateWord() {\n if (isNewLine(chars.getCurr())) {\n emitToken(TYPE_NEW_LINE, chars.getCurr());\n chars.skip();\n col = 0;\n prevCol = 0;\n row++;\n return STATE_WORD;\n }\n if (isWhiteSpace(chars.getCurr())) {\n const word = chars.grabWhile(isWhiteSpace);\n emitToken(TYPE_SPACE, word);\n return STATE_WORD;\n }\n if (chars.getCurr() === openTag) {\n if (contextFreeTag) {\n const fullTagLen = openTag.length + SLASH.length + contextFreeTag.length;\n const fullTagName = `${openTag}${SLASH}${contextFreeTag}`;\n const foundTag = chars.grabN(fullTagLen);\n const isEndContextFreeMode = foundTag === fullTagName;\n if (isEndContextFreeMode) {\n return STATE_TAG;\n }\n } else if (chars.includes(closeTag)) {\n return STATE_TAG;\n }\n emitToken(TYPE_WORD, chars.getCurr());\n chars.skip();\n prevCol++;\n return STATE_WORD;\n }\n if (escapeTags) {\n if (isEscapeChar(chars.getCurr())) {\n const currChar = chars.getCurr();\n const nextChar = chars.getNext();\n chars.skip(); // skip the \\ without emitting anything\n if (nextChar && isEscapableChar(nextChar)) {\n chars.skip(); // skip past the [, ] or \\ as well\n emitToken(TYPE_WORD, nextChar);\n return STATE_WORD;\n }\n emitToken(TYPE_WORD, currChar);\n return STATE_WORD;\n }\n const isChar = (char)=>isCharToken(char) && !isEscapeChar(char);\n const word = chars.grabWhile(isChar);\n emitToken(TYPE_WORD, word);\n return STATE_WORD;\n }\n const word = chars.grabWhile(isCharToken);\n emitToken(TYPE_WORD, word);\n return STATE_WORD;\n }\n function tokenize() {\n stateMode = STATE_WORD;\n while(chars.hasNext()){\n switch(stateMode){\n case STATE_TAG:\n stateMode = stateTag();\n break;\n case STATE_TAG_ATTRS:\n stateMode = stateAttrs();\n break;\n case STATE_WORD:\n default:\n stateMode = stateWord();\n break;\n }\n }\n tokens.length = tokenIndex + 1;\n return tokens;\n }\n function isTokenNested(token) {\n const value = openTag + SLASH + token.getValue();\n if (nestedMap.has(value)) {\n return !!nestedMap.get(value);\n } else {\n const status = buffer.indexOf(value) > -1;\n nestedMap.set(value, status);\n return status;\n }\n }\n return {\n tokenize,\n isTokenNested\n };\n}\n","import { CLOSE_BRAKET, OPEN_BRAKET, TagNode, isTagNode } from \"@bbob/plugin-helper\";\nimport { createLexer } from \"./lexer\";\nclass NodeList {\n last() {\n if (Array.isArray(this.n) && this.n.length > 0 && typeof this.n[this.n.length - 1] !== \"undefined\") {\n return this.n[this.n.length - 1];\n }\n return null;\n }\n flush() {\n return this.n.length ? this.n.pop() : false;\n }\n push(value) {\n this.n.push(value);\n }\n toArray() {\n return this.n;\n }\n constructor(){\n this.n = [];\n }\n}\nconst createList = ()=>new NodeList();\nfunction parse(input, opts = {}) {\n const options = opts;\n const openTag = options.openTag || OPEN_BRAKET;\n const closeTag = options.closeTag || CLOSE_BRAKET;\n const onlyAllowTags = (options.onlyAllowTags || []).filter(Boolean).map((tag)=>tag.toLowerCase());\n let tokenizer = null;\n /**\n * Result AST of nodes\n * @private\n * @type {NodeList}\n */ const nodes = createList();\n /**\n * Temp buffer of nodes that's nested to another node\n * @private\n */ const nestedNodes = createList();\n /**\n * Temp buffer of nodes [tag..]...[/tag]\n * @private\n * @type {NodeList}\n */ const tagNodes = createList();\n /**\n * Temp buffer of tag attributes\n * @private\n * @type {NodeList}\n */ const tagNodesAttrName = createList();\n /**\n * Cache for nested tags checks\n */ const nestedTagsMap = new Set();\n function isTokenNested(token) {\n const value = token.getValue();\n const { isTokenNested } = tokenizer || {};\n if (!nestedTagsMap.has(value) && isTokenNested && isTokenNested(token)) {\n nestedTagsMap.add(value);\n return true;\n }\n return nestedTagsMap.has(value);\n }\n /**\n * @private\n */ function isTagNested(tagName) {\n return Boolean(nestedTagsMap.has(tagName));\n }\n /**\n * @private\n */ function isAllowedTag(value) {\n if (onlyAllowTags.length) {\n return onlyAllowTags.indexOf(value.toLowerCase()) >= 0;\n }\n return true;\n }\n /**\n * Flushes temp tag nodes and its attributes buffers\n * @private\n */ function flushTagNodes() {\n if (tagNodes.flush()) {\n tagNodesAttrName.flush();\n }\n }\n /**\n * @private\n */ function getNodes() {\n const lastNestedNode = nestedNodes.last();\n if (lastNestedNode && isTagNode(lastNestedNode)) {\n return lastNestedNode.content;\n }\n return nodes.toArray();\n }\n /**\n * @private\n */ function appendNodeAsString(nodes, node, isNested = true) {\n if (Array.isArray(nodes) && typeof node !== \"undefined\") {\n nodes.push(node.toTagStart({\n openTag,\n closeTag\n }));\n if (Array.isArray(node.content) && node.content.length) {\n node.content.forEach((item)=>{\n nodes.push(item);\n });\n if (isNested) {\n nodes.push(node.toTagEnd({\n openTag,\n closeTag\n }));\n }\n }\n }\n }\n /**\n * @private\n */ function appendNodes(nodes, node) {\n if (Array.isArray(nodes) && typeof node !== \"undefined\") {\n if (isTagNode(node)) {\n if (isAllowedTag(node.tag)) {\n nodes.push(node.toTagNode());\n } else {\n appendNodeAsString(nodes, node);\n }\n } else {\n nodes.push(node);\n }\n }\n }\n /**\n * @private\n * @param {Token} token\n */ function handleTagStart(token) {\n flushTagNodes();\n const tagNode = TagNode.create(token.getValue(), {}, [], {\n from: token.getStart(),\n to: token.getEnd()\n });\n const isNested = isTokenNested(token);\n tagNodes.push(tagNode);\n if (isNested) {\n nestedNodes.push(tagNode);\n } else {\n const nodes = getNodes();\n appendNodes(nodes, tagNode);\n }\n }\n /**\n * @private\n * @param {Token} token\n */ function handleTagEnd(token) {\n const lastTagNode = nestedNodes.last();\n if (isTagNode(lastTagNode)) {\n lastTagNode.setEnd({\n from: token.getStart(),\n to: token.getEnd()\n });\n }\n flushTagNodes();\n const lastNestedNode = nestedNodes.flush();\n if (lastNestedNode) {\n const nodes = getNodes();\n appendNodes(nodes, lastNestedNode);\n } else if (typeof options.onError === \"function\") {\n const tag = token.getValue();\n const line = token.getLine();\n const column = token.getColumn();\n options.onError({\n tagName: tag,\n lineNumber: line,\n columnNumber: column\n });\n }\n }\n /**\n * @private\n * @param {Token} token\n */ function handleTag(token) {\n // [tag]\n if (token.isStart()) {\n handleTagStart(token);\n }\n // [/tag]\n if (token.isEnd()) {\n handleTagEnd(token);\n }\n }\n /**\n * @private\n * @param {Token} token\n */ function handleNode(token) {\n /**\n * @type {TagNode}\n */ const activeTagNode = tagNodes.last();\n const tokenValue = token.getValue();\n const isNested = isTagNested(token.toString());\n const nodes = getNodes();\n if (activeTagNode !== null) {\n if (token.isAttrName()) {\n tagNodesAttrName.push(tokenValue);\n const attrName = tagNodesAttrName.last();\n if (attrName) {\n activeTagNode.attr(attrName, \"\");\n }\n } else if (token.isAttrValue()) {\n const attrName = tagNodesAttrName.last();\n if (attrName) {\n activeTagNode.attr(attrName, tokenValue);\n tagNodesAttrName.flush();\n } else {\n activeTagNode.attr(tokenValue, tokenValue);\n }\n } else if (token.isText()) {\n if (isNested) {\n activeTagNode.append(tokenValue);\n } else {\n appendNodes(nodes, tokenValue);\n }\n } else if (token.isTag()) {\n // if tag is not allowed, just pass it as is\n appendNodes(nodes, token.toString());\n }\n } else if (token.isText()) {\n appendNodes(nodes, tokenValue);\n } else if (token.isTag()) {\n // if tag is not allowed, just pass it as is\n appendNodes(nodes, token.toString());\n }\n }\n /**\n * @private\n * @param {Token} token\n */ function onToken(token) {\n if (token.isTag()) {\n handleTag(token);\n } else {\n handleNode(token);\n }\n }\n const lexer = opts.createTokenizer ? opts.createTokenizer : createLexer;\n tokenizer = lexer(input, {\n onToken,\n openTag,\n closeTag,\n onlyAllowTags: options.onlyAllowTags,\n contextFreeTags: options.contextFreeTags,\n enableEscapeTags: options.enableEscapeTags\n });\n // eslint-disable-next-line no-unused-vars\n const tokens = tokenizer.tokenize();\n // handles situations where we open tag, but forgot close them\n // for ex [q]test[/q][u]some[/u][q]some [u]some[/u] // forgot to close [/q]\n // so we need to flush nested content to nodes array\n const lastNestedNode = nestedNodes.flush();\n if (lastNestedNode !== null && lastNestedNode && isTagNode(lastNestedNode) && isTagNested(lastNestedNode.tag)) {\n appendNodeAsString(getNodes(), lastNestedNode, false);\n }\n return nodes.toArray();\n}\nexport { parse };\nexport default parse;\n","/* eslint-disable no-plusplus */ const isObj = (value)=>typeof value === 'object' && value !== null;\nconst isBool = (value)=>typeof value === 'boolean';\nexport function iterate(t, cb) {\n const tree = t;\n if (Array.isArray(tree)) {\n for(let idx = 0; idx < tree.length; idx++){\n tree[idx] = iterate(cb(tree[idx]), cb);\n }\n } else if (isObj(tree) && 'content' in tree) {\n iterate(tree.content, cb);\n }\n return tree;\n}\nexport function same(expected, actual) {\n if (typeof expected !== typeof actual) {\n return false;\n }\n if (!isObj(expected) || expected === null) {\n return expected === actual;\n }\n if (Array.isArray(expected)) {\n return expected.every((exp)=>[].some.call(actual, (act)=>same(exp, act)));\n }\n if (isObj(expected) && isObj(actual)) {\n return Object.keys(expected).every((key)=>{\n const ao = actual[key];\n const eo = expected[key];\n if (isObj(eo) && isObj(ao)) {\n return same(eo, ao);\n }\n if (isBool(eo)) {\n return eo !== (ao === null);\n }\n return ao === eo;\n });\n }\n return false;\n}\nexport function match(t, expression, cb) {\n if (Array.isArray(expression)) {\n return iterate(t, (node)=>{\n for(let idx = 0; idx < expression.length; idx++){\n if (same(expression[idx], node)) {\n return cb(node);\n }\n }\n return node;\n });\n }\n return iterate(t, (node)=>same(expression, node) ? cb(node) : node);\n}\n","import { parse } from '@bbob/parser';\nimport { iterate, match } from './utils';\nimport { C1, C2 } from './errors';\nexport function createTree(tree, options) {\n const extendedTree = tree;\n extendedTree.messages = [\n ...extendedTree.messages || []\n ];\n extendedTree.options = {\n ...options,\n ...extendedTree.options\n };\n extendedTree.walk = function walkNodes(cb) {\n return iterate(this, cb);\n };\n extendedTree.match = function matchNodes(expr, cb) {\n return match(this, expr, cb);\n };\n return extendedTree;\n}\nexport default function bbob(plugs) {\n const plugins = typeof plugs === 'function' ? [\n plugs\n ] : plugs || [];\n const mockRender = ()=>\"\";\n return {\n process (input, opts) {\n const options = opts || {\n skipParse: false,\n parser: parse,\n render: mockRender,\n data: null\n };\n const parseFn = options.parser || parse;\n const renderFn = options.render;\n const data = options.data || null;\n if (typeof parseFn !== 'function') {\n throw new Error(C1);\n }\n // raw tree before modification with plugins\n const raw = options.skipParse && Array.isArray(input) ? input : parseFn(input, options);\n let tree = options.skipParse && Array.isArray(input) ? createTree(input || [], options) : createTree(raw, options);\n for(let idx = 0; idx < plugins.length; idx++){\n const plugin = plugins[idx];\n if (typeof plugin === 'function' && renderFn) {\n const newTree = plugin(tree, {\n parse: parseFn,\n render: renderFn,\n iterate,\n data\n });\n tree = createTree(newTree || tree, options);\n }\n }\n return {\n get html () {\n if (typeof renderFn !== 'function') {\n throw new Error(C2);\n }\n return renderFn(tree, tree.options);\n },\n tree,\n raw,\n messages: tree.messages\n };\n }\n };\n}\n","import core from '@bbob/core';\nimport { attrsToString, isTagNode } from '@bbob/plugin-helper';\nconst SELFCLOSE_END_TAG = '/>';\nconst CLOSE_START_TAG = '';\nfunction renderNode(node, options) {\n const { stripTags = false } = options || {};\n if (typeof node === 'undefined' || node === null) {\n return '';\n }\n if (typeof node === 'string' || typeof node === 'number') {\n return String(node);\n }\n if (Array.isArray(node)) {\n return render(node, options);\n }\n if (isTagNode(node)) {\n if (stripTags) {\n return render(node.content, options);\n }\n const attrs = attrsToString(node.attrs);\n if (node.content === null) {\n return START_TAG + node.tag + attrs + SELFCLOSE_END_TAG;\n }\n return START_TAG + node.tag + attrs + END_TAG + render(node.content, options) + CLOSE_START_TAG + node.tag + END_TAG;\n }\n return '';\n}\nexport function render(nodes, options) {\n if (nodes && Array.isArray(nodes)) {\n return nodes.reduce((r, node)=>r + renderNode(node, options), '');\n }\n if (nodes) {\n return renderNode(nodes, options);\n }\n return '';\n}\nexport function html(source, plugins, options) {\n return core(plugins).process(source, {\n ...options,\n render: render\n }).html;\n}\nexport default html;\n","/**\n * Generate the node object.\n *\n * Contains additional logic to help break any unintended side effects of the top down parsing of bbob.\n * @param {string} tag name of the tag\n * @param {Object} attrs attributes of the tag\n * @param {any} content contents of the tag. `[]` will create an empty tag. `null` will create a self closing tag\n *\n * @example\n * ```\n * toNode(\"div\", { class: \"class\" }, \"content\")\n * ```\n * becomes\n * ```\n * {\n * tag: \"div\",\n * attrs: { class: \"class\" },\n * content: \"content\",\n * gen: true,\n * }\n */\nconst toNode = (tag, attrs, content = []) => ({\n tag,\n attrs,\n content,\n gen: true,\n});\n\n/**\n * Preprocess attributes of a node to either return the default single attribute\n * or return a keyed attribute list\n * @param {import('@bbob/types').TagNode} node bbcode node to process\n * @param {string} [raw] raw string. Only include if the single attribute is allowed to have spaces\n * @returns processed attributes\n */\nconst preprocessAttr = (node, raw) => {\n const keys = Object.keys(node.attrs).join(\" \");\n const vals = Object.values(node.attrs).join(\" \");\n if (keys !== vals) {\n // [tag key=val]\n return node.attrs;\n }\n if (!raw || !node.start) {\n return {\n _default: vals,\n };\n }\n // [tag=attr]\n // node.start.from = 0\n // node.start.to = 10\n const nodeRaw = raw.substring(node.start.from, node.start.to);\n if (!nodeRaw.includes(\"=\")) {\n // [tag] or [tag attr]\n return node.attrs;\n }\n const openTagParts = nodeRaw.split(\"=\");\n if (openTagParts.length !== 2) {\n return node.attrs;\n }\n let val = openTagParts[1].slice(0, -1).trim(); // `attr` or `\"attr\"`\n if (val.startsWith('\"') && val.endsWith('\"')) {\n val = val.slice(1, -1);\n }\n return {\n _default: val,\n };\n};\n\n/**\n * Attempts to return tag into its original form with proper attributes\n * @returns string of tag start\n */\nconst toOriginalStartTag = (node, raw) => {\n if (node.start) {\n return raw.substring(node.start.from, node.start.to);\n }\n if (!node.attrs) {\n return `[${node.tag}]`;\n }\n const attrs = preprocessAttr(node, raw);\n if (attrs._default) {\n return `[${node.tag}=${attrs._default}]`;\n } else {\n return node.toTagStart();\n }\n};\n\n/**\n * Attempts to return tag into its original form\n * @returns string of tag end\n */\nconst toOriginalEndTag = (node, raw) => {\n if (node.end) {\n return raw.substring(node.end.from, node.end.to);\n }\n return node.toTagEnd();\n};\n\n/**\n * Given a string, find the first position of a regex match\n * @param {string} string to test against\n * @param {RegExp} regex to test with\n * @param {number} startpos starting position. Defaults to 0\n * @returns index of the first match of the regex in the string\n */\nconst regexIndexOf = (string, regex, startpos) => {\n const indexOf = string.substring(startpos || 0).search(regex);\n return indexOf >= 0 ? indexOf + (startpos || 0) : indexOf;\n};\n\nconst MD_NEWLINE_INJECT = \"\\n\\n\";\nconst MD_NEWLINE_PRE_INJECT = \"\\n\\n\";\nconst MD_NEWLINE_INJECT_COMMENT = \"\";\n\nconst URL_REGEX =\n /(http|ftp|https|upload):\\/\\/([\\w_-]+(?:(?:\\.[\\w_-]+)+))([\\w.,@?^=%&:\\/~+#-]*[\\w@?^=%&\\/~+#-])/;\nconst MD_URL_REGEX =\n /\\!?\\[.*\\]\\((http|ftp|https|upload):\\/\\/([\\w_-]+(?:(?:\\.[\\w_-]+)+))([\\w.,@?^=%&:\\/~+#-]*[\\w@?^=%&\\/~+#-])\\)/;\nconst URL_REGEX_SINGLE_LINE = new RegExp(`^${URL_REGEX.source}|${MD_URL_REGEX.source}$`);\nconst ESCAPABLES_REGEX =\n /((\\n|^)(?```+|~~~+)(?.*\\n))|(?\\[(?i?code|plain)(=.*)?\\])|(?(?`{1,2})(.*)(?\\k))/im;\nconst MD_TABLE_REGEX = /^(\\|[^\\n]+\\|\\r?\\n)((?:\\| ?:?[-]+:? ?)+\\|)(\\n(?:\\|[^\\n]+\\|\\r?\\n?)*)?$/m;\n\n/**\n * Generates a random GUID.\n *\n * Mini Racer doesn't have the crypto module, so we can't use the built-in `crypto.randomUUID` function.\n * @returns {string} a GUID\n */\nfunction generateGUID() {\n let d = new Date().getTime();\n if (window.performance && typeof window.performance.now === \"function\") {\n d += performance.now(); //use high-precision timer if available\n }\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, function (c) {\n // eslint-disable-next-line no-bitwise\n const r = (d + Math.random() * 16) % 16 | 0;\n d = Math.floor(d / 16);\n // eslint-disable-next-line no-bitwise\n return (c === \"x\" ? r : (r & 0x3) | 0x8).toString(16);\n });\n}\n\nexport {\n toNode,\n toOriginalStartTag,\n toOriginalEndTag,\n generateGUID,\n preprocessAttr,\n regexIndexOf,\n MD_NEWLINE_INJECT,\n MD_NEWLINE_INJECT_COMMENT,\n MD_NEWLINE_PRE_INJECT,\n URL_REGEX,\n MD_URL_REGEX,\n MD_TABLE_REGEX,\n URL_REGEX_SINGLE_LINE,\n ESCAPABLES_REGEX,\n};\n","/**\n * Plugin that converts line breaks to `
` tags.\n * To use, put as function similar to the presets.\n *\n * If a node is marked with `noLineBreakConversion`, then it'll skip the parsing the children\n *\n * @example\n * ```ts\n * const output = bbob([preset(), lineBreakPlugin()]).process(input, {render}).html\n * ```\n */\nimport { isEOL } from \"@bbob/plugin-helper\";\nimport { MD_NEWLINE_INJECT, MD_NEWLINE_PRE_INJECT, URL_REGEX_SINGLE_LINE } from \"../utils/common\";\n\nconst isObj = (value) => typeof value === \"object\";\nconst isString = (value) => typeof value === \"string\";\n\n/**\n * Walks the tree of nodes. Will add `br` tag to all `\\n` in format that can be used in any renderer.\n * Preserves \\n so that markdown-it doesn't try to treat everything like a block\n *\n * If a node has the property noLineBreakConversion is encountered, will skip parsing children.\n * @param t tree of nodes to be processed\n * @returns modified tree\n */\nconst walk = (t, disableLineBreakConversion = false) => {\n const tree = t;\n\n if (Array.isArray(tree)) {\n if (tree.some(isString)) {\n // array contains strings. Might be md compatible\n tree.unshift(MD_NEWLINE_INJECT);\n tree.push(MD_NEWLINE_INJECT);\n }\n for (let idx = 0; idx < tree.length; idx++) {\n const child = walk(tree[idx], disableLineBreakConversion);\n if (Array.isArray(child)) {\n tree.splice(idx, 1, ...child);\n idx += child.length - 1;\n } else {\n tree[idx] = child;\n }\n }\n } else if (tree && isObj(tree) && tree.content) {\n if (tree.isWhitespaceSensitive) {\n // applies only to [code] and [icode]\n // stop walk. children won't be parsed to have
\n return tree.tag ? tree : tree.content;\n }\n if (tree.disableLineBreakConversion) {\n disableLineBreakConversion = true;\n }\n walk(tree.content, disableLineBreakConversion);\n return tree.tag ? tree : tree.content;\n } else if (isString(tree) && URL_REGEX_SINGLE_LINE.test(tree.trim())) {\n // if the entire string is a URL, then it should be prepared for onebox.\n // BBob separates strings by newlines anyway, so we can already assume this is sitting on its own line\n // MD_NEWLINE_INJECT is already replacing newline came before or the start of the array,\n // so we only need to make sure \\n\\n is added after the URL\n return [tree, MD_NEWLINE_PRE_INJECT];\n }\n\n if (isString(tree) && isEOL(tree)) {\n return disableLineBreakConversion\n ? [\"\\n\", MD_NEWLINE_INJECT]\n : [{ tag: \"br\", content: null }, MD_NEWLINE_INJECT];\n }\n\n return tree;\n};\n\n/**\n * Converts `\\n` to `
` self closing tag. Supply this as the last plugin in the preset lists\n *\n * @example converts all line breaks to br\n * ```ts\n * const output = bbob([preset(), lineBreakPlugin()]).process(input, {render}).html\n * ```\n * @example will not convert line breaks inside [nobr]\n * ```ts\n * const nobr = (node: TagNode) => {return { disableLineBreakConversion: true, content: node.content }}; \\\\ tag in preset\n * ...\n * const output = bbob([preset(), lineBreakPlugin()]).process(input, {render}).html\n * ```\n * @returns plugin to be used in BBob process\n */\nexport const lineBreakPlugin = () => {\n return (tree) => walk(tree);\n};\n","/**\n * Plugin that converts consecutive normal spaces (U+0020) to non-breaking spaces (U+00A0).\n * To use, put as function similar to the presets.\n *\n *\n * @example\n * ```ts\n * const output = bbob([preset(), , preserveWhitespace(), lineBreakPlugin()]).process(input, {render}).html\n * ```\n */\nimport { isStringNode } from \"@bbob/plugin-helper\";\n\n/**\n * Checks if input is an object\n * @param value input\n * @returns if value is an object\n */\nconst isObj = (value) => typeof value === \"object\";\n\n/**\n * Walks the tree of nodes. Checks for node of consecutive spaces. If found replaces every space in\n * node with a nonbreaking space.\n * Preserves multiple spaces so html won't truncate them.\n *\n * Walks through entire tree.\n * @param t tree of nodes to be processed\n * @returns modified tree\n */\nconst walk = (t) => {\n const tree = t;\n\n if (Array.isArray(tree)) {\n for (let idx = 0; idx < tree.length; idx++) {\n const child = walk(tree[idx]);\n if (Array.isArray(child)) {\n tree.splice(idx, 1, ...child);\n idx += child.length - 1;\n } else {\n tree[idx] = child;\n }\n }\n } else if (tree && isObj(tree) && tree.content) {\n walk(tree.content);\n }\n\n //Bbob breaks up nodes by the presence of normal spaces.\n //So a node with a normal space can only have normal spaces in that node.\n if (isStringNode(tree)) {\n if (tree.length > 1 && tree[0] === \" \") {\n let numSpaces = tree.length;\n return [String.fromCharCode(160).repeat(numSpaces)];\n }\n }\n\n return tree;\n};\n\n/**\n * Converts consecutive normal spaces (U+0020) to nonbreaking spaces (U+00A0).\n * Supply this as a plugin in the preset lists.\n *\n * @example converts consecutive normal spaces (U+0020) to nonbreaking spaces (U+00A0)\n * ```ts\n * const output = bbob([preset(), preserveWhitespace(), lineBreakPlugin()]).process(input, {render}).html\n * ```\n *\n * @returns plugin to be used in BBob process\n */\nexport const preserveWhitespace = () => {\n return (tree) => walk(tree);\n};\n","import { isTagNode } from \"@bbob/plugin-helper\";\nexport function process(tags, tree, core, options) {\n return tree.walk((node)=>{\n if (isTagNode(node)) {\n const tag = node.tag;\n const tagCallback = tags[tag];\n if (typeof tagCallback === \"function\") {\n return tagCallback(node, core, options);\n }\n }\n return node;\n });\n}\n/**\n * Create a preset plugin for @bbob/core\n */ function createPreset(defTags, processor = process) {\n const presetFactory = (opts)=>{\n presetFactory.options = Object.assign(presetFactory.options || {}, opts);\n function presetExecutor(tree, core) {\n return processor(defTags, tree, core, presetFactory.options || {});\n }\n presetExecutor.options = presetFactory.options;\n return presetExecutor;\n };\n presetFactory.extend = function presetExtend(callback) {\n const newTags = callback(defTags, presetFactory.options);\n return createPreset(newTags, processor);\n };\n return presetFactory;\n}\nexport { createPreset };\nexport default createPreset;\n","import { isStringNode, isTagNode, TagNode } from \"@bbob/plugin-helper\";\nimport {\n generateGUID,\n preprocessAttr,\n regexIndexOf,\n toNode,\n toOriginalEndTag,\n toOriginalStartTag,\n} from \"../utils/common\";\n\nconst SLIDE_TITLE_OPEN = Symbol(\"slide-title-open\");\nconst SLIDE_TITLE_CLOSE = Symbol(\"slide-title-close\");\nconst SLIDE_CLOSE = Symbol(\"slide-close\");\nconst SLIDE_REGEX =\n /(?\\{slide=)|(?\\})|(?\\{\\/slide\\})/i;\n\n/**\n * Adds the accordion tag\n * [accordion]{slide=name}content{/slide}[/accordion]\n *\n * [accordion][slide=name]content[/slide][/accordion]\n */\nconst accordion = (node, options) => {\n const groupId = generateGUID();\n\n // add support for existing {slide} tags style, due to copious amounts of existing content\n // also the only way to get true custom content inside a slide due to nesting limitations\n const markedContent = generateSlideMarkersFromContent(node.content);\n const generatedSlides = generateSlidesFromMarkers(markedContent);\n\n const filteredContent = generatedSlides\n .filter((n) => isTagNode(n) && n.tag === \"slide\")\n .map((content) => {\n content.isValid = true;\n content.groupId = groupId;\n return content;\n });\n if (!filteredContent.length) {\n // no [slide] tags found\n return [\n toOriginalStartTag(node, options.data.raw),\n ...node.content,\n toOriginalEndTag(node, options.data.raw),\n ];\n }\n const attrs = preprocessAttr(node, options.data.raw);\n\n if (attrs._default) {\n /** @type {string[]} */\n const customSettings = attrs._default.split(\"|\").map((s) => s.trim());\n const lastValidAlignment = customSettings\n .filter((s) => [\"bright\", \"bcenter\", \"bleft\", \"fleft\", \"fright\"].includes(s))\n .pop();\n if (lastValidAlignment) {\n attrs.align ??= lastValidAlignment;\n }\n\n if (\n customSettings.some((s) => s.endsWith(\"px\")) ||\n customSettings.some((s) => s.endsWith(\"%\"))\n ) {\n attrs.width ??= customSettings.find((s) => s.endsWith(\"px\") || s.endsWith(\"%\"));\n }\n }\n\n let classes = attrs.align?.toLowerCase() || \"\";\n let style = \"\";\n if (attrs.width?.endsWith(\"px\") || attrs.width?.endsWith(\"%\")) {\n style = `width: ${attrs.width};`;\n }\n return toNode(\n \"div\",\n { class: \"bb-accordion \" + classes, \"data-group-id\": groupId, style },\n filteredContent,\n );\n};\n\n/**\n * Locates and splits all {slide} tag components into their respective parts while preserving remaining content\n * @param {(TagNode|string)[]} contentArr node content of the accordion tag\n *\n * @example\n * ```\n * [\"{slide=test}\", \"lorem ipsum\", \"{/slide}\"]\n * ```\n * becomes\n * ```\n * [SLIDE_TITLE_OPEN, \"test\", SLIDE_TITLE_CLOSE, \"lorem ipsum\", SLIDE_CLOSE]\n * ```\n */\nfunction generateSlideMarkersFromContent(contentArr) {\n contentArr = [...contentArr]; // shallow clone. object nodes are not modified anyway\n\n const newArr = [];\n while (contentArr.length > 0) {\n const content = contentArr[0];\n if (isTagNode(content)) {\n newArr.push(contentArr.shift());\n continue;\n }\n const foundIndex = regexIndexOf(content, SLIDE_REGEX);\n if (foundIndex === -1) {\n newArr.push(contentArr.shift());\n continue;\n }\n const match = content.match(SLIDE_REGEX);\n const preContent = content.slice(0, foundIndex);\n const postContent = content.slice(foundIndex + match[0].length);\n if (preContent.length) {\n newArr.push(preContent);\n }\n if (match.groups.slideTitleOpen) {\n newArr.push(SLIDE_TITLE_OPEN);\n }\n if (match.groups.slideTitleClose) {\n newArr.push(SLIDE_TITLE_CLOSE);\n }\n if (match.groups.slideClose) {\n newArr.push(SLIDE_CLOSE);\n }\n if (postContent.length) {\n contentArr[0] = postContent;\n } else {\n contentArr.shift();\n }\n }\n\n return newArr;\n}\n\n/**\n * Generates slide nodes from markers\n * @param {(string | typeof SLIDE_TITLE_OPEN | typeof SLIDE_TITLE_CLOSE | typeof SLIDE_CLOSE | TagNode)[]} markedContent\n */\nfunction generateSlidesFromMarkers(markedContent) {\n const nodes = [];\n let currentSlide = null;\n /** @type {typeof SLIDE_TITLE_OPEN | typeof SLIDE_TITLE_CLOSE | null} */\n let prevMarker = null;\n for (const content of markedContent) {\n if (content === SLIDE_TITLE_OPEN && prevMarker === null) {\n currentSlide = TagNode.create(\"slide\");\n currentSlide.content = [];\n currentSlide.customTitle = [];\n prevMarker = SLIDE_TITLE_OPEN;\n } else if (content === SLIDE_TITLE_CLOSE && prevMarker === SLIDE_TITLE_OPEN) {\n prevMarker = SLIDE_TITLE_CLOSE;\n continue;\n } else if (content === SLIDE_CLOSE && currentSlide && prevMarker === SLIDE_TITLE_CLOSE) {\n nodes.push(currentSlide);\n currentSlide = null;\n prevMarker = null;\n } else if (currentSlide) {\n if (prevMarker === SLIDE_TITLE_OPEN) {\n currentSlide.customTitle.push(markerToString(content));\n } else {\n currentSlide.content.push(markerToString(content));\n }\n } else {\n // no slide open, just add content\n nodes.push(markerToString(content));\n }\n }\n return nodes;\n}\n\n/**\n * Processes content into a string. Catches stray markers and converts them back into a string\n * @param {string | typeof SLIDE_TITLE_OPEN | typeof SLIDE_TITLE_CLOSE | typeof SLIDE_CLOSE} marker\n * @returns expected string\n */\nfunction markerToString(marker) {\n switch (marker) {\n case SLIDE_TITLE_OPEN:\n return \"{slide=\";\n case SLIDE_TITLE_CLOSE:\n return \"}\";\n case SLIDE_CLOSE:\n return \"{/slide}\";\n default:\n return marker;\n }\n}\n\nconst slide = (node, options) => {\n if (!node.isValid) {\n // not inside an [accordion] tag\n return [\n toOriginalStartTag(node, options.data.raw),\n ...node.content,\n toOriginalEndTag(node, options.data.raw),\n ];\n }\n const attrs = preprocessAttr(node, options.data.raw);\n let title = [attrs.title || attrs._default || \"Slide\"];\n let isOpen = !!attrs.open || false;\n let titleAlign = attrs.left ? \"left\" : attrs.right ? \"right\" : attrs.center ? \"center\" : \"left\";\n if (node.customTitle?.length) {\n // slide was created from markers\n title = node.customTitle;\n // pull out old options from title if they exist\n const possibleOptions = title\n .filter((t) => typeof t === \"string\")\n .join(\"\")\n .toLowerCase()\n .split(\"|\")\n .map((s) => s.trim());\n if (possibleOptions.includes(\"open\")) {\n isOpen = true;\n }\n if (possibleOptions.includes(\"right\")) {\n titleAlign = \"right\";\n }\n if (possibleOptions.includes(\"center\")) {\n titleAlign = \"center\";\n }\n if (possibleOptions.includes(\"left\")) {\n titleAlign = \"left\";\n }\n title = title.map((t) => {\n if (isStringNode(t)) {\n t = t.replace(/\\|(open|right|center|left)/gi, \"\");\n }\n return t;\n });\n }\n return [\n toNode(\"details\", { class: \"bb-slide\", open: isOpen }, [\n toNode(\n \"summary\",\n { class: \"bb-slide-title\", style: `text-align: ${titleAlign}; ${attrs.style || \"\"}` },\n title,\n ),\n toNode(\"div\", { class: \"bb-slide-content\" }, node.content),\n ]),\n ];\n};\n\nexport const accordionTags = { accordion, slide };\n","import { toNode } from \"../utils/common\";\n/**\n * @file Adds [left], [center], and [right] to bbcode\n * @example [center]content[/center]\n */\nexport const alignment = {\n left: (node) => toNode(\"div\", { class: \"bb-left\" }, node.content),\n center: (node) => toNode(\"div\", { class: \"bb-center\" }, node.content),\n right: (node) => toNode(\"div\", { class: \"bb-right\" }, node.content),\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n/**\n * @file Adds [a] and [goto] to bbcode\n * @example [a=your_anchor_name]An anchor[/a] [goto=your_anchor_name]Jump to an anchor[/goto]\n */\nexport const anchor = {\n // name is not valid in HTML5; however, it correctly displays back while id does not\n a: (node, options) => {\n const attrs = preprocessAttr(node, options.data.raw)._default || \"\";\n return toNode(\n \"a\",\n { id: `user-anchor-${attrs.trim()}`, name: `user-anchor-${attrs.trim()}` },\n node.content,\n );\n },\n goto: (node, options) => {\n const attrs = preprocessAttr(node, options.data.raw)._default || \"\";\n return toNode(\"a\", { href: `#user-anchor-${attrs.trim()}` }, node.content);\n },\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\nconst WEB_FONTS = [\n \"arial\",\n \"book antiqua\",\n \"courier new\",\n \"georgia\",\n \"tahoma\",\n \"times new roman\",\n \"trebuchet ms\",\n \"verdana\",\n];\nconst VALID_FONT_STYLES = {\n thin: \"100\",\n extralight: \"200\",\n light: \"300\",\n regular: \"400\",\n medium: \"500\",\n semibold: \"600\",\n bold: \"700\",\n extrabold: \"800\",\n black: \"900\",\n};\n// registered axis tags https://learn.microsoft.com/en-us/typography/opentype/spec/dvaraxisreg#registered-axis-tags\nconst REGISTERED_AXIS = [\"ital\", \"opsz\", \"slnt\", \"wdth\", \"wght\"];\n\nconst AXES_REGEX = /(?[a-zA-Z]*)?\\s?(?[0-9]*)?\\s?(?italic)?/;\n\nconst axesParser = (attrs) => {\n let axes = {\n ital: 0,\n wght: 400,\n };\n\n if (attrs?.style) {\n // user just copy pasted the name of the style on the google font site, probably\n const style = attrs.style.trim().toLowerCase();\n const matches = AXES_REGEX.exec(style).groups || {};\n if (matches?.italic) {\n axes.ital = 1;\n }\n\n const weight = matches.weight;\n if (weight && weight >= 0 && weight <= 900) {\n axes.wght = weight;\n } else if (Object.keys(VALID_FONT_STYLES).includes(matches.named_weight || \"\")) {\n axes.wght = VALID_FONT_STYLES[matches.named_weight];\n }\n\n axes = {\n ...axes,\n ...Object.fromEntries(Object.entries(attrs).filter(([key]) => REGISTERED_AXIS.includes(key))),\n };\n }\n return axes;\n};\n\n/**\n * Create google font api url\n * @param {string} family name of font\n * @param {object} axes custom font axes\n */\nconst googleFontApiBuild = (family, axes) => {\n family = family.replaceAll(\" \", \"+\");\n // google fonts requires axes names to be in alphabetical order\n axes = Object.keys(axes)\n .sort()\n .reduce((obj, key) => {\n obj[key] = axes[key];\n return obj;\n }, {});\n const axesList = Object.keys(axes).join(\",\") + \"@\" + Object.values(axes).join(\",\");\n return \"https://fonts.googleapis.com/css2?family=\" + family + \":\" + axesList;\n};\n\nexport const font = (node, options) => {\n const attrs = preprocessAttr(node, options.data.raw);\n const fontFamily = attrs?._default || attrs.family || attrs.name;\n if (fontFamily.trim() === \"\") {\n return node.content;\n }\n if (WEB_FONTS.includes(fontFamily.trim().toLowerCase())) {\n return toNode(\"span\", { style: `font-family: '${fontFamily}'` }, node.content);\n }\n\n const axes = axesParser(attrs);\n const url = googleFontApiBuild(fontFamily, axes);\n options.data.fonts.add(url);\n\n const italic = axes.ital === 1 ? \"italic\" : \"normal\";\n\n const custom = Object.entries(axes).filter(([key]) => key !== \"wght\" && key !== \"ital\");\n let fontVar = \"\";\n if (custom.length) {\n fontVar =\n \"font-variation-settings: \" + custom.map(([key, val]) => `'${key}' ${val}`).join(\", \") + \";\";\n }\n\n return toNode(\n \"span\",\n {\n style: `font-family: '${fontFamily}'; font-weight: ${axes.wght}; font-style: ${italic}; ${fontVar}`,\n \"data-font\": url,\n },\n node.content,\n );\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\n/**\n * Parse the user provided height and return a valid height value\n * @param {Number} heightValue obtains the input of the user entered height (default is 700)\n * @returns A validated number less than 0.\n */\nfunction parseHeight(heightValue) {\n const maxHeight = 700;\n const parsedHeight =\n heightValue && heightValue.trim() !== \"\" ? heightValue.replace(/[^\\d.]/g, \"\") : 0;\n\n if (parsedHeight && parsedHeight >= 0 && parsedHeight <= maxHeight) {\n return parsedHeight;\n } else {\n // if the value = 0 then nothing will be returned\n return parsedHeight === 0 ? 0 : maxHeight;\n }\n}\n\n/**\n * @file Adds [heightrestrict] to bbcode\n * @example [heightrestrict=50]content[/heightrestrict]\n */\nexport const heightrestrict = (node) => {\n const attrs = preprocessAttr(node)._default;\n const heightInput = parseHeight(attrs).toString();\n // Return image's default size if heightrestrict did not involve a valid value\n return heightInput === \"0\"\n ? toNode(\"div\", { class: \"bb-height-restrict\" }, node.content)\n : toNode(\n \"div\",\n { class: \"bb-height-restrict\", style: `height: ${heightInput}px;` },\n node.content,\n );\n};\n","import { toNode } from \"../utils/common\";\n/**\n * @file Adds [mail] to bbcode\n * @param {string} [type=\"send\"] Denotes type of mail either send or receive\n * @param {string} [person=\"Unknown\"] Denotes the person in the To/From field\n * @param {string} [subject=\"Empty\"] Denotes the subject line of the email\n * @example [mail type=\"send\" person=\"John Doe\" subject=\"Hello World\"]content[/mail]\n */\n\nconst parseEmailContent = (content) => {\n return toNode(\"div\", { class: \"bb-email-content\" }, content);\n};\n\nconst parseEmailSubject = (subject) => {\n return toNode(\"div\", { class: \"bb-email-subject\" }, subject);\n};\n\nconst parseEmailPerson = (person) => {\n return toNode(\"div\", { class: \"bb-email-address\" }, person);\n};\n\nconst emailHeader = toNode(\"div\", { class: \"bb-email-header\" }, \"\");\nconst emailFooter = toNode(\n \"div\",\n { class: \"bb-email-footer\" },\n toNode(\"div\", { class: \"bb-email-button\" }, \"\"),\n);\n\nexport const mail = (node) => {\n const attributes = node.attrs;\n let mailAttr = {\n mailOption: (attributes.type || \"send\").toLowerCase(),\n person: attributes.person || \"Unknown\",\n subject: attributes.subject || \"Empty\",\n };\n\n return toNode(\n \"div\",\n {\n class: \"bb-email\",\n \"data-bb-email\": mailAttr.mailOption,\n },\n [\n emailHeader,\n parseEmailPerson(mailAttr.person),\n parseEmailSubject(mailAttr.subject),\n parseEmailContent(node.content),\n emailFooter,\n ],\n );\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\n/**\n * @file Adds [row][column] to bbcode\n * @example Adds [row][column][/column][/row]\n */\nexport const rowcolumn = {\n row: (node) => toNode(\"div\", { class: \"bb-row\" }, node.content),\n column: (node, options) => {\n const columnAttrs = preprocessAttr(node, options.data.raw)._default || \"8\";\n const columnStyle = columnAttrs.startsWith(\"span\")\n ? `column-width-${columnAttrs}`\n : `column-width-span${columnAttrs}`;\n return toNode(\"div\", { class: `bb-column`, \"data-span\": columnStyle }, node.content);\n },\n};\n","import { preprocessAttr } from \"../utils/common\";\n\nconst EVENTS = [\n \"init\",\n \"click\",\n \"change\",\n \"input\",\n \"dblclick\",\n \"mouseenter\",\n \"mouseleave\",\n \"scroll\",\n];\n\n/**\n * Script tag\n *\n * [script]content[/script]\n *\n * [script class=\"id\" on=\"event\" version=\"2\"]content[/script]\n */\nexport const script = (node, options) => {\n const attrs = preprocessAttr(node, options.data.raw);\n\n if (!options.data.previewing && !options.data.commonGUID) {\n // create a common GUID for the post\n // only applicable for div, style, and script tags\n // this is to prevent the same class name from being used in different posts\n options.data.commonGUID = \"post-\" + Math.random().toString(36).substring(2, 7);\n }\n const classSuffix = options.data.previewing ? \"preview\" : options.data.commonGUID;\n\n const onEvent =\n (EVENTS.includes(attrs.on?.toLowerCase() || \"init\") && attrs.on?.toLowerCase()) || \"init\";\n\n const scriptSetup = {\n id: classSuffix,\n class: attrs.class || \"\",\n on: onEvent,\n version: attrs.version || \"\",\n content: node.content.join(\"\"),\n };\n options.data.bbscripts.push(scriptSetup);\n\n return [];\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\n/**\n * Parses an inputted size value and returns the formatted valid font size\n * @param {string} fontValue the input of the size\n */\nfunction parseFontSize(fontValue) {\n let value;\n let fontSize = { valid: true };\n const parsedSize = /(\\d+\\.?\\d?)(px|rem)?/i.exec(fontValue);\n const sizeRanges = {\n px_max: 36,\n px_min: 8,\n rem_max: 3,\n rem_min: 0.2,\n unitless_max: 7,\n unitless_min: 1,\n };\n\n if (parsedSize && (value = parsedSize[1])) {\n fontSize.unit = (parsedSize[2] || \"\").toLowerCase();\n switch (fontSize.unit) {\n case \"px\":\n if (value > sizeRanges.px_max) {\n value = sizeRanges.px_max;\n } else if (value < sizeRanges.px_min) {\n value = sizeRanges.px_min;\n }\n break;\n case \"rem\":\n if (value > sizeRanges.rem_max) {\n value = sizeRanges.rem_max;\n } else if (value < sizeRanges.rem_min) {\n value = sizeRanges.rem_min;\n }\n break;\n default:\n if ((fontSize.valid = fontValue.length === value.length)) {\n if (value > sizeRanges.unitless_max) {\n value = sizeRanges.unitless_max;\n } else if (value < sizeRanges.unitless_min) {\n value = sizeRanges.unitless_min;\n }\n }\n break;\n }\n\n fontSize.value = value;\n }\n return fontSize;\n}\n\nexport const size = (node) => {\n const input = preprocessAttr(node)._default;\n const fontSize = parseFontSize(input);\n if (!fontSize.valid) {\n return node.content;\n }\n let outputAttr = {};\n if (fontSize.unit) {\n outputAttr = { style: `font-size: ${fontSize.value}${fontSize.unit}` };\n } else {\n outputAttr = { \"data-size\": fontSize.value };\n }\n return toNode(\"span\", outputAttr, node.content);\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\n/**\n * @file Adds textmessage to bbcode\n * @exmaple [textmessage=Recipient][message=them]Hi [/message][message=me] Hey![/message][/textmessage]\n */\n\nconst ACCEPTED_OPTIONS = [\"me\", \"them\", \"right\", \"left\"];\nexport const textmessage = {\n textmessage: (node, options) => {\n const attr = preprocessAttr(node, options.data.raw)._default || \"Recipient\";\n const recipient = attr && attr.trim() !== \"\" ? attr : \"Recipient\";\n return toNode(\"div\", { class: \"bb-textmessage\" }, [\n toNode(\"div\", { class: \"bb-textmessage-name\" }, recipient),\n toNode(\"div\", { class: \"bb-textmessage-overflow\" }, [\n toNode(\"div\", { class: \"bb-textmessage-content\" }, node.content),\n ]),\n ]);\n },\n message: (node, options) => {\n let option = preprocessAttr(node, options.data.raw)._default.toLowerCase();\n if (!ACCEPTED_OPTIONS.includes(option) || option === \"right\") {\n option = \"me\";\n }\n if (option === \"left\") {\n option = \"them\";\n }\n\n const senderAttrs = option === \"me\" ? \"bb-message-me\" : \"bb-message-them\";\n return toNode(\"div\", { class: senderAttrs }, [\n toNode(\"div\", { class: \"bb-message-content\" }, node.content),\n ]);\n },\n};\n","import { createPreset } from \"@bbob/preset\";\nimport { accordionTags } from \"./tags/accordion\";\nimport { alignment } from \"./tags/alignment\";\nimport { anchor } from \"./tags/anchor\";\nimport { animation, keyframe } from \"./tags/animation\";\nimport { bg } from \"./tags/background\";\nimport { block } from \"./tags/block\";\nimport { blockquote } from \"./tags/blockquote\";\nimport { border } from \"./tags/border\";\nimport { centerblock } from \"./tags/centerblock\";\nimport { check } from \"./tags/check\";\nimport { classStyle } from \"./tags/class\";\nimport { code, icode, savenl } from \"./tags/code\";\nimport { color } from \"./tags/color\";\nimport { comment } from \"./tags/comment\";\nimport { bold, italic, strike, underline } from \"./tags/discourse-core-replacement\";\nimport { div } from \"./tags/div\";\nimport { divide } from \"./tags/divide\";\nimport { fieldset } from \"./tags/fieldset\";\nimport { font } from \"./tags/font\";\nimport { fa } from \"./tags/fontawesome\";\nimport { h, h1, h2, h3, h4, h5, h6, sh } from \"./tags/header\";\nimport { heightrestrict } from \"./tags/heightrestrict\";\nimport { highlight } from \"./tags/highlight\";\nimport { imagefloat } from \"./tags/imagefloat\";\nimport { justify } from \"./tags/justify\";\nimport { br, nobr } from \"./tags/lineBreak\";\nimport { mail } from \"./tags/mail\";\nimport { newspaper } from \"./tags/newspaper\";\nimport { note } from \"./tags/note\";\nimport { ooc } from \"./tags/ooc\";\nimport { pindent } from \"./tags/pindent\";\nimport { plain } from \"./tags/plain\";\nimport { print } from \"./tags/print\";\nimport { progress } from \"./tags/progress\";\nimport { quote } from \"./tags/quote\";\nimport { rowcolumn } from \"./tags/rowcolumn\";\nimport { script } from \"./tags/script\";\nimport { scroll } from \"./tags/scroll\";\nimport { side } from \"./tags/side\";\nimport { size } from \"./tags/size\";\nimport { inlinespoiler, spoiler } from \"./tags/spoiler\";\nimport { sub } from \"./tags/subscript\";\nimport { sup } from \"./tags/superscript\";\nimport { tab, tabs } from \"./tags/tabs\";\nimport { textmessage } from \"./tags/textmessage\";\nimport { thinprogress } from \"./tags/thinprogress\";\n\nconst tags = {\n ...accordionTags,\n ...alignment,\n ...anchor,\n animation,\n bg,\n block,\n blockquote,\n border,\n br,\n centerblock,\n check,\n class: classStyle,\n code,\n color,\n comment,\n div,\n divide,\n fieldset,\n fa,\n font,\n h,\n h1,\n h2,\n h3,\n h4,\n h5,\n h6,\n heightrestrict,\n highlight,\n icode,\n imagefloat,\n inlinespoiler,\n justify,\n keyframe,\n mail,\n newspaper,\n nobr,\n note,\n ooc,\n pindent,\n plain,\n print,\n progress,\n quote,\n ...rowcolumn,\n thinprogress,\n savenl,\n sh,\n script,\n scroll,\n side,\n size,\n spoiler,\n sub,\n sup,\n tab,\n tabs,\n ...textmessage,\n\n // discourse core replacement tags\n b: bold,\n i: italic,\n u: underline,\n s: strike,\n};\n\nconst availableTags = Object.keys(tags);\nconst preventParsing = [\"plain\", \"code\", \"icode\", \"class\", \"fa\"];\n\nconst preset = createPreset(tags);\n\nexport { availableTags, tags, preset, preventParsing };\nexport default preset;\n","import { isStringNode, isTagNode } from \"@bbob/plugin-helper\";\nimport { preprocessAttr, toOriginalEndTag, toOriginalStartTag } from \"../utils/common\";\n\n/**\n * Renders css Keyframes\n *\n * [animation=name][keyframe=0]color: red[/keyframe][/animation]\n */\nexport const animation = (node, options) => {\n if (!options.data.previewing && !options.data.commonGUID) {\n // create a common GUID for the post\n // only applicable for div, style, and script tags\n // this is to prevent the same class name from being used in different posts\n options.data.commonGUID = \"post-\" + Math.random().toString(36).substring(2, 7);\n }\n const commonId = options.data.previewing ? \"preview\" : options.data.commonGUID;\n\n const name = preprocessAttr(node, options.data.raw)?._default || \"\";\n const keyframes = node.content\n .filter((n) => isTagNode(n) && n.tag === \"keyframe\")\n .map((content) => {\n content.isValid = true;\n /** @type {string} */\n const ident = preprocessAttr(content, options.data.raw)._default || \"\";\n content.ident = ident + (ident.match(/^\\d+$/) ? \"%\" : \"\");\n const cleanContent = content.content\n .filter(isStringNode)\n .join(\"\")\n .replaceAll(/[\\[\\]\\{\\}]/g, \"\");\n content.formatted = `${content.ident}{ ${cleanContent} }`;\n return content;\n });\n const keyframeContent = keyframes.map((n) => n.formatted).join(\"\\n\");\n const content = `@keyframes ${commonId}${name} { ${keyframeContent} }`;\n options.data.styles.push(content);\n return [];\n};\n\nexport const keyframe = (node, options) => {\n if (!node.isValid) {\n return [\n toOriginalStartTag(node, options.data.raw),\n ...node.content,\n toOriginalEndTag(node, options.data.raw),\n ];\n }\n return [];\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\n/**\n * Add [bg] tag\n * @example [bg=red]Hello[/bg]\n */\nexport const bg = (node, options) => {\n const color = preprocessAttr(node, options.data.raw)._default;\n return toNode(\n \"div\",\n {\n style: `background-color: ${color};`,\n class: \"bb-background\",\n },\n node.content,\n );\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\n/**\n * Add [block] tag\n * @example [block=treasure]content[/block]\n */\nexport const block = (node, options) => {\n const defaultOp = \"block\";\n const blockAttr = (preprocessAttr(node, options.data.raw)._default || defaultOp).toLowerCase();\n\n const OPTIONS = [\n \"block\",\n \"dice\",\n \"dice10\",\n \"setting\",\n \"warning\",\n \"storyteller\",\n \"announcement\",\n \"important\",\n \"question\",\n \"encounter\",\n \"information\",\n \"character\",\n \"treasure\",\n ];\n\n // Default to block option if user did not provide anything valid\n const blockOption = OPTIONS.includes(blockAttr) ? blockAttr : defaultOp;\n\n return toNode(\"table\", { class: \"bb-block\", \"data-bb-block\": blockOption }, [\n toNode(\"tbody\", [\n toNode(\"tr\", [\n toNode(\"td\", { class: \"bb-block-icon\" }),\n toNode(\"td\", { class: \"bb-block-content\" }, node.content),\n ]),\n ]),\n ]);\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\n/**\n * @file Adds [blockquote] to bbcode\n * @example [blockquote=author]content[/blockquote]\n */\nexport const blockquote = (node, options) => {\n const author = preprocessAttr(node, options.data.raw)._default || \"\";\n\n return toNode(\"div\", { class: \"bb-blockquote\" }, [\n toNode(\"div\", { class: \"bb-blockquote-left\" }),\n toNode(\"div\", { class: \"bb-blockquote-content\" }, [\n node.content,\n toNode(\"div\", { class: \"bb-blockquote-speaker\" }, author !== \"\" ? `- ${author}` : \"\"),\n ]),\n toNode(\"div\", { class: \"bb-blockquote-right\" }),\n ]);\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\nexport const border = (node, options) => {\n const val = preprocessAttr(node, options.data.raw)._default;\n return toNode(\n \"div\",\n {\n style: `border: ${val};`,\n class: \"bb-border\",\n },\n node.content,\n );\n};\n","import { toNode } from \"../utils/common\";\n\n/**\n * Creates a line break html
tag\n */\nexport const br = () => {\n return toNode(\"br\", {}, null);\n};\n\n/**\n * Disables line breaks for given content\n * @example\n * ```\n * [nobr]test\n * test\n * test\n * [/nobr]\n *\n * test test test\n * ```\n */\nexport const nobr = (node) => {\n return { disableLineBreakConversion: true, content: node.content };\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\nexport const centerblock = (node, options) => {\n const percentageInput = preprocessAttr(node, options.data.raw)._default || \"50\";\n return toNode(\"div\", { style: `margin: 0 auto; width: ${percentageInput}%` }, node.content);\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\nexport const check = (node, options) => {\n const attrs = preprocessAttr(node, options.data.raw)._default || \"dot\";\n return toNode(\"div\", { class: `bb-check`, \"data-type\": attrs }, node.content);\n};\n","import { isStringNode } from \"@bbob/plugin-helper\";\nimport { preprocessAttr } from \"../utils/common\";\n\n/**\n * Class style tag\n *\n * [class=name]content[/class]\n * [class name=\"className\" state=\"psuedo-class\" minWidth=\"\" maxWidth=\"\"]content[/class]\n * [class name=\"className\" selector=\"\"]content[/class]\n */\nexport const classStyle = (node, options) => {\n const attrs = preprocessAttr(node);\n const nameAttr = attrs.name || attrs._default;\n\n if (!options.data.previewing && !options.data.commonGUID) {\n // create a common GUID for the post\n // only applicable for div, style, and script tags\n // this is to prevent the same class name from being used in different posts\n options.data.commonGUID = \"post-\" + Math.random().toString(36).substring(2, 7);\n }\n const classSuffix = options.data.previewing ? \"preview\" : options.data.commonGUID;\n const className = nameAttr + \"__\" + classSuffix;\n const content = node.content\n .filter(isStringNode)\n .map((s) => s.replaceAll(\"{post_id}\", classSuffix).replaceAll(/[\\[\\]\\{\\}]/g, \"\"));\n let selector = \"\";\n const mediaQuery = [];\n if (\n [\"hover\", \"focus\", \"active\", \"focus-within\", \"focus-visible\"].includes(\n attrs.state?.toLowerCase(),\n )\n ) {\n selector = \":\" + attrs.state.toLowerCase();\n }\n if (attrs.selector) {\n selector = attrs.selector.replace(/[,{}\\\\\\n]/g, \"\");\n }\n if (attrs.minWidth?.match(/^[0-9]+[a-z]+$/)) {\n // @media (min-width: )\n mediaQuery.push(`(min-width: ${attrs.minWidth})`);\n }\n if (attrs.maxWidth?.match(/^[0-9]+[a-z]+$/)) {\n // @media (max-width: )\n mediaQuery.push(`(max-width: ${attrs.maxWidth})`);\n }\n\n content.unshift(`.${className}${selector} {`);\n content.push(\"}\");\n if (mediaQuery.length) {\n content.unshift(`@media ${mediaQuery.join(\" and \")} {`);\n content.push(\"}\");\n }\n options.data.styles.push(content.join(\"\"));\n\n return [];\n};\n","import { preprocessAttr } from \"../utils/common\";\n\n/**\n * processes [code] tag and returns a fenced code block\n */\nexport const code = (node) => {\n const lang = preprocessAttr(node)._default || \"bbcode\";\n return {\n isWhitespaceSensitive: true,\n content: [\"```\" + lang + \"\\n\", node.content, \"\\n```\\n\"],\n };\n};\n\n/**\n * processes [icode] tag and returns inline code\n */\nexport const icode = (node) => {\n return {\n isWhitespaceSensitive: true,\n content: [\"`\", node.content, \"`\"],\n };\n};\n\n/**\n * Special tag to save newlines in code blocks. Used for hoisting code blocks\n */\nexport const savenl = (node) => {\n return {\n isWhitespaceSensitive: true,\n content: node.content,\n };\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\nexport const color = (node) => {\n const inputColor = preprocessAttr(node)._default || \"\";\n if (inputColor.trim() === \"\") {\n return node.content;\n }\n return toNode(\"span\", { style: `color: ${inputColor}` }, node.content);\n};\n","import { toNode } from \"../utils/common\";\n\n/**\n * @file Adds [comment] tag\n * @example [comment]Content[/comment]\n */\n\nconst comment = (node) => {\n return toNode(\"span\", { class: \"hidden\" }, node.content);\n};\n\nexport { comment };\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\n/**\n * Adds [div] tag\n * [div=css]Content[/div]\n * [div class=\"class\" style=\"css\"]Content[/div]\n */\nexport const div = (node, options) => {\n if (node.gen) {\n // node is actually a generated node \"div\" made by another tag\n // don't process it\n return node;\n }\n const attrs = preprocessAttr(node, options.data.raw);\n const style = attrs.style || attrs._default;\n const classAttrs = attrs.class;\n if (!classAttrs?.trim()) {\n return toNode(\n \"div\",\n {\n style,\n },\n node.content,\n );\n }\n\n if (!options.data.previewing && !options.data.commonGUID) {\n // create a common GUID for the post\n // only applicable for div, style, and script tags\n // this is to prevent the same class name from being used in different posts\n options.data.commonGUID = \"post-\" + Math.random().toString(36).substring(2, 7);\n }\n const classSuffix = options.data.previewing ? \"preview\" : options.data.commonGUID;\n const classNames = classAttrs\n .split(\" \")\n .map((c) => c + \"__\" + classSuffix)\n .join(\" \");\n\n return toNode(\n \"div\",\n {\n class: classNames,\n style,\n },\n node.content,\n );\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\nexport const divide = (node) => {\n const type = (preprocessAttr(node)._default || \"\").toLowerCase();\n return toNode(\n \"span\",\n {\n class: \"bb-divide\",\n \"data-type\": type,\n },\n node.content,\n );\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\n/**\n * @file Adds [fieldset] to bbcode\n * @example [fieldset=title]content[/fieldset]\n */\nexport const fieldset = (node, options) => {\n const title = preprocessAttr(node, options.data.raw)._default || \"\";\n return toNode(\"fieldset\", { class: \"bb-fieldset\" }, [\n toNode(\"legend\", { class: \"bb-fieldset-legend\" }, title),\n toNode(\"div\", { class: \"bb-fieldset\" }, node.content),\n ]);\n};\n","import { toNode } from \"../utils/common\";\n\n/**\n * Adds [fa] tag\n * [fa]fa-icon[/fa]\n * [fa style=\"\" fa-transform=\"\"]fa-solid fa-icon[/fa]\n * [fa primary-color=\"\" secondary-color=\"\" primary-opacity=\"\" secondary-opacity=\"\" rotate-angle=\"\"]fa-duotone fa-icon[/fa]\n */\nexport const fa = (node) => {\n const attrs = node.attrs;\n let style = attrs.style || \"\";\n style += attrs[\"primary-color\"] ? `--fa-primary-color: ${attrs[\"primary-color\"]};` : \"\";\n style += attrs[\"secondary-color\"] ? `--fa-secondary-color: ${attrs[\"secondary-color\"]};` : \"\";\n style += attrs[\"primary-opacity\"] ? `--fa-primary-opacity: ${attrs[\"primary-opacity\"]};` : \"\";\n style += attrs[\"secondary-opacity\"]\n ? `--fa-secondary-opacity: ${attrs[\"secondary-opacity\"]};`\n : \"\";\n style += attrs[\"rotate-angle\"] ? `--fa-rotate-angle: ${attrs[\"rotate-angle\"]};` : \"\";\n\n return toNode(\n \"i\",\n {\n \"data-bbcode-fa\": null,\n },\n [\n toNode(\n \"i\",\n {\n class: (node.content || []).join(\"\"),\n style,\n \"data-fa-transform\": attrs[\"fa-transform\"] || \"\",\n },\n [],\n ),\n ],\n );\n};\n","import { toNode } from \"../utils/common\";\n\n/**\n * @file Adds Header to bbcode\n * @example [h]content[/h], [h2]content[/h2], [h3]content[/h3],\n * [h4]content[/h4], [h5]content[/h5], [h6]content[/h6].\n */\n\nconst h = (node) => {\n return toNode(\"h1\", {}, node.content);\n};\n\nconst h1 = (node) => {\n return toNode(\"h1\", {}, node.content);\n};\n\nconst h2 = (node) => {\n return toNode(\"h2\", {}, node.content);\n};\n\nconst sh = (node) => {\n return toNode(\"h2\", {}, node.content);\n};\n\nconst h3 = (node) => {\n return toNode(\"h3\", {}, node.content);\n};\n\nconst h4 = (node) => {\n return toNode(\"h4\", {}, node.content);\n};\n\nconst h5 = (node) => {\n return toNode(\"h5\", {}, node.content);\n};\n\nconst h6 = (node) => {\n return toNode(\"h6\", {}, node.content);\n};\n\nexport { h, sh, h1, h2, h3, h4, h5, h6 };\n","import { toNode } from \"../utils/common\";\n/**\n * @file Adds [highlight] to bbcode\n * @example [highlight]content[/highlight]\n */\nexport const highlight = (node) => {\n return toNode(\"span\", { class: \"bb-highlight\" }, node.content);\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n/**\n * @file Adds [imagefloat] to bbcode\n * @exmaple [imagefloat=left]content[/imagefloat]\n */\nexport const imagefloat = (node) => {\n const attrs = preprocessAttr(node)._default || \"\";\n return toNode(\"div\", { class: `bb-float-${attrs}` }, node.content);\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n/**\n * @file Adds [spoiler] and [inlinespoiler] to bbcode\n *\n * Defaults to \"Spoiler\" name if no title provided\n *\n * @example `[spoiler=Title]text[/spoiler]`\n * @example `[inlinespoiler]hidden content[/inlinespoiler]\n */\n\nexport const spoiler = (node, options) => {\n const providedTitle = preprocessAttr(node, options.data.raw)._default;\n const title = \"Spoiler\" + (providedTitle ? `: ${providedTitle}` : \"\");\n\n /**\n *
\n * Title\n *
\n * lorem ipsum\n *
\n *
\n */\n return toNode(\"details\", { class: \"bb-spoiler\" }, [\n toNode(\"summary\", {}, title),\n toNode(\"div\", { class: \"bb-spoiler-content\" }, node.content),\n ]);\n};\n\nexport const inlinespoiler = (node) => {\n return toNode(\"span\", { class: \"bb-inline-spoiler\" }, node.content);\n};\n","import { toNode } from \"../utils/common\";\n\n/**\n * @file Adds [justify] to bbcode\n * @example [justify]content[/justify]\n */\nexport const justify = (node) => {\n return toNode(\"div\", { class: \"bb-justify\" }, node.content);\n};\n","import { toNode } from \"../utils/common\";\n/**\n * @file Adds [newspaper] to bbcode\n * @example [newspaper]content[/newspaper]\n */\nexport const newspaper = (node) => {\n return toNode(\"div\", { class: \"bb-newspaper\" }, node.content);\n};\n","import { toNode } from \"../utils/common\";\n/**\n * @file Adds [note] to bbcode\n * @example [note]content[/note]\n */\n\nexport const note = (node) => {\n return toNode(\"div\", { class: \"bb-note\" }, [\n toNode(\"div\", { class: \"bb-note-tape\" }, \"\"),\n toNode(\"div\", { class: \"bb-note-content\" }, [\n node.content,\n toNode(\"div\", { class: \"bb-note-footer\" }, \"\"),\n ]),\n ]);\n};\n","import { toNode } from \"../utils/common\";\n\n/**\n * @file Adds [ooc] to bbcode\n * @example [ooc]content[/ooc]\n */\nexport const ooc = (node) => {\n return toNode(\n \"div\",\n {\n class: \"bb-ooc\",\n },\n node.content,\n );\n};\n","import { toNode } from \"../utils/common\";\n/**\n * @file Adds [pindent] to bbcode\n * @example [pindent]content[/pindent]\n */\nexport const pindent = (node) => {\n return toNode(\"span\", { class: \"bb-pindent\" }, node.content);\n};\n","/**\n * [plain] bbcode tag that prevents parsing of inner tags\n * @example\n * ```\n * [plain]This is [b]bold[/b] and [i]italic[/i][/plain]\n * ```\n * outputs to\n * ```\n * This is [b]bold[/b] and [i]italic[/i]\n * ```\n */\nexport const plain = (node) => {\n return node.content;\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\n/**\n * Add [print] tag\n * @example [print=lined]content[/print]\n */\nexport const print = (node) => {\n const defaultOp = \"print\";\n const printAttr = (preprocessAttr(node)._default || defaultOp).toLowerCase();\n\n const OPTIONS = [\"print\", \"line\", \"graph\", \"parchment\"];\n\n // Default to print if option is not valid\n const printOption = OPTIONS.includes(printAttr) ? printAttr : defaultOp;\n\n return toNode(\n \"div\",\n { class: printOption === defaultOp ? `bb-print` : `bb-print-${printOption}` },\n node.content,\n );\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\n/**\n * @file Adds [progress] to bbcode\n * @exmaple [progress=percentageInt]content[/progress]\n */\nexport const progress = (node) => {\n const percentageInt = preprocessAttr(node)._default;\n return toNode(\"div\", { class: \"bb-progress\" }, [\n toNode(\"div\", { class: \"bb-progress-text\" }, node.content),\n toNode(\"div\", { class: \"bb-progress-bar\", style: `width: calc(${percentageInt}% - 6px)` }, \"\"),\n toNode(\"div\", { class: \"bb-progress-bar-other\" }, \"\"),\n ]);\n};\n","import { preprocessAttr } from \"../utils/common\";\n\n/**\n * rebuild the [quote] tag so that markdown-it engine can parse it for itself\n */\nexport const quote = (node, options) => {\n const attrs = preprocessAttr(node, options.data.raw);\n if (node.content[0] === \"\\n\") {\n node.content.shift();\n }\n return [`\\n[${node.tag}=\"${attrs._default}\"]\\n\\n`, ...node.content, \"\\n\\n[/quote]\\n\"];\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\n/**\n * @file Adds [thinprogress] to bbcode\n * @exmaple [thinprogress=percentageInt]content[/progthinprogressress]\n */\nexport const thinprogress = (node, options) => {\n const percentageInt = preprocessAttr(node, options.data.raw)._default;\n return toNode(\"div\", { class: \"bb-progress-thin\" }, [\n toNode(\"div\", { class: \"bb-progress-text\" }, node.content),\n toNode(\"div\", { class: \"bb-progress-bar\", style: `width: calc(${percentageInt}% - 6px)` }, \"\"),\n toNode(\"div\", { class: \"bb-progress-bar-other\" }, \"\"),\n ]);\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\n/**\n * Parse the user provided height and return a valid height value\n * @param {Number} heightValue obtains the input of the user entered height (default is 700)\n * @returns A validated number less than 0.\n */\nfunction parseHeight(heightValue) {\n const maxHeight = 700;\n const parsedHeight =\n heightValue && heightValue.trim() !== \"\" ? heightValue.replace(/[^\\d.]/g, \"\") : 0;\n\n if (parsedHeight && parsedHeight >= 0 && parsedHeight <= maxHeight) {\n return parsedHeight;\n } else {\n // if the value = 0 then nothing will be returned\n return parsedHeight === 0 ? 0 : maxHeight;\n }\n}\n\n/**\n * @file Adds [scroll] to bbcode\n * @example [scroll]content[/scroll]\n */\nexport const scroll = (node, options) => {\n const attrs = preprocessAttr(node, options.data.raw)._default;\n const heightInput = parseHeight(attrs);\n return toNode(\"div\", { class: \"bb-scroll\", style: `height: ${heightInput}px` }, node.content);\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\nexport const side = (node) => {\n const attrs = preprocessAttr(node)._default || \"left\";\n return toNode(\"div\", { class: \"bb-side\", \"data-side\": attrs }, node.content);\n};\n","import { toNode } from \"../utils/common\";\n\n/**\n * @file Adds subscript to BBCode\n * @example [sub]content[/sub]\n */\n\nconst sub = (node) => {\n return toNode(\"sub\", {}, node.content);\n};\n\nexport { sub };\n","import { toNode } from \"../utils/common\";\n\n/**\n * @file Adds superscript to bbcode\n * @example [sup]content[/sup]\n */\n\nconst sup = (node) => {\n return toNode(\"sup\", {}, node.content);\n};\n\nexport { sup };\n","import { isTagNode } from \"@bbob/plugin-helper\";\nimport {\n generateGUID,\n preprocessAttr,\n toNode,\n toOriginalEndTag,\n toOriginalStartTag,\n} from \"../utils/common\";\n\n/**\n * @file Adds [tabs][tab] to bbcode\n * @example [tabs][tab=name 1]content[/tab][tab=name 2]content[/tab][/tabs]\n */\nexport const tabs = (node, options) => {\n const tabsList = node.content.filter(\n (contentNode) => isTagNode(contentNode) && contentNode.tag === \"tab\",\n );\n const groupId = generateGUID();\n tabsList.forEach((tabNode) => {\n tabNode.isValid = true;\n tabNode.groupId = groupId;\n });\n if (!tabsList.length) {\n // no [tab] tags found\n return [\n toOriginalStartTag(node, options.data.raw),\n ...node.content,\n toOriginalEndTag(node, options.data.raw),\n ];\n }\n tabsList[0].open = true;\n\n return toNode(\n \"div\",\n {\n class: \"bb-tabs\",\n },\n tabsList,\n );\n};\n\n/**\n * [tab=name]content[/tab]\n * [tab name=\"name\" style=\"style\"]content[/tab]\n */\nexport const tab = (node, options) => {\n if (!node.isValid) {\n // not inside a [tabs] tag\n return [\n toOriginalStartTag(node, options.data.raw),\n ...node.content,\n toOriginalEndTag(node, options.data.raw),\n ];\n }\n const attrs = preprocessAttr(node, options.data.raw);\n const name = attrs._default || attrs.name || \"Tab\";\n const tabId = `tab-${name.replace(/\\W/g, \"_\")}-${generateGUID()}`;\n return [\n toNode(\"input\", {\n type: \"radio\",\n id: tabId,\n name: \"tab-group-\" + node.groupId,\n class: \"bb-tab\",\n checked: node.open,\n }),\n toNode(\n \"label\",\n {\n class: \"bb-tab-label\",\n for: tabId,\n style: attrs.style,\n },\n name,\n ),\n toNode(\n \"div\",\n {\n class: \"bb-tab-content\",\n },\n node.content,\n ),\n ];\n};\n","/**\n * @file discourse-core-replacement.js\n * This is a dedicated file for replacing the standard Discourse BBCode tags in core.\n * In the markdown-it engine, discourse has added these bbcode tags in the inline parser.\n * However this means that if the parser detects a block level tag inside an inline tag,\n * it will not parse the inline tag.\n *\n * This file is meant to fix such scenarios by doing the parsing of bbcode tags for it.\n *\n * @example\n * [b][h]bold[/h][/b] // this should properly parse the bold tag inside the h tag\n *\n * https://github.com/discourse/discourse/blob/d7ece61252d7671a1f124483836279b99852c08c/app/assets/javascripts/discourse-markdown-it/src/features/bbcode-inline.js\n */\nimport { toNode } from \"../utils/common\";\n\nexport const bold = (node) => {\n return toNode(\"span\", { class: \"bbcode-b\" }, node.content);\n};\n\nexport const italic = (node) => {\n if (node.gen) {\n // node is actually a generated node \"i\" made by another tag\n // don't process it\n return node;\n }\n return toNode(\"span\", { class: \"bbcode-i\" }, node.content);\n};\n\nexport const underline = (node) => {\n return toNode(\"span\", { class: \"bbcode-u\" }, node.content);\n};\n\nexport const strike = (node) => {\n return toNode(\"span\", { class: \"bbcode-s\" }, node.content);\n};\n","import { MD_NEWLINE_INJECT, MD_NEWLINE_INJECT_COMMENT, MD_NEWLINE_PRE_INJECT } from \"./common\";\n\n/**\n * Post Processing designed to fix issues with Markdown and BBCode that the parser can't fix.\n *\n * Separate from markdown-it post processing as it'll be able to manipulate the full string.\n * @param {string} raw string from processing through both BBCode and Markdown\n * @returns post processed string\n */\nfunction removeNewlineInjects(raw) {\n const processed = raw\n .replaceAll(MD_NEWLINE_INJECT, \"\")\n .replaceAll(MD_NEWLINE_PRE_INJECT, \"\")\n .replaceAll(\"\\n\" + MD_NEWLINE_INJECT_COMMENT, \"\")\n .replaceAll(MD_NEWLINE_INJECT_COMMENT + \"\\n\", \"\")\n .replaceAll(MD_NEWLINE_INJECT_COMMENT, \"\"); // Remove all instances of the injected newline\n return processed;\n}\n\n/**\n * Injects hoisted code blocks back into the raw string\n * @param {string} raw input to inject hoisted code blocks into\n * @param {any} data contains hoist map\n * @returns string with hoisted code blocks injected\n */\nfunction renderHoistedCodeBlocks(raw, data) {\n const hoistMap = data.hoistMap;\n for (const [uuid, content] of Object.entries(hoistMap)) {\n raw = raw.replaceAll(uuid, content);\n }\n return raw;\n}\n\n/**\n * Setups the class style tag template for the post\n * @param {string} raw\n * @param {{styles: string[]}} data - contains styles array\n * @returns string\n */\nfunction createClassStyleTagTemplate(raw, data) {\n if (data.styles.length === 0) {\n return raw;\n }\n const template = '\";\n return template + raw;\n}\n\n/**\n * Setups the script tag template for the post\n * @param {string} raw\n * @param {{\n * bbscripts: {\n * id: string,\n * class: string,\n * on: string,\n * version: string,\n * content: string\n * }[]}} data - contains scripts array\n * @returns string\n */\nfunction createScriptTagTemplate(raw, data) {\n if (data.bbscripts.length === 0) {\n return raw;\n }\n const templates = data.bbscripts.map(\n (s) =>\n ``,\n );\n return templates.join(\"\") + raw;\n}\n\n/**\n * Performs post processing on the raw string to address any necessary functionality that BBob/MD can't handle with a plugin (i.e. hoisting).\n * @param {string} raw processed input from after bbob and md\n * @param {any} data from bbob data\n * @returns final processed string\n */\nexport function postprocess(raw, data) {\n let final = raw;\n const postprocessors = [\n removeNewlineInjects,\n createClassStyleTagTemplate,\n createScriptTagTemplate,\n renderHoistedCodeBlocks,\n ];\n for (const postprocessor of postprocessors) {\n final = postprocessor(final, data);\n }\n return final;\n}\n","import { ESCAPABLES_REGEX, generateGUID, MD_TABLE_REGEX, regexIndexOf } from \"./common\";\n\n/**\n * Find all code blocks and hoist them out of the content and into a map for later insertion\n * @param {string} raw input to preprocess\n * @returns processed string and hoist map\n */\nfunction fenceCodeBlockPreprocess(content, data) {\n /** @type {Object.} */\n const hoistMap = {};\n let index = 0;\n\n const addHoistAndReturnNewStartPoint = (cutOffStart, cutOffEnd, expected, trim = false) => {\n const uuid = generateGUID();\n if (cutOffEnd !== -1) {\n hoistMap[uuid] = content.substring(cutOffStart, cutOffEnd);\n content = content.substring(0, cutOffStart) + uuid + content.substring(cutOffEnd);\n } else {\n hoistMap[uuid] = content.substring(cutOffStart);\n content = content.substring(0, cutOffStart) + uuid + expected;\n }\n if (trim) {\n if (hoistMap[uuid].startsWith(\"\\n\")) {\n hoistMap[uuid] = hoistMap[uuid].substring(1);\n }\n if (hoistMap[uuid].endsWith(\"\\n\")) {\n hoistMap[uuid] = hoistMap[uuid].substring(0, hoistMap[uuid].length - 1);\n }\n }\n return cutOffStart + uuid.length + expected.length;\n };\n\n while ((index = regexIndexOf(content, ESCAPABLES_REGEX, index)) !== -1) {\n const match = ESCAPABLES_REGEX.exec(content.substring(index));\n if (match.groups?.fence) {\n const fence = match.groups.fence;\n const fenceInfo = match.groups.fenceInfo;\n if (content[index] === \"\\n\") {\n // Check if the fence is not at the start of the content\n index += 1;\n }\n const closingFenceRegex = new RegExp(\"\\n\" + fence + \"(\\n|$)\"); // Find the next fence. By commonmark spec, it should be the same fence length and type\n const nextIndex = regexIndexOf(content, closingFenceRegex, index + fence.length);\n\n const uuid = generateGUID();\n if (nextIndex !== -1) {\n hoistMap[uuid] = content.substring(index + fence.length + fenceInfo.length, nextIndex);\n } else {\n hoistMap[uuid] = content.substring(index + fence.length + fenceInfo.length);\n }\n // inject bbcode tag before and after the code block. This is to prevent BBob plugin from injecting newlines\n const replacement = `[saveNL]\\n${fence}${fenceInfo}${uuid}\\n${fence}\\n[/saveNL]`;\n content =\n content.substring(0, index) +\n replacement +\n (nextIndex !== -1 ? content.substring(nextIndex + 1 + fence.length) : \"\");\n index = index + replacement.length;\n } else if (match.groups?.bbcode) {\n const bbcode = match.groups.bbcode;\n const bbcodeTag = match.groups.bbcodeTag.toLowerCase(); // coerce to lowercase for caseinsensitive matching\n const closingTag = `[/${bbcodeTag}]`;\n const nextIndex = content.toLowerCase().indexOf(closingTag, index + 1);\n index = addHoistAndReturnNewStartPoint(index + bbcode.length, nextIndex, closingTag, true);\n } else if (match.groups.backtick) {\n const backtick = match.groups.backtick; // contains whole content\n const tickStart = match.groups.tickStart;\n const tickEnd = match.groups.tickEnd;\n index = addHoistAndReturnNewStartPoint(\n index + tickStart.length,\n index + backtick.length - tickEnd.length,\n tickEnd,\n );\n }\n }\n\n data.hoistMap = hoistMap;\n return [content, data];\n}\n\n/**\n * Find all markdown table blocks and mark them to ignore newlines\n * @param {string} raw input to preprocess\n * @returns processed string\n */\nfunction mdTableBlockPreprocess(content, data) {\n let index = 0;\n while ((index = regexIndexOf(content, MD_TABLE_REGEX, index)) !== -1) {\n const match = MD_TABLE_REGEX.exec(content.substring(index));\n const table = match[0];\n const replacement = `[saveNL]\\n${table}\\n[/saveNL]`;\n content = content.substring(0, index) + replacement + content.substring(index + table.length);\n index = index + replacement.length;\n }\n return [content, data];\n}\n\n/**\n * Preprocesses input to be formatted for bbob to intake. Handles any necessary functionality that BBob can't handle with a plugin (i.e. hoisting).\n * @param {string} raw input to preprocess\n * @returns formatted input for bbob to intake\n */\nexport function preprocessRaw(raw) {\n let data = {};\n const preprocessors = [fenceCodeBlockPreprocess, mdTableBlockPreprocess];\n for (const preprocessor of preprocessors) {\n [raw, data] = preprocessor(raw, data);\n }\n return [raw, data];\n}\n","import bbob from \"@bbob/core\";\nimport { render } from \"@bbob/html\";\nimport { lineBreakPlugin } from \"./plugins/lineBreak\";\nimport { preserveWhitespace } from \"./plugins/preserveWhitespace\";\nimport { availableTags, preset, preventParsing } from \"./preset\";\nimport { postprocess } from \"./utils/postprocess\";\nimport { preprocessRaw } from \"./utils/preprocess\";\n\nconst options = {\n onlyAllowTags: [...availableTags],\n contextFreeTags: preventParsing, // prevent parsing of children\n enableEscapeTags: true,\n onError: (err) => {\n if (options.previewing) {\n // eslint-disable-next-line no-console\n console.warn(err.message, err.lineNumber, err.columnNumber);\n }\n },\n};\nconst presetTags = preset();\n\nexport const RpNBBCode = (code, opts) => {\n const plugins = [presetTags];\n if (opts.preserveWhitespace) {\n plugins.push(preserveWhitespace());\n }\n plugins.push(lineBreakPlugin());\n const [preprocessed, preprocessedData] = preprocessRaw(code);\n return bbob(plugins).process(preprocessed, {\n render,\n ...options,\n data: {\n ...preprocessedData,\n raw: preprocessed,\n previewing: opts.previewing,\n fonts: new Set(),\n styles: [],\n bbscripts: [],\n },\n });\n};\n\nexport { postprocess };\n","let C1 = 'C1';\nlet C2 = 'C2';\nif (process.env.NODE_ENV !== 'production') {\n C1 = '\"parser\" is not a function, please pass to \"process(input, { parser })\" right function';\n C2 = '\"render\" function not defined, please pass to \"process(input, { render })\"';\n}\nexport { C1, C2 };\n"],"names":["N","TAB","EQ","QUOTEMARK","SPACE","OPEN_BRAKET","CLOSE_BRAKET","SLASH","BACKSLASH","isTagNode","el","isStringNode","keysReduce","obj","reduce","def","Object","keys","acc","key","getNodeLength","node","Array","isArray","content","count","contentNode","String","length","escapeAttrValue","value","replace","attrValue","name","JSON","stringify","attrsToString","values","arr","join","getTagAttrs","tag","params","uniqAttr","res","tagAttr","attrs","TagNode","attr","this","append","push","appendToNode","setStart","start","setEnd","end","toTagStart","openTag","closeTag","toTagEnd","toTagNode","newNode","toLowerCase","toString","r","renderContent","tagStart","create","isOf","type","constructor","TOKEN_TYPE_ID","getTokenValue","token","isTagEnd","charCodeAt","Token","isEmpty","isNaN","isText","isTag","isAttrName","isAttrValue","isStart","isEnd","getName","slice","getTagName","getValue","getLine","getColumn","getStart","getEnd","text","tokenToText","row","col","TYPE_WORD","TYPE_TAG","TYPE_ATTR_NAME","TYPE_ATTR_VALUE","TYPE_SPACE","TYPE_NEW_LINE","CharGrabber","skip","num","silent","c","pos","o","onSkip","hasNext","len","getCurr","s","getPos","getLength","getRest","substring","getNext","nextPos","getPrev","prevPos","isLast","includes","val","indexOf","grabWhile","condition","grabN","substrUntilChar","char","idx","source","options","createCharGrabber","EM","STATE_WORD","STATE_TAG","STATE_TAG_ATTRS","TAG_STATE_NAME","TAG_STATE_ATTR","TAG_STATE_VALUE","WHITESPACES","SPECIAL_CHARS","END_POS_OFFSET","isWhiteSpace","isEscapeChar","isSpecialChar","isNewLine","unq","str","charToRemove","charAt","trimChar","createLexer","buffer","prevCol","tokenIndex","stateMode","tagMode","contextFreeTag","tokens","Math","floor","escapeTags","enableEscapeTags","contextFreeTags","filter","Boolean","map","nestedMap","Map","onToken","RESERVED_CHARS","NOT_CHAR_TOKENS","isCharReserved","isCharToken","isEscapableChar","checkContextFreeMode","isClosingTag","chars","emitToken","startPos","endPos","cl","p","e","createTokenOfType","nextTagState","tagChars","isSingleValueTag","masterStartPos","validAttrName","isValue","stateSpecial","validAttrValue","isQM","prevChar","nextChar","isPrevSLASH","isNextEQ","isWS","isNextWS","stateTag","currChar","substr","hasInvalidChars","isNoAttrsInTag","stateAttrs","tagStr","tagGrabber","hasSpace","stateWord","word","fullTagLen","fullTagName","isChar","tokenize","isTokenNested","has","get","status","set","NodeList","last","n","flush","pop","toArray","createList","parse","input","opts","onlyAllowTags","tokenizer","nodes","nestedNodes","tagNodes","tagNodesAttrName","nestedTagsMap","Set","isTagNested","tagName","flushTagNodes","getNodes","lastNestedNode","appendNodeAsString","isNested","forEach","item","appendNodes","handleTagStart","tagNode","from","to","add","handleTag","lastTagNode","onError","line","column","lineNumber","columnNumber","handleTagEnd","lexer","createTokenizer","activeTagNode","tokenValue","attrName","handleNode","isObj","isBool","iterate","t","cb","tree","same","expected","actual","every","exp","some","call","act","ao","eo","createTree","extendedTree","messages","walk","match","expr","expression","SELFCLOSE_END_TAG","CLOSE_START_TAG","START_TAG","END_TAG","renderNode","stripTags","render","toNode","gen","preprocessAttr","raw","vals","_default","nodeRaw","openTagParts","split","trim","startsWith","endsWith","toOriginalStartTag","toOriginalEndTag","regexIndexOf","string","regex","startpos","search","MD_NEWLINE_INJECT","MD_NEWLINE_PRE_INJECT","MD_NEWLINE_INJECT_COMMENT","URL_REGEX_SINGLE_LINE","RegExp","ESCAPABLES_REGEX","MD_TABLE_REGEX","generateGUID","d","Date","getTime","window","performance","now","random","isString","disableLineBreakConversion","unshift","child","splice","isWhitespaceSensitive","test","numSpaces","fromCharCode","repeat","process","tags","core","tagCallback","SLIDE_TITLE_OPEN","Symbol","SLIDE_TITLE_CLOSE","SLIDE_CLOSE","SLIDE_REGEX","markerToString","marker","accordionTags","accordion","groupId","markedContent","contentArr","newArr","shift","foundIndex","preContent","postContent","groups","slideTitleOpen","slideTitleClose","slideClose","generateSlideMarkersFromContent","generatedSlides","currentSlide","prevMarker","customTitle","generateSlidesFromMarkers","filteredContent","isValid","data","customSettings","lastValidAlignment","align","width","find","classes","style","class","slide","title","isOpen","open","titleAlign","left","right","center","possibleOptions","alignment","anchor","a","id","goto","href","WEB_FONTS","VALID_FONT_STYLES","thin","extralight","light","regular","medium","semibold","bold","extrabold","black","REGISTERED_AXIS","AXES_REGEX","emailHeader","emailFooter","rowcolumn","columnAttrs","columnStyle","EVENTS","ACCEPTED_OPTIONS","textmessage","recipient","message","option","animation","previewing","commonGUID","commonId","keyframes","ident","cleanContent","replaceAll","formatted","styles","bg","color","block","defaultOp","blockAttr","blockOption","blockquote","author","border","br","centerblock","percentageInput","check","nameAttr","classSuffix","className","selector","mediaQuery","state","minWidth","maxWidth","code","inputColor","comment","div","classAttrs","classNames","divide","fieldset","fa","font","fontFamily","family","axes","ital","wght","matches","exec","italic","weight","named_weight","fromEntries","entries","axesParser","url","sort","googleFontApiBuild","fonts","custom","fontVar","h","h1","h2","h3","h4","h5","h6","heightrestrict","heightInput","heightValue","parsedHeight","parseHeight","highlight","icode","imagefloat","inlinespoiler","justify","keyframe","mail","attributes","mailAttr","mailOption","person","subject","newspaper","nobr","note","ooc","pindent","plain","print","printAttr","printOption","progress","percentageInt","quote","thinprogress","savenl","sh","script","onEvent","on","scriptSetup","version","bbscripts","scroll","side","size","fontSize","fontValue","valid","parsedSize","sizeRanges","unit","parseFontSize","outputAttr","spoiler","providedTitle","sub","sup","tab","tabId","checked","for","tabs","tabsList","tabNode","b","i","u","availableTags","preset","createPreset","defTags","processor","presetFactory","presetExecutor","assign","extend","callback","removeNewlineInjects","renderHoistedCodeBlocks","hoistMap","uuid","createClassStyleTagTemplate","createScriptTagTemplate","fenceCodeBlockPreprocess","index","addHoistAndReturnNewStartPoint","cutOffStart","cutOffEnd","fence","fenceInfo","closingFenceRegex","nextIndex","replacement","bbcode","closingTag","bbcodeTag","backtick","tickStart","tickEnd","mdTableBlockPreprocess","table","err","console","warn","presetTags","plugins","preserveWhitespace","preprocessed","preprocessedData","preprocessors","preprocessor","preprocessRaw","plugs","mockRender","skipParse","parser","parseFn","renderFn","Error","plugin","newTree","html","bbob","final","postprocessors","postprocessor"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,13,64]} \ No newline at end of file +{"version":3,"file":"bbcode-parser.min.js","sources":["../../node_modules/@bbob/plugin-helper/es/char.js","../../node_modules/@bbob/plugin-helper/es/helpers.js","../../node_modules/@bbob/plugin-helper/es/TagNode.js","../../node_modules/@bbob/parser/es/Token.js","../../node_modules/@bbob/parser/es/utils.js","../../node_modules/@bbob/parser/es/lexer.js","../../node_modules/@bbob/parser/es/parse.js","../../node_modules/@bbob/core/es/utils.js","../../node_modules/@bbob/core/es/index.js","../../node_modules/@bbob/html/es/index.js","../../bbcode-src/utils/common.js","../../bbcode-src/plugins/lineBreak.js","../../bbcode-src/plugins/preserveWhitespace.js","../../node_modules/@bbob/preset/es/preset.js","../../bbcode-src/tags/accordion.js","../../bbcode-src/tags/alignment.js","../../bbcode-src/tags/anchor.js","../../bbcode-src/tags/font.js","../../bbcode-src/tags/heightrestrict.js","../../bbcode-src/tags/mail.js","../../bbcode-src/tags/rowcolumn.js","../../bbcode-src/tags/script.js","../../bbcode-src/tags/size.js","../../bbcode-src/tags/textmessage.js","../../bbcode-src/preset.js","../../bbcode-src/tags/animation.js","../../bbcode-src/tags/background.js","../../bbcode-src/tags/block.js","../../bbcode-src/tags/blockquote.js","../../bbcode-src/tags/border.js","../../bbcode-src/tags/lineBreak.js","../../bbcode-src/tags/centerblock.js","../../bbcode-src/tags/check.js","../../bbcode-src/tags/class.js","../../bbcode-src/tags/code.js","../../bbcode-src/tags/color.js","../../bbcode-src/tags/comment.js","../../bbcode-src/tags/div.js","../../bbcode-src/tags/divide.js","../../bbcode-src/tags/fieldset.js","../../bbcode-src/tags/fontawesome.js","../../bbcode-src/tags/header.js","../../bbcode-src/tags/highlight.js","../../bbcode-src/tags/imagefloat.js","../../bbcode-src/tags/spoiler.js","../../bbcode-src/tags/justify.js","../../bbcode-src/tags/newspaper.js","../../bbcode-src/tags/note.js","../../bbcode-src/tags/ooc.js","../../bbcode-src/tags/pindent.js","../../bbcode-src/tags/plain.js","../../bbcode-src/tags/print.js","../../bbcode-src/tags/progress.js","../../bbcode-src/tags/quote.js","../../bbcode-src/tags/thinprogress.js","../../bbcode-src/tags/scroll.js","../../bbcode-src/tags/side.js","../../bbcode-src/tags/subscript.js","../../bbcode-src/tags/superscript.js","../../bbcode-src/tags/tabs.js","../../bbcode-src/tags/discourse-core-replacement.js","../../bbcode-src/utils/postprocess.js","../../bbcode-src/utils/preprocess.js","../../bbcode-src/index.js","../../node_modules/@bbob/core/es/errors.js"],"sourcesContent":["const N = '\\n';\nconst TAB = '\\t';\nconst F = '\\f';\nconst R = '\\r';\nconst EQ = '=';\nconst QUOTEMARK = '\"';\nconst SPACE = ' ';\nconst OPEN_BRAKET = '[';\nconst CLOSE_BRAKET = ']';\nconst SLASH = '/';\nconst BACKSLASH = '\\\\';\nexport { N, F, R, EQ, TAB, SPACE, SLASH, BACKSLASH, QUOTEMARK, OPEN_BRAKET, CLOSE_BRAKET };\n","import { N } from './char';\nfunction isTagNode(el) {\n return typeof el === 'object' && el !== null && 'tag' in el;\n}\nfunction isStringNode(el) {\n return typeof el === 'string';\n}\n// check string is end of line\nfunction isEOL(el) {\n return el === N;\n}\nfunction keysReduce(obj, reduce, def) {\n const keys = Object.keys(obj);\n return keys.reduce((acc, key)=>reduce(acc, key, obj), def);\n}\nfunction getNodeLength(node) {\n if (isTagNode(node) && Array.isArray(node.content)) {\n return node.content.reduce((count, contentNode)=>{\n return count + getNodeLength(contentNode);\n }, 0);\n }\n if (isStringNode(node)) {\n return String(node).length;\n }\n return 0;\n}\nfunction appendToNode(node, value) {\n if (Array.isArray(node.content)) {\n node.content.push(value);\n }\n}\n/**\n * Replaces \" to &qquot;\n * @param {string} value\n */ function escapeAttrValue(value) {\n return value.replace(/&/g, '&').replace(//g, '>').replace(/\"/g, '"').replace(/'/g, ''')// eslint-disable-next-line no-script-url\n .replace(/(javascript|data|vbscript):/gi, '$1%3A');\n}\n/**\n * @deprecated use escapeAttrValue\n */ const escapeHTML = escapeAttrValue;\n/**\n * Accept name and value and return valid html5 attribute string\n */ function attrValue(name, value) {\n // in case of performance\n switch(typeof value){\n case 'boolean':\n return value ? `${name}` : '';\n case 'number':\n return `${name}=\"${value}\"`;\n case 'string':\n return `${name}=\"${escapeAttrValue(value)}\"`;\n case 'object':\n return `${name}=\"${escapeAttrValue(JSON.stringify(value))}\"`;\n default:\n return '';\n }\n}\n/**\n * Transforms attrs to html params string\n * @example\n * attrsToString({ 'foo': true, 'bar': bar' }) => 'foo=\"true\" bar=\"bar\"'\n */ function attrsToString(values) {\n // To avoid some malformed attributes\n if (values == null) {\n return '';\n }\n return keysReduce(values, (arr, key, obj)=>[\n ...arr,\n attrValue(key, obj[key])\n ], [\n ''\n ]).join(' ');\n}\n/**\n * Gets value from\n * @example\n * getUniqAttr({ 'foo': true, 'bar': bar' }) => 'bar'\n */ function getUniqAttr(attrs) {\n return keysReduce(attrs || {}, (res, key, obj)=>obj[key] === key ? obj[key] : null, null);\n}\nexport { attrsToString, attrValue, appendToNode, escapeHTML, escapeAttrValue, getNodeLength, getUniqAttr, isTagNode, isStringNode, isEOL };\n","import { OPEN_BRAKET, CLOSE_BRAKET, SLASH } from './char';\nimport { getUniqAttr, getNodeLength, appendToNode, attrsToString, attrValue, isTagNode } from './helpers';\nconst getTagAttrs = (tag, params)=>{\n const uniqAttr = getUniqAttr(params);\n if (uniqAttr) {\n const tagAttr = attrValue(tag, uniqAttr);\n const attrs = {\n ...params\n };\n delete attrs[String(uniqAttr)];\n const attrsStr = attrsToString(attrs);\n return `${tagAttr}${attrsStr}`;\n }\n return `${tag}${attrsToString(params)}`;\n};\nconst renderContent = (content, openTag, closeTag)=>{\n const toString = (node)=>{\n if (isTagNode(node)) {\n return node.toString({\n openTag,\n closeTag\n });\n }\n return String(node);\n };\n if (Array.isArray(content)) {\n return content.reduce((r, node)=>{\n if (node !== null) {\n return r + toString(node);\n }\n return r;\n }, '');\n }\n if (content) {\n return toString(content);\n }\n return null;\n};\nexport class TagNode {\n attr(name, value) {\n if (typeof value !== 'undefined') {\n this.attrs[name] = value;\n }\n return this.attrs[name];\n }\n append(value) {\n return appendToNode(this, value);\n }\n setStart(value) {\n this.start = value;\n }\n setEnd(value) {\n this.end = value;\n }\n get length() {\n return getNodeLength(this);\n }\n toTagStart({ openTag = OPEN_BRAKET, closeTag = CLOSE_BRAKET } = {}) {\n const tagAttrs = getTagAttrs(String(this.tag), this.attrs);\n return `${openTag}${tagAttrs}${closeTag}`;\n }\n toTagEnd({ openTag = OPEN_BRAKET, closeTag = CLOSE_BRAKET } = {}) {\n return `${openTag}${SLASH}${this.tag}${closeTag}`;\n }\n toTagNode() {\n const newNode = new TagNode(String(this.tag).toLowerCase(), this.attrs, this.content);\n if (this.start) {\n newNode.setStart(this.start);\n }\n if (this.end) {\n newNode.setEnd(this.end);\n }\n return newNode;\n }\n toString({ openTag = OPEN_BRAKET, closeTag = CLOSE_BRAKET } = {}) {\n const content = this.content ? renderContent(this.content, openTag, closeTag) : '';\n const tagStart = this.toTagStart({\n openTag,\n closeTag\n });\n if (this.content === null || Array.isArray(this.content) && this.content.length === 0) {\n return tagStart;\n }\n return `${tagStart}${content}${this.toTagEnd({\n openTag,\n closeTag\n })}`;\n }\n static create(tag, attrs = {}, content = null, start) {\n const node = new TagNode(tag, attrs, content);\n if (start) {\n node.setStart(start);\n }\n return node;\n }\n static isOf(node, type) {\n return node.tag === type;\n }\n constructor(tag, attrs, content){\n this.tag = tag;\n this.attrs = attrs;\n this.content = content;\n }\n}\n","import { OPEN_BRAKET, CLOSE_BRAKET, SLASH } from '@bbob/plugin-helper';\n// type, value, line, row, start pos, end pos\nconst TOKEN_TYPE_ID = 't'; // 0;\nconst TOKEN_VALUE_ID = 'v'; // 1;\nconst TOKEN_COLUMN_ID = 'r'; // 2;\nconst TOKEN_LINE_ID = 'l'; // 3;\nconst TOKEN_START_POS_ID = 's'; // 4;\nconst TOKEN_END_POS_ID = 'e'; // 5;\nconst TOKEN_TYPE_WORD = 1; // 'word';\nconst TOKEN_TYPE_TAG = 2; // 'tag';\nconst TOKEN_TYPE_ATTR_NAME = 3; // 'attr-name';\nconst TOKEN_TYPE_ATTR_VALUE = 4; // 'attr-value';\nconst TOKEN_TYPE_SPACE = 5; // 'space';\nconst TOKEN_TYPE_NEW_LINE = 6; // 'new-line';\nconst getTokenValue = (token)=>{\n if (token && typeof token[TOKEN_VALUE_ID] !== 'undefined') {\n return token[TOKEN_VALUE_ID];\n }\n return '';\n};\nconst getTokenLine = (token)=>token && token[TOKEN_LINE_ID] || 0;\nconst getTokenColumn = (token)=>token && token[TOKEN_COLUMN_ID] || 0;\nconst getStartPosition = (token)=>token && token[TOKEN_START_POS_ID] || 0;\nconst getEndPosition = (token)=>token && token[TOKEN_END_POS_ID] || 0;\nconst isTextToken = (token)=>{\n if (token && typeof token[TOKEN_TYPE_ID] !== 'undefined') {\n return token[TOKEN_TYPE_ID] === TOKEN_TYPE_SPACE || token[TOKEN_TYPE_ID] === TOKEN_TYPE_NEW_LINE || token[TOKEN_TYPE_ID] === TOKEN_TYPE_WORD;\n }\n return false;\n};\nconst isTagToken = (token)=>{\n if (token && typeof token[TOKEN_TYPE_ID] !== 'undefined') {\n return token[TOKEN_TYPE_ID] === TOKEN_TYPE_TAG;\n }\n return false;\n};\nconst isTagEnd = (token)=>getTokenValue(token).charCodeAt(0) === SLASH.charCodeAt(0);\nconst isTagStart = (token)=>!isTagEnd(token);\nconst isAttrNameToken = (token)=>{\n if (token && typeof token[TOKEN_TYPE_ID] !== 'undefined') {\n return token[TOKEN_TYPE_ID] === TOKEN_TYPE_ATTR_NAME;\n }\n return false;\n};\nconst isAttrValueToken = (token)=>{\n if (token && typeof token[TOKEN_TYPE_ID] !== 'undefined') {\n return token[TOKEN_TYPE_ID] === TOKEN_TYPE_ATTR_VALUE;\n }\n return false;\n};\nconst getTagName = (token)=>{\n const value = getTokenValue(token);\n return isTagEnd(token) ? value.slice(1) : value;\n};\nconst tokenToText = (token)=>{\n let text = OPEN_BRAKET;\n text += getTokenValue(token);\n text += CLOSE_BRAKET;\n return text;\n};\n/**\n * @export\n * @class Token\n */ class Token {\n get type() {\n return this[TOKEN_TYPE_ID];\n }\n isEmpty() {\n return this[TOKEN_TYPE_ID] === 0 || isNaN(this[TOKEN_TYPE_ID]);\n }\n isText() {\n return isTextToken(this);\n }\n isTag() {\n return isTagToken(this);\n }\n isAttrName() {\n return isAttrNameToken(this);\n }\n isAttrValue() {\n return isAttrValueToken(this);\n }\n isStart() {\n return isTagStart(this);\n }\n isEnd() {\n return isTagEnd(this);\n }\n getName() {\n return getTagName(this);\n }\n getValue() {\n return getTokenValue(this);\n }\n getLine() {\n return getTokenLine(this);\n }\n getColumn() {\n return getTokenColumn(this);\n }\n getStart() {\n return getStartPosition(this);\n }\n getEnd() {\n return getEndPosition(this);\n }\n toString() {\n return tokenToText(this);\n }\n constructor(type, value, row = 0, col = 0, start = 0, end = 0){\n this[TOKEN_LINE_ID] = row;\n this[TOKEN_COLUMN_ID] = col;\n this[TOKEN_TYPE_ID] = type || 0;\n this[TOKEN_VALUE_ID] = String(value);\n this[TOKEN_START_POS_ID] = start;\n this[TOKEN_END_POS_ID] = end;\n }\n}\nexport const TYPE_ID = TOKEN_TYPE_ID;\nexport const VALUE_ID = TOKEN_VALUE_ID;\nexport const LINE_ID = TOKEN_LINE_ID;\nexport const COLUMN_ID = TOKEN_COLUMN_ID;\nexport const START_POS_ID = TOKEN_START_POS_ID;\nexport const END_POS_ID = TOKEN_END_POS_ID;\nexport const TYPE_WORD = TOKEN_TYPE_WORD;\nexport const TYPE_TAG = TOKEN_TYPE_TAG;\nexport const TYPE_ATTR_NAME = TOKEN_TYPE_ATTR_NAME;\nexport const TYPE_ATTR_VALUE = TOKEN_TYPE_ATTR_VALUE;\nexport const TYPE_SPACE = TOKEN_TYPE_SPACE;\nexport const TYPE_NEW_LINE = TOKEN_TYPE_NEW_LINE;\nexport { Token };\nexport default Token;\n","import { QUOTEMARK, BACKSLASH } from '@bbob/plugin-helper';\nexport class CharGrabber {\n skip(num = 1, silent) {\n this.c.pos += num;\n if (this.o && this.o.onSkip && !silent) {\n this.o.onSkip();\n }\n }\n hasNext() {\n return this.c.len > this.c.pos;\n }\n getCurr() {\n if (typeof this.s[this.c.pos] === 'undefined') {\n return '';\n }\n return this.s[this.c.pos];\n }\n getPos() {\n return this.c.pos;\n }\n getLength() {\n return this.c.len;\n }\n getRest() {\n return this.s.substring(this.c.pos);\n }\n getNext() {\n const nextPos = this.c.pos + 1;\n return nextPos <= this.s.length - 1 ? this.s[nextPos] : null;\n }\n getPrev() {\n const prevPos = this.c.pos - 1;\n if (typeof this.s[prevPos] === 'undefined') {\n return null;\n }\n return this.s[prevPos];\n }\n isLast() {\n return this.c.pos === this.c.len;\n }\n includes(val) {\n return this.s.indexOf(val, this.c.pos) >= 0;\n }\n grabWhile(condition, silent) {\n let start = 0;\n if (this.hasNext()) {\n start = this.c.pos;\n while(this.hasNext() && condition(this.getCurr())){\n this.skip(1, silent);\n }\n }\n return this.s.substring(start, this.c.pos);\n }\n grabN(num = 0) {\n return this.s.substring(this.c.pos, this.c.pos + num);\n }\n /**\n * Grabs rest of string until it find a char\n */ substrUntilChar(char) {\n const { pos } = this.c;\n const idx = this.s.indexOf(char, pos);\n return idx >= 0 ? this.s.substring(pos, idx) : '';\n }\n constructor(source, options = {}){\n this.s = source;\n this.c = {\n pos: 0,\n len: source.length\n };\n this.o = options;\n }\n}\n/**\n * Creates a grabber wrapper for source string, that helps to iterate over string char by char\n */ export const createCharGrabber = (source, options)=>new CharGrabber(source, options);\n/**\n * Trims string from start and end by char\n * @example\n * trimChar('*hello*', '*') ==> 'hello'\n */ export const trimChar = (str, charToRemove)=>{\n while(str.charAt(0) === charToRemove){\n // eslint-disable-next-line no-param-reassign\n str = str.substring(1);\n }\n while(str.charAt(str.length - 1) === charToRemove){\n // eslint-disable-next-line no-param-reassign\n str = str.substring(0, str.length - 1);\n }\n return str;\n};\n/**\n * Unquotes \\\" to \"\n */ export const unquote = (str)=>str.replace(BACKSLASH + QUOTEMARK, QUOTEMARK);\n","/* eslint-disable no-plusplus,no-param-reassign */ import { OPEN_BRAKET, CLOSE_BRAKET, QUOTEMARK, BACKSLASH, SLASH, SPACE, TAB, EQ, N } from '@bbob/plugin-helper';\nimport { Token, TYPE_ATTR_NAME, TYPE_ATTR_VALUE, TYPE_NEW_LINE, TYPE_SPACE, TYPE_TAG, TYPE_WORD } from './Token';\nimport { createCharGrabber, trimChar, unquote } from './utils';\n// for cases \nconst EM = '!';\nexport function createTokenOfType(type, value, r = 0, cl = 0, p = 0, e = 0) {\n return new Token(type, value, r, cl, p, e);\n}\nconst STATE_WORD = 0;\nconst STATE_TAG = 1;\nconst STATE_TAG_ATTRS = 2;\nconst TAG_STATE_NAME = 0;\nconst TAG_STATE_ATTR = 1;\nconst TAG_STATE_VALUE = 2;\nconst WHITESPACES = [\n SPACE,\n TAB\n];\nconst SPECIAL_CHARS = [\n EQ,\n SPACE,\n TAB\n];\nconst END_POS_OFFSET = 2; // length + start position offset\nconst isWhiteSpace = (char)=>WHITESPACES.indexOf(char) >= 0;\nconst isEscapeChar = (char)=>char === BACKSLASH;\nconst isSpecialChar = (char)=>SPECIAL_CHARS.indexOf(char) >= 0;\nconst isNewLine = (char)=>char === N;\nconst unq = (val)=>unquote(trimChar(val, QUOTEMARK));\nexport function createLexer(buffer, options = {}) {\n let row = 0;\n let prevCol = 0;\n let col = 0;\n let tokenIndex = -1;\n let stateMode = STATE_WORD;\n let tagMode = TAG_STATE_NAME;\n let contextFreeTag = '';\n const tokens = new Array(Math.floor(buffer.length));\n const openTag = options.openTag || OPEN_BRAKET;\n const closeTag = options.closeTag || CLOSE_BRAKET;\n const escapeTags = !!options.enableEscapeTags;\n const contextFreeTags = (options.contextFreeTags || []).filter(Boolean).map((tag)=>tag.toLowerCase());\n const nestedMap = new Map();\n const onToken = options.onToken || (()=>{});\n const RESERVED_CHARS = [\n closeTag,\n openTag,\n QUOTEMARK,\n BACKSLASH,\n SPACE,\n TAB,\n EQ,\n N,\n EM\n ];\n const NOT_CHAR_TOKENS = [\n openTag,\n SPACE,\n TAB,\n N\n ];\n const isCharReserved = (char)=>RESERVED_CHARS.indexOf(char) >= 0;\n const isCharToken = (char)=>NOT_CHAR_TOKENS.indexOf(char) === -1;\n const isEscapableChar = (char)=>char === openTag || char === closeTag || char === BACKSLASH;\n const onSkip = ()=>{\n col++;\n };\n const checkContextFreeMode = (name, isClosingTag)=>{\n if (contextFreeTag !== '' && isClosingTag) {\n contextFreeTag = '';\n }\n if (contextFreeTag === '' && contextFreeTags.includes(name.toLowerCase())) {\n contextFreeTag = name;\n }\n };\n const chars = createCharGrabber(buffer, {\n onSkip\n });\n /**\n * Emits newly created token to subscriber\n * @param {Number} type\n * @param {String} value\n */ function emitToken(type, value, startPos, endPos) {\n const token = createTokenOfType(type, value, row, prevCol, startPos, endPos);\n onToken(token);\n prevCol = col;\n tokenIndex += 1;\n tokens[tokenIndex] = token;\n }\n function nextTagState(tagChars, isSingleValueTag, masterStartPos) {\n if (tagMode === TAG_STATE_ATTR) {\n const validAttrName = (char)=>!(char === EQ || isWhiteSpace(char));\n const name = tagChars.grabWhile(validAttrName);\n const isEnd = tagChars.isLast();\n const isValue = tagChars.getCurr() !== EQ;\n tagChars.skip();\n if (isEnd || isValue) {\n emitToken(TYPE_ATTR_VALUE, unq(name));\n } else {\n emitToken(TYPE_ATTR_NAME, name);\n }\n if (isEnd) {\n return TAG_STATE_NAME;\n }\n if (isValue) {\n return TAG_STATE_ATTR;\n }\n return TAG_STATE_VALUE;\n }\n if (tagMode === TAG_STATE_VALUE) {\n let stateSpecial = false;\n const validAttrValue = (char)=>{\n // const isEQ = char === EQ;\n const isQM = char === QUOTEMARK;\n const prevChar = tagChars.getPrev();\n const nextChar = tagChars.getNext();\n const isPrevSLASH = prevChar === BACKSLASH;\n const isNextEQ = nextChar === EQ;\n const isWS = isWhiteSpace(char);\n // const isPrevWS = isWhiteSpace(prevChar);\n const isNextWS = nextChar && isWhiteSpace(nextChar);\n if (stateSpecial && isSpecialChar(char)) {\n return true;\n }\n if (isQM && !isPrevSLASH) {\n stateSpecial = !stateSpecial;\n if (!stateSpecial && !(isNextEQ || isNextWS)) {\n return false;\n }\n }\n if (!isSingleValueTag) {\n return !isWS;\n // return (isEQ || isWS) === false;\n }\n return true;\n };\n const name = tagChars.grabWhile(validAttrValue);\n tagChars.skip();\n emitToken(TYPE_ATTR_VALUE, unq(name));\n if (tagChars.getPrev() === QUOTEMARK) {\n prevCol++;\n }\n if (tagChars.isLast()) {\n return TAG_STATE_NAME;\n }\n return TAG_STATE_ATTR;\n }\n const start = masterStartPos + tagChars.getPos() - 1;\n const validName = (char)=>!(char === EQ || isWhiteSpace(char) || tagChars.isLast());\n const name = tagChars.grabWhile(validName);\n emitToken(TYPE_TAG, name, start, masterStartPos + tagChars.getLength() + 1);\n checkContextFreeMode(name);\n tagChars.skip();\n prevCol++;\n // in cases when we has [url=someval]GET[/url] and we dont need to parse all\n if (isSingleValueTag) {\n return TAG_STATE_VALUE;\n }\n const hasEQ = tagChars.includes(EQ);\n return hasEQ ? TAG_STATE_ATTR : TAG_STATE_VALUE;\n }\n function stateTag() {\n const currChar = chars.getCurr();\n const nextChar = chars.getNext();\n chars.skip();\n // detect case where we have '[My word [tag][/tag]' or we have '[My last line word'\n const substr = chars.substrUntilChar(closeTag);\n const hasInvalidChars = substr.length === 0 || substr.indexOf(openTag) >= 0;\n if (nextChar && isCharReserved(nextChar) || hasInvalidChars || chars.isLast()) {\n emitToken(TYPE_WORD, currChar);\n return STATE_WORD;\n }\n // [myTag ]\n const isNoAttrsInTag = substr.indexOf(EQ) === -1;\n // [/myTag]\n const isClosingTag = substr[0] === SLASH;\n if (isNoAttrsInTag || isClosingTag) {\n const startPos = chars.getPos() - 1;\n const name = chars.grabWhile((char)=>char !== closeTag);\n const endPos = startPos + name.length + END_POS_OFFSET;\n chars.skip(); // skip closeTag\n emitToken(TYPE_TAG, name, startPos, endPos);\n checkContextFreeMode(name, isClosingTag);\n return STATE_WORD;\n }\n return STATE_TAG_ATTRS;\n }\n function stateAttrs() {\n const startPos = chars.getPos();\n const silent = true;\n const tagStr = chars.grabWhile((char)=>char !== closeTag, silent);\n const tagGrabber = createCharGrabber(tagStr, {\n onSkip\n });\n const hasSpace = tagGrabber.includes(SPACE);\n tagMode = TAG_STATE_NAME;\n while(tagGrabber.hasNext()){\n tagMode = nextTagState(tagGrabber, !hasSpace, startPos);\n }\n chars.skip(); // skip closeTag\n return STATE_WORD;\n }\n function stateWord() {\n if (isNewLine(chars.getCurr())) {\n emitToken(TYPE_NEW_LINE, chars.getCurr());\n chars.skip();\n col = 0;\n prevCol = 0;\n row++;\n return STATE_WORD;\n }\n if (isWhiteSpace(chars.getCurr())) {\n const word = chars.grabWhile(isWhiteSpace);\n emitToken(TYPE_SPACE, word);\n return STATE_WORD;\n }\n if (chars.getCurr() === openTag) {\n if (contextFreeTag) {\n const fullTagLen = openTag.length + SLASH.length + contextFreeTag.length;\n const fullTagName = `${openTag}${SLASH}${contextFreeTag}`;\n const foundTag = chars.grabN(fullTagLen);\n const isEndContextFreeMode = foundTag === fullTagName;\n if (isEndContextFreeMode) {\n return STATE_TAG;\n }\n } else if (chars.includes(closeTag)) {\n return STATE_TAG;\n }\n emitToken(TYPE_WORD, chars.getCurr());\n chars.skip();\n prevCol++;\n return STATE_WORD;\n }\n if (escapeTags) {\n if (isEscapeChar(chars.getCurr())) {\n const currChar = chars.getCurr();\n const nextChar = chars.getNext();\n chars.skip(); // skip the \\ without emitting anything\n if (nextChar && isEscapableChar(nextChar)) {\n chars.skip(); // skip past the [, ] or \\ as well\n emitToken(TYPE_WORD, nextChar);\n return STATE_WORD;\n }\n emitToken(TYPE_WORD, currChar);\n return STATE_WORD;\n }\n const isChar = (char)=>isCharToken(char) && !isEscapeChar(char);\n const word = chars.grabWhile(isChar);\n emitToken(TYPE_WORD, word);\n return STATE_WORD;\n }\n const word = chars.grabWhile(isCharToken);\n emitToken(TYPE_WORD, word);\n return STATE_WORD;\n }\n function tokenize() {\n stateMode = STATE_WORD;\n while(chars.hasNext()){\n switch(stateMode){\n case STATE_TAG:\n stateMode = stateTag();\n break;\n case STATE_TAG_ATTRS:\n stateMode = stateAttrs();\n break;\n case STATE_WORD:\n default:\n stateMode = stateWord();\n break;\n }\n }\n tokens.length = tokenIndex + 1;\n return tokens;\n }\n function isTokenNested(token) {\n const value = openTag + SLASH + token.getValue();\n if (nestedMap.has(value)) {\n return !!nestedMap.get(value);\n } else {\n const status = buffer.indexOf(value) > -1;\n nestedMap.set(value, status);\n return status;\n }\n }\n return {\n tokenize,\n isTokenNested\n };\n}\n","import { CLOSE_BRAKET, OPEN_BRAKET, TagNode, isTagNode } from \"@bbob/plugin-helper\";\nimport { createLexer } from \"./lexer\";\nclass NodeList {\n last() {\n if (Array.isArray(this.n) && this.n.length > 0 && typeof this.n[this.n.length - 1] !== \"undefined\") {\n return this.n[this.n.length - 1];\n }\n return null;\n }\n flush() {\n return this.n.length ? this.n.pop() : false;\n }\n push(value) {\n this.n.push(value);\n }\n toArray() {\n return this.n;\n }\n constructor(){\n this.n = [];\n }\n}\nconst createList = ()=>new NodeList();\nfunction parse(input, opts = {}) {\n const options = opts;\n const openTag = options.openTag || OPEN_BRAKET;\n const closeTag = options.closeTag || CLOSE_BRAKET;\n const onlyAllowTags = (options.onlyAllowTags || []).filter(Boolean).map((tag)=>tag.toLowerCase());\n let tokenizer = null;\n /**\n * Result AST of nodes\n * @private\n * @type {NodeList}\n */ const nodes = createList();\n /**\n * Temp buffer of nodes that's nested to another node\n * @private\n */ const nestedNodes = createList();\n /**\n * Temp buffer of nodes [tag..]...[/tag]\n * @private\n * @type {NodeList}\n */ const tagNodes = createList();\n /**\n * Temp buffer of tag attributes\n * @private\n * @type {NodeList}\n */ const tagNodesAttrName = createList();\n /**\n * Cache for nested tags checks\n */ const nestedTagsMap = new Set();\n function isTokenNested(token) {\n const value = token.getValue();\n const { isTokenNested } = tokenizer || {};\n if (!nestedTagsMap.has(value) && isTokenNested && isTokenNested(token)) {\n nestedTagsMap.add(value);\n return true;\n }\n return nestedTagsMap.has(value);\n }\n /**\n * @private\n */ function isTagNested(tagName) {\n return Boolean(nestedTagsMap.has(tagName));\n }\n /**\n * @private\n */ function isAllowedTag(value) {\n if (onlyAllowTags.length) {\n return onlyAllowTags.indexOf(value.toLowerCase()) >= 0;\n }\n return true;\n }\n /**\n * Flushes temp tag nodes and its attributes buffers\n * @private\n */ function flushTagNodes() {\n if (tagNodes.flush()) {\n tagNodesAttrName.flush();\n }\n }\n /**\n * @private\n */ function getNodes() {\n const lastNestedNode = nestedNodes.last();\n if (lastNestedNode && isTagNode(lastNestedNode)) {\n return lastNestedNode.content;\n }\n return nodes.toArray();\n }\n /**\n * @private\n */ function appendNodeAsString(nodes, node, isNested = true) {\n if (Array.isArray(nodes) && typeof node !== \"undefined\") {\n nodes.push(node.toTagStart({\n openTag,\n closeTag\n }));\n if (Array.isArray(node.content) && node.content.length) {\n node.content.forEach((item)=>{\n nodes.push(item);\n });\n if (isNested) {\n nodes.push(node.toTagEnd({\n openTag,\n closeTag\n }));\n }\n }\n }\n }\n /**\n * @private\n */ function appendNodes(nodes, node) {\n if (Array.isArray(nodes) && typeof node !== \"undefined\") {\n if (isTagNode(node)) {\n if (isAllowedTag(node.tag)) {\n nodes.push(node.toTagNode());\n } else {\n appendNodeAsString(nodes, node);\n }\n } else {\n nodes.push(node);\n }\n }\n }\n /**\n * @private\n * @param {Token} token\n */ function handleTagStart(token) {\n flushTagNodes();\n const tagNode = TagNode.create(token.getValue(), {}, [], {\n from: token.getStart(),\n to: token.getEnd()\n });\n const isNested = isTokenNested(token);\n tagNodes.push(tagNode);\n if (isNested) {\n nestedNodes.push(tagNode);\n } else {\n const nodes = getNodes();\n appendNodes(nodes, tagNode);\n }\n }\n /**\n * @private\n * @param {Token} token\n */ function handleTagEnd(token) {\n const lastTagNode = nestedNodes.last();\n if (isTagNode(lastTagNode)) {\n lastTagNode.setEnd({\n from: token.getStart(),\n to: token.getEnd()\n });\n }\n flushTagNodes();\n const lastNestedNode = nestedNodes.flush();\n if (lastNestedNode) {\n const nodes = getNodes();\n appendNodes(nodes, lastNestedNode);\n } else if (typeof options.onError === \"function\") {\n const tag = token.getValue();\n const line = token.getLine();\n const column = token.getColumn();\n options.onError({\n tagName: tag,\n lineNumber: line,\n columnNumber: column\n });\n }\n }\n /**\n * @private\n * @param {Token} token\n */ function handleTag(token) {\n // [tag]\n if (token.isStart()) {\n handleTagStart(token);\n }\n // [/tag]\n if (token.isEnd()) {\n handleTagEnd(token);\n }\n }\n /**\n * @private\n * @param {Token} token\n */ function handleNode(token) {\n /**\n * @type {TagNode}\n */ const activeTagNode = tagNodes.last();\n const tokenValue = token.getValue();\n const isNested = isTagNested(token.toString());\n const nodes = getNodes();\n if (activeTagNode !== null) {\n if (token.isAttrName()) {\n tagNodesAttrName.push(tokenValue);\n const attrName = tagNodesAttrName.last();\n if (attrName) {\n activeTagNode.attr(attrName, \"\");\n }\n } else if (token.isAttrValue()) {\n const attrName = tagNodesAttrName.last();\n if (attrName) {\n activeTagNode.attr(attrName, tokenValue);\n tagNodesAttrName.flush();\n } else {\n activeTagNode.attr(tokenValue, tokenValue);\n }\n } else if (token.isText()) {\n if (isNested) {\n activeTagNode.append(tokenValue);\n } else {\n appendNodes(nodes, tokenValue);\n }\n } else if (token.isTag()) {\n // if tag is not allowed, just pass it as is\n appendNodes(nodes, token.toString());\n }\n } else if (token.isText()) {\n appendNodes(nodes, tokenValue);\n } else if (token.isTag()) {\n // if tag is not allowed, just pass it as is\n appendNodes(nodes, token.toString());\n }\n }\n /**\n * @private\n * @param {Token} token\n */ function onToken(token) {\n if (token.isTag()) {\n handleTag(token);\n } else {\n handleNode(token);\n }\n }\n const lexer = opts.createTokenizer ? opts.createTokenizer : createLexer;\n tokenizer = lexer(input, {\n onToken,\n openTag,\n closeTag,\n onlyAllowTags: options.onlyAllowTags,\n contextFreeTags: options.contextFreeTags,\n enableEscapeTags: options.enableEscapeTags\n });\n // eslint-disable-next-line no-unused-vars\n const tokens = tokenizer.tokenize();\n // handles situations where we open tag, but forgot close them\n // for ex [q]test[/q][u]some[/u][q]some [u]some[/u] // forgot to close [/q]\n // so we need to flush nested content to nodes array\n const lastNestedNode = nestedNodes.flush();\n if (lastNestedNode !== null && lastNestedNode && isTagNode(lastNestedNode) && isTagNested(lastNestedNode.tag)) {\n appendNodeAsString(getNodes(), lastNestedNode, false);\n }\n return nodes.toArray();\n}\nexport { parse };\nexport default parse;\n","/* eslint-disable no-plusplus */ const isObj = (value)=>typeof value === 'object' && value !== null;\nconst isBool = (value)=>typeof value === 'boolean';\nexport function iterate(t, cb) {\n const tree = t;\n if (Array.isArray(tree)) {\n for(let idx = 0; idx < tree.length; idx++){\n tree[idx] = iterate(cb(tree[idx]), cb);\n }\n } else if (isObj(tree) && 'content' in tree) {\n iterate(tree.content, cb);\n }\n return tree;\n}\nexport function same(expected, actual) {\n if (typeof expected !== typeof actual) {\n return false;\n }\n if (!isObj(expected) || expected === null) {\n return expected === actual;\n }\n if (Array.isArray(expected)) {\n return expected.every((exp)=>[].some.call(actual, (act)=>same(exp, act)));\n }\n if (isObj(expected) && isObj(actual)) {\n return Object.keys(expected).every((key)=>{\n const ao = actual[key];\n const eo = expected[key];\n if (isObj(eo) && isObj(ao)) {\n return same(eo, ao);\n }\n if (isBool(eo)) {\n return eo !== (ao === null);\n }\n return ao === eo;\n });\n }\n return false;\n}\nexport function match(t, expression, cb) {\n if (Array.isArray(expression)) {\n return iterate(t, (node)=>{\n for(let idx = 0; idx < expression.length; idx++){\n if (same(expression[idx], node)) {\n return cb(node);\n }\n }\n return node;\n });\n }\n return iterate(t, (node)=>same(expression, node) ? cb(node) : node);\n}\n","import { parse } from '@bbob/parser';\nimport { iterate, match } from './utils';\nimport { C1, C2 } from './errors';\nexport function createTree(tree, options) {\n const extendedTree = tree;\n extendedTree.messages = [\n ...extendedTree.messages || []\n ];\n extendedTree.options = {\n ...options,\n ...extendedTree.options\n };\n extendedTree.walk = function walkNodes(cb) {\n return iterate(this, cb);\n };\n extendedTree.match = function matchNodes(expr, cb) {\n return match(this, expr, cb);\n };\n return extendedTree;\n}\nexport default function bbob(plugs) {\n const plugins = typeof plugs === 'function' ? [\n plugs\n ] : plugs || [];\n const mockRender = ()=>\"\";\n return {\n process (input, opts) {\n const options = opts || {\n skipParse: false,\n parser: parse,\n render: mockRender,\n data: null\n };\n const parseFn = options.parser || parse;\n const renderFn = options.render;\n const data = options.data || null;\n if (typeof parseFn !== 'function') {\n throw new Error(C1);\n }\n // raw tree before modification with plugins\n const raw = options.skipParse && Array.isArray(input) ? input : parseFn(input, options);\n let tree = options.skipParse && Array.isArray(input) ? createTree(input || [], options) : createTree(raw, options);\n for(let idx = 0; idx < plugins.length; idx++){\n const plugin = plugins[idx];\n if (typeof plugin === 'function' && renderFn) {\n const newTree = plugin(tree, {\n parse: parseFn,\n render: renderFn,\n iterate,\n data\n });\n tree = createTree(newTree || tree, options);\n }\n }\n return {\n get html () {\n if (typeof renderFn !== 'function') {\n throw new Error(C2);\n }\n return renderFn(tree, tree.options);\n },\n tree,\n raw,\n messages: tree.messages\n };\n }\n };\n}\n","import core from '@bbob/core';\nimport { attrsToString, isTagNode } from '@bbob/plugin-helper';\nconst SELFCLOSE_END_TAG = '/>';\nconst CLOSE_START_TAG = '';\nfunction renderNode(node, options) {\n const { stripTags = false } = options || {};\n if (typeof node === 'undefined' || node === null) {\n return '';\n }\n if (typeof node === 'string' || typeof node === 'number') {\n return String(node);\n }\n if (Array.isArray(node)) {\n return render(node, options);\n }\n if (isTagNode(node)) {\n if (stripTags) {\n return render(node.content, options);\n }\n const attrs = attrsToString(node.attrs);\n if (node.content === null) {\n return START_TAG + node.tag + attrs + SELFCLOSE_END_TAG;\n }\n return START_TAG + node.tag + attrs + END_TAG + render(node.content, options) + CLOSE_START_TAG + node.tag + END_TAG;\n }\n return '';\n}\nexport function render(nodes, options) {\n if (nodes && Array.isArray(nodes)) {\n return nodes.reduce((r, node)=>r + renderNode(node, options), '');\n }\n if (nodes) {\n return renderNode(nodes, options);\n }\n return '';\n}\nexport function html(source, plugins, options) {\n return core(plugins).process(source, {\n ...options,\n render: render\n }).html;\n}\nexport default html;\n","/**\n * Generate the node object.\n *\n * Contains additional logic to help break any unintended side effects of the top down parsing of bbob.\n * @param {string} tag name of the tag\n * @param {Object} attrs attributes of the tag\n * @param {any} content contents of the tag. `[]` will create an empty tag. `null` will create a self closing tag\n *\n * @example\n * ```\n * toNode(\"div\", { class: \"class\" }, \"content\")\n * ```\n * becomes\n * ```\n * {\n * tag: \"div\",\n * attrs: { class: \"class\" },\n * content: \"content\",\n * gen: true,\n * }\n */\nconst toNode = (tag, attrs, content = []) => ({\n tag,\n attrs,\n content,\n gen: true,\n});\n\n/**\n * Preprocess attributes of a node to either return the default single attribute\n * or return a keyed attribute list\n * @param {import('@bbob/types').TagNode} node bbcode node to process\n * @param {string} [raw] raw string. Only include if the single attribute is allowed to have spaces\n * @returns processed attributes\n */\nconst preprocessAttr = (node, raw) => {\n const keys = Object.keys(node.attrs).join(\" \");\n const vals = Object.values(node.attrs).join(\" \");\n if (keys !== vals) {\n // [tag key=val]\n return node.attrs;\n }\n if (!raw || !node.start) {\n return {\n _default: vals,\n };\n }\n // [tag=attr]\n // node.start.from = 0\n // node.start.to = 10\n const nodeRaw = raw.substring(node.start.from, node.start.to);\n if (!nodeRaw.includes(\"=\")) {\n // [tag] or [tag attr]\n return node.attrs;\n }\n const openTagParts = nodeRaw.split(\"=\");\n if (openTagParts.length !== 2) {\n return node.attrs;\n }\n let val = openTagParts[1].slice(0, -1).trim(); // `attr` or `\"attr\"`\n if (val.startsWith('\"') && val.endsWith('\"')) {\n val = val.slice(1, -1);\n }\n return {\n _default: val,\n };\n};\n\n/**\n * Attempts to return tag into its original form with proper attributes\n * @returns string of tag start\n */\nconst toOriginalStartTag = (node, raw) => {\n if (node.start) {\n return raw.substring(node.start.from, node.start.to);\n }\n if (!node.attrs) {\n return `[${node.tag}]`;\n }\n const attrs = preprocessAttr(node, raw);\n if (attrs._default) {\n return `[${node.tag}=${attrs._default}]`;\n } else {\n return node.toTagStart();\n }\n};\n\n/**\n * Attempts to return tag into its original form\n * @returns string of tag end\n */\nconst toOriginalEndTag = (node, raw) => {\n if (node.end) {\n return raw.substring(node.end.from, node.end.to);\n }\n return node.toTagEnd();\n};\n\n/**\n * Given a string, find the first position of a regex match\n * @param {string} string to test against\n * @param {RegExp} regex to test with\n * @param {number} startpos starting position. Defaults to 0\n * @returns index of the first match of the regex in the string\n */\nconst regexIndexOf = (string, regex, startpos) => {\n const indexOf = string.substring(startpos || 0).search(regex);\n return indexOf >= 0 ? indexOf + (startpos || 0) : indexOf;\n};\n\nconst MD_NEWLINE_INJECT = \"\\n\\n\";\nconst MD_NEWLINE_PRE_INJECT = \"\\n\\n\";\nconst MD_NEWLINE_INJECT_COMMENT = \"\";\n\nconst URL_REGEX =\n /(http|ftp|https|upload):\\/\\/([\\w_-]+(?:(?:\\.[\\w_-]+)+))([\\w.,@?^=%&:\\/~+#-]*[\\w@?^=%&\\/~+#-])/;\nconst MD_URL_REGEX =\n /\\!?\\[.*\\]\\((http|ftp|https|upload):\\/\\/([\\w_-]+(?:(?:\\.[\\w_-]+)+))([\\w.,@?^=%&:\\/~+#-]*[\\w@?^=%&\\/~+#-])\\)/;\nconst URL_REGEX_SINGLE_LINE = new RegExp(`^${URL_REGEX.source}|${MD_URL_REGEX.source}$`);\nconst ESCAPABLES_REGEX =\n /((\\n|^)(?```+|~~~+)(?.*\\n))|(?\\[(?i?code|plain)(=.*)?\\])|(?(?`{1,2})(.*)(?\\k))/im;\nconst MD_TABLE_REGEX = /^(\\|[^\\n]+\\|\\r?\\n)((?:\\| ?:?[-]+:? ?)+\\|)(\\n(?:\\|[^\\n]+\\|\\r?\\n?)*)?$/m;\n\n/**\n * Generates a random GUID.\n *\n * Mini Racer doesn't have the crypto module, so we can't use the built-in `crypto.randomUUID` function.\n * @returns {string} a GUID\n */\nfunction generateGUID() {\n let d = new Date().getTime();\n if (window.performance && typeof window.performance.now === \"function\") {\n d += performance.now(); //use high-precision timer if available\n }\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, function (c) {\n // eslint-disable-next-line no-bitwise\n const r = (d + Math.random() * 16) % 16 | 0;\n d = Math.floor(d / 16);\n // eslint-disable-next-line no-bitwise\n return (c === \"x\" ? r : (r & 0x3) | 0x8).toString(16);\n });\n}\n\nexport {\n toNode,\n toOriginalStartTag,\n toOriginalEndTag,\n generateGUID,\n preprocessAttr,\n regexIndexOf,\n MD_NEWLINE_INJECT,\n MD_NEWLINE_INJECT_COMMENT,\n MD_NEWLINE_PRE_INJECT,\n URL_REGEX,\n MD_URL_REGEX,\n MD_TABLE_REGEX,\n URL_REGEX_SINGLE_LINE,\n ESCAPABLES_REGEX,\n};\n","/**\n * Plugin that converts line breaks to `
` tags.\n * To use, put as function similar to the presets.\n *\n * If a node is marked with `noLineBreakConversion`, then it'll skip the parsing the children\n *\n * @example\n * ```ts\n * const output = bbob([preset(), lineBreakPlugin()]).process(input, {render}).html\n * ```\n */\nimport { isEOL } from \"@bbob/plugin-helper\";\nimport { MD_NEWLINE_INJECT, MD_NEWLINE_PRE_INJECT, URL_REGEX_SINGLE_LINE } from \"../utils/common\";\n\nconst isObj = (value) => typeof value === \"object\";\nconst isString = (value) => typeof value === \"string\";\n\n/**\n * Walks the tree of nodes. Will add `br` tag to all `\\n` in format that can be used in any renderer.\n * Preserves \\n so that markdown-it doesn't try to treat everything like a block\n *\n * If a node has the property noLineBreakConversion is encountered, will skip parsing children.\n * @param t tree of nodes to be processed\n * @returns modified tree\n */\nconst walk = (t, disableLineBreakConversion = false) => {\n const tree = t;\n\n if (Array.isArray(tree)) {\n if (tree.some(isString)) {\n // array contains strings. Might be md compatible\n tree.unshift(MD_NEWLINE_INJECT);\n tree.push(MD_NEWLINE_INJECT);\n }\n for (let idx = 0; idx < tree.length; idx++) {\n const child = walk(tree[idx], disableLineBreakConversion);\n if (Array.isArray(child)) {\n tree.splice(idx, 1, ...child);\n idx += child.length - 1;\n } else {\n tree[idx] = child;\n }\n }\n } else if (tree && isObj(tree) && tree.content) {\n if (tree.isWhitespaceSensitive) {\n // applies only to [code] and [icode]\n // stop walk. children won't be parsed to have
\n return tree.tag ? tree : tree.content;\n }\n if (tree.disableLineBreakConversion) {\n disableLineBreakConversion = true;\n }\n walk(tree.content, disableLineBreakConversion);\n return tree.tag ? tree : tree.content;\n } else if (isString(tree) && URL_REGEX_SINGLE_LINE.test(tree.trim())) {\n // if the entire string is a URL, then it should be prepared for onebox.\n // BBob separates strings by newlines anyway, so we can already assume this is sitting on its own line\n // MD_NEWLINE_INJECT is already replacing newline came before or the start of the array,\n // so we only need to make sure \\n\\n is added after the URL\n return [tree, MD_NEWLINE_PRE_INJECT];\n }\n\n if (isString(tree) && isEOL(tree)) {\n return disableLineBreakConversion\n ? [\"\\n\", MD_NEWLINE_INJECT]\n : [{ tag: \"br\", content: null }, MD_NEWLINE_INJECT];\n }\n\n return tree;\n};\n\n/**\n * Converts `\\n` to `
` self closing tag. Supply this as the last plugin in the preset lists\n *\n * @example converts all line breaks to br\n * ```ts\n * const output = bbob([preset(), lineBreakPlugin()]).process(input, {render}).html\n * ```\n * @example will not convert line breaks inside [nobr]\n * ```ts\n * const nobr = (node: TagNode) => {return { disableLineBreakConversion: true, content: node.content }}; \\\\ tag in preset\n * ...\n * const output = bbob([preset(), lineBreakPlugin()]).process(input, {render}).html\n * ```\n * @returns plugin to be used in BBob process\n */\nexport const lineBreakPlugin = () => {\n return (tree) => walk(tree);\n};\n","/**\n * Plugin that converts consecutive normal spaces (U+0020) to non-breaking spaces (U+00A0).\n * To use, put as function similar to the presets.\n *\n *\n * @example\n * ```ts\n * const output = bbob([preset(), , preserveWhitespace(), lineBreakPlugin()]).process(input, {render}).html\n * ```\n */\nimport { isStringNode } from \"@bbob/plugin-helper\";\n\n/**\n * Checks if input is an object\n * @param value input\n * @returns if value is an object\n */\nconst isObj = (value) => typeof value === \"object\";\n\n/**\n * Walks the tree of nodes. Checks for node of consecutive spaces. If found replaces every space in\n * node with a nonbreaking space.\n * Preserves multiple spaces so html won't truncate them.\n *\n * Walks through entire tree.\n * @param t tree of nodes to be processed\n * @returns modified tree\n */\nconst walk = (t) => {\n const tree = t;\n\n if (Array.isArray(tree)) {\n for (let idx = 0; idx < tree.length; idx++) {\n const child = walk(tree[idx]);\n if (Array.isArray(child)) {\n tree.splice(idx, 1, ...child);\n idx += child.length - 1;\n } else {\n tree[idx] = child;\n }\n }\n } else if (tree && isObj(tree) && tree.content) {\n walk(tree.content);\n }\n\n //Bbob breaks up nodes by the presence of normal spaces.\n //So a node with a normal space can only have normal spaces in that node.\n if (isStringNode(tree)) {\n if (tree.length > 1 && tree[0] === \" \") {\n let numSpaces = tree.length;\n return [String.fromCharCode(160).repeat(numSpaces)];\n }\n }\n\n return tree;\n};\n\n/**\n * Converts consecutive normal spaces (U+0020) to nonbreaking spaces (U+00A0).\n * Supply this as a plugin in the preset lists.\n *\n * @example converts consecutive normal spaces (U+0020) to nonbreaking spaces (U+00A0)\n * ```ts\n * const output = bbob([preset(), preserveWhitespace(), lineBreakPlugin()]).process(input, {render}).html\n * ```\n *\n * @returns plugin to be used in BBob process\n */\nexport const preserveWhitespace = () => {\n return (tree) => walk(tree);\n};\n","import { isTagNode } from \"@bbob/plugin-helper\";\nexport function process(tags, tree, core, options) {\n return tree.walk((node)=>{\n if (isTagNode(node)) {\n const tag = node.tag;\n const tagCallback = tags[tag];\n if (typeof tagCallback === \"function\") {\n return tagCallback(node, core, options);\n }\n }\n return node;\n });\n}\n/**\n * Create a preset plugin for @bbob/core\n */ function createPreset(defTags, processor = process) {\n const presetFactory = (opts)=>{\n presetFactory.options = Object.assign(presetFactory.options || {}, opts);\n function presetExecutor(tree, core) {\n return processor(defTags, tree, core, presetFactory.options || {});\n }\n presetExecutor.options = presetFactory.options;\n return presetExecutor;\n };\n presetFactory.extend = function presetExtend(callback) {\n const newTags = callback(defTags, presetFactory.options);\n return createPreset(newTags, processor);\n };\n return presetFactory;\n}\nexport { createPreset };\nexport default createPreset;\n","import { isStringNode, isTagNode, TagNode } from \"@bbob/plugin-helper\";\nimport {\n generateGUID,\n preprocessAttr,\n regexIndexOf,\n toNode,\n toOriginalEndTag,\n toOriginalStartTag,\n} from \"../utils/common\";\n\nconst SLIDE_TITLE_OPEN = Symbol(\"slide-title-open\");\nconst SLIDE_TITLE_CLOSE = Symbol(\"slide-title-close\");\nconst SLIDE_CLOSE = Symbol(\"slide-close\");\nconst SLIDE_REGEX =\n /(?\\{slide=)|(?\\})|(?\\{\\/slide\\})/i;\n\n/**\n * Adds the accordion tag\n * [accordion]{slide=name}content{/slide}[/accordion]\n *\n * [accordion][slide=name]content[/slide][/accordion]\n */\nconst accordion = (node, options) => {\n const groupId = generateGUID();\n\n // add support for existing {slide} tags style, due to copious amounts of existing content\n // also the only way to get true custom content inside a slide due to nesting limitations\n const markedContent = generateSlideMarkersFromContent(node.content);\n const generatedSlides = generateSlidesFromMarkers(markedContent);\n\n const filteredContent = generatedSlides\n .filter((n) => isTagNode(n) && n.tag === \"slide\")\n .map((content) => {\n content.isValid = true;\n content.groupId = groupId;\n return content;\n });\n if (!filteredContent.length) {\n // no [slide] tags found\n return [\n toOriginalStartTag(node, options.data.raw),\n ...node.content,\n toOriginalEndTag(node, options.data.raw),\n ];\n }\n const attrs = preprocessAttr(node, options.data.raw);\n\n if (attrs._default) {\n /** @type {string[]} */\n const customSettings = attrs._default.split(\"|\").map((s) => s.trim());\n const lastValidAlignment = customSettings\n .filter((s) => [\"bright\", \"bcenter\", \"bleft\", \"fleft\", \"fright\"].includes(s))\n .pop();\n if (lastValidAlignment) {\n attrs.align ??= lastValidAlignment;\n }\n\n if (\n customSettings.some((s) => s.endsWith(\"px\")) ||\n customSettings.some((s) => s.endsWith(\"%\"))\n ) {\n attrs.width ??= customSettings.find((s) => s.endsWith(\"px\") || s.endsWith(\"%\"));\n }\n }\n\n let classes = attrs.align?.toLowerCase() || \"\";\n let style = \"\";\n if (attrs.width?.endsWith(\"px\") || attrs.width?.endsWith(\"%\")) {\n style = `width: ${attrs.width};`;\n }\n return toNode(\n \"div\",\n { class: \"bb-accordion \" + classes, \"data-group-id\": groupId, style },\n filteredContent,\n );\n};\n\n/**\n * Locates and splits all {slide} tag components into their respective parts while preserving remaining content\n * @param {(TagNode|string)[]} contentArr node content of the accordion tag\n *\n * @example\n * ```\n * [\"{slide=test}\", \"lorem ipsum\", \"{/slide}\"]\n * ```\n * becomes\n * ```\n * [SLIDE_TITLE_OPEN, \"test\", SLIDE_TITLE_CLOSE, \"lorem ipsum\", SLIDE_CLOSE]\n * ```\n */\nfunction generateSlideMarkersFromContent(contentArr) {\n contentArr = [...contentArr]; // shallow clone. object nodes are not modified anyway\n\n const newArr = [];\n while (contentArr.length > 0) {\n const content = contentArr[0];\n if (isTagNode(content)) {\n newArr.push(contentArr.shift());\n continue;\n }\n const foundIndex = regexIndexOf(content, SLIDE_REGEX);\n if (foundIndex === -1) {\n newArr.push(contentArr.shift());\n continue;\n }\n const match = content.match(SLIDE_REGEX);\n const preContent = content.slice(0, foundIndex);\n const postContent = content.slice(foundIndex + match[0].length);\n if (preContent.length) {\n newArr.push(preContent);\n }\n if (match.groups.slideTitleOpen) {\n newArr.push(SLIDE_TITLE_OPEN);\n }\n if (match.groups.slideTitleClose) {\n newArr.push(SLIDE_TITLE_CLOSE);\n }\n if (match.groups.slideClose) {\n newArr.push(SLIDE_CLOSE);\n }\n if (postContent.length) {\n contentArr[0] = postContent;\n } else {\n contentArr.shift();\n }\n }\n\n return newArr;\n}\n\n/**\n * Generates slide nodes from markers\n * @param {(string | typeof SLIDE_TITLE_OPEN | typeof SLIDE_TITLE_CLOSE | typeof SLIDE_CLOSE | TagNode)[]} markedContent\n */\nfunction generateSlidesFromMarkers(markedContent) {\n const nodes = [];\n let currentSlide = null;\n /** @type {typeof SLIDE_TITLE_OPEN | typeof SLIDE_TITLE_CLOSE | null} */\n let prevMarker = null;\n for (const content of markedContent) {\n if (content === SLIDE_TITLE_OPEN && prevMarker === null) {\n currentSlide = TagNode.create(\"slide\");\n currentSlide.content = [];\n currentSlide.customTitle = [];\n prevMarker = SLIDE_TITLE_OPEN;\n } else if (content === SLIDE_TITLE_CLOSE && prevMarker === SLIDE_TITLE_OPEN) {\n prevMarker = SLIDE_TITLE_CLOSE;\n continue;\n } else if (content === SLIDE_CLOSE && currentSlide && prevMarker === SLIDE_TITLE_CLOSE) {\n nodes.push(currentSlide);\n currentSlide = null;\n prevMarker = null;\n } else if (currentSlide) {\n if (prevMarker === SLIDE_TITLE_OPEN) {\n currentSlide.customTitle.push(markerToString(content));\n } else {\n currentSlide.content.push(markerToString(content));\n }\n } else {\n // no slide open, just add content\n nodes.push(markerToString(content));\n }\n }\n return nodes;\n}\n\n/**\n * Processes content into a string. Catches stray markers and converts them back into a string\n * @param {string | typeof SLIDE_TITLE_OPEN | typeof SLIDE_TITLE_CLOSE | typeof SLIDE_CLOSE} marker\n * @returns expected string\n */\nfunction markerToString(marker) {\n switch (marker) {\n case SLIDE_TITLE_OPEN:\n return \"{slide=\";\n case SLIDE_TITLE_CLOSE:\n return \"}\";\n case SLIDE_CLOSE:\n return \"{/slide}\";\n default:\n return marker;\n }\n}\n\nconst slide = (node, options) => {\n if (!node.isValid) {\n // not inside an [accordion] tag\n return [\n toOriginalStartTag(node, options.data.raw),\n ...node.content,\n toOriginalEndTag(node, options.data.raw),\n ];\n }\n const attrs = preprocessAttr(node, options.data.raw);\n let title = [attrs.title || attrs._default || \"Slide\"];\n let isOpen = !!attrs.open || false;\n let titleAlign = attrs.left ? \"left\" : attrs.right ? \"right\" : attrs.center ? \"center\" : \"left\";\n if (node.customTitle?.length) {\n // slide was created from markers\n title = node.customTitle;\n // pull out old options from title if they exist\n const possibleOptions = title\n .filter((t) => typeof t === \"string\")\n .join(\"\")\n .toLowerCase()\n .split(\"|\")\n .map((s) => s.trim());\n if (possibleOptions.includes(\"open\")) {\n isOpen = true;\n }\n if (possibleOptions.includes(\"right\")) {\n titleAlign = \"right\";\n }\n if (possibleOptions.includes(\"center\")) {\n titleAlign = \"center\";\n }\n if (possibleOptions.includes(\"left\")) {\n titleAlign = \"left\";\n }\n title = title.map((t) => {\n if (isStringNode(t)) {\n t = t.replace(/\\|(open|right|center|left)/gi, \"\");\n }\n return t;\n });\n }\n return [\n toNode(\"details\", { class: \"bb-slide\", open: isOpen }, [\n toNode(\n \"summary\",\n { class: \"bb-slide-title\", style: `text-align: ${titleAlign}; ${attrs.style || \"\"}` },\n title,\n ),\n toNode(\"div\", { class: \"bb-slide-content\" }, node.content),\n ]),\n ];\n};\n\nexport const accordionTags = { accordion, slide };\n","import { toNode } from \"../utils/common\";\n/**\n * @file Adds [left], [center], and [right] to bbcode\n * @example [center]content[/center]\n */\nexport const alignment = {\n left: (node) => toNode(\"div\", { class: \"bb-left\" }, node.content),\n center: (node) => toNode(\"div\", { class: \"bb-center\" }, node.content),\n right: (node) => toNode(\"div\", { class: \"bb-right\" }, node.content),\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n/**\n * @file Adds [a] and [goto] to bbcode\n * @example [a=your_anchor_name]An anchor[/a] [goto=your_anchor_name]Jump to an anchor[/goto]\n */\nexport const anchor = {\n // name is not valid in HTML5; however, it correctly displays back while id does not\n a: (node, options) => {\n const attrs = preprocessAttr(node, options.data.raw)._default || \"\";\n return toNode(\n \"a\",\n { id: `user-anchor-${attrs.trim()}`, name: `user-anchor-${attrs.trim()}` },\n node.content,\n );\n },\n goto: (node, options) => {\n const attrs = preprocessAttr(node, options.data.raw)._default || \"\";\n return toNode(\"a\", { href: `#user-anchor-${attrs.trim()}` }, node.content);\n },\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\nconst WEB_FONTS = [\n \"arial\",\n \"book antiqua\",\n \"courier new\",\n \"georgia\",\n \"tahoma\",\n \"times new roman\",\n \"trebuchet ms\",\n \"verdana\",\n];\nconst VALID_FONT_STYLES = {\n thin: \"100\",\n extralight: \"200\",\n light: \"300\",\n regular: \"400\",\n medium: \"500\",\n semibold: \"600\",\n bold: \"700\",\n extrabold: \"800\",\n black: \"900\",\n};\n// registered axis tags https://learn.microsoft.com/en-us/typography/opentype/spec/dvaraxisreg#registered-axis-tags\nconst REGISTERED_AXIS = [\"ital\", \"opsz\", \"slnt\", \"wdth\", \"wght\"];\n\nconst AXES_REGEX = /(?[a-zA-Z]*)?\\s?(?[0-9]*)?\\s?(?italic)?/;\n\nconst axesParser = (attrs) => {\n let axes = {\n ital: 0,\n wght: 400,\n };\n\n if (attrs?.style) {\n // user just copy pasted the name of the style on the google font site, probably\n const style = attrs.style.trim().toLowerCase();\n const matches = AXES_REGEX.exec(style).groups || {};\n if (matches?.italic) {\n axes.ital = 1;\n }\n\n const weight = matches.weight;\n if (weight && weight >= 0 && weight <= 900) {\n axes.wght = weight;\n } else if (Object.keys(VALID_FONT_STYLES).includes(matches.named_weight || \"\")) {\n axes.wght = VALID_FONT_STYLES[matches.named_weight];\n }\n\n axes = {\n ...axes,\n ...Object.fromEntries(Object.entries(attrs).filter(([key]) => REGISTERED_AXIS.includes(key))),\n };\n }\n return axes;\n};\n\n/**\n * Create google font api url\n * @param {string} family name of font\n * @param {object} axes custom font axes\n */\nconst googleFontApiBuild = (family, axes) => {\n family = family.replaceAll(\" \", \"+\");\n // google fonts requires axes names to be in alphabetical order\n axes = Object.keys(axes)\n .sort()\n .reduce((obj, key) => {\n obj[key] = axes[key];\n return obj;\n }, {});\n const axesList = Object.keys(axes).join(\",\") + \"@\" + Object.values(axes).join(\",\");\n return \"https://fonts.googleapis.com/css2?family=\" + family + \":\" + axesList;\n};\n\nexport const font = (node, options) => {\n const attrs = preprocessAttr(node, options.data.raw);\n const fontFamily = attrs?._default || attrs.family || attrs.name;\n if (fontFamily.trim() === \"\") {\n return node.content;\n }\n if (WEB_FONTS.includes(fontFamily.trim().toLowerCase())) {\n return toNode(\"span\", { style: `font-family: '${fontFamily}'` }, node.content);\n }\n\n const axes = axesParser(attrs);\n const url = googleFontApiBuild(fontFamily, axes);\n options.data.fonts.add(url);\n\n const italic = axes.ital === 1 ? \"italic\" : \"normal\";\n\n const custom = Object.entries(axes).filter(([key]) => key !== \"wght\" && key !== \"ital\");\n let fontVar = \"\";\n if (custom.length) {\n fontVar =\n \"font-variation-settings: \" + custom.map(([key, val]) => `'${key}' ${val}`).join(\", \") + \";\";\n }\n\n return toNode(\n \"span\",\n {\n style: `font-family: '${fontFamily}'; font-weight: ${axes.wght}; font-style: ${italic}; ${fontVar}`,\n \"data-font\": url,\n },\n node.content,\n );\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\n/**\n * Parse the user provided height and return a valid height value\n * @param {Number} heightValue obtains the input of the user entered height (default is 700)\n * @returns A validated number less than 0.\n */\nfunction parseHeight(heightValue) {\n const maxHeight = 700;\n const parsedHeight =\n heightValue && heightValue.trim() !== \"\" ? heightValue.replace(/[^\\d.]/g, \"\") : 0;\n\n if (parsedHeight && parsedHeight >= 0 && parsedHeight <= maxHeight) {\n return parsedHeight;\n } else {\n // if the value = 0 then nothing will be returned\n return parsedHeight === 0 ? 0 : maxHeight;\n }\n}\n\n/**\n * @file Adds [heightrestrict] to bbcode\n * @example [heightrestrict=50]content[/heightrestrict]\n */\nexport const heightrestrict = (node) => {\n const attrs = preprocessAttr(node)._default;\n const heightInput = parseHeight(attrs).toString();\n // Return image's default size if heightrestrict did not involve a valid value\n return heightInput === \"0\"\n ? toNode(\"div\", { class: \"bb-height-restrict\" }, node.content)\n : toNode(\n \"div\",\n { class: \"bb-height-restrict\", style: `height: ${heightInput}px;` },\n node.content,\n );\n};\n","import { toNode } from \"../utils/common\";\n/**\n * @file Adds [mail] to bbcode\n * @param {string} [type=\"send\"] Denotes type of mail either send or receive\n * @param {string} [person=\"Unknown\"] Denotes the person in the To/From field\n * @param {string} [subject=\"Empty\"] Denotes the subject line of the email\n * @example [mail type=\"send\" person=\"John Doe\" subject=\"Hello World\"]content[/mail]\n */\n\nconst parseEmailContent = (content) => {\n return toNode(\"div\", { class: \"bb-email-content\" }, content);\n};\n\nconst parseEmailSubject = (subject) => {\n return toNode(\"div\", { class: \"bb-email-subject\" }, subject);\n};\n\nconst parseEmailPerson = (person) => {\n return toNode(\"div\", { class: \"bb-email-address\" }, person);\n};\n\nconst emailHeader = toNode(\"div\", { class: \"bb-email-header\" }, \"\");\nconst emailFooter = toNode(\n \"div\",\n { class: \"bb-email-footer\" },\n toNode(\"div\", { class: \"bb-email-button\" }, \"\"),\n);\n\nexport const mail = (node) => {\n const attributes = node.attrs;\n let mailAttr = {\n mailOption: (attributes.type || \"send\").toLowerCase(),\n person: attributes.person || \"Unknown\",\n subject: attributes.subject || \"Empty\",\n };\n\n return toNode(\n \"div\",\n {\n class: \"bb-email\",\n \"data-bb-email\": mailAttr.mailOption,\n },\n [\n emailHeader,\n parseEmailPerson(mailAttr.person),\n parseEmailSubject(mailAttr.subject),\n parseEmailContent(node.content),\n emailFooter,\n ],\n );\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\n/**\n * @file Adds [row][column] to bbcode\n * @example Adds [row][column][/column][/row]\n */\nexport const rowcolumn = {\n row: (node) => toNode(\"div\", { class: \"bb-row\" }, node.content),\n column: (node, options) => {\n const columnAttrs = preprocessAttr(node, options.data.raw)._default || \"8\";\n const columnStyle = columnAttrs.startsWith(\"span\")\n ? `column-width-${columnAttrs}`\n : `column-width-span${columnAttrs}`;\n return toNode(\"div\", { class: `bb-column`, \"data-span\": columnStyle }, node.content);\n },\n};\n","import { preprocessAttr } from \"../utils/common\";\n\nconst EVENTS = [\n \"init\",\n \"click\",\n \"change\",\n \"input\",\n \"dblclick\",\n \"mouseenter\",\n \"mouseleave\",\n \"scroll\",\n];\n\n/**\n * Script tag\n *\n * [script]content[/script]\n *\n * [script class=\"id\" on=\"event\" version=\"2\"]content[/script]\n */\nexport const script = (node, options) => {\n const attrs = preprocessAttr(node, options.data.raw);\n\n if (!options.data.previewing && !options.data.commonGUID) {\n // create a common GUID for the post\n // only applicable for div, style, and script tags\n // this is to prevent the same class name from being used in different posts\n options.data.commonGUID = \"post-\" + Math.random().toString(36).substring(2, 7);\n }\n const classSuffix = options.data.previewing ? \"preview\" : options.data.commonGUID;\n\n const onEvent =\n (EVENTS.includes(attrs.on?.toLowerCase() || \"init\") && attrs.on?.toLowerCase()) || \"init\";\n\n const scriptSetup = {\n id: classSuffix,\n class: attrs.class || \"\",\n on: onEvent,\n version: attrs.version || \"\",\n content: node.content.join(\"\"),\n };\n options.data.bbscripts.push(scriptSetup);\n\n return [];\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\n/**\n * Parses an inputted size value and returns the formatted valid font size\n * @param {string} fontValue the input of the size\n */\nfunction parseFontSize(fontValue) {\n let value;\n let fontSize = { valid: true };\n const parsedSize = /(\\d+\\.?\\d?)(px|rem)?/i.exec(fontValue);\n const sizeRanges = {\n px_max: 36,\n px_min: 8,\n rem_max: 3,\n rem_min: 0.2,\n unitless_max: 7,\n unitless_min: 1,\n };\n\n if (parsedSize && (value = parsedSize[1])) {\n fontSize.unit = (parsedSize[2] || \"\").toLowerCase();\n switch (fontSize.unit) {\n case \"px\":\n if (value > sizeRanges.px_max) {\n value = sizeRanges.px_max;\n } else if (value < sizeRanges.px_min) {\n value = sizeRanges.px_min;\n }\n break;\n case \"rem\":\n if (value > sizeRanges.rem_max) {\n value = sizeRanges.rem_max;\n } else if (value < sizeRanges.rem_min) {\n value = sizeRanges.rem_min;\n }\n break;\n default:\n if ((fontSize.valid = fontValue.length === value.length)) {\n if (value > sizeRanges.unitless_max) {\n value = sizeRanges.unitless_max;\n } else if (value < sizeRanges.unitless_min) {\n value = sizeRanges.unitless_min;\n }\n }\n break;\n }\n\n fontSize.value = value;\n }\n return fontSize;\n}\n\nexport const size = (node) => {\n const input = preprocessAttr(node)._default;\n const fontSize = parseFontSize(input);\n if (!fontSize.valid) {\n return node.content;\n }\n let outputAttr = {};\n if (fontSize.unit) {\n outputAttr = { style: `font-size: ${fontSize.value}${fontSize.unit}` };\n } else {\n outputAttr = { \"data-size\": fontSize.value };\n }\n return toNode(\"span\", outputAttr, node.content);\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\n/**\n * @file Adds textmessage to bbcode\n * @exmaple [textmessage=Recipient][message=them]Hi [/message][message=me] Hey![/message][/textmessage]\n */\n\nconst ACCEPTED_OPTIONS = [\"me\", \"them\", \"right\", \"left\"];\nexport const textmessage = {\n textmessage: (node, options) => {\n const attr = preprocessAttr(node, options.data.raw)._default || \"Recipient\";\n const recipient = attr && attr.trim() !== \"\" ? attr : \"Recipient\";\n return toNode(\"div\", { class: \"bb-textmessage\" }, [\n toNode(\"div\", { class: \"bb-textmessage-name\" }, recipient),\n toNode(\"div\", { class: \"bb-textmessage-overflow\" }, [\n toNode(\"div\", { class: \"bb-textmessage-content\" }, node.content),\n ]),\n ]);\n },\n message: (node, options) => {\n let option = preprocessAttr(node, options.data.raw)._default.toLowerCase();\n if (!ACCEPTED_OPTIONS.includes(option) || option === \"right\") {\n option = \"me\";\n }\n if (option === \"left\") {\n option = \"them\";\n }\n\n const senderAttrs = option === \"me\" ? \"bb-message-me\" : \"bb-message-them\";\n return toNode(\"div\", { class: senderAttrs }, [\n toNode(\"div\", { class: \"bb-message-content\" }, node.content),\n ]);\n },\n};\n","import { createPreset } from \"@bbob/preset\";\nimport { accordionTags } from \"./tags/accordion\";\nimport { alignment } from \"./tags/alignment\";\nimport { anchor } from \"./tags/anchor\";\nimport { animation, keyframe } from \"./tags/animation\";\nimport { bg } from \"./tags/background\";\nimport { block } from \"./tags/block\";\nimport { blockquote } from \"./tags/blockquote\";\nimport { border } from \"./tags/border\";\nimport { centerblock } from \"./tags/centerblock\";\nimport { check } from \"./tags/check\";\nimport { classStyle } from \"./tags/class\";\nimport { code, icode, savenl } from \"./tags/code\";\nimport { color } from \"./tags/color\";\nimport { comment } from \"./tags/comment\";\nimport { bold, italic, strike, underline } from \"./tags/discourse-core-replacement\";\nimport { div } from \"./tags/div\";\nimport { divide } from \"./tags/divide\";\nimport { fieldset } from \"./tags/fieldset\";\nimport { font } from \"./tags/font\";\nimport { fa } from \"./tags/fontawesome\";\nimport { h, h1, h2, h3, h4, h5, h6, sh } from \"./tags/header\";\nimport { heightrestrict } from \"./tags/heightrestrict\";\nimport { highlight } from \"./tags/highlight\";\nimport { imagefloat } from \"./tags/imagefloat\";\nimport { justify } from \"./tags/justify\";\nimport { br, nobr } from \"./tags/lineBreak\";\nimport { mail } from \"./tags/mail\";\nimport { newspaper } from \"./tags/newspaper\";\nimport { note } from \"./tags/note\";\nimport { ooc } from \"./tags/ooc\";\nimport { pindent } from \"./tags/pindent\";\nimport { plain } from \"./tags/plain\";\nimport { print } from \"./tags/print\";\nimport { progress } from \"./tags/progress\";\nimport { quote } from \"./tags/quote\";\nimport { rowcolumn } from \"./tags/rowcolumn\";\nimport { script } from \"./tags/script\";\nimport { scroll } from \"./tags/scroll\";\nimport { side } from \"./tags/side\";\nimport { size } from \"./tags/size\";\nimport { inlinespoiler, spoiler } from \"./tags/spoiler\";\nimport { sub } from \"./tags/subscript\";\nimport { sup } from \"./tags/superscript\";\nimport { tab, tabs } from \"./tags/tabs\";\nimport { textmessage } from \"./tags/textmessage\";\nimport { thinprogress } from \"./tags/thinprogress\";\n\nconst tags = {\n ...accordionTags,\n ...alignment,\n ...anchor,\n animation,\n bg,\n block,\n blockquote,\n border,\n br,\n centerblock,\n check,\n class: classStyle,\n code,\n color,\n comment,\n div,\n divide,\n fieldset,\n fa,\n font,\n h,\n h1,\n h2,\n h3,\n h4,\n h5,\n h6,\n heightrestrict,\n highlight,\n icode,\n imagefloat,\n inlinespoiler,\n justify,\n keyframe,\n mail,\n newspaper,\n nobr,\n note,\n ooc,\n pindent,\n plain,\n print,\n progress,\n quote,\n ...rowcolumn,\n thinprogress,\n savenl,\n sh,\n script,\n scroll,\n side,\n size,\n spoiler,\n sub,\n sup,\n tab,\n tabs,\n ...textmessage,\n\n // discourse core replacement tags\n b: bold,\n i: italic,\n u: underline,\n s: strike,\n};\n\nconst availableTags = Object.keys(tags);\nconst preventParsing = [\"plain\", \"code\", \"icode\", \"class\", \"fa\"];\n\nconst preset = createPreset(tags);\n\nexport { availableTags, tags, preset, preventParsing };\nexport default preset;\n","import { isStringNode, isTagNode } from \"@bbob/plugin-helper\";\nimport { preprocessAttr, toOriginalEndTag, toOriginalStartTag } from \"../utils/common\";\n\n/**\n * Renders css Keyframes\n *\n * [animation=name][keyframe=0]color: red[/keyframe][/animation]\n */\nexport const animation = (node, options) => {\n if (!options.data.previewing && !options.data.commonGUID) {\n // create a common GUID for the post\n // only applicable for div, style, and script tags\n // this is to prevent the same class name from being used in different posts\n options.data.commonGUID = \"post-\" + Math.random().toString(36).substring(2, 7);\n }\n const commonId = options.data.previewing ? \"preview\" : options.data.commonGUID;\n\n const name = preprocessAttr(node, options.data.raw)?._default || \"\";\n const keyframes = node.content\n .filter((n) => isTagNode(n) && n.tag === \"keyframe\")\n .map((content) => {\n content.isValid = true;\n /** @type {string} */\n const ident = preprocessAttr(content, options.data.raw)._default || \"\";\n content.ident = ident + (ident.match(/^\\d+$/) ? \"%\" : \"\");\n const cleanContent = content.content\n .filter(isStringNode)\n .join(\"\")\n .replaceAll(/[\\[\\]\\{\\}]/g, \"\");\n content.formatted = `${content.ident}{ ${cleanContent} }`;\n return content;\n });\n const keyframeContent = keyframes.map((n) => n.formatted).join(\"\\n\");\n const content = `@keyframes ${commonId}${name} { ${keyframeContent} }`;\n options.data.styles.push(content);\n return [];\n};\n\nexport const keyframe = (node, options) => {\n if (!node.isValid) {\n return [\n toOriginalStartTag(node, options.data.raw),\n ...node.content,\n toOriginalEndTag(node, options.data.raw),\n ];\n }\n return [];\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\n/**\n * Add [bg] tag\n * @example [bg=red]Hello[/bg]\n */\nexport const bg = (node, options) => {\n const color = preprocessAttr(node, options.data.raw)._default;\n return toNode(\n \"div\",\n {\n style: `background-color: ${color};`,\n class: \"bb-background\",\n },\n node.content,\n );\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\n/**\n * Add [block] tag\n * @example [block=treasure]content[/block]\n */\nexport const block = (node, options) => {\n const defaultOp = \"block\";\n const blockAttr = (preprocessAttr(node, options.data.raw)._default || defaultOp).toLowerCase();\n\n const OPTIONS = [\n \"block\",\n \"dice\",\n \"dice10\",\n \"setting\",\n \"warning\",\n \"storyteller\",\n \"announcement\",\n \"important\",\n \"question\",\n \"encounter\",\n \"information\",\n \"character\",\n \"treasure\",\n ];\n\n // Default to block option if user did not provide anything valid\n const blockOption = OPTIONS.includes(blockAttr) ? blockAttr : defaultOp;\n\n return toNode(\"table\", { class: \"bb-block\", \"data-bb-block\": blockOption }, [\n toNode(\"tbody\", [\n toNode(\"tr\", [\n toNode(\"td\", { class: \"bb-block-icon\" }),\n toNode(\"td\", { class: \"bb-block-content\" }, node.content),\n ]),\n ]),\n ]);\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\n/**\n * @file Adds [blockquote] to bbcode\n * @example [blockquote=author]content[/blockquote]\n */\nexport const blockquote = (node, options) => {\n const author = preprocessAttr(node, options.data.raw)._default || \"\";\n\n return toNode(\"div\", { class: \"bb-blockquote\" }, [\n toNode(\"div\", { class: \"bb-blockquote-left\" }),\n toNode(\"div\", { class: \"bb-blockquote-content\" }, [\n node.content,\n toNode(\"div\", { class: \"bb-blockquote-speaker\" }, author !== \"\" ? `- ${author}` : \"\"),\n ]),\n toNode(\"div\", { class: \"bb-blockquote-right\" }),\n ]);\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\nexport const border = (node, options) => {\n const val = preprocessAttr(node, options.data.raw)._default;\n return toNode(\n \"div\",\n {\n style: `border: ${val};`,\n class: \"bb-border\",\n },\n node.content,\n );\n};\n","import { toNode } from \"../utils/common\";\n\n/**\n * Creates a line break html
tag\n */\nexport const br = () => {\n return toNode(\"br\", {}, null);\n};\n\n/**\n * Disables line breaks for given content\n * @example\n * ```\n * [nobr]test\n * test\n * test\n * [/nobr]\n *\n * test test test\n * ```\n */\nexport const nobr = (node) => {\n return { disableLineBreakConversion: true, content: node.content };\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\nexport const centerblock = (node, options) => {\n const percentageInput = preprocessAttr(node, options.data.raw)._default || \"50\";\n return toNode(\"div\", { style: `margin: 0 auto; width: ${percentageInput}%` }, node.content);\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\nexport const check = (node, options) => {\n const attrs = preprocessAttr(node, options.data.raw)._default || \"dot\";\n return toNode(\"div\", { class: `bb-check`, \"data-type\": attrs }, node.content);\n};\n","import { isStringNode } from \"@bbob/plugin-helper\";\nimport { preprocessAttr } from \"../utils/common\";\n\n/**\n * Class style tag\n *\n * [class=name]content[/class]\n * [class name=\"className\" state=\"psuedo-class\" minWidth=\"\" maxWidth=\"\"]content[/class]\n * [class name=\"className\" selector=\"\"]content[/class]\n */\nexport const classStyle = (node, options) => {\n const attrs = preprocessAttr(node);\n const nameAttr = attrs.name || attrs._default;\n\n if (!options.data.previewing && !options.data.commonGUID) {\n // create a common GUID for the post\n // only applicable for div, style, and script tags\n // this is to prevent the same class name from being used in different posts\n options.data.commonGUID = \"post-\" + Math.random().toString(36).substring(2, 7);\n }\n const classSuffix = options.data.previewing ? \"preview\" : options.data.commonGUID;\n const className = nameAttr + \"__\" + classSuffix;\n const content = node.content\n .filter(isStringNode)\n .map((s) => s.replaceAll(\"{post_id}\", classSuffix).replaceAll(/[\\[\\]\\{\\}]/g, \"\"));\n let selector = \"\";\n const mediaQuery = [];\n if (\n [\"hover\", \"focus\", \"active\", \"focus-within\", \"focus-visible\"].includes(\n attrs.state?.toLowerCase(),\n )\n ) {\n selector = \":\" + attrs.state.toLowerCase();\n }\n if (attrs.selector) {\n selector = attrs.selector.replace(/[,{}\\\\\\n]/g, \"\");\n }\n if (attrs.minWidth?.match(/^[0-9]+[a-z]+$/)) {\n // @media (min-width: )\n mediaQuery.push(`(min-width: ${attrs.minWidth})`);\n }\n if (attrs.maxWidth?.match(/^[0-9]+[a-z]+$/)) {\n // @media (max-width: )\n mediaQuery.push(`(max-width: ${attrs.maxWidth})`);\n }\n\n content.unshift(`.${className}${selector} {`);\n content.push(\"}\");\n if (mediaQuery.length) {\n content.unshift(`@media ${mediaQuery.join(\" and \")} {`);\n content.push(\"}\");\n }\n options.data.styles.push(content.join(\"\"));\n\n return [];\n};\n","import { preprocessAttr } from \"../utils/common\";\n\n/**\n * processes [code] tag and returns a fenced code block\n */\nexport const code = (node) => {\n const lang = preprocessAttr(node)._default || \"bbcode\";\n return {\n isWhitespaceSensitive: true,\n content: [\"```\" + lang + \"\\n\", node.content, \"\\n```\\n\"],\n };\n};\n\n/**\n * processes [icode] tag and returns inline code\n */\nexport const icode = (node) => {\n return {\n isWhitespaceSensitive: true,\n content: [\"`\", node.content, \"`\"],\n };\n};\n\n/**\n * Special tag to save newlines in code blocks. Used for hoisting code blocks\n */\nexport const savenl = (node) => {\n return {\n isWhitespaceSensitive: true,\n content: node.content,\n };\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\nexport const color = (node) => {\n const inputColor = preprocessAttr(node)._default || \"\";\n if (inputColor.trim() === \"\") {\n return node.content;\n }\n return toNode(\"span\", { style: `color: ${inputColor}` }, node.content);\n};\n","import { toNode } from \"../utils/common\";\n\n/**\n * @file Adds [comment] tag\n * @example [comment]Content[/comment]\n */\n\nconst comment = (node) => {\n return toNode(\"span\", { class: \"hidden\" }, node.content);\n};\n\nexport { comment };\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\n/**\n * Adds [div] tag\n * [div=css]Content[/div]\n * [div class=\"class\" style=\"css\"]Content[/div]\n */\nexport const div = (node, options) => {\n if (node.gen) {\n // node is actually a generated node \"div\" made by another tag\n // don't process it\n return node;\n }\n const attrs = preprocessAttr(node, options.data.raw);\n const style = attrs.style || attrs._default;\n const classAttrs = attrs.class;\n if (!classAttrs?.trim()) {\n return toNode(\n \"div\",\n {\n style,\n },\n node.content,\n );\n }\n\n if (!options.data.previewing && !options.data.commonGUID) {\n // create a common GUID for the post\n // only applicable for div, style, and script tags\n // this is to prevent the same class name from being used in different posts\n options.data.commonGUID = \"post-\" + Math.random().toString(36).substring(2, 7);\n }\n const classSuffix = options.data.previewing ? \"preview\" : options.data.commonGUID;\n const classNames = classAttrs\n .split(\" \")\n .map((c) => c + \"__\" + classSuffix)\n .join(\" \");\n\n return toNode(\n \"div\",\n {\n class: classNames,\n style,\n },\n node.content,\n );\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\nexport const divide = (node) => {\n const type = (preprocessAttr(node)._default || \"\").toLowerCase();\n return toNode(\n \"span\",\n {\n class: \"bb-divide\",\n \"data-type\": type,\n },\n node.content,\n );\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\n/**\n * @file Adds [fieldset] to bbcode\n * @example [fieldset=title]content[/fieldset]\n */\nexport const fieldset = (node, options) => {\n const title = preprocessAttr(node, options.data.raw)._default || \"\";\n return toNode(\"fieldset\", { class: \"bb-fieldset\" }, [\n toNode(\"legend\", { class: \"bb-fieldset-legend\" }, title),\n toNode(\"div\", { class: \"bb-fieldset\" }, node.content),\n ]);\n};\n","import { toNode } from \"../utils/common\";\n\n/**\n * Adds [fa] tag\n * [fa]fa-icon[/fa]\n * [fa style=\"\" fa-transform=\"\"]fa-solid fa-icon[/fa]\n * [fa primary-color=\"\" secondary-color=\"\" primary-opacity=\"\" secondary-opacity=\"\" rotate-angle=\"\"]fa-duotone fa-icon[/fa]\n */\nexport const fa = (node) => {\n const attrs = node.attrs;\n let style = attrs.style || \"\";\n style += attrs[\"primary-color\"] ? `--fa-primary-color: ${attrs[\"primary-color\"]};` : \"\";\n style += attrs[\"secondary-color\"] ? `--fa-secondary-color: ${attrs[\"secondary-color\"]};` : \"\";\n style += attrs[\"primary-opacity\"] ? `--fa-primary-opacity: ${attrs[\"primary-opacity\"]};` : \"\";\n style += attrs[\"secondary-opacity\"]\n ? `--fa-secondary-opacity: ${attrs[\"secondary-opacity\"]};`\n : \"\";\n style += attrs[\"rotate-angle\"] ? `--fa-rotate-angle: ${attrs[\"rotate-angle\"]};` : \"\";\n\n return toNode(\n \"i\",\n {\n \"data-bbcode-fa\": null,\n },\n [\n toNode(\n \"i\",\n {\n class: (node.content || []).join(\"\"),\n style,\n \"data-fa-transform\": attrs[\"fa-transform\"] || \"\",\n },\n [],\n ),\n ],\n );\n};\n","import { toNode } from \"../utils/common\";\n\n/**\n * @file Adds Header to bbcode\n * @example [h]content[/h], [h2]content[/h2], [h3]content[/h3],\n * [h4]content[/h4], [h5]content[/h5], [h6]content[/h6].\n */\n\nconst h = (node) => {\n return toNode(\"h1\", {}, node.content);\n};\n\nconst h1 = (node) => {\n return toNode(\"h1\", {}, node.content);\n};\n\nconst h2 = (node) => {\n return toNode(\"h2\", {}, node.content);\n};\n\nconst sh = (node) => {\n return toNode(\"h2\", {}, node.content);\n};\n\nconst h3 = (node) => {\n return toNode(\"h3\", {}, node.content);\n};\n\nconst h4 = (node) => {\n return toNode(\"h4\", {}, node.content);\n};\n\nconst h5 = (node) => {\n return toNode(\"h5\", {}, node.content);\n};\n\nconst h6 = (node) => {\n return toNode(\"h6\", {}, node.content);\n};\n\nexport { h, sh, h1, h2, h3, h4, h5, h6 };\n","import { toNode } from \"../utils/common\";\n/**\n * @file Adds [highlight] to bbcode\n * @example [highlight]content[/highlight]\n */\nexport const highlight = (node) => {\n return toNode(\"span\", { class: \"bb-highlight\" }, node.content);\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n/**\n * @file Adds [imagefloat] to bbcode\n * @exmaple [imagefloat=left]content[/imagefloat]\n */\nexport const imagefloat = (node) => {\n const attrs = preprocessAttr(node)._default || \"\";\n return toNode(\"div\", { class: `bb-float-${attrs}` }, node.content);\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n/**\n * @file Adds [spoiler] and [inlinespoiler] to bbcode\n *\n * Defaults to \"Spoiler\" name if no title provided\n *\n * @example `[spoiler=Title]text[/spoiler]`\n * @example `[inlinespoiler]hidden content[/inlinespoiler]\n */\n\nexport const spoiler = (node, options) => {\n const providedTitle = preprocessAttr(node, options.data.raw)._default;\n const title = \"Spoiler\" + (providedTitle ? `: ${providedTitle}` : \"\");\n\n /**\n *
\n * Title\n *
\n * lorem ipsum\n *
\n *
\n */\n return toNode(\"details\", { class: \"bb-spoiler\" }, [\n toNode(\"summary\", {}, title),\n toNode(\"div\", { class: \"bb-spoiler-content\" }, node.content),\n ]);\n};\n\nexport const inlinespoiler = (node) => {\n return toNode(\"span\", { class: \"bb-inline-spoiler\" }, node.content);\n};\n","import { toNode } from \"../utils/common\";\n\n/**\n * @file Adds [justify] to bbcode\n * @example [justify]content[/justify]\n */\nexport const justify = (node) => {\n return toNode(\"div\", { class: \"bb-justify\" }, node.content);\n};\n","import { toNode } from \"../utils/common\";\n/**\n * @file Adds [newspaper] to bbcode\n * @example [newspaper]content[/newspaper]\n */\nexport const newspaper = (node) => {\n return toNode(\"div\", { class: \"bb-newspaper\" }, node.content);\n};\n","import { toNode } from \"../utils/common\";\n/**\n * @file Adds [note] to bbcode\n * @example [note]content[/note]\n */\n\nexport const note = (node) => {\n return toNode(\"div\", { class: \"bb-note\" }, [\n toNode(\"div\", { class: \"bb-note-tape\" }, \"\"),\n toNode(\"div\", { class: \"bb-note-content\" }, [\n node.content,\n toNode(\"div\", { class: \"bb-note-footer\" }, \"\"),\n ]),\n ]);\n};\n","import { toNode } from \"../utils/common\";\n\n/**\n * @file Adds [ooc] to bbcode\n * @example [ooc]content[/ooc]\n */\nexport const ooc = (node) => {\n return toNode(\n \"div\",\n {\n class: \"bb-ooc\",\n },\n node.content,\n );\n};\n","import { toNode } from \"../utils/common\";\n/**\n * @file Adds [pindent] to bbcode\n * @example [pindent]content[/pindent]\n */\nexport const pindent = (node) => {\n return toNode(\"span\", { class: \"bb-pindent\" }, node.content);\n};\n","/**\n * [plain] bbcode tag that prevents parsing of inner tags\n * @example\n * ```\n * [plain]This is [b]bold[/b] and [i]italic[/i][/plain]\n * ```\n * outputs to\n * ```\n * This is [b]bold[/b] and [i]italic[/i]\n * ```\n */\nexport const plain = (node) => {\n return node.content;\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\n/**\n * Add [print] tag\n * @example [print=lined]content[/print]\n */\nexport const print = (node) => {\n const defaultOp = \"print\";\n const printAttr = (preprocessAttr(node)._default || defaultOp).toLowerCase();\n\n const OPTIONS = [\"print\", \"line\", \"graph\", \"parchment\"];\n\n // Default to print if option is not valid\n const printOption = OPTIONS.includes(printAttr) ? printAttr : defaultOp;\n\n return toNode(\n \"div\",\n { class: printOption === defaultOp ? `bb-print` : `bb-print-${printOption}` },\n node.content,\n );\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\n/**\n * @file Adds [progress] to bbcode\n * @exmaple [progress=percentageInt]content[/progress]\n */\nexport const progress = (node) => {\n const percentageInt = preprocessAttr(node)._default;\n return toNode(\"div\", { class: \"bb-progress\" }, [\n toNode(\"div\", { class: \"bb-progress-text\" }, node.content),\n toNode(\"div\", { class: \"bb-progress-bar\", style: `width: calc(${percentageInt}% - 6px)` }, \"\"),\n toNode(\"div\", { class: \"bb-progress-bar-other\" }, \"\"),\n ]);\n};\n","import { preprocessAttr } from \"../utils/common\";\n\n/**\n * rebuild the [quote] tag so that markdown-it engine can parse it for itself\n */\nexport const quote = (node, options) => {\n const attrs = preprocessAttr(node, options.data.raw);\n if (node.content[0] === \"\\n\") {\n node.content.shift();\n }\n return [`\\n[${node.tag}=\"${attrs._default}\"]\\n\\n`, ...node.content, \"\\n\\n[/quote]\\n\"];\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\n/**\n * @file Adds [thinprogress] to bbcode\n * @exmaple [thinprogress=percentageInt]content[/progthinprogressress]\n */\nexport const thinprogress = (node, options) => {\n const percentageInt = preprocessAttr(node, options.data.raw)._default;\n return toNode(\"div\", { class: \"bb-progress-thin\" }, [\n toNode(\"div\", { class: \"bb-progress-text\" }, node.content),\n toNode(\"div\", { class: \"bb-progress-bar\", style: `width: calc(${percentageInt}% - 6px)` }, \"\"),\n toNode(\"div\", { class: \"bb-progress-bar-other\" }, \"\"),\n ]);\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\n/**\n * Parse the user provided height and return a valid height value\n * @param {Number} heightValue obtains the input of the user entered height (default is 700)\n * @returns A validated number less than 0.\n */\nfunction parseHeight(heightValue) {\n const maxHeight = 700;\n const parsedHeight =\n heightValue && heightValue.trim() !== \"\" ? heightValue.replace(/[^\\d.]/g, \"\") : 0;\n\n if (parsedHeight && parsedHeight >= 0 && parsedHeight <= maxHeight) {\n return parsedHeight;\n } else {\n // if the value = 0 then nothing will be returned\n return parsedHeight === 0 ? 0 : maxHeight;\n }\n}\n\n/**\n * @file Adds [scroll] to bbcode\n * @example [scroll]content[/scroll]\n */\nexport const scroll = (node, options) => {\n const attrs = preprocessAttr(node, options.data.raw)._default;\n const heightInput = parseHeight(attrs);\n return toNode(\"div\", { class: \"bb-scroll\", style: `height: ${heightInput}px` }, node.content);\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\nexport const side = (node) => {\n const attrs = preprocessAttr(node)._default || \"left\";\n return toNode(\"div\", { class: \"bb-side\", \"data-side\": attrs }, node.content);\n};\n","import { toNode } from \"../utils/common\";\n\n/**\n * @file Adds subscript to BBCode\n * @example [sub]content[/sub]\n */\n\nconst sub = (node) => {\n return toNode(\"sub\", {}, node.content);\n};\n\nexport { sub };\n","import { toNode } from \"../utils/common\";\n\n/**\n * @file Adds superscript to bbcode\n * @example [sup]content[/sup]\n */\n\nconst sup = (node) => {\n return toNode(\"sup\", {}, node.content);\n};\n\nexport { sup };\n","import { isTagNode } from \"@bbob/plugin-helper\";\nimport {\n generateGUID,\n preprocessAttr,\n toNode,\n toOriginalEndTag,\n toOriginalStartTag,\n} from \"../utils/common\";\n\n/**\n * @file Adds [tabs][tab] to bbcode\n * @example [tabs][tab=name 1]content[/tab][tab=name 2]content[/tab][/tabs]\n */\nexport const tabs = (node, options) => {\n const tabsList = node.content.filter(\n (contentNode) => isTagNode(contentNode) && contentNode.tag === \"tab\",\n );\n const groupId = generateGUID();\n tabsList.forEach((tabNode) => {\n tabNode.isValid = true;\n tabNode.groupId = groupId;\n });\n if (!tabsList.length) {\n // no [tab] tags found\n return [\n toOriginalStartTag(node, options.data.raw),\n ...node.content,\n toOriginalEndTag(node, options.data.raw),\n ];\n }\n tabsList[0].open = true;\n\n return toNode(\n \"div\",\n {\n class: \"bb-tabs\",\n },\n tabsList,\n );\n};\n\n/**\n * [tab=name]content[/tab]\n * [tab name=\"name\" style=\"style\"]content[/tab]\n */\nexport const tab = (node, options) => {\n if (!node.isValid) {\n // not inside a [tabs] tag\n return [\n toOriginalStartTag(node, options.data.raw),\n ...node.content,\n toOriginalEndTag(node, options.data.raw),\n ];\n }\n const attrs = preprocessAttr(node, options.data.raw);\n const name = attrs._default || attrs.name || \"Tab\";\n const tabId = `tab-${name.replace(/\\W/g, \"_\")}-${generateGUID()}`;\n return [\n toNode(\"input\", {\n type: \"radio\",\n id: tabId,\n name: \"tab-group-\" + node.groupId,\n class: \"bb-tab\",\n checked: node.open,\n }),\n toNode(\n \"label\",\n {\n class: \"bb-tab-label\",\n for: tabId,\n style: attrs.style,\n },\n name,\n ),\n toNode(\n \"div\",\n {\n class: \"bb-tab-content\",\n },\n node.content,\n ),\n ];\n};\n","/**\n * @file discourse-core-replacement.js\n * This is a dedicated file for replacing the standard Discourse BBCode tags in core.\n * In the markdown-it engine, discourse has added these bbcode tags in the inline parser.\n * However this means that if the parser detects a block level tag inside an inline tag,\n * it will not parse the inline tag.\n *\n * This file is meant to fix such scenarios by doing the parsing of bbcode tags for it.\n *\n * @example\n * [b][h]bold[/h][/b] // this should properly parse the bold tag inside the h tag\n *\n * https://github.com/discourse/discourse/blob/d7ece61252d7671a1f124483836279b99852c08c/app/assets/javascripts/discourse-markdown-it/src/features/bbcode-inline.js\n */\nimport { toNode } from \"../utils/common\";\n\nexport const bold = (node) => {\n return toNode(\"span\", { class: \"bbcode-b\" }, node.content);\n};\n\nexport const italic = (node) => {\n if (node.gen) {\n // node is actually a generated node \"i\" made by another tag\n // don't process it\n return node;\n }\n return toNode(\"span\", { class: \"bbcode-i\" }, node.content);\n};\n\nexport const underline = (node) => {\n return toNode(\"span\", { class: \"bbcode-u\" }, node.content);\n};\n\nexport const strike = (node) => {\n return toNode(\"span\", { class: \"bbcode-s\" }, node.content);\n};\n","import { MD_NEWLINE_INJECT, MD_NEWLINE_INJECT_COMMENT, MD_NEWLINE_PRE_INJECT } from \"./common\";\n\n/**\n * Post Processing designed to fix issues with Markdown and BBCode that the parser can't fix.\n *\n * Separate from markdown-it post processing as it'll be able to manipulate the full string.\n * @param {string} raw string from processing through both BBCode and Markdown\n * @returns post processed string\n */\nfunction removeNewlineInjects(raw) {\n const processed = raw\n .replaceAll(MD_NEWLINE_INJECT, \"\")\n .replaceAll(MD_NEWLINE_PRE_INJECT, \"\")\n .replaceAll(\"\\n\" + MD_NEWLINE_INJECT_COMMENT, \"\")\n .replaceAll(MD_NEWLINE_INJECT_COMMENT + \"\\n\", \"\")\n .replaceAll(MD_NEWLINE_INJECT_COMMENT, \"\"); // Remove all instances of the injected newline\n return processed;\n}\n\n/**\n * Injects hoisted code blocks back into the raw string\n * @param {string} raw input to inject hoisted code blocks into\n * @param {any} data contains hoist map\n * @returns string with hoisted code blocks injected\n */\nfunction renderHoistedCodeBlocks(raw, data) {\n const hoistMap = data.hoistMap;\n for (const [uuid, content] of Object.entries(hoistMap)) {\n raw = raw.replaceAll(uuid, content);\n }\n return raw;\n}\n\n/**\n * Setups the class style tag template for the post\n * @param {string} raw\n * @param {{styles: string[]}} data - contains styles array\n * @returns string\n */\nfunction createClassStyleTagTemplate(raw, data) {\n if (data.styles.length === 0) {\n return raw;\n }\n const template = '\";\n return template + raw;\n}\n\n/**\n * Setups the script tag template for the post\n * @param {string} raw\n * @param {{\n * bbscripts: {\n * id: string,\n * class: string,\n * on: string,\n * version: string,\n * content: string\n * }[]}} data - contains scripts array\n * @returns string\n */\nfunction createScriptTagTemplate(raw, data) {\n if (data.bbscripts.length === 0) {\n return raw;\n }\n const templates = data.bbscripts.map(\n (s) =>\n ``,\n );\n return templates.join(\"\") + raw;\n}\n\n/**\n * Performs post processing on the raw string to address any necessary functionality that BBob/MD can't handle with a plugin (i.e. hoisting).\n * @param {string} raw processed input from after bbob and md\n * @param {any} data from bbob data\n * @returns final processed string\n */\nexport function postprocess(raw, data) {\n let final = raw;\n const postprocessors = [\n removeNewlineInjects,\n createClassStyleTagTemplate,\n createScriptTagTemplate,\n renderHoistedCodeBlocks,\n ];\n for (const postprocessor of postprocessors) {\n final = postprocessor(final, data);\n }\n return final;\n}\n","import { ESCAPABLES_REGEX, generateGUID, MD_TABLE_REGEX, regexIndexOf } from \"./common\";\n\n/**\n * Find all code blocks and hoist them out of the content and into a map for later insertion\n * @param {string} raw input to preprocess\n * @returns processed string and hoist map\n */\nfunction fenceCodeBlockPreprocess(content, data) {\n /** @type {Object.} */\n const hoistMap = {};\n let index = 0;\n\n const addHoistAndReturnNewStartPoint = (cutOffStart, cutOffEnd, expected, trim = false) => {\n const uuid = generateGUID();\n if (cutOffEnd !== -1) {\n hoistMap[uuid] = content.substring(cutOffStart, cutOffEnd);\n content = content.substring(0, cutOffStart) + uuid + content.substring(cutOffEnd);\n } else {\n hoistMap[uuid] = content.substring(cutOffStart);\n content = content.substring(0, cutOffStart) + uuid + expected;\n }\n if (trim) {\n if (hoistMap[uuid].startsWith(\"\\n\")) {\n hoistMap[uuid] = hoistMap[uuid].substring(1);\n }\n if (hoistMap[uuid].endsWith(\"\\n\")) {\n hoistMap[uuid] = hoistMap[uuid].substring(0, hoistMap[uuid].length - 1);\n }\n }\n return cutOffStart + uuid.length + expected.length;\n };\n\n while ((index = regexIndexOf(content, ESCAPABLES_REGEX, index)) !== -1) {\n const match = ESCAPABLES_REGEX.exec(content.substring(index));\n if (match.groups?.fence) {\n const fence = match.groups.fence;\n const fenceInfo = match.groups.fenceInfo;\n if (content[index] === \"\\n\") {\n // Check if the fence is not at the start of the content\n index += 1;\n }\n const closingFenceRegex = new RegExp(\"\\n\" + fence + \"(\\n|$)\"); // Find the next fence. By commonmark spec, it should be the same fence length and type\n const nextIndex = regexIndexOf(content, closingFenceRegex, index + fence.length);\n\n const uuid = generateGUID();\n if (nextIndex !== -1) {\n hoistMap[uuid] = content.substring(index + fence.length + fenceInfo.length, nextIndex);\n } else {\n hoistMap[uuid] = content.substring(index + fence.length + fenceInfo.length);\n }\n // inject bbcode tag before and after the code block. This is to prevent BBob plugin from injecting newlines\n const replacement = `[saveNL]\\n${fence}${fenceInfo}${uuid}\\n${fence}\\n[/saveNL]`;\n content =\n content.substring(0, index) +\n replacement +\n (nextIndex !== -1 ? content.substring(nextIndex + 1 + fence.length) : \"\");\n index = index + replacement.length;\n } else if (match.groups?.bbcode) {\n const bbcode = match.groups.bbcode;\n const bbcodeTag = match.groups.bbcodeTag.toLowerCase(); // coerce to lowercase for caseinsensitive matching\n const closingTag = `[/${bbcodeTag}]`;\n const nextIndex = content.toLowerCase().indexOf(closingTag, index + 1);\n index = addHoistAndReturnNewStartPoint(index + bbcode.length, nextIndex, closingTag, true);\n } else if (match.groups.backtick) {\n const backtick = match.groups.backtick; // contains whole content\n const tickStart = match.groups.tickStart;\n const tickEnd = match.groups.tickEnd;\n index = addHoistAndReturnNewStartPoint(\n index + tickStart.length,\n index + backtick.length - tickEnd.length,\n tickEnd,\n );\n }\n }\n\n data.hoistMap = hoistMap;\n return [content, data];\n}\n\n/**\n * Find all markdown table blocks and mark them to ignore newlines\n * @param {string} raw input to preprocess\n * @returns processed string\n */\nfunction mdTableBlockPreprocess(content, data) {\n let index = 0;\n while ((index = regexIndexOf(content, MD_TABLE_REGEX, index)) !== -1) {\n const match = MD_TABLE_REGEX.exec(content.substring(index));\n const table = match[0];\n const replacement = `[saveNL]\\n${table}\\n[/saveNL]`;\n content = content.substring(0, index) + replacement + content.substring(index + table.length);\n index = index + replacement.length;\n }\n return [content, data];\n}\n\n/**\n * Preprocesses input to be formatted for bbob to intake. Handles any necessary functionality that BBob can't handle with a plugin (i.e. hoisting).\n * @param {string} raw input to preprocess\n * @returns formatted input for bbob to intake\n */\nexport function preprocessRaw(raw) {\n let data = {};\n const preprocessors = [fenceCodeBlockPreprocess, mdTableBlockPreprocess];\n for (const preprocessor of preprocessors) {\n [raw, data] = preprocessor(raw, data);\n }\n return [raw, data];\n}\n","import bbob from \"@bbob/core\";\nimport { render } from \"@bbob/html\";\nimport { lineBreakPlugin } from \"./plugins/lineBreak\";\nimport { preserveWhitespace } from \"./plugins/preserveWhitespace\";\nimport { availableTags, preset, preventParsing } from \"./preset\";\nimport { postprocess } from \"./utils/postprocess\";\nimport { preprocessRaw } from \"./utils/preprocess\";\n\nconst options = {\n onlyAllowTags: [...availableTags],\n caseFreeTags: true,\n contextFreeTags: preventParsing, // prevent parsing of children\n enableEscapeTags: true,\n onError: (err) => {\n if (options.previewing) {\n // eslint-disable-next-line no-console\n console.warn(err.message, err.lineNumber, err.columnNumber);\n }\n },\n};\nconst presetTags = preset();\n\nexport const RpNBBCode = (code, opts) => {\n const plugins = [presetTags];\n if (opts.preserveWhitespace) {\n plugins.push(preserveWhitespace());\n }\n plugins.push(lineBreakPlugin());\n const [preprocessed, preprocessedData] = preprocessRaw(code);\n return bbob(plugins).process(preprocessed, {\n render,\n ...options,\n data: {\n ...preprocessedData,\n raw: preprocessed,\n previewing: opts.previewing,\n fonts: new Set(),\n styles: [],\n bbscripts: [],\n },\n });\n};\n\nexport { postprocess };\n","let C1 = 'C1';\nlet C2 = 'C2';\nif (process.env.NODE_ENV !== 'production') {\n C1 = '\"parser\" is not a function, please pass to \"process(input, { parser })\" right function';\n C2 = '\"render\" function not defined, please pass to \"process(input, { render })\"';\n}\nexport { C1, C2 };\n"],"names":["N","TAB","EQ","QUOTEMARK","SPACE","OPEN_BRAKET","CLOSE_BRAKET","SLASH","BACKSLASH","isTagNode","el","isStringNode","keysReduce","obj","reduce","def","Object","keys","acc","key","getNodeLength","node","Array","isArray","content","count","contentNode","String","length","escapeAttrValue","value","replace","attrValue","name","JSON","stringify","attrsToString","values","arr","join","getTagAttrs","tag","params","uniqAttr","res","tagAttr","attrs","TagNode","attr","this","append","push","appendToNode","setStart","start","setEnd","end","toTagStart","openTag","closeTag","toTagEnd","toTagNode","newNode","toLowerCase","toString","r","renderContent","tagStart","create","isOf","type","constructor","TOKEN_TYPE_ID","getTokenValue","token","isTagEnd","charCodeAt","Token","isEmpty","isNaN","isText","isTag","isAttrName","isAttrValue","isStart","isEnd","getName","slice","getTagName","getValue","getLine","getColumn","getStart","getEnd","text","tokenToText","row","col","TYPE_WORD","TYPE_TAG","TYPE_ATTR_NAME","TYPE_ATTR_VALUE","TYPE_SPACE","TYPE_NEW_LINE","CharGrabber","skip","num","silent","c","pos","o","onSkip","hasNext","len","getCurr","s","getPos","getLength","getRest","substring","getNext","nextPos","getPrev","prevPos","isLast","includes","val","indexOf","grabWhile","condition","grabN","substrUntilChar","char","idx","source","options","createCharGrabber","EM","STATE_WORD","STATE_TAG","STATE_TAG_ATTRS","TAG_STATE_NAME","TAG_STATE_ATTR","TAG_STATE_VALUE","WHITESPACES","SPECIAL_CHARS","END_POS_OFFSET","isWhiteSpace","isEscapeChar","isSpecialChar","isNewLine","unq","str","charToRemove","charAt","trimChar","createLexer","buffer","prevCol","tokenIndex","stateMode","tagMode","contextFreeTag","tokens","Math","floor","escapeTags","enableEscapeTags","contextFreeTags","filter","Boolean","map","nestedMap","Map","onToken","RESERVED_CHARS","NOT_CHAR_TOKENS","isCharReserved","isCharToken","isEscapableChar","checkContextFreeMode","isClosingTag","chars","emitToken","startPos","endPos","cl","p","e","createTokenOfType","nextTagState","tagChars","isSingleValueTag","masterStartPos","validAttrName","isValue","stateSpecial","validAttrValue","isQM","prevChar","nextChar","isPrevSLASH","isNextEQ","isWS","isNextWS","stateTag","currChar","substr","hasInvalidChars","isNoAttrsInTag","stateAttrs","tagStr","tagGrabber","hasSpace","stateWord","word","fullTagLen","fullTagName","isChar","tokenize","isTokenNested","has","get","status","set","NodeList","last","n","flush","pop","toArray","createList","parse","input","opts","onlyAllowTags","tokenizer","nodes","nestedNodes","tagNodes","tagNodesAttrName","nestedTagsMap","Set","isTagNested","tagName","flushTagNodes","getNodes","lastNestedNode","appendNodeAsString","isNested","forEach","item","appendNodes","handleTagStart","tagNode","from","to","add","handleTag","lastTagNode","onError","line","column","lineNumber","columnNumber","handleTagEnd","lexer","createTokenizer","activeTagNode","tokenValue","attrName","handleNode","isObj","isBool","iterate","t","cb","tree","same","expected","actual","every","exp","some","call","act","ao","eo","createTree","extendedTree","messages","walk","match","expr","expression","SELFCLOSE_END_TAG","CLOSE_START_TAG","START_TAG","END_TAG","renderNode","stripTags","render","toNode","gen","preprocessAttr","raw","vals","_default","nodeRaw","openTagParts","split","trim","startsWith","endsWith","toOriginalStartTag","toOriginalEndTag","regexIndexOf","string","regex","startpos","search","MD_NEWLINE_INJECT","MD_NEWLINE_PRE_INJECT","MD_NEWLINE_INJECT_COMMENT","URL_REGEX_SINGLE_LINE","RegExp","ESCAPABLES_REGEX","MD_TABLE_REGEX","generateGUID","d","Date","getTime","window","performance","now","random","isString","disableLineBreakConversion","unshift","child","splice","isWhitespaceSensitive","test","numSpaces","fromCharCode","repeat","process","tags","core","tagCallback","SLIDE_TITLE_OPEN","Symbol","SLIDE_TITLE_CLOSE","SLIDE_CLOSE","SLIDE_REGEX","markerToString","marker","accordionTags","accordion","groupId","markedContent","contentArr","newArr","shift","foundIndex","preContent","postContent","groups","slideTitleOpen","slideTitleClose","slideClose","generateSlideMarkersFromContent","generatedSlides","currentSlide","prevMarker","customTitle","generateSlidesFromMarkers","filteredContent","isValid","data","customSettings","lastValidAlignment","align","width","find","classes","style","class","slide","title","isOpen","open","titleAlign","left","right","center","possibleOptions","alignment","anchor","a","id","goto","href","WEB_FONTS","VALID_FONT_STYLES","thin","extralight","light","regular","medium","semibold","bold","extrabold","black","REGISTERED_AXIS","AXES_REGEX","emailHeader","emailFooter","rowcolumn","columnAttrs","columnStyle","EVENTS","ACCEPTED_OPTIONS","textmessage","recipient","message","option","animation","previewing","commonGUID","commonId","keyframes","ident","cleanContent","replaceAll","formatted","styles","bg","color","block","defaultOp","blockAttr","blockOption","blockquote","author","border","br","centerblock","percentageInput","check","nameAttr","classSuffix","className","selector","mediaQuery","state","minWidth","maxWidth","code","inputColor","comment","div","classAttrs","classNames","divide","fieldset","fa","font","fontFamily","family","axes","ital","wght","matches","exec","italic","weight","named_weight","fromEntries","entries","axesParser","url","sort","googleFontApiBuild","fonts","custom","fontVar","h","h1","h2","h3","h4","h5","h6","heightrestrict","heightInput","heightValue","parsedHeight","parseHeight","highlight","icode","imagefloat","inlinespoiler","justify","keyframe","mail","attributes","mailAttr","mailOption","person","subject","newspaper","nobr","note","ooc","pindent","plain","print","printAttr","printOption","progress","percentageInt","quote","thinprogress","savenl","sh","script","onEvent","on","scriptSetup","version","bbscripts","scroll","side","size","fontSize","fontValue","valid","parsedSize","sizeRanges","unit","parseFontSize","outputAttr","spoiler","providedTitle","sub","sup","tab","tabId","checked","for","tabs","tabsList","tabNode","b","i","u","availableTags","preset","createPreset","defTags","processor","presetFactory","presetExecutor","assign","extend","callback","removeNewlineInjects","renderHoistedCodeBlocks","hoistMap","uuid","createClassStyleTagTemplate","createScriptTagTemplate","fenceCodeBlockPreprocess","index","addHoistAndReturnNewStartPoint","cutOffStart","cutOffEnd","fence","fenceInfo","closingFenceRegex","nextIndex","replacement","bbcode","closingTag","bbcodeTag","backtick","tickStart","tickEnd","mdTableBlockPreprocess","table","caseFreeTags","err","console","warn","presetTags","plugins","preserveWhitespace","preprocessed","preprocessedData","preprocessors","preprocessor","preprocessRaw","plugs","mockRender","skipParse","parser","parseFn","renderFn","Error","plugin","newTree","html","bbob","final","postprocessors","postprocessor"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,13,64]} \ No newline at end of file diff --git a/bbcode-src/index.js b/bbcode-src/index.js index e685539..94d49ca 100644 --- a/bbcode-src/index.js +++ b/bbcode-src/index.js @@ -8,6 +8,7 @@ import { preprocessRaw } from "./utils/preprocess"; const options = { onlyAllowTags: [...availableTags], + caseFreeTags: true, contextFreeTags: preventParsing, // prevent parsing of children enableEscapeTags: true, onError: (err) => { diff --git a/package.json b/package.json index 769d5fa..923e40c 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "lint": "eslint" }, "devDependencies": { - "@bbob/types": "^4.1.0", + "@bbob/types": "^4.2.0", "@discourse/lint-configs": "^1.3.9", "@rollup/plugin-node-resolve": "^15.1.0", "@rollup/plugin-replace": "^5.0.7", @@ -22,13 +22,13 @@ "husky": ">=6", "lint-staged": ">=10", "prettier": "3.3.2", - "rollup": "^4.18.0" + "rollup": "^4.30.1" }, "dependencies": { - "@bbob/core": "^4.1.0", - "@bbob/html": "^4.1.0", - "@bbob/preset": "^4.1.0", - "@bbob/preset-html5": "^4.1.0" + "@bbob/core": "^4.2.0", + "@bbob/html": "^4.2.0", + "@bbob/preset": "^4.2.0", + "@bbob/preset-html5": "^4.2.0" }, "lint-staged": { "*.js": "eslint --fix", @@ -37,4 +37,4 @@ "engines": { "node": ">=18.0.0" } -} \ No newline at end of file +} diff --git a/public/javascripts/bbscript-parser.min.js.map b/public/javascripts/bbscript-parser.min.js.map index 571ca43..c73bd29 100644 --- a/public/javascripts/bbscript-parser.min.js.map +++ b/public/javascripts/bbscript-parser.min.js.map @@ -1 +1 @@ -{"version":3,"file":"bbscript-parser.min.js","sources":["../../bbcode-src/bbscript/bbscript1/utils.js","../../bbcode-src/bbscript/logger.js","../../bbcode-src/bbscript/bbscript1/processor.js","../../bbcode-src/bbscript/bbscript1/functions.js","../../bbcode-src/bbscript/bbscript2/AST.js","../../bbcode-src/bbscript/bbscript2/ASTError.js","../../bbcode-src/bbscript/bbscript2/parser.js","../../bbcode-src/bbscript/bbscript2/processor.js","../../bbcode-src/bbscript/bbscript2/functions.js","../../bbcode-src/bbscript/index.js","../../bbcode-src/bbscript/bbscript1/bbscript1.js","../../bbcode-src/bbscript/bbscript2/bbscript2.js"],"sourcesContent":["/** @typedef {import('./processor').bbscriptOptions} bbscriptOptions */\n\n/**\n * @typedef {Object.} bbscriptFuncMap\n */\n/**\n * @typedef {Object} bbscriptFunc\n * @property {{types: bbscriptParamTypes[], default?: (number|string|null)}} params\n * @property {bbscriptFunctionCallback} func\n */\n/**\n * @callback bbscriptFunctionCallback\n * @param {bbscriptOptions} options\n * @param {...any} args\n * @returns {(void | string | boolean | number | Promise | bbscriptStop)}\n */\n/**\n * @typedef {Object} bbscriptStop\n * @property {'stop'} msg\n */\n\nexport const bbscriptParamTypes = Object.freeze({\n Function: Symbol(\"Function\"),\n String: Symbol(\"String\"),\n Identifier: Symbol(\"Identifier\"),\n Int: Symbol(\"Int\"),\n});\n\n/**\n * @param {unknown} input\n * @returns {asserts input is bbscriptStop}\n */\nexport const isStop = (input) => {\n return (\n typeof input === \"object\" &&\n Object.getOwnPropertyNames(input).includes(\"msg\") &&\n input.msg === \"stop\"\n );\n};\n\n/**\n * @typedef {Object} astNode\n * @property {string} name\n * @property {(astNode|string|number)[]} params\n */\n\n/**\n * @param {unknown} input\n * @returns {asserts input is astNode}\n */\nexport const isAstNode = (input) => {\n return (\n typeof input === \"object\" &&\n Object.getOwnPropertyNames(input).every((v) => [\"name\", \"params\"].includes(v))\n );\n};\n/**\n * Process input string to produce either a string or the associated data if it is a variable\n * @param {string | number} str input string. Either a string or an identifier\n * @param {bbscriptOptions} options\n * @returns {string} string value\n */\nexport const getStringVal = (str, options) => {\n if (typeof str === \"string\" && str.match(/^_(.*)_$/)) {\n if (\n options.callerId &&\n options.data[options.callerId] &&\n options.data[options.callerId][str] !== undefined\n ) {\n // is identifier\n return options.data[options.callerId][str];\n } else {\n return str.match(/^_(.*)_$/)?.[1] || str;\n }\n }\n if (typeof str === \"string\" && str.match(/\\$\\{\\w+\\}/)) {\n const matches = str.matchAll(/\\$\\{(\\w+)\\}/g);\n for (const match of matches) {\n const presumedValue = options.data?.[options.callerId]?.[\"_\" + match[1] + \"_\"] || match[0];\n str = str.replace(match[0], presumedValue);\n }\n }\n return str;\n};\n","/* eslint-disable no-console */\nexport class ConsoleLogger {\n static log = console.log;\n static warn = console.warn;\n static error = console.error;\n static info = console.info;\n static debug = console.debug;\n}\n","/** @typedef {import('./utils').astNode} astNode */\n/** @typedef {import('./utils').bbscriptFuncMap} bbscriptFuncMap */\nimport { bbscriptParamTypes, isStop } from \"./utils\";\nimport { ConsoleLogger } from \"../logger\";\n\n/**\n * @typedef {Object} bbscriptOptions\n * @property {string} callerId\n * @property {string} callerClass\n * @property {any} data\n * @property {BBScriptProcessor} processor\n * @property {Element} target\n */\n\nexport class BBScriptProcessor {\n /** @type {bbscriptOptions} */\n options;\n /** @type {bbscriptFuncMap} */\n functions;\n /**\n * @param {bbscriptFuncMap} bbscriptFunc\n * @param {bbscriptOptions} [defaultOptions={} as bbscriptOptions]\n */\n constructor(bbscriptFunc, defaultOptions = {}) {\n defaultOptions = {\n ...defaultOptions,\n processor: this,\n };\n this.options = defaultOptions;\n this.functions = bbscriptFunc;\n }\n /**\n * Processes and executes all commands in node tree\n * @param {astNode[]} nodeTree input node tree, generated by `parse()`\n * @param {string} callerId\n * @param {string} callerClass\n * @param {bbscriptOptions} [options=this.options] options to use\n * @returns {Promise}\n */\n async execAll(nodeTree, callerId, callerClass, options = this.options) {\n options = {\n ...this.options,\n ...options,\n callerId,\n callerClass,\n };\n for (const node of nodeTree) {\n const res = await this.exec(node, options);\n if (isStop(res)) {\n return;\n }\n }\n }\n /**\n * Processes and executes a single node\n * @param {astNode} node node to process and execute\n * @param {bbscriptOptions} options bbscript options\n * @returns {(void|string|boolean|number|Promise|import('./utils').bbscriptStop)} returns value if applicable\n */\n exec(node, options) {\n const functions = options.processor.functions;\n const callable = functions[node.name].func;\n if (callable) {\n const args = node.params;\n try {\n return callable(options, ...args);\n } catch (error) {\n ConsoleLogger.warn(\"BBScript Error\", error, node.name, options);\n }\n } else {\n ConsoleLogger.info(\"invalid command\", node.name, options);\n }\n }\n /**\n * Process raw string into AST\n * @param {string} raw input script\n * @returns {astNode[]}\n */\n parse(raw) {\n const nodeTree = [];\n for (let line of raw.split(\"\\n\")) {\n line = line.trim();\n if (!line || line.startsWith(\"//\")) {\n continue;\n }\n try {\n nodeTree.push(this.process(this.functions, line)[0]);\n } catch (e) {\n ConsoleLogger.warn(e);\n }\n }\n return nodeTree;\n }\n /**\n * Processes input line into AST node\n * @private\n * @param {bbscriptFuncMap} functions valid bbscript functions\n * @param {string} input input string to process\n * @param {number} [idx=0] optional index of string to start from\n * @returns {[astNode, number]} parsed AST Node and last index\n */\n process(functions, input, idx = 0) {\n const [part1, ...parts] = input.split(/\\s+/);\n const name = part1.toLowerCase();\n const params = parts.join(\" \");\n const node = {\n name,\n params: [],\n };\n if (!(name in functions)) {\n throw new Error(`Invalid bbscript function name '${name}'`);\n }\n const foundFunc = functions[name];\n // required params\n for (const { types: validParamType, default: defaultValue } of foundFunc.params) {\n let value;\n if (idx >= params.length) {\n if (defaultValue) {\n value = defaultValue;\n } else if (defaultValue == null) {\n // optional param with function defined default\n continue;\n } else {\n ConsoleLogger.warn(`Missing Parameter for ${name}`, validParamType);\n continue;\n }\n }\n let isString = false;\n if (params[idx] === '\"') {\n // process quoted string\n [value, idx] = this.getEnclosedParameter(params, idx);\n isString = true;\n } else if (params[idx] === \"'\") {\n // process quoted string\n [value, idx] = this.getEnclosedParameter(params, idx, \"'\");\n isString = true;\n } else if (validParamType.includes(bbscriptParamTypes.Function) && params[idx] === \"(\") {\n // process nested function\n try {\n const [childFunc, overallIdx] = this.getEnclosedParameter(params, idx, \")\");\n [value] = this.process(functions, childFunc);\n idx = overallIdx;\n } catch (e) {\n ConsoleLogger.warn(e);\n }\n } else if (validParamType.includes(bbscriptParamTypes.Identifier) && params[idx] === \"$\") {\n let braceVar = false;\n try {\n braceVar = params[idx + 1] === \"{\";\n } catch {\n ConsoleLogger.warn(`$ found but no opening {`);\n }\n if (braceVar) {\n [value, idx] = this.getEnclosedParameter(params, ++idx, \"}\");\n }\n } else if (params[idx]) {\n // no clue what token is\n value = params.substring(idx).split(/\\s+/, 2)[0];\n idx += value.length;\n }\n if (\n validParamType.includes(bbscriptParamTypes.Int) &&\n typeof value === \"string\" &&\n !isNaN(parseFloat(value))\n ) {\n // if numeric, convert it\n value = parseFloat(value);\n } else if (validParamType.includes(bbscriptParamTypes.String) && isString) {\n value;\n } else if (validParamType.includes(bbscriptParamTypes.Identifier)) {\n value = `_${value}_`;\n }\n if (value !== undefined && value !== null) {\n node.params.push(value);\n }\n while (params[idx]?.match(/\\s/)) {\n // skip index to next non-space char\n idx++;\n }\n }\n return [node, idx];\n }\n /**\n * Processed an input string for a single block of string\n * @private\n * @param {string} input input string\n * @param {number} idx index to start from\n * @param {string} [close='\"'] closing char to stop at\n * @param {boolean} [trimWrap=true] if `true`, will remove opening and closing chars\n * @returns {[string, number]} found parameter and closing index\n */\n getEnclosedParameter(input, idx, close = '\"', trimWrap = true) {\n const startIdx = idx;\n const remainder = input.slice(startIdx);\n const length = input.length;\n idx++;\n while (idx < length) {\n const closeIndex = input.indexOf(close, idx);\n if (!closeIndex) {\n idx = length;\n break;\n }\n // escaped close \"\n if (input[closeIndex - 1] === \"\\\\\") {\n idx = closeIndex + 1;\n continue;\n }\n idx = closeIndex;\n break;\n }\n if (idx >= length && input[idx] !== close) {\n throw new Error('missing closing \"');\n }\n const value = remainder.substring(trimWrap ? 1 : 0, idx - startIdx + (trimWrap ? 0 : 1));\n idx++;\n return [value, idx];\n }\n}\n","/** @typedef {import('./utils').astNode} astNode */\n/** @typedef {import('./utils').bbscriptFunc} bbscriptFunc */\n/** @typedef {import('./utils').bbscriptFuncMap} bbscriptFuncMap */\n/** @typedef {import('./processor').bbscriptOptions} bbscriptOptions */\nimport $ from \"jquery\";\nimport { bbscriptParamTypes, getStringVal, isAstNode } from \"./utils\";\nimport { ConsoleLogger } from \"../logger\";\n\n/**\n * Conditional if then else\n * @type {bbscriptFunc}\n */\nexport const conditional = {\n params: [\n { types: [bbscriptParamTypes.Function] },\n { types: [bbscriptParamTypes.Function] },\n { types: [bbscriptParamTypes.Function], default: null },\n ],\n func: (options, lhs, rhs, elseBlock) => {\n const result = options.processor.exec(lhs, options);\n if (result) {\n return options.processor.exec(rhs, options);\n } else if (elseBlock) {\n return options.processor.exec(elseBlock, options);\n }\n },\n};\n/**\n * force stop\n * @type {bbscriptFunc}\n */\nexport const stop = {\n params: [],\n func: () => {\n return { msg: \"stop\" };\n },\n};\n/**\n * Get the Elements wrapped in JQuery for quick JQuery functionality\n * @param {any} el target input string selector\n * @param {bbscriptOptions} options\n * @returns {any}\n */\nconst getJQueryEl = (el, options) => {\n if (el) {\n el = \".\" + getStringVal(el, options).trim() + \"__\" + options.callerId;\n } else {\n el = $(options.target);\n }\n return $(el);\n};\nexport const addClass = {\n params: [\n { types: [bbscriptParamTypes.Identifier] },\n { types: [bbscriptParamTypes.Identifier], default: null },\n ],\n func: (options, newClass, target = \"\") => {\n newClass = getStringVal(newClass, options) || \"\";\n newClass &&= newClass + \"__\" + options.callerId;\n getJQueryEl(target, options).addClass(newClass);\n },\n};\nexport const removeClass = {\n params: [\n { types: [bbscriptParamTypes.Identifier] },\n { types: [bbscriptParamTypes.Identifier], default: null },\n ],\n func: (options, oldClass, target = \"\") => {\n oldClass = getStringVal(oldClass, options) || \"\";\n oldClass &&= oldClass + \"__\" + options.callerId;\n getJQueryEl(target, options).removeClass(oldClass);\n },\n};\nexport const fadeIn = {\n params: [\n { types: [bbscriptParamTypes.Int], default: 1000 },\n { types: [bbscriptParamTypes.Identifier], default: null },\n ],\n func: (options, time = 1000, target) => {\n getJQueryEl(target, options).fadeIn(time);\n },\n};\nexport const fadeOut = {\n params: [\n { types: [bbscriptParamTypes.Int], default: 1000 },\n { types: [bbscriptParamTypes.Identifier], default: null },\n ],\n func: (options, time = 1000, target) => {\n getJQueryEl(target, options).fadeOut(time);\n },\n};\nexport const fadeToggle = {\n params: [\n { types: [bbscriptParamTypes.Int], default: 1000 },\n { types: [bbscriptParamTypes.Identifier], default: null },\n ],\n func: (options, time = 1000, target) => {\n getJQueryEl(target, options).fadeToggle(time);\n },\n};\nexport const hide = {\n params: [{ types: [bbscriptParamTypes.Identifier], default: null }],\n func: (options, target) => {\n getJQueryEl(target, options).hide();\n },\n};\nexport const show = {\n params: [{ types: [bbscriptParamTypes.Identifier], default: null }],\n func: (options, target) => {\n getJQueryEl(target, options).show();\n },\n};\nexport const getText = {\n params: [{ types: [bbscriptParamTypes.Identifier], default: null }],\n func: (options, target) => {\n return getJQueryEl(target, options).text();\n },\n};\nexport const setText = {\n params: [\n {\n types: [\n bbscriptParamTypes.String,\n bbscriptParamTypes.Function,\n bbscriptParamTypes.Identifier,\n ],\n },\n { types: [bbscriptParamTypes.Identifier], default: null },\n ],\n func: (options, input, target) => {\n if (isAstNode(input)) {\n input = options.processor.exec(input, options);\n } else {\n input = getStringVal(input, options);\n }\n getJQueryEl(target, options).text(input);\n },\n};\nexport const slideDown = {\n params: [\n { types: [bbscriptParamTypes.Int], default: 1000 },\n { types: [bbscriptParamTypes.Identifier], default: null },\n ],\n func: (options, time = 1000, target) => {\n getJQueryEl(target, options).slideDown(time);\n },\n};\nexport const slideUp = {\n params: [\n { types: [bbscriptParamTypes.Int], default: 1000 },\n { types: [bbscriptParamTypes.Identifier], default: null },\n ],\n func: (options, time = 1000, target) => {\n getJQueryEl(target, options).slideUp(time);\n },\n};\nexport const slideToggle = {\n params: [\n { types: [bbscriptParamTypes.Int], default: 1000 },\n { types: [bbscriptParamTypes.Identifier], default: null },\n ],\n func: (options, time = 1000, target) => {\n getJQueryEl(target, options).slideToggle(time);\n },\n};\nconst params = [\n {\n types: [\n bbscriptParamTypes.String,\n bbscriptParamTypes.Function,\n bbscriptParamTypes.Int,\n bbscriptParamTypes.Identifier,\n ],\n },\n {\n types: [\n bbscriptParamTypes.String,\n bbscriptParamTypes.Function,\n bbscriptParamTypes.Int,\n bbscriptParamTypes.Identifier,\n ],\n },\n];\n/**\n * Common evaluate method to process left and right arguments first if they are nested\n * @param {bbscriptOptions} options\n * @param {unknown} lhs\n * @param {unknown} rhs\n * @returns {any[]}\n */\nconst evaluate = (options, lhs, rhs) => {\n let leftResult;\n let rightResult;\n if (isAstNode(lhs)) {\n leftResult = options.processor.exec(lhs, options);\n } else {\n leftResult = getStringVal(lhs, options);\n }\n if (isAstNode(rhs)) {\n rightResult = options.processor.exec(rhs, options);\n } else {\n rightResult = getStringVal(rhs, options);\n }\n return [leftResult, rightResult];\n};\n/**\n * is equal to\n * @type {bbscriptFunc}\n */\nexport const eq = {\n params,\n func: (options, lhs, rhs) => {\n const [leftResult, rightResult] = evaluate(options, lhs, rhs);\n // eslint-disable-next-line eqeqeq\n return leftResult == rightResult;\n },\n};\n/**\n * is greater than\n * @type {bbscriptFunc}\n */\nexport const ge = {\n params,\n func: (options, lhs, rhs) => {\n const [leftResult, rightResult] = evaluate(options, lhs, rhs);\n return leftResult > rightResult;\n },\n};\n/**\n * is greater than or equal to\n * @type {bbscriptFunc}\n */\nexport const geq = {\n params,\n func: (options, lhs, rhs) => {\n const [leftResult, rightResult] = evaluate(options, lhs, rhs);\n return leftResult >= rightResult;\n },\n};\n/**\n * is less than\n * @type {bbscriptFunc}\n */\nexport const le = {\n params,\n func: (options, lhs, rhs) => {\n const [leftResult, rightResult] = evaluate(options, lhs, rhs);\n return leftResult < rightResult;\n },\n};\n/**\n * is less than or equal to\n * @type {bbscriptFunc}\n */\nexport const leq = {\n params,\n func: (options, lhs, rhs) => {\n const [leftResult, rightResult] = evaluate(options, lhs, rhs);\n return leftResult >= rightResult;\n },\n};\nexport const random = {\n params: [{ types: [bbscriptParamTypes.Int] }, { types: [bbscriptParamTypes.Int] }],\n func: (options, min, max) => {\n return Math.floor(Math.random() * (max - min + 1) + min);\n },\n};\nexport const print = {\n params: [{ types: [bbscriptParamTypes.String, bbscriptParamTypes.Identifier] }],\n func: (options, args) => {\n ConsoleLogger.log(getStringVal(args, options));\n },\n};\n/**\n * Set variable\n * @type {bbscriptFunc}\n */\nexport const set = {\n params: [\n { types: [bbscriptParamTypes.Identifier] },\n { types: [bbscriptParamTypes.Int, bbscriptParamTypes.String, bbscriptParamTypes.Function] },\n ],\n func: (options, id, value) => {\n if (isAstNode(value)) {\n value = options.processor.exec(value, options);\n } else {\n value = getStringVal(value, options);\n }\n const callerId = options.callerId || \"\";\n if (!(callerId in options.data)) {\n options.data[callerId] = {};\n }\n options.data[callerId][id] = value;\n },\n};\nexport const add = {\n params: [\n {\n types: [\n bbscriptParamTypes.Int,\n bbscriptParamTypes.String,\n bbscriptParamTypes.Identifier,\n bbscriptParamTypes.Function,\n ],\n },\n {\n types: [\n bbscriptParamTypes.Int,\n bbscriptParamTypes.String,\n bbscriptParamTypes.Identifier,\n bbscriptParamTypes.Function,\n ],\n },\n ],\n func: (options, a, b) => {\n if (isAstNode(a)) {\n a = options.processor.exec(a, options);\n } else {\n a = getStringVal(a, options);\n }\n if (isAstNode(b)) {\n b = options.processor.exec(b, options);\n } else {\n b = getStringVal(b, options);\n }\n return a + b;\n },\n};\nexport const dec = {\n params: [\n { types: [bbscriptParamTypes.Identifier] },\n { types: [bbscriptParamTypes.Int], default: 1 },\n ],\n func: (options, id, amount = 1) => {\n try {\n const callerId = options.callerId || \"\";\n if (!(callerId in options.data)) {\n options.data[callerId] = {};\n }\n options.data[callerId][id] -= amount;\n } catch (e) {\n ConsoleLogger.warn(`${id} is not a number`, e);\n }\n },\n};\n\nexport const inc = {\n params: [\n { types: [bbscriptParamTypes.Identifier] },\n { types: [bbscriptParamTypes.Int], default: 1 },\n ],\n func: (options, id, amount = 1) => {\n try {\n const callerId = options.callerId || \"\";\n if (!(callerId in options.data)) {\n options.data[callerId] = {};\n }\n options.data[callerId][id] += amount;\n } catch (e) {\n ConsoleLogger.warn(`${id} is not a number`, e);\n }\n },\n};\n\n/**\n * Map between bbscript function name and logic.\n * keys must be all lowercase. Parser will apply lowercase to user input,\n * so is case-insensitive.\n * @type {bbscriptFuncMap}\n */\nexport const bbscriptFunctions = {\n print,\n eq,\n ge,\n geq,\n le,\n leq,\n if: conditional,\n stop,\n set,\n dec,\n inc,\n addclass: addClass,\n removeclass: removeClass,\n fadein: fadeIn,\n fadeout: fadeOut,\n fadetoggle: fadeToggle,\n hide,\n show,\n gettext: getText,\n settext: setText,\n slidedown: slideDown,\n slideup: slideUp,\n slidetoggle: slideToggle,\n random,\n add,\n};\n","/** @typedef {import('./processor').BBScriptOptions} BBScriptOptions */\n/** @typedef {import('./utils').BBScriptReturnTypes} BBScriptReturnTypes */\nimport { ConsoleLogger } from \"../logger\";\n\nexport class ASTNode {\n /** @type {number} */\n _startIdx;\n /** @type {number} */\n _endIdx;\n\n /**\n * @param {number} startIdx\n * @param {number} endIdx\n */\n constructor(startIdx, endIdx) {\n this._startIdx = startIdx;\n this._endIdx = endIdx;\n }\n /**\n * @public\n * @returns {number}\n */\n get startIdx() {\n return this._startIdx;\n }\n /**\n * @public\n * @returns {number}\n */\n get endIdx() {\n return this._endIdx;\n }\n /**\n * returns information about the text of the node in the original script\n * @public\n * @param {string} text input string\n * @returns {{ line: number; column: number; text: string; }}\n */\n findInText(text) {\n let line = 1;\n let column = 1;\n for (let i = 0; i < text.length; i++) {\n if (i === this.startIdx) {\n break;\n }\n if (text[i] === \"\\n\") {\n line++;\n column = 0;\n }\n column++;\n }\n return {\n line,\n column,\n text: text.substring(this.startIdx, this.endIdx),\n };\n }\n}\n\n/** @extends ASTNode */\nexport class ASTIdentifier extends ASTNode {\n /** @type {string} */\n _name;\n\n /**\n * @param {number} startIdx\n * @param {number} endIdx\n * @param {string} name\n */\n constructor(startIdx, endIdx, name) {\n super(startIdx, endIdx);\n this._name = name;\n }\n /**\n * @public\n * @returns {string}\n */\n get name() {\n return this._name;\n }\n /**\n * @public\n * @param {BBScriptOptions} options\n * @returns {any}\n */\n resolveValue(options) {\n if (\n options.callerId &&\n options.data[options.callerId] &&\n options.data[options.callerId][this.name] !== undefined\n ) {\n return options.data[options.callerId][this.name];\n } else {\n return this.name;\n }\n }\n}\n\n/** @extends ASTNode */\nexport class ASTFunction extends ASTNode {\n /** @type {ASTIdentifier} */\n _identifier;\n /** @type {ASTNode[]} */\n _params;\n\n /**\n * @param {number} startIdx\n * @param {number} endIdx\n * @param {ASTIdentifier} name\n * @param {ASTNode[]} params\n */\n constructor(startIdx, endIdx, name, params) {\n super(startIdx, endIdx);\n this._identifier = name;\n this._params = params;\n }\n /**\n * @public\n * @returns {ASTIdentifier}\n */\n get identifier() {\n return this._identifier;\n }\n /**\n * @public\n * @returns {ASTNode[]}\n */\n get params() {\n return this._params;\n }\n /**\n * Processes and executes a single node\n * @public\n * @param {BBScriptOptions} options bbscript options\n * @returns {BBScriptReturnTypes} returns value if applicable\n */\n resolveValue(options) {\n const functions = options.processor.functions;\n const callable = functions[this.identifier.name];\n if (callable) {\n const args = this.params;\n try {\n return callable(options, ...args);\n } catch (error) {\n ConsoleLogger.warn(\"BBScript Error\", error, this, options);\n }\n }\n ConsoleLogger.info(\"invalid command\", this, options);\n }\n}\n\n/** @extends ASTNode */\nexport class ASTQuotedString extends ASTNode {\n /** @type {string} */\n _string;\n\n /**\n * @param {number} startIdx\n * @param {number} endIdx\n * @param {string} input\n */\n constructor(startIdx, endIdx, input) {\n super(startIdx, endIdx);\n this._string = input;\n }\n /**\n * @public\n * @returns {string}\n */\n get string() {\n return this._string;\n }\n /**\n * @public\n * @returns {string}\n */\n resolveValue(options) {\n if (this.string.match(/\\$\\{\\w+\\}/)) {\n // string interpolation. carryover from bbscript1\n let str = this.string;\n const matches = str.matchAll(/\\$\\{(\\w+)\\}/g);\n for (const match of matches) {\n const presumedValue = options.data?.[options.callerId]?.[\"_\" + match[1] + \"_\"] || match[0];\n str = str.replace(match[0], presumedValue);\n }\n return str;\n }\n return this.string;\n }\n}\n\n/** @extends ASTNode */\nexport class ASTList extends ASTNode {\n /** @type {ASTNode[]} */\n _items;\n /**\n * @param {number} startIdx\n * @param {number} endIdx\n * @param {ASTNode[]} elements\n */\n constructor(startIdx, endIdx, elements) {\n super(startIdx, endIdx);\n this._items = elements;\n }\n /**\n * @public\n * @returns {ASTNode[]}\n */\n get items() {\n return this._items;\n }\n /**\n * @public\n * @param {BBScriptOptions} options\n * @returns {(string | number | boolean)[]}\n */\n resolveValue(options) {\n return this.items.map((i) => i.resolveValue(options));\n }\n}\n\n/** @extends ASTNode */\nexport class ASTNumberLiteral extends ASTNode {\n /** @type {string} */\n _value;\n\n /**\n * @param {number} startIdx\n * @param {number} endIdx\n * @param {string} value\n */\n constructor(startIdx, endIdx, value) {\n super(startIdx, endIdx);\n this._value = value;\n }\n /**\n * @public\n * @returns {string}\n */\n get value() {\n return this._value;\n }\n /**\n * @public\n * @returns {number}\n */\n resolveValue() {\n return +this.value;\n }\n}\n","/** @typedef {import('./AST').ASTNode} ASTNode */\n/** @extends Error */\nexport class ASTError extends Error {\n /** @type {ASTNode | null} */\n node;\n\n /**\n * @param {ASTNode | null} node\n * @param {string} message\n */\n constructor(node, message) {\n super(message);\n this.name = \"ASTError\";\n this.node = node;\n }\n /**\n * @public\n * @param {string} text\n * @returns {string}\n */\n format(text) {\n if (this.node !== null) {\n const details = this.node.findInText(text);\n this.message += `: ${details.text} (line ${details.line}, column ${details.column})`;\n }\n return this.message;\n }\n}\n","/** @typedef {import('./AST').ASTNode} ASTNode */\nimport { ASTFunction, ASTIdentifier, ASTList, ASTNumberLiteral, ASTQuotedString } from \"./AST\";\nimport { ASTError } from \"./ASTError\";\n\nexport class BBScriptParser {\n /** @type {ASTNode[]} */\n ast = [];\n /** @type {string} */\n text = \"\";\n /** @type {number} */\n length = 0; // separate value for better dev\n /** @type {ASTError[]} */\n errors = [];\n /** @type {number} */\n pos = 0;\n\n /**\n * Parse input string into AST tree for later processing\n * @param {string} input string to parse\n * @returns {{ ast: ASTNode[]; formattedErrors: string[]; }} AST Tree to be processed in BBScript 2 syntax\n */\n parse(input) {\n this.text = input;\n this.length = this.text.length;\n let fatalError;\n try {\n this.buildAst();\n } catch (e) {\n fatalError = new ASTError(null, e?.message);\n }\n if (fatalError) {\n this.errors.push(fatalError);\n }\n const formattedErrors = this.errors.map((e) => e.format(this.text));\n return {\n ast: this.ast,\n formattedErrors,\n };\n }\n /**\n * Builds an AST\n * @private\n * @returns {ASTNode[]} AST\n */\n buildAst() {\n this.ast = [];\n this.errors = [];\n this.pos = 0;\n let node;\n while (this.pos < this.length) {\n // consume whitespace\n this.consumeWhitespace();\n if (this.pos >= this.length) {\n break;\n }\n // top-level function\n if (this.head() === \"(\") {\n node = this.processFunctionCall();\n } else {\n this.errors.push(new ASTError(null, \"Expecting function call, found \" + this.head()));\n break;\n }\n if (node !== null) {\n this.ast.push(node);\n }\n }\n return this.ast;\n }\n /**\n * Returns the current character at the cursor\n * @private\n * @param {boolean} [throwOnError=true] throw an error if unexpected end of script\n * @returns {string | null} single character string or `null`\n */\n head(throwOnError = true) {\n if (this.pos < this.length) {\n return this.text[this.pos];\n }\n if (throwOnError) {\n throw new Error(\"Unexpected end of script\");\n }\n return null;\n }\n /**\n * Advance the cursor position if the current cursor points to a whitespace\n * @private\n * @returns {void}\n */\n consumeWhitespace() {\n while (this.pos < this.length && this.isWhitespaceChar()) {\n this.pos++;\n }\n }\n /**\n * @private\n * @param {string} [char=this.head() || '']\n * @returns {boolean}\n */\n isWhitespaceChar(char = this.head() || \"\") {\n return /\\s/.test(char);\n }\n /**\n * Processes the following substring at the cursor position as a function call\n * @private\n * @returns {ASTFunction} ASTFunction node\n */\n processFunctionCall() {\n const startIdx = this.pos;\n // consume starting parentheses\n this.pos++;\n const name = this.processIdentifier(\")\", /[^+\\-_*/%<>=!a-zA-Z]/gm);\n this.consumeWhitespace();\n const params = [];\n while (this.head() !== \")\") {\n this.consumeWhitespace();\n const char = this.head();\n switch (char) {\n case \"(\":\n params.push(this.processFunctionCall());\n break;\n case '\"':\n params.push(this.processString());\n break;\n case \"[\":\n params.push(this.processList());\n break;\n case \")\":\n // end of function.\n break;\n default:\n if (char === \"-\" || /\\d/.test(char || \"\")) {\n params.push(this.processNumber());\n } else {\n params.push(this.processIdentifier());\n }\n break;\n }\n }\n // consume ending parentheses\n this.pos++;\n const endIdx = this.pos;\n return new ASTFunction(startIdx, endIdx, name, params);\n }\n /**\n * Processes a double quoted string starting at the cursor position into an ASTNode\n * @private\n * @returns {ASTQuotedString}\n */\n processString() {\n let string = \"\";\n const startIdx = this.pos;\n this.pos++;\n let escaped = false;\n while (this.head() !== null) {\n const char = this.head();\n if (char === '\"') {\n if (!escaped) {\n break;\n }\n string += char;\n escaped = false;\n } else if (char === \"\\\\\") {\n if (escaped) {\n string += char;\n }\n escaped = !escaped;\n } else {\n string += char;\n escaped = false;\n }\n this.pos++;\n }\n const endIdx = this.pos;\n this.pos++;\n return new ASTQuotedString(startIdx, endIdx, string.replace(\"\\n\", \"\\\\n\"));\n }\n /**\n * Processes a bracketed list starting at the cursor position into an ASTNode\n *\n * expects `[item1 item2 item3]`\n * @private\n * @returns {ASTList}\n */\n processList() {\n const startIdx = this.pos;\n this.pos++;\n const items = [];\n while (this.head() !== null) {\n this.consumeWhitespace();\n const char = this.head();\n if (char === \"]\") {\n break;\n }\n switch (char) {\n case \"(\":\n items.push(this.processFunctionCall());\n break;\n case '\"':\n items.push(this.processString());\n break;\n case \"[\":\n items.push(this.processList());\n break;\n default:\n if (char === \"-\" || /\\d/.test(char || \"\")) {\n items.push(this.processNumber(\"]\"));\n } else {\n items.push(this.processIdentifier(\"]\"));\n }\n break;\n }\n }\n // consume closing brace\n this.pos++;\n const endIdx = this.pos;\n return new ASTList(startIdx, endIdx, items);\n }\n /**\n * Processes a number literal starting at the cursor position\n * @private\n * @param {string} [end=')'] terminating characters to stop at\n * @returns {ASTNumberLiteral}\n */\n processNumber(end = \")\") {\n const startIdx = this.pos;\n if (this.head() === \"-\") {\n this.pos++;\n }\n while (!this.isWhitespaceChar() && this.head() !== end) {\n this.pos++;\n }\n const endIdx = this.pos;\n const value = this.text.substring(startIdx, endIdx);\n const numberLiteral = new ASTNumberLiteral(startIdx, endIdx, value);\n if (isNaN(+value)) {\n this.errors.push(new ASTError(numberLiteral, \"Invalid number literal\"));\n }\n return numberLiteral;\n }\n /**\n * Processes an identifier at the cursor position\n * @private\n * @param {string} [end=')'] end character to stop at\n * @param {RegExp} [invalidChars=/[^_a-zA-Z]/gm] regex to check against\n * @returns {ASTIdentifier}\n */\n processIdentifier(end = \")\", invalidChars = /[^_a-zA-Z]/gm) {\n const nameStartIdx = this.pos;\n while (!this.isWhitespaceChar() && this.head() !== end) {\n this.pos++;\n }\n const nameEndIdx = this.pos;\n const identifier = new ASTIdentifier(\n nameStartIdx,\n nameEndIdx,\n this.text.substring(nameStartIdx, nameEndIdx),\n );\n // validate identifier\n if (invalidChars.test(identifier.name)) {\n this.errors.push(new ASTError(identifier, \"Invalid function identifier\"));\n }\n if (identifier.name.length === 0) {\n this.errors.push(new ASTError(identifier, \"Missing function identifier\"));\n }\n return identifier;\n }\n}\n","/** @typedef {import('./AST').ASTNode} ASTNode */\n/** @typedef {import('./utils').BBScriptFuncMap} BBScriptFuncMap */\n\n/**\n * @typedef {Object} BBScriptOptions\n * @property {string} callerId\n * @property {string} callerClass\n * @property {any} data\n * @property {BBScriptProcessor} processor\n * @property {Element} target\n */\n\nexport class BBScriptProcessor {\n /** @type {BBScriptOptions} */\n options;\n /** @type {BBScriptFuncMap} */\n functions;\n\n /**\n * @param {BBScriptFuncMap} functions\n * @param {BBScriptOptions} [defaultOptions={} as BBScriptOptions]\n */\n constructor(functions, defaultOptions = {}) {\n defaultOptions = {\n ...defaultOptions,\n processor: this,\n };\n this.options = defaultOptions;\n this.functions = functions;\n }\n /**\n * Processes and executes all commands in node tree\n * @param {ASTNode[]} nodeTree input node tree, generated by `parse()`\n * @param {string} callerId\n * @param {string} callerClass\n * @param {BBScriptOptions} [options=this.options] options to use\n * @returns {void}\n */\n execAll(nodeTree, callerId, callerClass, options = this.options) {\n options = {\n ...this.options,\n ...options,\n callerId,\n callerClass,\n };\n for (const node of nodeTree) {\n node.resolveValue(options);\n }\n }\n}\n","/** @typedef {import('./utils').BBScriptFunc} BBScriptFunc */\n/** @typedef {import('./utils').BBScriptFuncMap} BBScriptFuncMap */\n/** @typedef {import('./utils').BBScriptReturnTypes} BBScriptReturnTypes */\n/** @typedef {import('./AST').ASTNode} ASTNode */\n/** @typedef {import('./processor').BBScriptOptions} BBScriptOptions */\nimport $ from \"jquery\";\nimport { ASTError } from \"./ASTError\";\nimport { ASTIdentifier } from \"./AST\";\nimport { ConsoleLogger } from \"../logger\";\n\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} arr\n * @returns {number}\n */\nconst count = (options, arr) => {\n const arrVal = arr.resolveValue(options);\n if (Array.isArray(arrVal) || typeof arrVal === \"string\") {\n return arrVal.length;\n } else {\n throw new ASTError(arr, \"Does not resolve to an array or string\");\n }\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} arr\n * @param {ASTNode} needle\n * @returns {boolean}\n */\nconst contain = (options, arr, needle) => {\n const arrVal = arr.resolveValue(options);\n const needleVal = needle.resolveValue(options);\n if (Array.isArray(arrVal) && needleVal !== undefined) {\n return arrVal.includes(needleVal);\n }\n if (typeof arrVal === \"string\" && needleVal !== undefined) {\n return arrVal.includes(needleVal);\n }\n if (!Array.isArray(arrVal) || typeof arrVal !== \"string\") {\n throw new ASTError(arr, \"Does not resolve to an array or string\");\n }\n return false;\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} arr\n * @param {ASTNode} needle\n * @returns {number}\n */\nconst find = (options, arr, needle) => {\n const arrVal = arr.resolveValue(options);\n const needleVal = needle.resolveValue(options);\n if (Array.isArray(arrVal) && needleVal !== undefined) {\n return arrVal.indexOf(needleVal);\n }\n if (!Array.isArray(arrVal)) {\n throw new ASTError(arr, \"Does not resolve to an array\");\n }\n return -1;\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} arr\n * @param {ASTNode} i\n * @param {ASTNode | undefined} [val]\n * @returns {BBScriptReturnTypes}\n */\nconst index = (options, arr, i, val) => {\n const arrVal = arr.resolveValue(options);\n const idx = +i.resolveValue(options);\n if (!Array.isArray(arrVal)) {\n throw new ASTError(arr, \"Does not resolve to an array\");\n }\n if (val === undefined) {\n return arrVal[idx];\n }\n const newVal = val.resolveValue(options);\n arrVal[idx] = newVal;\n return arrVal[idx];\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} arr\n * @param {ASTNode} val\n * @returns {number}\n */\nconst append = (options, arr, val) => {\n const arrVal = arr.resolveValue(options);\n const newVal = val.resolveValue(options);\n if (!Array.isArray(arrVal)) {\n throw new ASTError(arr, \"Does not resolve to an array\");\n }\n // js array is pass by reference, so options.data will be updated if applicable\n return arrVal.push(newVal);\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} arr\n * @param {ASTNode} i\n * @param {ASTNode} val\n * @returns {void}\n */\nconst insert = (options, arr, i, val) => {\n const arrVal = arr.resolveValue(options);\n if (!Array.isArray(arrVal)) {\n throw new ASTError(arr, \"Does not resolve to an array\");\n }\n const idx = +i.resolveValue(options);\n if (typeof idx !== \"number\") {\n throw new ASTError(i, \"Does not resolve to a number\");\n }\n const newVal = val.resolveValue(options);\n arrVal.splice(Math.floor(idx), 0, newVal);\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} arr\n * @returns {BBScriptReturnTypes | undefined}\n */\nconst pop = (options, arr) => {\n const arrVal = arr.resolveValue(options);\n if (!Array.isArray(arrVal)) {\n throw new ASTError(arr, \"Does not resolve to an array\");\n }\n return arrVal.pop();\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} arr\n * @param {ASTNode} i\n * @returns {BBScriptReturnTypes}\n */\nconst remove = (options, arr, i) => {\n const arrVal = arr.resolveValue(options);\n if (!Array.isArray(arrVal)) {\n throw new ASTError(arr, \"Does not resolve to an array\");\n }\n const idx = +i.resolveValue(options);\n return arrVal.splice(idx, 1)[0];\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} arr\n * @returns {BBScriptReturnTypes[]}\n */\nconst reverse = (options, arr) => {\n const arrVal = arr.resolveValue(options);\n if (!Array.isArray(arrVal)) {\n throw new ASTError(arr, \"Does not resolve to an array\");\n }\n return arrVal.reverse();\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} arr\n * @param {ASTNode | undefined} [sep]\n * @returns {string}\n */\nconst join = (options, arr, sep) => {\n const arrVal = arr.resolveValue(options);\n let sepVal = \"\";\n if (!Array.isArray(arrVal)) {\n throw new ASTError(arr, \"Does not resolve to an array\");\n }\n if (sep !== undefined) {\n sepVal = String(sep.resolveValue(options));\n }\n return arrVal.join(sepVal);\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} arr\n * @returns {BBScriptReturnTypes[]}\n */\nconst shuffle = (options, arr) => {\n const arrVal = arr.resolveValue(options);\n if (!Array.isArray(arrVal)) {\n throw new ASTError(arr, \"Does not resolve to an array\");\n }\n for (let i = arrVal.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [arrVal[i], arrVal[j]] = [arrVal[j], arrVal[i]];\n }\n return arrVal;\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} arr\n * @param {ASTNode} start\n * @param {ASTNode} end\n * @returns {string | BBScriptReturnTypes[]}\n */\nconst slice = (options, arr, start, end) => {\n const val = arr.resolveValue(options);\n if (!Array.isArray(val) && typeof val !== \"string\") {\n throw new ASTError(arr, \"Does not resolve to an array or string\");\n }\n const startVal = +start.resolveValue(options);\n const endVal = +end.resolveValue(options);\n return val.slice(startVal, endVal);\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} arr\n * @param {ASTNode} func\n * @param {ASTNode | undefined} [token]\n * @returns {void}\n */\nconst each = (options, arr, func, token) => {\n const arrVal = arr.resolveValue(options);\n if (!Array.isArray(arrVal)) {\n throw new ASTError(arr, \"Does not resolve to an array\");\n }\n const tokenVar = token !== undefined ? String(token.resolveValue(options)) : \"_\";\n // eslint-disable-next-line eqeqeq\n if (options.data[options.callerId] == undefined) {\n options.data[options.callerId] = {};\n }\n for (const e of arrVal) {\n options.data[options.callerId][tokenVar] = e;\n func.resolveValue(options);\n }\n delete options.data[options.callerId][tokenVar];\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode | undefined} [target]\n */\nconst getJQueryEl = (options, target) => {\n if (target !== undefined) {\n const search = \".\" + String(target.resolveValue(options)).trim() + \"__\" + options.callerId;\n return $(search);\n } else {\n return $(options.target);\n }\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} newClass\n * @param {ASTNode | undefined} [target]\n * @returns {void}\n */\nconst addClass = (options, newClass, target) => {\n let className = String(newClass.resolveValue(options));\n className &&= className + \"__\" + options.callerId;\n const targetEl = getJQueryEl(options, target);\n targetEl.addClass(className);\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} oldClass\n * @param {ASTNode | undefined} [target]\n * @returns {void}\n */\nconst removeClass = (options, oldClass, target) => {\n let className = String(oldClass.resolveValue(options));\n className &&= className + \"__\" + options.callerId;\n const targetEl = getJQueryEl(options, target);\n targetEl.removeClass(className);\n};\n/**\n * Scroll the target element into view\n * @param {BBScriptOptions} options\n * @param {ASTNode | undefined} target\n */\nconst scrollIntoView = (options, target) => {\n const targetEl = getJQueryEl(options, target);\n targetEl[0].scrollIntoView();\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode | undefined} [duration]\n * @param {ASTNode | undefined} [target]\n * @returns {void}\n */\nconst fadeIn = (options, duration, target) => {\n const targetEl = getJQueryEl(options, target);\n if (duration !== undefined) {\n const time = +duration.resolveValue(options);\n targetEl.fadeIn(time || 1000);\n } else {\n targetEl.fadeIn(1000);\n }\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode | undefined} [duration]\n * @param {ASTNode | undefined} [target]\n * @returns {void}\n */\nconst fadeOut = (options, duration, target) => {\n const targetEl = getJQueryEl(options, target);\n if (duration !== undefined) {\n const time = +duration.resolveValue(options);\n targetEl.fadeOut(time || 1000);\n } else {\n targetEl.fadeOut(1000);\n }\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode | undefined} [duration]\n * @param {ASTNode | undefined} [target]\n * @returns {void}\n */\nconst fadeToggle = (options, duration, target) => {\n const targetEl = getJQueryEl(options, target);\n if (duration !== undefined) {\n const time = +duration.resolveValue(options);\n targetEl.fadeToggle(time || 1000);\n } else {\n targetEl.fadeToggle(1000);\n }\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode | undefined} [target]\n * @returns {void}\n */\nconst hide = (options, target) => {\n const targetEl = getJQueryEl(options, target);\n targetEl.hide();\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode | undefined} [target]\n * @returns {void}\n */\nconst show = (options, target) => {\n const targetEl = getJQueryEl(options, target);\n targetEl.show();\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode | undefined} [target]\n * @returns {any}\n */\nconst getText = (options, target) => {\n const targetEl = getJQueryEl(options, target);\n return targetEl.text();\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} text\n * @param {ASTNode | undefined} [target]\n * @returns {void}\n */\nconst setText = (options, text, target) => {\n const targetEl = getJQueryEl(options, target);\n const textVal = text.resolveValue(options);\n targetEl.text(textVal);\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode | undefined} [duration]\n * @param {ASTNode | undefined} [target]\n * @returns {void}\n */\nconst slideDown = (options, duration, target) => {\n const targetEl = getJQueryEl(options, target);\n if (duration !== undefined) {\n const time = +duration.resolveValue(options);\n targetEl.slideDown(time || 1000);\n } else {\n targetEl.slideDown(1000);\n }\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode | undefined} [duration]\n * @param {ASTNode | undefined} [target]\n * @returns {void}\n */\nconst slideUp = (options, duration, target) => {\n const targetEl = getJQueryEl(options, target);\n if (duration !== undefined) {\n const time = +duration.resolveValue(options);\n targetEl.slideUp(time || 1000);\n } else {\n targetEl.slideUp(1000);\n }\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode | undefined} [duration]\n * @param {ASTNode | undefined} [target]\n * @returns {void}\n */\nconst slideToggle = (options, duration, target) => {\n const targetEl = getJQueryEl(options, target);\n if (duration !== undefined) {\n const time = +duration.resolveValue(options);\n targetEl.slideToggle(time || 1000);\n } else {\n targetEl.slideToggle(1000);\n }\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} classes\n * @param {ASTNode | undefined} [target]\n * @returns {void}\n */\nconst addDiv = (options, classes, target) => {\n const targetEl = getJQueryEl(options, target);\n let classList = \"\";\n const classVal = classes.resolveValue(options);\n if (Array.isArray(classVal)) {\n classList = classVal.map((c) => c + \"__\" + options.callerId).join(\" \");\n } else {\n classList = classVal + \"__\" + options.callerId;\n }\n targetEl.append(`
`);\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} classes\n * @param {ASTNode | undefined} [target]\n * @returns {void}\n */\nconst removeDiv = (options, classes, target) => {\n const targetEl = getJQueryEl(options, target);\n let classList = \"\";\n const classVal = classes.resolveValue(options);\n if (Array.isArray(classVal)) {\n classList = \".\" + classVal.map((c) => c + \"__\" + options.callerId).join(\".\");\n } else {\n classList = \".\" + classVal + \"__\" + options.callerId;\n }\n targetEl.remove(classList);\n};\n/**\n * @param {BBScriptOptions} options\n * @param {...ASTNode} [params]\n * @returns {boolean}\n */\nconst and = (options, ...params) => {\n return params.every((a) => !!a.resolveValue(options)); // allows for quick fallout if falsy\n};\n/**\n * @param {BBScriptOptions} options\n * @param {...ASTNode} [params]\n * @returns {boolean}\n */\nconst or = (options, ...params) => {\n return params.some((a) => !!a.resolveValue(options)); // allows for quick fallout if truthy\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} lhs\n * @param {ASTNode} rhs\n * @returns {boolean}\n */\nconst equal = (options, lhs, rhs) => {\n // eslint-disable-next-line eqeqeq\n return lhs.resolveValue(options) == rhs.resolveValue(options);\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} lhs\n * @param {ASTNode} rhs\n * @returns {boolean}\n */\nconst notEqual = (options, lhs, rhs) => {\n // eslint-disable-next-line eqeqeq\n return lhs.resolveValue(options) != rhs.resolveValue(options);\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} lhs\n * @param {ASTNode} rhs\n * @returns {boolean}\n */\nconst greaterThan = (options, lhs, rhs) => {\n return lhs.resolveValue(options) > rhs.resolveValue(options);\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} lhs\n * @param {ASTNode} rhs\n * @returns {boolean}\n */\nconst greaterOrEqual = (options, lhs, rhs) => {\n return lhs.resolveValue(options) >= rhs.resolveValue(options);\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} lhs\n * @param {ASTNode} rhs\n * @returns {boolean}\n */\nconst lessThan = (options, lhs, rhs) => {\n return lhs.resolveValue(options) < rhs.resolveValue(options);\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} lhs\n * @param {ASTNode} rhs\n * @returns {boolean}\n */\nconst lessOrEqual = (options, lhs, rhs) => {\n return lhs.resolveValue(options) <= rhs.resolveValue(options);\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} test\n * @param {ASTNode} caseTrue\n * @param {ASTNode | undefined} [caseFalse]\n * @returns {BBScriptReturnTypes}\n */\nconst conditional = (options, test, caseTrue, caseFalse) => {\n const result = test.resolveValue(options);\n if (result) {\n return caseTrue.resolveValue(options);\n } else if (caseFalse !== undefined) {\n return caseFalse.resolveValue(options);\n }\n};\n/**\n * @param {BBScriptOptions} options\n * @param {...ASTNode} [exec]\n * @returns {BBScriptReturnTypes}\n */\nconst group = (options, ...exec) => {\n const values = exec.map((a) => a.resolveValue(options));\n return values[values.length - 1];\n};\n/**\n * @returns {never}\n */\nconst stop = () => {\n throw new Error(\"BBScript Stop Command\"); // throw an error for easy exit and less try-catching\n};\n/**\n * @returns {number}\n */\nconst random = () => {\n return Math.random();\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} min\n * @param {ASTNode} max\n * @returns {number}\n */\nconst randomInt = (options, min, max) => {\n const minVal = +min.resolveValue(options);\n const maxVal = +max.resolveValue(options);\n return Math.floor(Math.random() * (maxVal - minVal + 1) + minVal);\n};\n/**\n * @returns {number}\n */\nconst time = () => {\n return new Date().getTime();\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} secs\n * @param {ASTNode} func\n * @returns {number}\n */\nconst timeoutFunc = (options, secs, func) => {\n const secsVal = secs.resolveValue(options);\n if (typeof secsVal !== \"number\") {\n throw new ASTError(secs, \"Does not resolve to a number\");\n }\n return setTimeout(\n () => {\n func.resolveValue(options);\n },\n Math.round(secsVal * 1000),\n );\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} id\n * @returns {void}\n */\nconst clearTimeoutFunc = (options, id) => {\n const handle = +id.resolveValue(options);\n clearTimeout(handle);\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} secs\n * @param {ASTNode} func\n * @returns {number}\n */\nconst intervalFunc = (options, secs, func) => {\n const secsVal = secs.resolveValue(options);\n if (typeof secsVal !== \"number\") {\n throw new ASTError(secs, \"Does not resolve to a number\");\n }\n return setInterval(() => func.resolveValue(options), Math.round(secsVal * 1000));\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} id\n * @returns {void}\n */\nconst clearIntervalFunc = (options, id) => {\n const handle = +id.resolveValue(options);\n clearInterval(handle);\n};\n/**\n * @param {BBScriptOptions} options\n * @param {...ASTNode} [nodes]\n * @returns {void}\n */\nconst print = (options, ...nodes) => {\n const values = nodes.map((n) => n.resolveValue(options));\n ConsoleLogger.log(...values);\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} str\n * @param {ASTNode | undefined} [sep]\n * @returns {string[]}\n */\nconst split = (options, str, sep) => {\n const strVal = String(str.resolveValue(options));\n let sepVal = \"\";\n if (sep !== undefined) {\n const res = sep.resolveValue(options);\n if (typeof res === \"string\") {\n sepVal = res;\n }\n }\n return strVal.split(sepVal);\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} str\n * @returns {string}\n */\nconst lower = (options, str) => {\n const strVal = String(str.resolveValue(options));\n return strVal.toLowerCase();\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} str\n * @returns {string}\n */\nconst upper = (options, str) => {\n const strVal = String(str.resolveValue(options));\n return strVal.toUpperCase();\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} str\n * @returns {string}\n */\nconst trim = (options, str) => {\n const strVal = String(str.resolveValue(options));\n return strVal.trim();\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} str\n * @param {ASTNode} needle\n * @param {ASTNode} replacement\n * @returns {string}\n */\nconst replace = (options, str, needle, replacement) => {\n const strVal = String(str.resolveValue(options));\n return strVal.replaceAll(needle.resolveValue(options), replacement.resolveValue(options));\n};\n/**\n * create/assign to data variable\n * @param {BBScriptOptions} options\n * @param {ASTNode} variable\n * @param {ASTNode} input\n * @returns {void}\n */\nconst assign = (options, variable, input) => {\n const value = input.resolveValue(options);\n let varName;\n if (variable instanceof ASTIdentifier) {\n varName = variable.name;\n // eslint-disable-next-line eqeqeq\n if (options.data[options.callerId] == undefined) {\n options.data[options.callerId] = {};\n }\n options.data[options.callerId][varName] = value;\n return;\n }\n throw new ASTError(variable, \"Cannot assign to non identifier\");\n};\n/**\n * JS loosy add for strings or nums\n * @param {BBScriptOptions} options\n * @param {...ASTNode} [params]\n * @returns {string | number}\n */\nconst add = (options, ...params) => {\n const addElems = params.map((p) => p.resolveValue(options));\n return addElems.reduce((a, b) => a + b);\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode[]} param\n * @returns {number[]}\n */\nconst resolveToNums = (options, param) => {\n return param.map((p) => {\n const v = p.resolveValue(options);\n if (typeof v !== \"number\") {\n throw new ASTError(p, \"Does not resolve to a number\");\n }\n return v;\n });\n};\n/**\n * @param {BBScriptOptions} options\n * @param {...ASTNode} [params]\n * @returns {number}\n */\nconst subtract = (options, ...params) => {\n const subElems = resolveToNums(options, params);\n return subElems.reduce((a, b) => a - b);\n};\n/**\n * @param {BBScriptOptions} options\n * @param {...ASTNode} [params]\n * @returns {number}\n */\nconst multiply = (options, ...params) => {\n const elems = resolveToNums(options, params);\n return elems.reduce((a, b) => a * b);\n};\n/**\n * @param {BBScriptOptions} options\n * @param {...ASTNode} [params]\n * @returns {number}\n */\nconst divide = (options, ...params) => {\n const elems = resolveToNums(options, params);\n return elems.reduce((a, b) => a / b);\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} value\n * @param {ASTNode} base\n * @returns {number}\n */\nconst mod = (options, value, base) => {\n const [valueNum, baseNum] = resolveToNums(options, [value, base]);\n return valueNum % baseNum;\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} base\n * @param {ASTNode} expo\n * @returns {number}\n */\nconst exp = (options, base, expo) => {\n const [expoNum, baseNum] = resolveToNums(options, [expo, base]);\n return baseNum ** expoNum;\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} variable\n * @returns {void}\n */\nconst decrement = (options, variable) => {\n if (variable instanceof ASTIdentifier) {\n const varName = variable.name;\n if (\n // eslint-disable-next-line eqeqeq\n options.data[options.callerId] == undefined ||\n // eslint-disable-next-line eqeqeq\n options.data[options.callerId][varName] == undefined\n ) {\n throw new ASTError(variable, \"Identifier not set yet\");\n }\n if (typeof options.data[options.callerId][varName] !== \"number\") {\n throw new ASTError(variable, \"Not a number\");\n }\n options.data[options.callerId][varName] -= 1;\n return;\n }\n throw new ASTError(variable, \"Not an identifier variable\");\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} variable\n * @returns {void}\n */\nconst increment = (options, variable) => {\n if (variable instanceof ASTIdentifier) {\n const varName = variable.name;\n if (\n // eslint-disable-next-line eqeqeq\n options.data[options.callerId] == undefined ||\n // eslint-disable-next-line eqeqeq\n options.data[options.callerId][varName] == undefined\n ) {\n throw new ASTError(variable, \"Identifier not set yet\");\n }\n if (typeof options.data[options.callerId][varName] !== \"number\") {\n throw new ASTError(variable, \"Not a number\");\n }\n options.data[options.callerId][varName] += 1;\n return;\n }\n throw new ASTError(variable, \"Not an identifier variable\");\n};\nexport const bbscriptFunctions = {\n count,\n contain,\n find,\n index,\n append,\n insert,\n pop,\n remove,\n reverse,\n join,\n shuffle,\n slice,\n each,\n addClass,\n removeClass,\n scrollIntoView,\n fadeIn,\n fadeOut,\n fadeToggle,\n hide,\n show,\n getText,\n setText,\n slideDown,\n slideUp,\n slideToggle,\n addDiv,\n removeDiv,\n and,\n or,\n \"==\": equal,\n \"!=\": notEqual,\n \">\": greaterThan,\n \">=\": greaterOrEqual,\n \"<\": lessThan,\n \"<=\": lessOrEqual,\n if: conditional,\n group,\n stop,\n random,\n randomInt,\n time,\n setTimeout: timeoutFunc,\n clearTimeout: clearTimeoutFunc,\n setInterval: intervalFunc,\n clearInterval: clearIntervalFunc,\n print,\n split,\n lower,\n upper,\n trim,\n replace,\n \"=\": assign,\n \"+\": add,\n \"-\": subtract,\n \"*\": multiply,\n \"/\": divide,\n \"%\": mod,\n \"**\": exp,\n \"--\": decrement,\n \"++\": increment,\n};\n","/** @typedef {import('./bbscript1/processor').bbscriptOptions} bbscriptOptions */\n/** @typedef {import('./bbscript1/utils').astNode} astNode */\n/** @typedef {import('./bbscript2/AST').ASTNode} ASTNode */\n/** @typedef {import('./bbscript2/processor').BBScriptOptions} BBScriptOptions */\nimport { initBBScript1 } from \"./bbscript1/bbscript1\";\nimport { initBBScript2 } from \"./bbscript2/bbscript2\";\nconst bbscriptData = {};\nconst bbscriptProcessorV1 = initBBScript1(bbscriptData);\nconst { processor: bbscriptProcessorV2, parser: bbscript2Parser } = initBBScript2(bbscriptData);\n// eslint-disable-next-line no-console\nconsole.info(\"BBCodePlus Addon JS Loaded\");\n\n/**\n * @module bbscriptParser\n */\nexport { bbscriptData, bbscriptProcessorV1, bbscriptProcessorV2, bbscript2Parser };\n","/** @typedef {import('./processor.js').bbscriptOptions} bbscript1Options */\nimport { BBScriptProcessor as BBScript1Processor } from \"./processor.js\";\nimport { bbscriptFunctions } from \"./functions.js\";\n/**\n * @param {any} bbscriptData\n * @returns {BBScript1Processor}\n */\nexport function initBBScript1(bbscriptData) {\n return new BBScript1Processor(bbscriptFunctions, { data: bbscriptData });\n}\n","/** @typedef {import('./processor').BBScriptOptions} BBScriptOptions */\nimport { BBScriptParser } from \"./parser\";\nimport { BBScriptProcessor as BBScript2Processor } from \"./processor\";\nimport { bbscriptFunctions } from \"./functions\";\n/**\n * @param {any} bbscriptData\n * @returns {{ processor: BBScript2Processor; parser: BBScriptParser; }}\n */\nexport function initBBScript2(bbscriptData) {\n return {\n processor: new BBScript2Processor(bbscriptFunctions, { data: bbscriptData }),\n parser: new BBScriptParser(),\n };\n}\n"],"names":["bbscriptParamTypes","Object","freeze","Function","Symbol","String","Identifier","Int","isAstNode","input","getOwnPropertyNames","every","v","includes","getStringVal","str","options","match","callerId","data","undefined","matches","matchAll","presumedValue","replace","ConsoleLogger","static","console","log","warn","error","info","debug","BBScriptProcessor$1","functions","constructor","bbscriptFunc","defaultOptions","processor","this","execAll","nodeTree","callerClass","node","res","exec","msg","callable","name","func","args","params","parse","raw","line","split","trim","startsWith","push","process","e","idx","part1","parts","toLowerCase","join","Error","foundFunc","types","validParamType","default","defaultValue","value","length","isString","getEnclosedParameter","childFunc","overallIdx","braceVar","substring","isNaN","parseFloat","close","trimWrap","startIdx","remainder","slice","closeIndex","indexOf","conditional","lhs","rhs","elseBlock","getJQueryEl","el","$","target","addClass","newClass","removeClass","oldClass","fadeIn","time","fadeOut","fadeToggle","hide","show","getText","text","setText","slideDown","slideUp","slideToggle","evaluate","leftResult","rightResult","eq","ge","geq","le","leq","random","min","max","Math","floor","print","set","id","add","a","b","bbscriptFunctions","if","stop","dec","amount","inc","addclass","removeclass","fadein","fadeout","fadetoggle","gettext","settext","slidedown","slideup","slidetoggle","ASTNode","_startIdx","_endIdx","endIdx","findInText","column","i","ASTIdentifier","_name","super","resolveValue","ASTFunction","_identifier","_params","identifier","ASTQuotedString","_string","string","ASTList","_items","elements","items","map","ASTNumberLiteral","_value","ASTError","message","format","details","BBScriptParser","ast","errors","pos","fatalError","buildAst","formattedErrors","consumeWhitespace","head","processFunctionCall","throwOnError","isWhitespaceChar","char","test","processIdentifier","processString","processList","processNumber","escaped","end","numberLiteral","invalidChars","nameStartIdx","nameEndIdx","BBScriptProcessor","search","resolveToNums","param","p","count","arr","arrVal","Array","isArray","contain","needle","needleVal","find","index","val","newVal","append","insert","splice","pop","remove","reverse","sep","sepVal","shuffle","j","start","startVal","endVal","each","token","tokenVar","className","scrollIntoView","duration","targetEl","textVal","addDiv","classes","classList","classVal","c","removeDiv","and","or","some","caseTrue","caseFalse","group","values","randomInt","minVal","maxVal","Date","getTime","setTimeout","secs","secsVal","round","clearTimeout","handle","setInterval","clearInterval","nodes","n","strVal","lower","upper","toUpperCase","replacement","replaceAll","variable","varName","reduce","base","valueNum","baseNum","expo","expoNum","bbscriptData","bbscriptProcessorV1","BBScript1Processor","initBBScript1","bbscriptProcessorV2","parser","bbscript2Parser","BBScript2Processor","initBBScript2"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"bbscript-parser.min.js","sources":["../../bbcode-src/bbscript/bbscript1/utils.js","../../bbcode-src/bbscript/logger.js","../../bbcode-src/bbscript/bbscript1/processor.js","../../bbcode-src/bbscript/bbscript1/functions.js","../../bbcode-src/bbscript/bbscript2/AST.js","../../bbcode-src/bbscript/bbscript2/ASTError.js","../../bbcode-src/bbscript/bbscript2/parser.js","../../bbcode-src/bbscript/bbscript2/processor.js","../../bbcode-src/bbscript/bbscript2/functions.js","../../bbcode-src/bbscript/index.js","../../bbcode-src/bbscript/bbscript1/bbscript1.js","../../bbcode-src/bbscript/bbscript2/bbscript2.js"],"sourcesContent":["/** @typedef {import('./processor').bbscriptOptions} bbscriptOptions */\n\n/**\n * @typedef {Object.} bbscriptFuncMap\n */\n/**\n * @typedef {Object} bbscriptFunc\n * @property {{types: bbscriptParamTypes[], default?: (number|string|null)}} params\n * @property {bbscriptFunctionCallback} func\n */\n/**\n * @callback bbscriptFunctionCallback\n * @param {bbscriptOptions} options\n * @param {...any} args\n * @returns {(void | string | boolean | number | Promise | bbscriptStop)}\n */\n/**\n * @typedef {Object} bbscriptStop\n * @property {'stop'} msg\n */\n\nexport const bbscriptParamTypes = Object.freeze({\n Function: Symbol(\"Function\"),\n String: Symbol(\"String\"),\n Identifier: Symbol(\"Identifier\"),\n Int: Symbol(\"Int\"),\n});\n\n/**\n * @param {unknown} input\n * @returns {asserts input is bbscriptStop}\n */\nexport const isStop = (input) => {\n return (\n typeof input === \"object\" &&\n Object.getOwnPropertyNames(input).includes(\"msg\") &&\n input.msg === \"stop\"\n );\n};\n\n/**\n * @typedef {Object} astNode\n * @property {string} name\n * @property {(astNode|string|number)[]} params\n */\n\n/**\n * @param {unknown} input\n * @returns {asserts input is astNode}\n */\nexport const isAstNode = (input) => {\n return (\n typeof input === \"object\" &&\n Object.getOwnPropertyNames(input).every((v) => [\"name\", \"params\"].includes(v))\n );\n};\n/**\n * Process input string to produce either a string or the associated data if it is a variable\n * @param {string | number} str input string. Either a string or an identifier\n * @param {bbscriptOptions} options\n * @returns {string} string value\n */\nexport const getStringVal = (str, options) => {\n if (typeof str === \"string\" && str.match(/^_(.*)_$/)) {\n if (\n options.callerId &&\n options.data[options.callerId] &&\n options.data[options.callerId][str] !== undefined\n ) {\n // is identifier\n return options.data[options.callerId][str];\n } else {\n return str.match(/^_(.*)_$/)?.[1] || str;\n }\n }\n if (typeof str === \"string\" && str.match(/\\$\\{\\w+\\}/)) {\n const matches = str.matchAll(/\\$\\{(\\w+)\\}/g);\n for (const match of matches) {\n const presumedValue = options.data?.[options.callerId]?.[\"_\" + match[1] + \"_\"] || match[0];\n str = str.replace(match[0], presumedValue);\n }\n }\n return str;\n};\n","/* eslint-disable no-console */\nexport class ConsoleLogger {\n static log = console.log;\n static warn = console.warn;\n static error = console.error;\n static info = console.info;\n static debug = console.debug;\n}\n","/** @typedef {import('./utils').astNode} astNode */\n/** @typedef {import('./utils').bbscriptFuncMap} bbscriptFuncMap */\nimport { bbscriptParamTypes, isStop } from \"./utils\";\nimport { ConsoleLogger } from \"../logger\";\n\n/**\n * @typedef {Object} bbscriptOptions\n * @property {string} callerId\n * @property {string} callerClass\n * @property {any} data\n * @property {BBScriptProcessor} processor\n * @property {Element} target\n */\n\nexport class BBScriptProcessor {\n /** @type {bbscriptOptions} */\n options;\n /** @type {bbscriptFuncMap} */\n functions;\n /**\n * @param {bbscriptFuncMap} bbscriptFunc\n * @param {bbscriptOptions} [defaultOptions={} as bbscriptOptions]\n */\n constructor(bbscriptFunc, defaultOptions = {}) {\n defaultOptions = {\n ...defaultOptions,\n processor: this,\n };\n this.options = defaultOptions;\n this.functions = bbscriptFunc;\n }\n /**\n * Processes and executes all commands in node tree\n * @param {astNode[]} nodeTree input node tree, generated by `parse()`\n * @param {string} callerId\n * @param {string} callerClass\n * @param {bbscriptOptions} [options=this.options] options to use\n * @returns {Promise}\n */\n async execAll(nodeTree, callerId, callerClass, options = this.options) {\n options = {\n ...this.options,\n ...options,\n callerId,\n callerClass,\n };\n for (const node of nodeTree) {\n const res = await this.exec(node, options);\n if (isStop(res)) {\n return;\n }\n }\n }\n /**\n * Processes and executes a single node\n * @param {astNode} node node to process and execute\n * @param {bbscriptOptions} options bbscript options\n * @returns {(void|string|boolean|number|Promise|import('./utils').bbscriptStop)} returns value if applicable\n */\n exec(node, options) {\n const functions = options.processor.functions;\n const callable = functions[node.name].func;\n if (callable) {\n const args = node.params;\n try {\n return callable(options, ...args);\n } catch (error) {\n ConsoleLogger.warn(\"BBScript Error\", error, node.name, options);\n }\n } else {\n ConsoleLogger.info(\"invalid command\", node.name, options);\n }\n }\n /**\n * Process raw string into AST\n * @param {string} raw input script\n * @returns {astNode[]}\n */\n parse(raw) {\n const nodeTree = [];\n for (let line of raw.split(\"\\n\")) {\n line = line.trim();\n if (!line || line.startsWith(\"//\")) {\n continue;\n }\n try {\n nodeTree.push(this.process(this.functions, line)[0]);\n } catch (e) {\n ConsoleLogger.warn(e);\n }\n }\n return nodeTree;\n }\n /**\n * Processes input line into AST node\n * @private\n * @param {bbscriptFuncMap} functions valid bbscript functions\n * @param {string} input input string to process\n * @param {number} [idx=0] optional index of string to start from\n * @returns {[astNode, number]} parsed AST Node and last index\n */\n process(functions, input, idx = 0) {\n const [part1, ...parts] = input.split(/\\s+/);\n const name = part1.toLowerCase();\n const params = parts.join(\" \");\n const node = {\n name,\n params: [],\n };\n if (!(name in functions)) {\n throw new Error(`Invalid bbscript function name '${name}'`);\n }\n const foundFunc = functions[name];\n // required params\n for (const { types: validParamType, default: defaultValue } of foundFunc.params) {\n let value;\n if (idx >= params.length) {\n if (defaultValue) {\n value = defaultValue;\n } else if (defaultValue == null) {\n // optional param with function defined default\n continue;\n } else {\n ConsoleLogger.warn(`Missing Parameter for ${name}`, validParamType);\n continue;\n }\n }\n let isString = false;\n if (params[idx] === '\"') {\n // process quoted string\n [value, idx] = this.getEnclosedParameter(params, idx);\n isString = true;\n } else if (params[idx] === \"'\") {\n // process quoted string\n [value, idx] = this.getEnclosedParameter(params, idx, \"'\");\n isString = true;\n } else if (validParamType.includes(bbscriptParamTypes.Function) && params[idx] === \"(\") {\n // process nested function\n try {\n const [childFunc, overallIdx] = this.getEnclosedParameter(params, idx, \")\");\n [value] = this.process(functions, childFunc);\n idx = overallIdx;\n } catch (e) {\n ConsoleLogger.warn(e);\n }\n } else if (validParamType.includes(bbscriptParamTypes.Identifier) && params[idx] === \"$\") {\n let braceVar = false;\n try {\n braceVar = params[idx + 1] === \"{\";\n } catch {\n ConsoleLogger.warn(`$ found but no opening {`);\n }\n if (braceVar) {\n [value, idx] = this.getEnclosedParameter(params, ++idx, \"}\");\n }\n } else if (params[idx]) {\n // no clue what token is\n value = params.substring(idx).split(/\\s+/, 2)[0];\n idx += value.length;\n }\n if (\n validParamType.includes(bbscriptParamTypes.Int) &&\n typeof value === \"string\" &&\n !isNaN(parseFloat(value))\n ) {\n // if numeric, convert it\n value = parseFloat(value);\n } else if (validParamType.includes(bbscriptParamTypes.String) && isString) {\n value;\n } else if (validParamType.includes(bbscriptParamTypes.Identifier)) {\n value = `_${value}_`;\n }\n if (value !== undefined && value !== null) {\n node.params.push(value);\n }\n while (params[idx]?.match(/\\s/)) {\n // skip index to next non-space char\n idx++;\n }\n }\n return [node, idx];\n }\n /**\n * Processed an input string for a single block of string\n * @private\n * @param {string} input input string\n * @param {number} idx index to start from\n * @param {string} [close='\"'] closing char to stop at\n * @param {boolean} [trimWrap=true] if `true`, will remove opening and closing chars\n * @returns {[string, number]} found parameter and closing index\n */\n getEnclosedParameter(input, idx, close = '\"', trimWrap = true) {\n const startIdx = idx;\n const remainder = input.slice(startIdx);\n const length = input.length;\n idx++;\n while (idx < length) {\n const closeIndex = input.indexOf(close, idx);\n if (!closeIndex) {\n idx = length;\n break;\n }\n // escaped close \"\n if (input[closeIndex - 1] === \"\\\\\") {\n idx = closeIndex + 1;\n continue;\n }\n idx = closeIndex;\n break;\n }\n if (idx >= length && input[idx] !== close) {\n throw new Error('missing closing \"');\n }\n const value = remainder.substring(trimWrap ? 1 : 0, idx - startIdx + (trimWrap ? 0 : 1));\n idx++;\n return [value, idx];\n }\n}\n","/** @typedef {import('./utils').astNode} astNode */\n/** @typedef {import('./utils').bbscriptFunc} bbscriptFunc */\n/** @typedef {import('./utils').bbscriptFuncMap} bbscriptFuncMap */\n/** @typedef {import('./processor').bbscriptOptions} bbscriptOptions */\nimport $ from \"jquery\";\nimport { bbscriptParamTypes, getStringVal, isAstNode } from \"./utils\";\nimport { ConsoleLogger } from \"../logger\";\n\n/**\n * Conditional if then else\n * @type {bbscriptFunc}\n */\nexport const conditional = {\n params: [\n { types: [bbscriptParamTypes.Function] },\n { types: [bbscriptParamTypes.Function] },\n { types: [bbscriptParamTypes.Function], default: null },\n ],\n func: (options, lhs, rhs, elseBlock) => {\n const result = options.processor.exec(lhs, options);\n if (result) {\n return options.processor.exec(rhs, options);\n } else if (elseBlock) {\n return options.processor.exec(elseBlock, options);\n }\n },\n};\n/**\n * force stop\n * @type {bbscriptFunc}\n */\nexport const stop = {\n params: [],\n func: () => {\n return { msg: \"stop\" };\n },\n};\n/**\n * Get the Elements wrapped in JQuery for quick JQuery functionality\n * @param {any} el target input string selector\n * @param {bbscriptOptions} options\n * @returns {any}\n */\nconst getJQueryEl = (el, options) => {\n if (el) {\n el = \".\" + getStringVal(el, options).trim() + \"__\" + options.callerId;\n } else {\n el = $(options.target);\n }\n return $(el);\n};\nexport const addClass = {\n params: [\n { types: [bbscriptParamTypes.Identifier] },\n { types: [bbscriptParamTypes.Identifier], default: null },\n ],\n func: (options, newClass, target = \"\") => {\n newClass = getStringVal(newClass, options) || \"\";\n newClass &&= newClass + \"__\" + options.callerId;\n getJQueryEl(target, options).addClass(newClass);\n },\n};\nexport const removeClass = {\n params: [\n { types: [bbscriptParamTypes.Identifier] },\n { types: [bbscriptParamTypes.Identifier], default: null },\n ],\n func: (options, oldClass, target = \"\") => {\n oldClass = getStringVal(oldClass, options) || \"\";\n oldClass &&= oldClass + \"__\" + options.callerId;\n getJQueryEl(target, options).removeClass(oldClass);\n },\n};\nexport const fadeIn = {\n params: [\n { types: [bbscriptParamTypes.Int], default: 1000 },\n { types: [bbscriptParamTypes.Identifier], default: null },\n ],\n func: (options, time = 1000, target) => {\n getJQueryEl(target, options).fadeIn(time);\n },\n};\nexport const fadeOut = {\n params: [\n { types: [bbscriptParamTypes.Int], default: 1000 },\n { types: [bbscriptParamTypes.Identifier], default: null },\n ],\n func: (options, time = 1000, target) => {\n getJQueryEl(target, options).fadeOut(time);\n },\n};\nexport const fadeToggle = {\n params: [\n { types: [bbscriptParamTypes.Int], default: 1000 },\n { types: [bbscriptParamTypes.Identifier], default: null },\n ],\n func: (options, time = 1000, target) => {\n getJQueryEl(target, options).fadeToggle(time);\n },\n};\nexport const hide = {\n params: [{ types: [bbscriptParamTypes.Identifier], default: null }],\n func: (options, target) => {\n getJQueryEl(target, options).hide();\n },\n};\nexport const show = {\n params: [{ types: [bbscriptParamTypes.Identifier], default: null }],\n func: (options, target) => {\n getJQueryEl(target, options).show();\n },\n};\nexport const getText = {\n params: [{ types: [bbscriptParamTypes.Identifier], default: null }],\n func: (options, target) => {\n return getJQueryEl(target, options).text();\n },\n};\nexport const setText = {\n params: [\n {\n types: [\n bbscriptParamTypes.String,\n bbscriptParamTypes.Function,\n bbscriptParamTypes.Identifier,\n ],\n },\n { types: [bbscriptParamTypes.Identifier], default: null },\n ],\n func: (options, input, target) => {\n if (isAstNode(input)) {\n input = options.processor.exec(input, options);\n } else {\n input = getStringVal(input, options);\n }\n getJQueryEl(target, options).text(input);\n },\n};\nexport const slideDown = {\n params: [\n { types: [bbscriptParamTypes.Int], default: 1000 },\n { types: [bbscriptParamTypes.Identifier], default: null },\n ],\n func: (options, time = 1000, target) => {\n getJQueryEl(target, options).slideDown(time);\n },\n};\nexport const slideUp = {\n params: [\n { types: [bbscriptParamTypes.Int], default: 1000 },\n { types: [bbscriptParamTypes.Identifier], default: null },\n ],\n func: (options, time = 1000, target) => {\n getJQueryEl(target, options).slideUp(time);\n },\n};\nexport const slideToggle = {\n params: [\n { types: [bbscriptParamTypes.Int], default: 1000 },\n { types: [bbscriptParamTypes.Identifier], default: null },\n ],\n func: (options, time = 1000, target) => {\n getJQueryEl(target, options).slideToggle(time);\n },\n};\nconst params = [\n {\n types: [\n bbscriptParamTypes.String,\n bbscriptParamTypes.Function,\n bbscriptParamTypes.Int,\n bbscriptParamTypes.Identifier,\n ],\n },\n {\n types: [\n bbscriptParamTypes.String,\n bbscriptParamTypes.Function,\n bbscriptParamTypes.Int,\n bbscriptParamTypes.Identifier,\n ],\n },\n];\n/**\n * Common evaluate method to process left and right arguments first if they are nested\n * @param {bbscriptOptions} options\n * @param {unknown} lhs\n * @param {unknown} rhs\n * @returns {any[]}\n */\nconst evaluate = (options, lhs, rhs) => {\n let leftResult;\n let rightResult;\n if (isAstNode(lhs)) {\n leftResult = options.processor.exec(lhs, options);\n } else {\n leftResult = getStringVal(lhs, options);\n }\n if (isAstNode(rhs)) {\n rightResult = options.processor.exec(rhs, options);\n } else {\n rightResult = getStringVal(rhs, options);\n }\n return [leftResult, rightResult];\n};\n/**\n * is equal to\n * @type {bbscriptFunc}\n */\nexport const eq = {\n params,\n func: (options, lhs, rhs) => {\n const [leftResult, rightResult] = evaluate(options, lhs, rhs);\n // eslint-disable-next-line eqeqeq\n return leftResult == rightResult;\n },\n};\n/**\n * is greater than\n * @type {bbscriptFunc}\n */\nexport const ge = {\n params,\n func: (options, lhs, rhs) => {\n const [leftResult, rightResult] = evaluate(options, lhs, rhs);\n return leftResult > rightResult;\n },\n};\n/**\n * is greater than or equal to\n * @type {bbscriptFunc}\n */\nexport const geq = {\n params,\n func: (options, lhs, rhs) => {\n const [leftResult, rightResult] = evaluate(options, lhs, rhs);\n return leftResult >= rightResult;\n },\n};\n/**\n * is less than\n * @type {bbscriptFunc}\n */\nexport const le = {\n params,\n func: (options, lhs, rhs) => {\n const [leftResult, rightResult] = evaluate(options, lhs, rhs);\n return leftResult < rightResult;\n },\n};\n/**\n * is less than or equal to\n * @type {bbscriptFunc}\n */\nexport const leq = {\n params,\n func: (options, lhs, rhs) => {\n const [leftResult, rightResult] = evaluate(options, lhs, rhs);\n return leftResult >= rightResult;\n },\n};\nexport const random = {\n params: [{ types: [bbscriptParamTypes.Int] }, { types: [bbscriptParamTypes.Int] }],\n func: (options, min, max) => {\n return Math.floor(Math.random() * (max - min + 1) + min);\n },\n};\nexport const print = {\n params: [{ types: [bbscriptParamTypes.String, bbscriptParamTypes.Identifier] }],\n func: (options, args) => {\n ConsoleLogger.log(getStringVal(args, options));\n },\n};\n/**\n * Set variable\n * @type {bbscriptFunc}\n */\nexport const set = {\n params: [\n { types: [bbscriptParamTypes.Identifier] },\n { types: [bbscriptParamTypes.Int, bbscriptParamTypes.String, bbscriptParamTypes.Function] },\n ],\n func: (options, id, value) => {\n if (isAstNode(value)) {\n value = options.processor.exec(value, options);\n } else {\n value = getStringVal(value, options);\n }\n const callerId = options.callerId || \"\";\n if (!(callerId in options.data)) {\n options.data[callerId] = {};\n }\n options.data[callerId][id] = value;\n },\n};\nexport const add = {\n params: [\n {\n types: [\n bbscriptParamTypes.Int,\n bbscriptParamTypes.String,\n bbscriptParamTypes.Identifier,\n bbscriptParamTypes.Function,\n ],\n },\n {\n types: [\n bbscriptParamTypes.Int,\n bbscriptParamTypes.String,\n bbscriptParamTypes.Identifier,\n bbscriptParamTypes.Function,\n ],\n },\n ],\n func: (options, a, b) => {\n if (isAstNode(a)) {\n a = options.processor.exec(a, options);\n } else {\n a = getStringVal(a, options);\n }\n if (isAstNode(b)) {\n b = options.processor.exec(b, options);\n } else {\n b = getStringVal(b, options);\n }\n return a + b;\n },\n};\nexport const dec = {\n params: [\n { types: [bbscriptParamTypes.Identifier] },\n { types: [bbscriptParamTypes.Int], default: 1 },\n ],\n func: (options, id, amount = 1) => {\n try {\n const callerId = options.callerId || \"\";\n if (!(callerId in options.data)) {\n options.data[callerId] = {};\n }\n options.data[callerId][id] -= amount;\n } catch (e) {\n ConsoleLogger.warn(`${id} is not a number`, e);\n }\n },\n};\n\nexport const inc = {\n params: [\n { types: [bbscriptParamTypes.Identifier] },\n { types: [bbscriptParamTypes.Int], default: 1 },\n ],\n func: (options, id, amount = 1) => {\n try {\n const callerId = options.callerId || \"\";\n if (!(callerId in options.data)) {\n options.data[callerId] = {};\n }\n options.data[callerId][id] += amount;\n } catch (e) {\n ConsoleLogger.warn(`${id} is not a number`, e);\n }\n },\n};\n\n/**\n * Map between bbscript function name and logic.\n * keys must be all lowercase. Parser will apply lowercase to user input,\n * so is case-insensitive.\n * @type {bbscriptFuncMap}\n */\nexport const bbscriptFunctions = {\n print,\n eq,\n ge,\n geq,\n le,\n leq,\n if: conditional,\n stop,\n set,\n dec,\n inc,\n addclass: addClass,\n removeclass: removeClass,\n fadein: fadeIn,\n fadeout: fadeOut,\n fadetoggle: fadeToggle,\n hide,\n show,\n gettext: getText,\n settext: setText,\n slidedown: slideDown,\n slideup: slideUp,\n slidetoggle: slideToggle,\n random,\n add,\n};\n","/** @typedef {import('./processor').BBScriptOptions} BBScriptOptions */\n/** @typedef {import('./utils').BBScriptReturnTypes} BBScriptReturnTypes */\nimport { ConsoleLogger } from \"../logger\";\n\nexport class ASTNode {\n /** @type {number} */\n _startIdx;\n /** @type {number} */\n _endIdx;\n\n /**\n * @param {number} startIdx\n * @param {number} endIdx\n */\n constructor(startIdx, endIdx) {\n this._startIdx = startIdx;\n this._endIdx = endIdx;\n }\n /**\n * @public\n * @returns {number}\n */\n get startIdx() {\n return this._startIdx;\n }\n /**\n * @public\n * @returns {number}\n */\n get endIdx() {\n return this._endIdx;\n }\n /**\n * returns information about the text of the node in the original script\n * @public\n * @param {string} text input string\n * @returns {{ line: number; column: number; text: string; }}\n */\n findInText(text) {\n let line = 1;\n let column = 1;\n for (let i = 0; i < text.length; i++) {\n if (i === this.startIdx) {\n break;\n }\n if (text[i] === \"\\n\") {\n line++;\n column = 0;\n }\n column++;\n }\n return {\n line,\n column,\n text: text.substring(this.startIdx, this.endIdx),\n };\n }\n}\n\n/** @extends ASTNode */\nexport class ASTIdentifier extends ASTNode {\n /** @type {string} */\n _name;\n\n /**\n * @param {number} startIdx\n * @param {number} endIdx\n * @param {string} name\n */\n constructor(startIdx, endIdx, name) {\n super(startIdx, endIdx);\n this._name = name;\n }\n /**\n * @public\n * @returns {string}\n */\n get name() {\n return this._name;\n }\n /**\n * @public\n * @param {BBScriptOptions} options\n * @returns {any}\n */\n resolveValue(options) {\n if (\n options.callerId &&\n options.data[options.callerId] &&\n options.data[options.callerId][this.name] !== undefined\n ) {\n return options.data[options.callerId][this.name];\n } else {\n return this.name;\n }\n }\n}\n\n/** @extends ASTNode */\nexport class ASTFunction extends ASTNode {\n /** @type {ASTIdentifier} */\n _identifier;\n /** @type {ASTNode[]} */\n _params;\n\n /**\n * @param {number} startIdx\n * @param {number} endIdx\n * @param {ASTIdentifier} name\n * @param {ASTNode[]} params\n */\n constructor(startIdx, endIdx, name, params) {\n super(startIdx, endIdx);\n this._identifier = name;\n this._params = params;\n }\n /**\n * @public\n * @returns {ASTIdentifier}\n */\n get identifier() {\n return this._identifier;\n }\n /**\n * @public\n * @returns {ASTNode[]}\n */\n get params() {\n return this._params;\n }\n /**\n * Processes and executes a single node\n * @public\n * @param {BBScriptOptions} options bbscript options\n * @returns {BBScriptReturnTypes} returns value if applicable\n */\n resolveValue(options) {\n const functions = options.processor.functions;\n const callable = functions[this.identifier.name];\n if (callable) {\n const args = this.params;\n try {\n return callable(options, ...args);\n } catch (error) {\n ConsoleLogger.warn(\"BBScript Error\", error, this, options);\n }\n }\n ConsoleLogger.info(\"invalid command\", this, options);\n }\n}\n\n/** @extends ASTNode */\nexport class ASTQuotedString extends ASTNode {\n /** @type {string} */\n _string;\n\n /**\n * @param {number} startIdx\n * @param {number} endIdx\n * @param {string} input\n */\n constructor(startIdx, endIdx, input) {\n super(startIdx, endIdx);\n this._string = input;\n }\n /**\n * @public\n * @returns {string}\n */\n get string() {\n return this._string;\n }\n /**\n * @public\n * @returns {string}\n */\n resolveValue(options) {\n if (this.string.match(/\\$\\{\\w+\\}/)) {\n // string interpolation. carryover from bbscript1\n let str = this.string;\n const matches = str.matchAll(/\\$\\{(\\w+)\\}/g);\n for (const match of matches) {\n const presumedValue = options.data?.[options.callerId]?.[\"_\" + match[1] + \"_\"] || match[0];\n str = str.replace(match[0], presumedValue);\n }\n return str;\n }\n return this.string;\n }\n}\n\n/** @extends ASTNode */\nexport class ASTList extends ASTNode {\n /** @type {ASTNode[]} */\n _items;\n /**\n * @param {number} startIdx\n * @param {number} endIdx\n * @param {ASTNode[]} elements\n */\n constructor(startIdx, endIdx, elements) {\n super(startIdx, endIdx);\n this._items = elements;\n }\n /**\n * @public\n * @returns {ASTNode[]}\n */\n get items() {\n return this._items;\n }\n /**\n * @public\n * @param {BBScriptOptions} options\n * @returns {(string | number | boolean)[]}\n */\n resolveValue(options) {\n return this.items.map((i) => i.resolveValue(options));\n }\n}\n\n/** @extends ASTNode */\nexport class ASTNumberLiteral extends ASTNode {\n /** @type {string} */\n _value;\n\n /**\n * @param {number} startIdx\n * @param {number} endIdx\n * @param {string} value\n */\n constructor(startIdx, endIdx, value) {\n super(startIdx, endIdx);\n this._value = value;\n }\n /**\n * @public\n * @returns {string}\n */\n get value() {\n return this._value;\n }\n /**\n * @public\n * @returns {number}\n */\n resolveValue() {\n return +this.value;\n }\n}\n","/** @typedef {import('./AST').ASTNode} ASTNode */\n/** @extends Error */\nexport class ASTError extends Error {\n /** @type {ASTNode | null} */\n node;\n\n /**\n * @param {ASTNode | null} node\n * @param {string} message\n */\n constructor(node, message) {\n super(message);\n this.name = \"ASTError\";\n this.node = node;\n }\n /**\n * @public\n * @param {string} text\n * @returns {string}\n */\n format(text) {\n if (this.node !== null) {\n const details = this.node.findInText(text);\n this.message += `: ${details.text} (line ${details.line}, column ${details.column})`;\n }\n return this.message;\n }\n}\n","/** @typedef {import('./AST').ASTNode} ASTNode */\nimport { ASTFunction, ASTIdentifier, ASTList, ASTNumberLiteral, ASTQuotedString } from \"./AST\";\nimport { ASTError } from \"./ASTError\";\n\nexport class BBScriptParser {\n /** @type {ASTNode[]} */\n ast = [];\n /** @type {string} */\n text = \"\";\n /** @type {number} */\n length = 0; // separate value for better dev\n /** @type {ASTError[]} */\n errors = [];\n /** @type {number} */\n pos = 0;\n\n /**\n * Parse input string into AST tree for later processing\n * @param {string} input string to parse\n * @returns {{ ast: ASTNode[]; formattedErrors: string[]; }} AST Tree to be processed in BBScript 2 syntax\n */\n parse(input) {\n this.text = input;\n this.length = this.text.length;\n let fatalError;\n try {\n this.buildAst();\n } catch (e) {\n fatalError = new ASTError(null, e?.message);\n }\n if (fatalError) {\n this.errors.push(fatalError);\n }\n const formattedErrors = this.errors.map((e) => e.format(this.text));\n return {\n ast: this.ast,\n formattedErrors,\n };\n }\n /**\n * Builds an AST\n * @private\n * @returns {ASTNode[]} AST\n */\n buildAst() {\n this.ast = [];\n this.errors = [];\n this.pos = 0;\n let node;\n while (this.pos < this.length) {\n // consume whitespace\n this.consumeWhitespace();\n if (this.pos >= this.length) {\n break;\n }\n // top-level function\n if (this.head() === \"(\") {\n node = this.processFunctionCall();\n } else {\n this.errors.push(new ASTError(null, \"Expecting function call, found \" + this.head()));\n break;\n }\n if (node !== null) {\n this.ast.push(node);\n }\n }\n return this.ast;\n }\n /**\n * Returns the current character at the cursor\n * @private\n * @param {boolean} [throwOnError=true] throw an error if unexpected end of script\n * @returns {string | null} single character string or `null`\n */\n head(throwOnError = true) {\n if (this.pos < this.length) {\n return this.text[this.pos];\n }\n if (throwOnError) {\n throw new Error(\"Unexpected end of script\");\n }\n return null;\n }\n /**\n * Advance the cursor position if the current cursor points to a whitespace\n * @private\n * @returns {void}\n */\n consumeWhitespace() {\n while (this.pos < this.length && this.isWhitespaceChar()) {\n this.pos++;\n }\n }\n /**\n * @private\n * @param {string} [char=this.head() || '']\n * @returns {boolean}\n */\n isWhitespaceChar(char = this.head() || \"\") {\n return /\\s/.test(char);\n }\n /**\n * Processes the following substring at the cursor position as a function call\n * @private\n * @returns {ASTFunction} ASTFunction node\n */\n processFunctionCall() {\n const startIdx = this.pos;\n // consume starting parentheses\n this.pos++;\n const name = this.processIdentifier(\")\", /[^+\\-_*/%<>=!a-zA-Z]/gm);\n this.consumeWhitespace();\n const params = [];\n while (this.head() !== \")\") {\n this.consumeWhitespace();\n const char = this.head();\n switch (char) {\n case \"(\":\n params.push(this.processFunctionCall());\n break;\n case '\"':\n params.push(this.processString());\n break;\n case \"[\":\n params.push(this.processList());\n break;\n case \")\":\n // end of function.\n break;\n default:\n if (char === \"-\" || /\\d/.test(char || \"\")) {\n params.push(this.processNumber());\n } else {\n params.push(this.processIdentifier());\n }\n break;\n }\n }\n // consume ending parentheses\n this.pos++;\n const endIdx = this.pos;\n return new ASTFunction(startIdx, endIdx, name, params);\n }\n /**\n * Processes a double quoted string starting at the cursor position into an ASTNode\n * @private\n * @returns {ASTQuotedString}\n */\n processString() {\n let string = \"\";\n const startIdx = this.pos;\n this.pos++;\n let escaped = false;\n while (this.head() !== null) {\n const char = this.head();\n if (char === '\"') {\n if (!escaped) {\n break;\n }\n string += char;\n escaped = false;\n } else if (char === \"\\\\\") {\n if (escaped) {\n string += char;\n }\n escaped = !escaped;\n } else {\n string += char;\n escaped = false;\n }\n this.pos++;\n }\n const endIdx = this.pos;\n this.pos++;\n return new ASTQuotedString(startIdx, endIdx, string.replace(\"\\n\", \"\\\\n\"));\n }\n /**\n * Processes a bracketed list starting at the cursor position into an ASTNode\n *\n * expects `[item1 item2 item3]`\n * @private\n * @returns {ASTList}\n */\n processList() {\n const startIdx = this.pos;\n this.pos++;\n const items = [];\n while (this.head() !== null) {\n this.consumeWhitespace();\n const char = this.head();\n if (char === \"]\") {\n break;\n }\n switch (char) {\n case \"(\":\n items.push(this.processFunctionCall());\n break;\n case '\"':\n items.push(this.processString());\n break;\n case \"[\":\n items.push(this.processList());\n break;\n default:\n if (char === \"-\" || /\\d/.test(char || \"\")) {\n items.push(this.processNumber(\"]\"));\n } else {\n items.push(this.processIdentifier(\"]\"));\n }\n break;\n }\n }\n // consume closing brace\n this.pos++;\n const endIdx = this.pos;\n return new ASTList(startIdx, endIdx, items);\n }\n /**\n * Processes a number literal starting at the cursor position\n * @private\n * @param {string} [end=')'] terminating characters to stop at\n * @returns {ASTNumberLiteral}\n */\n processNumber(end = \")\") {\n const startIdx = this.pos;\n if (this.head() === \"-\") {\n this.pos++;\n }\n while (!this.isWhitespaceChar() && this.head() !== end) {\n this.pos++;\n }\n const endIdx = this.pos;\n const value = this.text.substring(startIdx, endIdx);\n const numberLiteral = new ASTNumberLiteral(startIdx, endIdx, value);\n if (isNaN(+value)) {\n this.errors.push(new ASTError(numberLiteral, \"Invalid number literal\"));\n }\n return numberLiteral;\n }\n /**\n * Processes an identifier at the cursor position\n * @private\n * @param {string} [end=')'] end character to stop at\n * @param {RegExp} [invalidChars=/[^_a-zA-Z]/gm] regex to check against\n * @returns {ASTIdentifier}\n */\n processIdentifier(end = \")\", invalidChars = /[^_a-zA-Z]/gm) {\n const nameStartIdx = this.pos;\n while (!this.isWhitespaceChar() && this.head() !== end) {\n this.pos++;\n }\n const nameEndIdx = this.pos;\n const identifier = new ASTIdentifier(\n nameStartIdx,\n nameEndIdx,\n this.text.substring(nameStartIdx, nameEndIdx),\n );\n // validate identifier\n if (invalidChars.test(identifier.name)) {\n this.errors.push(new ASTError(identifier, \"Invalid function identifier\"));\n }\n if (identifier.name.length === 0) {\n this.errors.push(new ASTError(identifier, \"Missing function identifier\"));\n }\n return identifier;\n }\n}\n","/** @typedef {import('./AST').ASTNode} ASTNode */\n/** @typedef {import('./utils').BBScriptFuncMap} BBScriptFuncMap */\n\n/**\n * @typedef {Object} BBScriptOptions\n * @property {string} callerId\n * @property {string} callerClass\n * @property {any} data\n * @property {BBScriptProcessor} processor\n * @property {Element} target\n */\n\nexport class BBScriptProcessor {\n /** @type {BBScriptOptions} */\n options;\n /** @type {BBScriptFuncMap} */\n functions;\n\n /**\n * @param {BBScriptFuncMap} functions\n * @param {BBScriptOptions} [defaultOptions={} as BBScriptOptions]\n */\n constructor(functions, defaultOptions = {}) {\n defaultOptions = {\n ...defaultOptions,\n processor: this,\n };\n this.options = defaultOptions;\n this.functions = functions;\n }\n /**\n * Processes and executes all commands in node tree\n * @param {ASTNode[]} nodeTree input node tree, generated by `parse()`\n * @param {string} callerId\n * @param {string} callerClass\n * @param {BBScriptOptions} [options=this.options] options to use\n * @returns {void}\n */\n execAll(nodeTree, callerId, callerClass, options = this.options) {\n options = {\n ...this.options,\n ...options,\n callerId,\n callerClass,\n };\n for (const node of nodeTree) {\n node.resolveValue(options);\n }\n }\n}\n","/** @typedef {import('./utils').BBScriptFunc} BBScriptFunc */\n/** @typedef {import('./utils').BBScriptFuncMap} BBScriptFuncMap */\n/** @typedef {import('./utils').BBScriptReturnTypes} BBScriptReturnTypes */\n/** @typedef {import('./AST').ASTNode} ASTNode */\n/** @typedef {import('./processor').BBScriptOptions} BBScriptOptions */\nimport $ from \"jquery\";\nimport { ASTError } from \"./ASTError\";\nimport { ASTIdentifier } from \"./AST\";\nimport { ConsoleLogger } from \"../logger\";\n\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} arr\n * @returns {number}\n */\nconst count = (options, arr) => {\n const arrVal = arr.resolveValue(options);\n if (Array.isArray(arrVal) || typeof arrVal === \"string\") {\n return arrVal.length;\n } else {\n throw new ASTError(arr, \"Does not resolve to an array or string\");\n }\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} arr\n * @param {ASTNode} needle\n * @returns {boolean}\n */\nconst contain = (options, arr, needle) => {\n const arrVal = arr.resolveValue(options);\n const needleVal = needle.resolveValue(options);\n if (Array.isArray(arrVal) && needleVal !== undefined) {\n return arrVal.includes(needleVal);\n }\n if (typeof arrVal === \"string\" && needleVal !== undefined) {\n return arrVal.includes(needleVal);\n }\n if (!Array.isArray(arrVal) || typeof arrVal !== \"string\") {\n throw new ASTError(arr, \"Does not resolve to an array or string\");\n }\n return false;\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} arr\n * @param {ASTNode} needle\n * @returns {number}\n */\nconst find = (options, arr, needle) => {\n const arrVal = arr.resolveValue(options);\n const needleVal = needle.resolveValue(options);\n if (Array.isArray(arrVal) && needleVal !== undefined) {\n return arrVal.indexOf(needleVal);\n }\n if (!Array.isArray(arrVal)) {\n throw new ASTError(arr, \"Does not resolve to an array\");\n }\n return -1;\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} arr\n * @param {ASTNode} i\n * @param {ASTNode | undefined} [val]\n * @returns {BBScriptReturnTypes}\n */\nconst index = (options, arr, i, val) => {\n const arrVal = arr.resolveValue(options);\n const idx = +i.resolveValue(options);\n if (!Array.isArray(arrVal)) {\n throw new ASTError(arr, \"Does not resolve to an array\");\n }\n if (val === undefined) {\n return arrVal[idx];\n }\n const newVal = val.resolveValue(options);\n arrVal[idx] = newVal;\n return arrVal[idx];\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} arr\n * @param {ASTNode} val\n * @returns {number}\n */\nconst append = (options, arr, val) => {\n const arrVal = arr.resolveValue(options);\n const newVal = val.resolveValue(options);\n if (!Array.isArray(arrVal)) {\n throw new ASTError(arr, \"Does not resolve to an array\");\n }\n // js array is pass by reference, so options.data will be updated if applicable\n return arrVal.push(newVal);\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} arr\n * @param {ASTNode} i\n * @param {ASTNode} val\n * @returns {void}\n */\nconst insert = (options, arr, i, val) => {\n const arrVal = arr.resolveValue(options);\n if (!Array.isArray(arrVal)) {\n throw new ASTError(arr, \"Does not resolve to an array\");\n }\n const idx = +i.resolveValue(options);\n if (typeof idx !== \"number\") {\n throw new ASTError(i, \"Does not resolve to a number\");\n }\n const newVal = val.resolveValue(options);\n arrVal.splice(Math.floor(idx), 0, newVal);\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} arr\n * @returns {BBScriptReturnTypes | undefined}\n */\nconst pop = (options, arr) => {\n const arrVal = arr.resolveValue(options);\n if (!Array.isArray(arrVal)) {\n throw new ASTError(arr, \"Does not resolve to an array\");\n }\n return arrVal.pop();\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} arr\n * @param {ASTNode} i\n * @returns {BBScriptReturnTypes}\n */\nconst remove = (options, arr, i) => {\n const arrVal = arr.resolveValue(options);\n if (!Array.isArray(arrVal)) {\n throw new ASTError(arr, \"Does not resolve to an array\");\n }\n const idx = +i.resolveValue(options);\n return arrVal.splice(idx, 1)[0];\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} arr\n * @returns {BBScriptReturnTypes[]}\n */\nconst reverse = (options, arr) => {\n const arrVal = arr.resolveValue(options);\n if (!Array.isArray(arrVal)) {\n throw new ASTError(arr, \"Does not resolve to an array\");\n }\n return arrVal.reverse();\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} arr\n * @param {ASTNode | undefined} [sep]\n * @returns {string}\n */\nconst join = (options, arr, sep) => {\n const arrVal = arr.resolveValue(options);\n let sepVal = \"\";\n if (!Array.isArray(arrVal)) {\n throw new ASTError(arr, \"Does not resolve to an array\");\n }\n if (sep !== undefined) {\n sepVal = String(sep.resolveValue(options));\n }\n return arrVal.join(sepVal);\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} arr\n * @returns {BBScriptReturnTypes[]}\n */\nconst shuffle = (options, arr) => {\n const arrVal = arr.resolveValue(options);\n if (!Array.isArray(arrVal)) {\n throw new ASTError(arr, \"Does not resolve to an array\");\n }\n for (let i = arrVal.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [arrVal[i], arrVal[j]] = [arrVal[j], arrVal[i]];\n }\n return arrVal;\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} arr\n * @param {ASTNode} start\n * @param {ASTNode} end\n * @returns {string | BBScriptReturnTypes[]}\n */\nconst slice = (options, arr, start, end) => {\n const val = arr.resolveValue(options);\n if (!Array.isArray(val) && typeof val !== \"string\") {\n throw new ASTError(arr, \"Does not resolve to an array or string\");\n }\n const startVal = +start.resolveValue(options);\n const endVal = +end.resolveValue(options);\n return val.slice(startVal, endVal);\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} arr\n * @param {ASTNode} func\n * @param {ASTNode | undefined} [token]\n * @returns {void}\n */\nconst each = (options, arr, func, token) => {\n const arrVal = arr.resolveValue(options);\n if (!Array.isArray(arrVal)) {\n throw new ASTError(arr, \"Does not resolve to an array\");\n }\n const tokenVar = token !== undefined ? String(token.resolveValue(options)) : \"_\";\n // eslint-disable-next-line eqeqeq\n if (options.data[options.callerId] == undefined) {\n options.data[options.callerId] = {};\n }\n for (const e of arrVal) {\n options.data[options.callerId][tokenVar] = e;\n func.resolveValue(options);\n }\n delete options.data[options.callerId][tokenVar];\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode | undefined} [target]\n */\nconst getJQueryEl = (options, target) => {\n if (target !== undefined) {\n const search = \".\" + String(target.resolveValue(options)).trim() + \"__\" + options.callerId;\n return $(search);\n } else {\n return $(options.target);\n }\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} newClass\n * @param {ASTNode | undefined} [target]\n * @returns {void}\n */\nconst addClass = (options, newClass, target) => {\n let className = String(newClass.resolveValue(options));\n className &&= className + \"__\" + options.callerId;\n const targetEl = getJQueryEl(options, target);\n targetEl.addClass(className);\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} oldClass\n * @param {ASTNode | undefined} [target]\n * @returns {void}\n */\nconst removeClass = (options, oldClass, target) => {\n let className = String(oldClass.resolveValue(options));\n className &&= className + \"__\" + options.callerId;\n const targetEl = getJQueryEl(options, target);\n targetEl.removeClass(className);\n};\n/**\n * Scroll the target element into view\n * @param {BBScriptOptions} options\n * @param {ASTNode | undefined} target\n */\nconst scrollIntoView = (options, target) => {\n const targetEl = getJQueryEl(options, target);\n targetEl[0].scrollIntoView();\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode | undefined} [duration]\n * @param {ASTNode | undefined} [target]\n * @returns {void}\n */\nconst fadeIn = (options, duration, target) => {\n const targetEl = getJQueryEl(options, target);\n if (duration !== undefined) {\n const time = +duration.resolveValue(options);\n targetEl.fadeIn(time || 1000);\n } else {\n targetEl.fadeIn(1000);\n }\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode | undefined} [duration]\n * @param {ASTNode | undefined} [target]\n * @returns {void}\n */\nconst fadeOut = (options, duration, target) => {\n const targetEl = getJQueryEl(options, target);\n if (duration !== undefined) {\n const time = +duration.resolveValue(options);\n targetEl.fadeOut(time || 1000);\n } else {\n targetEl.fadeOut(1000);\n }\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode | undefined} [duration]\n * @param {ASTNode | undefined} [target]\n * @returns {void}\n */\nconst fadeToggle = (options, duration, target) => {\n const targetEl = getJQueryEl(options, target);\n if (duration !== undefined) {\n const time = +duration.resolveValue(options);\n targetEl.fadeToggle(time || 1000);\n } else {\n targetEl.fadeToggle(1000);\n }\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode | undefined} [target]\n * @returns {void}\n */\nconst hide = (options, target) => {\n const targetEl = getJQueryEl(options, target);\n targetEl.hide();\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode | undefined} [target]\n * @returns {void}\n */\nconst show = (options, target) => {\n const targetEl = getJQueryEl(options, target);\n targetEl.show();\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode | undefined} [target]\n * @returns {any}\n */\nconst getText = (options, target) => {\n const targetEl = getJQueryEl(options, target);\n return targetEl.text();\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} text\n * @param {ASTNode | undefined} [target]\n * @returns {void}\n */\nconst setText = (options, text, target) => {\n const targetEl = getJQueryEl(options, target);\n const textVal = text.resolveValue(options);\n targetEl.text(textVal);\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode | undefined} [duration]\n * @param {ASTNode | undefined} [target]\n * @returns {void}\n */\nconst slideDown = (options, duration, target) => {\n const targetEl = getJQueryEl(options, target);\n if (duration !== undefined) {\n const time = +duration.resolveValue(options);\n targetEl.slideDown(time || 1000);\n } else {\n targetEl.slideDown(1000);\n }\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode | undefined} [duration]\n * @param {ASTNode | undefined} [target]\n * @returns {void}\n */\nconst slideUp = (options, duration, target) => {\n const targetEl = getJQueryEl(options, target);\n if (duration !== undefined) {\n const time = +duration.resolveValue(options);\n targetEl.slideUp(time || 1000);\n } else {\n targetEl.slideUp(1000);\n }\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode | undefined} [duration]\n * @param {ASTNode | undefined} [target]\n * @returns {void}\n */\nconst slideToggle = (options, duration, target) => {\n const targetEl = getJQueryEl(options, target);\n if (duration !== undefined) {\n const time = +duration.resolveValue(options);\n targetEl.slideToggle(time || 1000);\n } else {\n targetEl.slideToggle(1000);\n }\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} classes\n * @param {ASTNode | undefined} [target]\n * @returns {void}\n */\nconst addDiv = (options, classes, target) => {\n const targetEl = getJQueryEl(options, target);\n let classList = \"\";\n const classVal = classes.resolveValue(options);\n if (Array.isArray(classVal)) {\n classList = classVal.map((c) => c + \"__\" + options.callerId).join(\" \");\n } else {\n classList = classVal + \"__\" + options.callerId;\n }\n targetEl.append(`
`);\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} classes\n * @param {ASTNode | undefined} [target]\n * @returns {void}\n */\nconst removeDiv = (options, classes, target) => {\n const targetEl = getJQueryEl(options, target);\n let classList = \"\";\n const classVal = classes.resolveValue(options);\n if (Array.isArray(classVal)) {\n classList = \".\" + classVal.map((c) => c + \"__\" + options.callerId).join(\".\");\n } else {\n classList = \".\" + classVal + \"__\" + options.callerId;\n }\n targetEl.remove(classList);\n};\n/**\n * @param {BBScriptOptions} options\n * @param {...ASTNode} [params]\n * @returns {boolean}\n */\nconst and = (options, ...params) => {\n return params.every((a) => !!a.resolveValue(options)); // allows for quick fallout if falsy\n};\n/**\n * @param {BBScriptOptions} options\n * @param {...ASTNode} [params]\n * @returns {boolean}\n */\nconst or = (options, ...params) => {\n return params.some((a) => !!a.resolveValue(options)); // allows for quick fallout if truthy\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} lhs\n * @param {ASTNode} rhs\n * @returns {boolean}\n */\nconst equal = (options, lhs, rhs) => {\n // eslint-disable-next-line eqeqeq\n return lhs.resolveValue(options) == rhs.resolveValue(options);\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} lhs\n * @param {ASTNode} rhs\n * @returns {boolean}\n */\nconst notEqual = (options, lhs, rhs) => {\n // eslint-disable-next-line eqeqeq\n return lhs.resolveValue(options) != rhs.resolveValue(options);\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} lhs\n * @param {ASTNode} rhs\n * @returns {boolean}\n */\nconst greaterThan = (options, lhs, rhs) => {\n return lhs.resolveValue(options) > rhs.resolveValue(options);\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} lhs\n * @param {ASTNode} rhs\n * @returns {boolean}\n */\nconst greaterOrEqual = (options, lhs, rhs) => {\n return lhs.resolveValue(options) >= rhs.resolveValue(options);\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} lhs\n * @param {ASTNode} rhs\n * @returns {boolean}\n */\nconst lessThan = (options, lhs, rhs) => {\n return lhs.resolveValue(options) < rhs.resolveValue(options);\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} lhs\n * @param {ASTNode} rhs\n * @returns {boolean}\n */\nconst lessOrEqual = (options, lhs, rhs) => {\n return lhs.resolveValue(options) <= rhs.resolveValue(options);\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} test\n * @param {ASTNode} caseTrue\n * @param {ASTNode | undefined} [caseFalse]\n * @returns {BBScriptReturnTypes}\n */\nconst conditional = (options, test, caseTrue, caseFalse) => {\n const result = test.resolveValue(options);\n if (result) {\n return caseTrue.resolveValue(options);\n } else if (caseFalse !== undefined) {\n return caseFalse.resolveValue(options);\n }\n};\n/**\n * @param {BBScriptOptions} options\n * @param {...ASTNode} [exec]\n * @returns {BBScriptReturnTypes}\n */\nconst group = (options, ...exec) => {\n const values = exec.map((a) => a.resolveValue(options));\n return values[values.length - 1];\n};\n/**\n * @returns {never}\n */\nconst stop = () => {\n throw new Error(\"BBScript Stop Command\"); // throw an error for easy exit and less try-catching\n};\n/**\n * @returns {number}\n */\nconst random = () => {\n return Math.random();\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} min\n * @param {ASTNode} max\n * @returns {number}\n */\nconst randomInt = (options, min, max) => {\n const minVal = +min.resolveValue(options);\n const maxVal = +max.resolveValue(options);\n return Math.floor(Math.random() * (maxVal - minVal + 1) + minVal);\n};\n/**\n * @returns {number}\n */\nconst time = () => {\n return new Date().getTime();\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} secs\n * @param {ASTNode} func\n * @returns {number}\n */\nconst timeoutFunc = (options, secs, func) => {\n const secsVal = secs.resolveValue(options);\n if (typeof secsVal !== \"number\") {\n throw new ASTError(secs, \"Does not resolve to a number\");\n }\n return setTimeout(\n () => {\n func.resolveValue(options);\n },\n Math.round(secsVal * 1000),\n );\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} id\n * @returns {void}\n */\nconst clearTimeoutFunc = (options, id) => {\n const handle = +id.resolveValue(options);\n clearTimeout(handle);\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} secs\n * @param {ASTNode} func\n * @returns {number}\n */\nconst intervalFunc = (options, secs, func) => {\n const secsVal = secs.resolveValue(options);\n if (typeof secsVal !== \"number\") {\n throw new ASTError(secs, \"Does not resolve to a number\");\n }\n return setInterval(() => func.resolveValue(options), Math.round(secsVal * 1000));\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} id\n * @returns {void}\n */\nconst clearIntervalFunc = (options, id) => {\n const handle = +id.resolveValue(options);\n clearInterval(handle);\n};\n/**\n * @param {BBScriptOptions} options\n * @param {...ASTNode} [nodes]\n * @returns {void}\n */\nconst print = (options, ...nodes) => {\n const values = nodes.map((n) => n.resolveValue(options));\n ConsoleLogger.log(...values);\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} str\n * @param {ASTNode | undefined} [sep]\n * @returns {string[]}\n */\nconst split = (options, str, sep) => {\n const strVal = String(str.resolveValue(options));\n let sepVal = \"\";\n if (sep !== undefined) {\n const res = sep.resolveValue(options);\n if (typeof res === \"string\") {\n sepVal = res;\n }\n }\n return strVal.split(sepVal);\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} str\n * @returns {string}\n */\nconst lower = (options, str) => {\n const strVal = String(str.resolveValue(options));\n return strVal.toLowerCase();\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} str\n * @returns {string}\n */\nconst upper = (options, str) => {\n const strVal = String(str.resolveValue(options));\n return strVal.toUpperCase();\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} str\n * @returns {string}\n */\nconst trim = (options, str) => {\n const strVal = String(str.resolveValue(options));\n return strVal.trim();\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} str\n * @param {ASTNode} needle\n * @param {ASTNode} replacement\n * @returns {string}\n */\nconst replace = (options, str, needle, replacement) => {\n const strVal = String(str.resolveValue(options));\n return strVal.replaceAll(needle.resolveValue(options), replacement.resolveValue(options));\n};\n/**\n * create/assign to data variable\n * @param {BBScriptOptions} options\n * @param {ASTNode} variable\n * @param {ASTNode} input\n * @returns {void}\n */\nconst assign = (options, variable, input) => {\n const value = input.resolveValue(options);\n let varName;\n if (variable instanceof ASTIdentifier) {\n varName = variable.name;\n // eslint-disable-next-line eqeqeq\n if (options.data[options.callerId] == undefined) {\n options.data[options.callerId] = {};\n }\n options.data[options.callerId][varName] = value;\n return;\n }\n throw new ASTError(variable, \"Cannot assign to non identifier\");\n};\n/**\n * JS loosy add for strings or nums\n * @param {BBScriptOptions} options\n * @param {...ASTNode} [params]\n * @returns {string | number}\n */\nconst add = (options, ...params) => {\n const addElems = params.map((p) => p.resolveValue(options));\n return addElems.reduce((a, b) => a + b);\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode[]} param\n * @returns {number[]}\n */\nconst resolveToNums = (options, param) => {\n return param.map((p) => {\n const v = p.resolveValue(options);\n if (typeof v !== \"number\") {\n throw new ASTError(p, \"Does not resolve to a number\");\n }\n return v;\n });\n};\n/**\n * @param {BBScriptOptions} options\n * @param {...ASTNode} [params]\n * @returns {number}\n */\nconst subtract = (options, ...params) => {\n const subElems = resolveToNums(options, params);\n return subElems.reduce((a, b) => a - b);\n};\n/**\n * @param {BBScriptOptions} options\n * @param {...ASTNode} [params]\n * @returns {number}\n */\nconst multiply = (options, ...params) => {\n const elems = resolveToNums(options, params);\n return elems.reduce((a, b) => a * b);\n};\n/**\n * @param {BBScriptOptions} options\n * @param {...ASTNode} [params]\n * @returns {number}\n */\nconst divide = (options, ...params) => {\n const elems = resolveToNums(options, params);\n return elems.reduce((a, b) => a / b);\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} value\n * @param {ASTNode} base\n * @returns {number}\n */\nconst mod = (options, value, base) => {\n const [valueNum, baseNum] = resolveToNums(options, [value, base]);\n return valueNum % baseNum;\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} base\n * @param {ASTNode} expo\n * @returns {number}\n */\nconst exp = (options, base, expo) => {\n const [expoNum, baseNum] = resolveToNums(options, [expo, base]);\n return baseNum ** expoNum;\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} variable\n * @returns {void}\n */\nconst decrement = (options, variable) => {\n if (variable instanceof ASTIdentifier) {\n const varName = variable.name;\n if (\n // eslint-disable-next-line eqeqeq\n options.data[options.callerId] == undefined ||\n // eslint-disable-next-line eqeqeq\n options.data[options.callerId][varName] == undefined\n ) {\n throw new ASTError(variable, \"Identifier not set yet\");\n }\n if (typeof options.data[options.callerId][varName] !== \"number\") {\n throw new ASTError(variable, \"Not a number\");\n }\n options.data[options.callerId][varName] -= 1;\n return;\n }\n throw new ASTError(variable, \"Not an identifier variable\");\n};\n/**\n * @param {BBScriptOptions} options\n * @param {ASTNode} variable\n * @returns {void}\n */\nconst increment = (options, variable) => {\n if (variable instanceof ASTIdentifier) {\n const varName = variable.name;\n if (\n // eslint-disable-next-line eqeqeq\n options.data[options.callerId] == undefined ||\n // eslint-disable-next-line eqeqeq\n options.data[options.callerId][varName] == undefined\n ) {\n throw new ASTError(variable, \"Identifier not set yet\");\n }\n if (typeof options.data[options.callerId][varName] !== \"number\") {\n throw new ASTError(variable, \"Not a number\");\n }\n options.data[options.callerId][varName] += 1;\n return;\n }\n throw new ASTError(variable, \"Not an identifier variable\");\n};\nexport const bbscriptFunctions = {\n count,\n contain,\n find,\n index,\n append,\n insert,\n pop,\n remove,\n reverse,\n join,\n shuffle,\n slice,\n each,\n addClass,\n removeClass,\n scrollIntoView,\n fadeIn,\n fadeOut,\n fadeToggle,\n hide,\n show,\n getText,\n setText,\n slideDown,\n slideUp,\n slideToggle,\n addDiv,\n removeDiv,\n and,\n or,\n \"==\": equal,\n \"!=\": notEqual,\n \">\": greaterThan,\n \">=\": greaterOrEqual,\n \"<\": lessThan,\n \"<=\": lessOrEqual,\n if: conditional,\n group,\n stop,\n random,\n randomInt,\n time,\n setTimeout: timeoutFunc,\n clearTimeout: clearTimeoutFunc,\n setInterval: intervalFunc,\n clearInterval: clearIntervalFunc,\n print,\n split,\n lower,\n upper,\n trim,\n replace,\n \"=\": assign,\n \"+\": add,\n \"-\": subtract,\n \"*\": multiply,\n \"/\": divide,\n \"%\": mod,\n \"**\": exp,\n \"--\": decrement,\n \"++\": increment,\n};\n","/** @typedef {import('./bbscript1/processor').bbscriptOptions} bbscriptOptions */\n/** @typedef {import('./bbscript1/utils').astNode} astNode */\n/** @typedef {import('./bbscript2/AST').ASTNode} ASTNode */\n/** @typedef {import('./bbscript2/processor').BBScriptOptions} BBScriptOptions */\nimport { initBBScript1 } from \"./bbscript1/bbscript1\";\nimport { initBBScript2 } from \"./bbscript2/bbscript2\";\nconst bbscriptData = {};\nconst bbscriptProcessorV1 = initBBScript1(bbscriptData);\nconst { processor: bbscriptProcessorV2, parser: bbscript2Parser } = initBBScript2(bbscriptData);\n// eslint-disable-next-line no-console\nconsole.info(\"BBCodePlus Addon JS Loaded\");\n\n/**\n * @module bbscriptParser\n */\nexport { bbscriptData, bbscriptProcessorV1, bbscriptProcessorV2, bbscript2Parser };\n","/** @typedef {import('./processor.js').bbscriptOptions} bbscript1Options */\nimport { BBScriptProcessor as BBScript1Processor } from \"./processor.js\";\nimport { bbscriptFunctions } from \"./functions.js\";\n/**\n * @param {any} bbscriptData\n * @returns {BBScript1Processor}\n */\nexport function initBBScript1(bbscriptData) {\n return new BBScript1Processor(bbscriptFunctions, { data: bbscriptData });\n}\n","/** @typedef {import('./processor').BBScriptOptions} BBScriptOptions */\nimport { BBScriptParser } from \"./parser\";\nimport { BBScriptProcessor as BBScript2Processor } from \"./processor\";\nimport { bbscriptFunctions } from \"./functions\";\n/**\n * @param {any} bbscriptData\n * @returns {{ processor: BBScript2Processor; parser: BBScriptParser; }}\n */\nexport function initBBScript2(bbscriptData) {\n return {\n processor: new BBScript2Processor(bbscriptFunctions, { data: bbscriptData }),\n parser: new BBScriptParser(),\n };\n}\n"],"names":["bbscriptParamTypes","Object","freeze","Function","Symbol","String","Identifier","Int","isAstNode","input","getOwnPropertyNames","every","v","includes","getStringVal","str","options","match","callerId","data","undefined","matches","matchAll","presumedValue","replace","ConsoleLogger","static","console","log","warn","error","info","debug","BBScriptProcessor$1","functions","constructor","bbscriptFunc","defaultOptions","processor","this","execAll","nodeTree","callerClass","node","res","exec","msg","callable","name","func","args","params","parse","raw","line","split","trim","startsWith","push","process","e","idx","part1","parts","toLowerCase","join","Error","foundFunc","types","validParamType","default","defaultValue","value","length","isString","getEnclosedParameter","childFunc","overallIdx","braceVar","substring","isNaN","parseFloat","close","trimWrap","startIdx","remainder","slice","closeIndex","indexOf","conditional","lhs","rhs","elseBlock","getJQueryEl","el","$","target","addClass","newClass","removeClass","oldClass","fadeIn","time","fadeOut","fadeToggle","hide","show","getText","text","setText","slideDown","slideUp","slideToggle","evaluate","leftResult","rightResult","eq","ge","geq","le","leq","random","min","max","Math","floor","print","set","id","add","a","b","bbscriptFunctions","if","stop","dec","amount","inc","addclass","removeclass","fadein","fadeout","fadetoggle","gettext","settext","slidedown","slideup","slidetoggle","ASTNode","_startIdx","_endIdx","endIdx","findInText","column","i","ASTIdentifier","_name","super","resolveValue","ASTFunction","_identifier","_params","identifier","ASTQuotedString","_string","string","ASTList","_items","elements","items","map","ASTNumberLiteral","_value","ASTError","message","format","details","BBScriptParser","ast","errors","pos","fatalError","buildAst","formattedErrors","consumeWhitespace","head","processFunctionCall","throwOnError","isWhitespaceChar","char","test","processIdentifier","processString","processList","processNumber","escaped","end","numberLiteral","invalidChars","nameStartIdx","nameEndIdx","BBScriptProcessor","search","resolveToNums","param","p","count","arr","arrVal","Array","isArray","contain","needle","needleVal","find","index","val","newVal","append","insert","splice","pop","remove","reverse","sep","sepVal","shuffle","j","start","startVal","endVal","each","token","tokenVar","className","scrollIntoView","duration","targetEl","textVal","addDiv","classes","classList","classVal","c","removeDiv","and","or","some","caseTrue","caseFalse","group","values","randomInt","minVal","maxVal","Date","getTime","setTimeout","secs","secsVal","round","clearTimeout","handle","setInterval","clearInterval","nodes","n","strVal","lower","upper","toUpperCase","replacement","replaceAll","variable","varName","reduce","base","valueNum","baseNum","expo","expoNum","bbscriptData","bbscriptProcessorV1","BBScript1Processor","initBBScript1","bbscriptProcessorV2","parser","bbscript2Parser","BBScript2Processor","initBBScript2"],"mappings":"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"} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index b862eab..bbae536 100644 --- a/yarn.lock +++ b/yarn.lock @@ -286,7 +286,7 @@ "@babel/helper-validator-identifier" "^7.24.7" to-fast-properties "^2.0.0" -"@bbob/core@*", "@bbob/core@^4.1.0": +"@bbob/core@*": version "4.1.0" resolved "https://registry.yarnpkg.com/@bbob/core/-/core-4.1.0.tgz#32e1aa02df6709ed5d22f352c9e933b9fc85b4d5" integrity sha512-RUhUV1JXOac3ISRXAuNLnUAGDRlBFTZYgYik8slV063Nk87C1z6e19DlDC+6hgAocBT02DQiju0z9v6bAwWIiQ== @@ -295,10 +295,19 @@ "@bbob/plugin-helper" "*" "@bbob/types" "*" -"@bbob/html@^4.1.0": - version "4.1.0" - resolved "https://registry.yarnpkg.com/@bbob/html/-/html-4.1.0.tgz#08d21ce96991dc8bf76e351a8038304fa268c581" - integrity sha512-hy/87vKsjTTnm6iDfVpAW959bfITUf9EfwL1k8JmDJ8Wt5acnqsUqJmhKiJh3fVOGUGpxx4o+T3ku6AFumHKmA== +"@bbob/core@^4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@bbob/core/-/core-4.2.0.tgz#5e56cdbbc1988dc837842c9c34679bf36eabb5f5" + integrity sha512-i5VUIO6xx+TCrBE8plQF9KpW1z+0QcCh9GawCCWYG9KcZrEsyRy57my5/kem0a2lFxXjh0o+tgjQY9sCP5b3bw== + dependencies: + "@bbob/parser" "*" + "@bbob/plugin-helper" "*" + "@bbob/types" "*" + +"@bbob/html@^4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@bbob/html/-/html-4.2.0.tgz#f91d1dff989f9ef8cba0e98a959eac3c6c487baa" + integrity sha512-mZG7MmE/YluH1/FNCr2Jv/Vz3Mq5stZ5tFAjBmYpVVN6Ndus4+FA84vKoHFdUHDiuU1p/e2/o/VUrwsWwLdoIA== dependencies: "@bbob/core" "*" "@bbob/plugin-helper" "*" @@ -319,16 +328,16 @@ dependencies: "@bbob/types" "*" -"@bbob/preset-html5@^4.1.0": - version "4.1.0" - resolved "https://registry.yarnpkg.com/@bbob/preset-html5/-/preset-html5-4.1.0.tgz#ef435c09edb3a329ea61498b4a9037ad645daf01" - integrity sha512-ZOUblxMh2rG167o2djXQBikRioGNmGeY0MD8NgwyK1Sj2/8Q2/V7yn9aUSd31bo76uj1lBpFJ4vEC9xB6ETw/Q== +"@bbob/preset-html5@^4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@bbob/preset-html5/-/preset-html5-4.2.0.tgz#2ebbbcdd988c8aaac49342143e5497d83f2f16f4" + integrity sha512-X2EIeb2vqTz/n34KWQXEL5IC0SuB6i2/ltRpEaMTyK7IoDEs0XGIWcqVpenb7Z2d4eNA3gTWhkoUUkKlZmfQRQ== dependencies: "@bbob/plugin-helper" "*" "@bbob/preset" "*" "@bbob/types" "*" -"@bbob/preset@*", "@bbob/preset@^4.1.0": +"@bbob/preset@*": version "4.1.0" resolved "https://registry.yarnpkg.com/@bbob/preset/-/preset-4.1.0.tgz#209e8501897eb3d34bf011dfcabeb08ed95bb2c5" integrity sha512-/PEVrDOuckx1EwbqziU+xbCu2rja70a0jx/p9/x2AJdLw5j0yw1DvV6r6BM4/AazNjfP++1np7rU8+IxyDdDWA== @@ -336,11 +345,24 @@ "@bbob/plugin-helper" "*" "@bbob/types" "*" -"@bbob/types@*", "@bbob/types@^4.1.0": +"@bbob/preset@^4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@bbob/preset/-/preset-4.2.0.tgz#316634a5a144d8f3a0533fb268e83adc56cb52ca" + integrity sha512-IA+kxlrRcYBXE634B8W6uU2DO7VvrxeOqWUzIDKV2CgzTMpmCG875ihGp+Q3T+QxGwzG5S0L4GdmCIULTbzC4A== + dependencies: + "@bbob/plugin-helper" "*" + "@bbob/types" "*" + +"@bbob/types@*": version "4.1.0" resolved "https://registry.yarnpkg.com/@bbob/types/-/types-4.1.0.tgz#2837249c0c0e3e7aea3030ea0038063916561eb8" integrity sha512-awahXN6FPt50IvWSHDgNTdDJR7mwJaR2vajT09idaSdWzR2715SyqTIGXPqNQgoNaeIzxWGal55h3dH77+/Z+Q== +"@bbob/types@^4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@bbob/types/-/types-4.2.0.tgz#f3da1ca6eea134984f4ed2173bbfa4427560df28" + integrity sha512-bSCZnNg0VrPosBBUVkjBDYVKNEqwT0jTNuzvAuNrZkuILgUKtLYI9GHuT8rY4lZecCb7UqGDsHsYt0YJO36eJg== + "@discourse/lint-configs@^1.3.9": version "1.3.9" resolved "https://registry.npmjs.org/@discourse/lint-configs/-/lint-configs-1.3.9.tgz" @@ -642,85 +664,100 @@ estree-walker "^2.0.2" picomatch "^2.3.1" -"@rollup/rollup-android-arm-eabi@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.0.tgz#bbd0e616b2078cd2d68afc9824d1fadb2f2ffd27" - integrity sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ== - -"@rollup/rollup-android-arm64@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.0.tgz#97255ef6384c5f73f4800c0de91f5f6518e21203" - integrity sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA== - -"@rollup/rollup-darwin-arm64@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.0.tgz#b6dd74e117510dfe94541646067b0545b42ff096" - integrity sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w== - -"@rollup/rollup-darwin-x64@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.0.tgz#e07d76de1cec987673e7f3d48ccb8e106d42c05c" - integrity sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA== - -"@rollup/rollup-linux-arm-gnueabihf@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.0.tgz#9f1a6d218b560c9d75185af4b8bb42f9f24736b8" - integrity sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA== - -"@rollup/rollup-linux-arm-musleabihf@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.0.tgz#53618b92e6ffb642c7b620e6e528446511330549" - integrity sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A== - -"@rollup/rollup-linux-arm64-gnu@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.0.tgz#99a7ba5e719d4f053761a698f7b52291cefba577" - integrity sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw== - -"@rollup/rollup-linux-arm64-musl@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.0.tgz#f53db99a45d9bc00ce94db8a35efa7c3c144a58c" - integrity sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ== - -"@rollup/rollup-linux-powerpc64le-gnu@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.0.tgz#cbb0837408fe081ce3435cf3730e090febafc9bf" - integrity sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA== - -"@rollup/rollup-linux-riscv64-gnu@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.0.tgz#8ed09c1d1262ada4c38d791a28ae0fea28b80cc9" - integrity sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg== - -"@rollup/rollup-linux-s390x-gnu@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.0.tgz#938138d3c8e0c96f022252a28441dcfb17afd7ec" - integrity sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg== - -"@rollup/rollup-linux-x64-gnu@4.18.0": - version "4.18.0" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.0.tgz" - integrity sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w== - -"@rollup/rollup-linux-x64-musl@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.0.tgz#f1186afc601ac4f4fc25fac4ca15ecbee3a1874d" - integrity sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg== - -"@rollup/rollup-win32-arm64-msvc@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.0.tgz#ed6603e93636a96203c6915be4117245c1bd2daf" - integrity sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA== - -"@rollup/rollup-win32-ia32-msvc@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.0.tgz#14e0b404b1c25ebe6157a15edb9c46959ba74c54" - integrity sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg== - -"@rollup/rollup-win32-x64-msvc@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.0.tgz#5d694d345ce36b6ecf657349e03eb87297e68da4" - integrity sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g== +"@rollup/rollup-android-arm-eabi@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.30.1.tgz#14c737dc19603a096568044eadaa60395eefb809" + integrity sha512-pSWY+EVt3rJ9fQ3IqlrEUtXh3cGqGtPDH1FQlNZehO2yYxCHEX1SPsz1M//NXwYfbTlcKr9WObLnJX9FsS9K1Q== + +"@rollup/rollup-android-arm64@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.30.1.tgz#9d81ea54fc5650eb4ebbc0a7d84cee331bfa30ad" + integrity sha512-/NA2qXxE3D/BRjOJM8wQblmArQq1YoBVJjrjoTSBS09jgUisq7bqxNHJ8kjCHeV21W/9WDGwJEWSN0KQ2mtD/w== + +"@rollup/rollup-darwin-arm64@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.30.1.tgz#29448cb1370cf678b50743d2e392be18470abc23" + integrity sha512-r7FQIXD7gB0WJ5mokTUgUWPl0eYIH0wnxqeSAhuIwvnnpjdVB8cRRClyKLQr7lgzjctkbp5KmswWszlwYln03Q== + +"@rollup/rollup-darwin-x64@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.30.1.tgz#0ca99741c3ed096700557a43bb03359450c7857d" + integrity sha512-x78BavIwSH6sqfP2xeI1hd1GpHL8J4W2BXcVM/5KYKoAD3nNsfitQhvWSw+TFtQTLZ9OmlF+FEInEHyubut2OA== + +"@rollup/rollup-freebsd-arm64@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.30.1.tgz#233f8e4c2f54ad9b719cd9645887dcbd12b38003" + integrity sha512-HYTlUAjbO1z8ywxsDFWADfTRfTIIy/oUlfIDmlHYmjUP2QRDTzBuWXc9O4CXM+bo9qfiCclmHk1x4ogBjOUpUQ== + +"@rollup/rollup-freebsd-x64@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.30.1.tgz#dfba762a023063dc901610722995286df4a48360" + integrity sha512-1MEdGqogQLccphhX5myCJqeGNYTNcmTyaic9S7CG3JhwuIByJ7J05vGbZxsizQthP1xpVx7kd3o31eOogfEirw== + +"@rollup/rollup-linux-arm-gnueabihf@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.30.1.tgz#b9da54171726266c5ef4237f462a85b3c3cf6ac9" + integrity sha512-PaMRNBSqCx7K3Wc9QZkFx5+CX27WFpAMxJNiYGAXfmMIKC7jstlr32UhTgK6T07OtqR+wYlWm9IxzennjnvdJg== + +"@rollup/rollup-linux-arm-musleabihf@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.30.1.tgz#b9db69b3f85f5529eb992936d8f411ee6d04297b" + integrity sha512-B8Rcyj9AV7ZlEFqvB5BubG5iO6ANDsRKlhIxySXcF1axXYUyqwBok+XZPgIYGBgs7LDXfWfifxhw0Ik57T0Yug== + +"@rollup/rollup-linux-arm64-gnu@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.30.1.tgz#2550cf9bb4d47d917fd1ab4af756d7bbc3ee1528" + integrity sha512-hqVyueGxAj3cBKrAI4aFHLV+h0Lv5VgWZs9CUGqr1z0fZtlADVV1YPOij6AhcK5An33EXaxnDLmJdQikcn5NEw== + +"@rollup/rollup-linux-arm64-musl@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.30.1.tgz#9d06b26d286c7dded6336961a2f83e48330e0c80" + integrity sha512-i4Ab2vnvS1AE1PyOIGp2kXni69gU2DAUVt6FSXeIqUCPIR3ZlheMW3oP2JkukDfu3PsexYRbOiJrY+yVNSk9oA== + +"@rollup/rollup-linux-loongarch64-gnu@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.30.1.tgz#e957bb8fee0c8021329a34ca8dfa825826ee0e2e" + integrity sha512-fARcF5g296snX0oLGkVxPmysetwUk2zmHcca+e9ObOovBR++9ZPOhqFUM61UUZ2EYpXVPN1redgqVoBB34nTpQ== + +"@rollup/rollup-linux-powerpc64le-gnu@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.30.1.tgz#e8585075ddfb389222c5aada39ea62d6d2511ccc" + integrity sha512-GLrZraoO3wVT4uFXh67ElpwQY0DIygxdv0BNW9Hkm3X34wu+BkqrDrkcsIapAY+N2ATEbvak0XQ9gxZtCIA5Rw== + +"@rollup/rollup-linux-riscv64-gnu@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.30.1.tgz#7d0d40cee7946ccaa5a4e19a35c6925444696a9e" + integrity sha512-0WKLaAUUHKBtll0wvOmh6yh3S0wSU9+yas923JIChfxOaaBarmb/lBKPF0w/+jTVozFnOXJeRGZ8NvOxvk/jcw== + +"@rollup/rollup-linux-s390x-gnu@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.30.1.tgz#c2dcd8a4b08b2f2778eceb7a5a5dfde6240ebdea" + integrity sha512-GWFs97Ruxo5Bt+cvVTQkOJ6TIx0xJDD/bMAOXWJg8TCSTEK8RnFeOeiFTxKniTc4vMIaWvCplMAFBt9miGxgkA== + +"@rollup/rollup-linux-x64-gnu@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.30.1.tgz#183637d91456877cb83d0a0315eb4788573aa588" + integrity sha512-UtgGb7QGgXDIO+tqqJ5oZRGHsDLO8SlpE4MhqpY9Llpzi5rJMvrK6ZGhsRCST2abZdBqIBeXW6WPD5fGK5SDwg== + +"@rollup/rollup-linux-x64-musl@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.30.1.tgz#036a4c860662519f1f9453807547fd2a11d5bb01" + integrity sha512-V9U8Ey2UqmQsBT+xTOeMzPzwDzyXmnAoO4edZhL7INkwQcaW1Ckv3WJX3qrrp/VHaDkEWIBWhRwP47r8cdrOow== + +"@rollup/rollup-win32-arm64-msvc@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.30.1.tgz#51cad812456e616bfe4db5238fb9c7497e042a52" + integrity sha512-WabtHWiPaFF47W3PkHnjbmWawnX/aE57K47ZDT1BXTS5GgrBUEpvOzq0FI0V/UYzQJgdb8XlhVNH8/fwV8xDjw== + +"@rollup/rollup-win32-ia32-msvc@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.30.1.tgz#661c8b3e4cd60f51deaa39d153aac4566e748e5e" + integrity sha512-pxHAU+Zv39hLUTdQQHUVHf4P+0C47y/ZloorHpzs2SXMRqeAWmGghzAhfOlzFHHwjvgokdFAhC4V+6kC1lRRfw== + +"@rollup/rollup-win32-x64-msvc@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.30.1.tgz#73bf1885ff052b82fbb0f82f8671f73c36e9137c" + integrity sha512-D6qjsXGcvhTjv0kI4fU8tUuBDF/Ueee4SVX79VfNDXZa64TfCW1Slkb6Z7O1p7vflqZjcmOVdZlqf8gvJxc6og== "@simple-dom/interface@^1.4.0": version "1.4.0" @@ -740,11 +777,16 @@ "@types/estree" "*" "@types/json-schema" "*" -"@types/estree@*", "@types/estree@1.0.5", "@types/estree@^1.0.0": +"@types/estree@*", "@types/estree@^1.0.0": version "1.0.5" resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz" integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== +"@types/estree@1.0.6": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" + integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== + "@types/json-schema@*": version "7.0.15" resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz" @@ -3293,29 +3335,32 @@ rimraf@^3.0.0, rimraf@^3.0.2: dependencies: glob "^7.1.3" -rollup@^4.18.0: - version "4.18.0" - resolved "https://registry.npmjs.org/rollup/-/rollup-4.18.0.tgz" - integrity sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg== +rollup@^4.30.1: + version "4.30.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.30.1.tgz#d5c3d066055259366cdc3eb6f1d051c5d6afaf74" + integrity sha512-mlJ4glW020fPuLi7DkM/lN97mYEZGWeqBnrljzN0gs7GLctqX3lNWxKQ7Gl712UAX+6fog/L3jh4gb7R6aVi3w== dependencies: - "@types/estree" "1.0.5" + "@types/estree" "1.0.6" optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.18.0" - "@rollup/rollup-android-arm64" "4.18.0" - "@rollup/rollup-darwin-arm64" "4.18.0" - "@rollup/rollup-darwin-x64" "4.18.0" - "@rollup/rollup-linux-arm-gnueabihf" "4.18.0" - "@rollup/rollup-linux-arm-musleabihf" "4.18.0" - "@rollup/rollup-linux-arm64-gnu" "4.18.0" - "@rollup/rollup-linux-arm64-musl" "4.18.0" - "@rollup/rollup-linux-powerpc64le-gnu" "4.18.0" - "@rollup/rollup-linux-riscv64-gnu" "4.18.0" - "@rollup/rollup-linux-s390x-gnu" "4.18.0" - "@rollup/rollup-linux-x64-gnu" "4.18.0" - "@rollup/rollup-linux-x64-musl" "4.18.0" - "@rollup/rollup-win32-arm64-msvc" "4.18.0" - "@rollup/rollup-win32-ia32-msvc" "4.18.0" - "@rollup/rollup-win32-x64-msvc" "4.18.0" + "@rollup/rollup-android-arm-eabi" "4.30.1" + "@rollup/rollup-android-arm64" "4.30.1" + "@rollup/rollup-darwin-arm64" "4.30.1" + "@rollup/rollup-darwin-x64" "4.30.1" + "@rollup/rollup-freebsd-arm64" "4.30.1" + "@rollup/rollup-freebsd-x64" "4.30.1" + "@rollup/rollup-linux-arm-gnueabihf" "4.30.1" + "@rollup/rollup-linux-arm-musleabihf" "4.30.1" + "@rollup/rollup-linux-arm64-gnu" "4.30.1" + "@rollup/rollup-linux-arm64-musl" "4.30.1" + "@rollup/rollup-linux-loongarch64-gnu" "4.30.1" + "@rollup/rollup-linux-powerpc64le-gnu" "4.30.1" + "@rollup/rollup-linux-riscv64-gnu" "4.30.1" + "@rollup/rollup-linux-s390x-gnu" "4.30.1" + "@rollup/rollup-linux-x64-gnu" "4.30.1" + "@rollup/rollup-linux-x64-musl" "4.30.1" + "@rollup/rollup-win32-arm64-msvc" "4.30.1" + "@rollup/rollup-win32-ia32-msvc" "4.30.1" + "@rollup/rollup-win32-x64-msvc" "4.30.1" fsevents "~2.3.2" rsvp@^3.0.14, rsvp@^3.0.18: