From fb76ea7e89b495fa5da64e2469c82102f9c37611 Mon Sep 17 00:00:00 2001 From: Alteras1 <42795314+Alteras1@users.noreply.github.com.> Date: Tue, 11 Mar 2025 12:10:27 -0700 Subject: [PATCH 1/2] Fixes issues with cleaning broken Markdown blocks and reduce words to lines BBob updated to form tree by word instead of linebreak. Reconstructs consecutive strings to form lines so that line break plugin operates properly --- assets/bundled/bbcode-parser.min.js | 2 +- assets/bundled/bbcode-parser.min.js.map | 2 +- assets/stylesheets/common/markdown-shims.scss | 4 +++ bbcode-src/plugins/lineBreak.js | 30 +++++++++++++++++++ bbcode-src/utils/common.js | 7 +++++ bbcode-src/utils/postprocess.js | 18 ++++++++++- 6 files changed, 60 insertions(+), 3 deletions(-) diff --git a/assets/bundled/bbcode-parser.min.js b/assets/bundled/bbcode-parser.min.js index 4b2b347..d7b7b93 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.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;te(n,s,t)),n)}function p(t){return u(t)&&Array.isArray(t.content)?t.content.reduce(((t,e)=>t+p(e)),0):d(t)?String(t).length:0}function f(t){return t.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'").replace(/(javascript|data|vbscript):/gi,"$1%3A")}function b(t,e){switch(typeof e){case"boolean":return e?`${t}`:"";case"number":return`${t}="${e}"`;case"string":return`${t}="${f(e)}"`;case"object":return`${t}="${f(JSON.stringify(e))}"`;default:return""}}function m(t){return null==t?"":h(t,((t,e,n)=>[...t,b(e,n[e])]),[""]).join(" ")}const y=(t,e)=>{const n=h(e||{},((t,e,n)=>n[e]===e?n[e]:null),null);if(n){const s=b(t,n),r={...e};delete r[String(n)];return`${s}${m(r)}`}return`${t}${m(e)}`};class w{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 p(this)}toTagStart({openTag:t=a,closeTag:e=i}={}){return`${t}${y(String(this.tag),this.attrs)}${e}`}toTagEnd({openTag:t=a,closeTag:e=i}={}){return`${t}${c}${this.tag}${e}`}toTagNode(){const t=new w(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 w(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 v="t",x=t=>t&&void 0!==t.v?t.v:"",$=t=>x(t).charCodeAt(0)===c.charCodeAt(0);class k{get type(){return this[v]}isEmpty(){return 0===this[v]||isNaN(this[v])}isText(){return!(!(t=this)||void 0===t[v]||5!==t[v]&&6!==t[v]&&1!==t[v]);var t}isTag(){return!(!(t=this)||void 0===t[v])&&2===t[v];var t}isAttrName(){return!(!(t=this)||void 0===t[v])&&3===t[v];var t}isAttrValue(){return!(!(t=this)||void 0===t[v])&&4===t[v];var t}isStart(){return!$(this)}isEnd(){return $(this)}getName(){return(t=>{const e=x(t);return $(t)?e.slice(1):e})(this)}getValue(){return x(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+=x(t),e+=i,e})(this)}constructor(t,e,n=0,s=0,r=0,o=0){this.l=n,this.r=s,this[v]=t||0,this.v=String(e),this.s=r,this.e=o}}const T=1,A=2,S=3,_=4,C=5,j=6;class L{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 N=(t,e)=>new L(t,e),O="!";const E=0,W=1,I=2,U=0,V=1,q=2,D=[o,n],G=[s,o,n],z=2,P=t=>D.indexOf(t)>=0,M=t=>t===l,B=t=>G.indexOf(t)>=0,R=t=>t===e,F=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 J(t,u={}){let d=0,g=0,h=0,p=-1,f=E,b=U,m="";const y=new Array(Math.floor(t.length)),w=u.openTag||a,v=u.closeTag||i,x=!!u.enableEscapeTags,$=(u.contextFreeTags||[]).filter(Boolean).map((t=>t.toLowerCase())),L=new Map,D=u.onToken||(()=>{}),G=[v,w,r,l,o,n,s,e,O],J=[w,o,n,e],Z=t=>G.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&&$.includes(t.toLowerCase())&&(m=t)},Y=N(t,{onSkip:Q});function tt(t,e,n,s){const r=function(t,e,n=0,s=0,r=0,o=0){return new k(t,e,n,s,r,o)}(t,e,d,g,n,s);D(r),g=h,p+=1,y[p]=r}function et(t,e,n){if(b===V){const e=t=>!(t===s||P(t)),n=t.grabWhile(e),r=t.isLast(),o=t.getCurr()!==s;return t.skip(),r||o?tt(_,F(n)):tt(S,n),r?U:o?V:q}if(b===q){let n=!1;const o=o=>{const a=o===r,i=t.getPrev(),c=t.getNext(),u=i===l,d=c===s,g=P(o),h=c&&P(c);return!(!n||!B(o))||!!(!a||u||(n=!n,n||d||h))&&(!!e||!g)},a=t.grabWhile(o);return t.skip(),tt(_,F(a)),t.getPrev()===r&&g++,t.isLast()?U:V}const o=n+t.getPos()-1,a=t.grabWhile((e=>!(e===s||P(e)||t.isLast())));if(tt(A,a,o,n+t.getLength()+1),X(a),t.skip(),g++,e)return q;return t.includes(s)?V:q}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(T,t),E;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+z;return Y.skip(),tt(A,e,t,n),X(e,a),E}return I}function st(){const t=Y.getPos(),e=Y.grabWhile((t=>t!==v),!0),n=N(e,{onSkip:Q}),s=n.includes(o);for(b=U;n.hasNext();)b=et(n,!s,t);return Y.skip(),E}function rt(){if(R(Y.getCurr()))return tt(j,Y.getCurr()),Y.skip(),h=0,g=0,d++,E;if(P(Y.getCurr())){const t=Y.grabWhile(P);return tt(C,t),E}if(Y.getCurr()===w){if(m){const t=w.length+c.length+m.length,e=`${w}${c}${m}`;if(Y.grabN(t)===e)return W}else if(Y.includes(v))return W;return tt(T,Y.getCurr()),Y.skip(),g++,E}if(x){if(M(Y.getCurr())){const t=Y.getCurr(),e=Y.getNext();return Y.skip(),e&&K(e)?(Y.skip(),tt(T,e),E):(tt(T,t),E)}const t=t=>H(t)&&!M(t),e=Y.grabWhile(t);return tt(T,e),E}const t=Y.grabWhile(H);return tt(T,t),E}return{tokenize:function(){for(f=E;Y.hasNext();)switch(f){case W:f=nt();break;case I:f=st();break;default:f=rt()}return y.length=p+1,y},isTokenNested:function(e){const n=w+c+e.getValue();if(L.has(n))return!!L.get(n);{const e=t.indexOf(n)>-1;return L.set(n,e),e}}}}class Z{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 H=()=>new Z;function K(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=H(),d=H(),g=H(),h=H(),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 y(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()):y(t,e)):t.push(e))}function x(t){b();const e=w.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:J;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)&&y(m(),T,!1),l.toArray()}const Q=t=>"object"==typeof t&&null!==t,X=t=>"boolean"==typeof t;function Y(t,e){const n=t;if(Array.isArray(n))for(let t=0;t[].some.call(e,(e=>tt(t,e))))):!(!Q(t)||!Q(e))&&Object.keys(t).every((n=>{const s=e[n],r=t[n];return Q(r)&&Q(s)?tt(r,s):X(r)?r!==(null===s):s===r})):t===e)}function et(t,e){const n=t;return n.messages=[...n.messages||[]],n.options={...e,...n.options},n.walk=function(t){return Y(this,t)},n.match=function(t,e){return function(t,e,n){return Array.isArray(e)?Y(t,(t=>{for(let s=0;stt(e,t)?n(t):t))}(this,t,e)},n}const nt="/>",st="";function at(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 it(t,e);if(u(t)){if(n)return it(t.content,e);const s=m(t.attrs);return null===t.content?rt+t.tag+s+nt:rt+t.tag+s+ot+it(t.content,e)+st+t.tag+ot}return""}function it(t,e){return t&&Array.isArray(t)?t.reduce(((t,n)=>t+at(n,e)),""):t?at(t,e):""}const ct=(t,e,n=[])=>({tag:t,attrs:e,content:n,gen:!0}),lt=(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}},ut=(t,e)=>{if(t.start)return e.substring(t.start.from,t.start.to);if(!t.attrs)return`[${t.tag}]`;const n=lt(t,e);return n._default?`[${t.tag}=${n._default}]`:t.toTagStart()},dt=(t,e)=>t.end?e.substring(t.end.from,t.end.to):t.toTagEnd(),gt=(t,e,n)=>{const s=t.substring(n||0).search(e);return s>=0?s+(n||0):s},ht="\x3c!-- bbcode injected newlines --\x3e\n\n",pt="\n\n\x3c!-- bbcode pre injected newlines --\x3e",ft="\x3c!-- bbcode injected newlines --\x3e",bt=new RegExp(`^${/(http|ftp|https|upload):\/\/([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:\/~+#-]*[\w@?^=%&\/~+#-])/.source}|${/\!?\[.*\]\((http|ftp|https|upload):\/\/([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:\/~+#-]*[\w@?^=%&\/~+#-])\)/.source}$`),mt=/((\n|^)(?```+|~~~+)(?.*\n))|(?\[(?i?code|plain)(=.*)?\])|(?(?`{1,2})(.*)(?\k))/im,yt=/^(\|[^\n]+\|\r?\n)((?:\| ?:?[-]+:? ?)+\|)(\n(?:\|[^\n]+\|\r?\n?)*)?$/m,wt="\n
    ",vt="\n
      ",xt="\n
      ";function $t(){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 kt=t=>"string"==typeof t,Tt=(t,e=!1)=>{const n=t;if(Array.isArray(n)){At(n),n.some(kt)&&(n.unshift(ht),n.push(ht));for(let t=0;t{const e=[];let n="";for(const s of t)kt(s)&&!g(s)?n+=s:kt(s)&&g(s)?(n&&e.push(n),e.push(s),n=""):(e.push(n),e.push(s),n="");n&&e.push(n),t.splice(0,t.length,...e)},St=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 Ct=Symbol("slide-title-open"),jt=Symbol("slide-title-close"),Lt=Symbol("slide-close"),Nt=/(?\{slide=)|(?\})|(?\{\/slide\})/i;function Ot(t){switch(t){case Ct:return"{slide=";case jt:return"}";case Lt:return"{/slide}";default:return t}}const Et={accordion:(t,e)=>{const n=$t(),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=gt(n,Nt);if(-1===s){e.push(t.shift());continue}const r=n.match(Nt),o=n.slice(0,s),a=n.slice(s+r[0].length);o.length&&e.push(o),r.groups.slideTitleOpen&&e.push(Ct),r.groups.slideTitleClose&&e.push(jt),r.groups.slideClose&&e.push(Lt),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===Ct&&null===s)n=w.create("slide"),n.content=[],n.customTitle=[],s=Ct;else{if(r===jt&&s===Ct){s=jt;continue}r===Lt&&n&&s===jt?(e.push(n),n=null,s=null):n?s===Ct?n.customTitle.push(Ot(r)):n.content.push(Ot(r)):e.push(Ot(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[ut(t,e.data.raw),...t.content,dt(t,e.data.raw)];const a=lt(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};`),ct("div",{class:"bb-accordion "+i,"data-group-id":n,style:c},o)},slide:(t,e)=>{if(!t.isValid)return[ut(t,e.data.raw),...t.content,dt(t,e.data.raw)];const n=lt(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[ct("details",{class:"bb-slide",open:r},[ct("summary",{class:"bb-slide-title",style:`text-align: ${o}; ${n.style||""}`},s),ct("div",{class:"bb-slide-content"},t.content)])]}},Wt={left:t=>ct("div",{class:"bb-left"},t.content),center:t=>ct("div",{class:"bb-center"},t.content),right:t=>ct("div",{class:"bb-right"},t.content)},It={a:(t,e)=>{const n=lt(t,e.data.raw)._default||"";return ct("a",{id:`user-anchor-${n.trim()}`,name:`user-anchor-${n.trim()}`},t.content)},goto:(t,e)=>{const n=lt(t,e.data.raw)._default||"";return ct("a",{href:`#user-anchor-${n.trim()}`},t.content)}},Ut=["arial","book antiqua","courier new","georgia","tahoma","times new roman","trebuchet ms","verdana"],Vt={thin:"100",extralight:"200",light:"300",regular:"400",medium:"500",semibold:"600",bold:"700",extrabold:"800",black:"900"},qt=["ital","opsz","slnt","wdth","wght"],Dt=/(?[a-zA-Z]*)?\s?(?[0-9]*)?\s?(?italic)?/;const Gt=ct("div",{class:"bb-email-header"},""),zt=ct("div",{class:"bb-email-footer"},ct("div",{class:"bb-email-button"},"")),Pt={row:t=>ct("div",{class:"bb-row"},t.content),column:(t,e)=>{const n=lt(t,e.data.raw)._default||"8",s=n.startsWith("span")?`column-width-${n}`:`column-width-span${n}`;return ct("div",{class:"bb-column","data-span":s},t.content)}},Mt=["init","click","change","input","dblclick","mouseenter","mouseleave","scroll"];const Bt=["me","them","right","left"],Rt={textmessage:(t,e)=>{const n=lt(t,e.data.raw)._default||"Recipient",s=""!==n.trim()?n:"Recipient";return ct("div",{class:"bb-textmessage"},[ct("div",{class:"bb-textmessage-name"},s),ct("div",{class:"bb-textmessage-overflow"},[ct("div",{class:"bb-textmessage-content"},t.content)])])},message:(t,e)=>{let n=lt(t,e.data.raw)._default.toLowerCase();Bt.includes(n)&&"right"!==n||(n="me"),"left"===n&&(n="them");return ct("div",{class:"me"===n?"bb-message-me":"bb-message-them"},[ct("div",{class:"bb-message-content"},t.content)])}},Ft={...Et,...Wt,...It,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=lt(t,e.data.raw)?._default||"",r=t.content.filter((t=>u(t)&&"keyframe"===t.tag)).map((t=>{t.isValid=!0;const n=lt(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=lt(t,e.data.raw)._default;return ct("div",{style:`background-color: ${n};`,class:"bb-background"},t.content)},block:(t,e)=>{const n="block",s=(lt(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 ct("table",{class:"bb-block","data-bb-block":r},[ct("tbody",[ct("tr",[ct("td",{class:"bb-block-icon"}),ct("td",{class:"bb-block-content"},t.content)])])])},blockquote:(t,e)=>{const n=lt(t,e.data.raw)._default||"";return ct("div",{class:"bb-blockquote"},[ct("div",{class:"bb-blockquote-left"}),ct("div",{class:"bb-blockquote-content"},[t.content,ct("div",{class:"bb-blockquote-speaker"},""!==n?`- ${n}`:"")]),ct("div",{class:"bb-blockquote-right"})])},border:(t,e)=>{const n=lt(t,e.data.raw)._default;return ct("div",{style:`border: ${n};`,class:"bb-border"},t.content)},br:()=>ct("br",{},null),centerblock:(t,e)=>{const n=lt(t,e.data.raw)._default||"50";return ct("div",{style:`margin: 0 auto; width: ${n}%`},t.content)},check:(t,e)=>{const n=lt(t,e.data.raw)._default||"dot";return ct("div",{class:"bb-check","data-type":n},t.content)},class:(t,e)=>{const n=lt(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:["```"+(lt(t)._default||"bbcode")+"\n",t.content,"\n```\n"]}),color:t=>{const e=lt(t)._default||"";return""===e.trim()?t.content:ct("span",{style:`color: ${e}`},t.content)},comment:t=>ct("span",{class:"hidden"},t.content),div:(t,e)=>{if(t.gen)return t;const n=lt(t,e.data.raw),s=n.style||n._default,r=n.class;if(!r?.trim())return ct("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 ct("div",{class:a,style:s},t.content)},divide:t=>{const e=(lt(t)._default||"").toLowerCase();return ct("span",{class:"bb-divide","data-type":e},t.content)},fieldset:(t,e)=>{const n=lt(t,e.data.raw)._default||"";return ct("fieldset",{class:"bb-fieldset"},[ct("legend",{class:"bb-fieldset-legend"},n),ct("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"]};`:"",ct("i",{"data-bbcode-fa":null},[ct("i",{class:(t.content||[]).join(""),style:n,"data-fa-transform":e["fa-transform"]||""},[])])},font:(t,e)=>{const n=lt(t,e.data.raw),s=n?._default||n.family||n.name;if(""===s.trim())return t.content;if(Ut.includes(s.trim().toLowerCase()))return ct("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=Dt.exec(n).groups||{};s?.italic&&(e.ital=1);const r=s.weight;r&&r>=0&&r<=900?e.wght=r:Object.keys(Vt).includes(s.named_weight||"")&&(e.wght=Vt[s.named_weight]),e={...e,...Object.fromEntries(Object.entries(t).filter((([t])=>qt.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(", ")+";"),ct("span",{style:`font-family: '${s}'; font-weight: ${r.wght}; font-style: ${a}; ${c}`,"data-font":o},t.content)},h:t=>ct("h1",{},t.content),h1:t=>ct("h1",{},t.content),h2:t=>ct("h2",{},t.content),h3:t=>ct("h3",{},t.content),h4:t=>ct("h4",{},t.content),h5:t=>ct("h5",{},t.content),h6:t=>ct("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}(lt(t)._default).toString();return ct("div","0"===e?{class:"bb-height-restrict"}:{class:"bb-height-restrict",style:`height: ${e}px;`},t.content)},highlight:t=>ct("span",{class:"bb-highlight"},t.content),icode:t=>({isWhitespaceSensitive:!0,content:["`",t.content,"`"]}),imagefloat:t=>{const e=lt(t)._default||"";return ct("div",{class:`bb-float-${e}`},t.content)},inlinespoiler:t=>ct("span",{class:"bb-inline-spoiler"},t.content),justify:t=>ct("div",{class:"bb-justify"},t.content),keyframe:(t,e)=>t.isValid?[]:[ut(t,e.data.raw),...t.content,dt(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 ct("div",{class:"bb-email","data-bb-email":n.mailOption},[Gt,(o=n.person,ct("div",{class:"bb-email-address"},o)),(r=n.subject,ct("div",{class:"bb-email-subject"},r)),(s=t.content,ct("div",{class:"bb-email-content"},s)),zt]);var s,r,o},newspaper:t=>ct("div",{class:"bb-newspaper"},t.content),nobr:t=>({disableLineBreakConversion:!0,content:t.content}),note:t=>ct("div",{class:"bb-note"},[ct("div",{class:"bb-note-tape"},""),ct("div",{class:"bb-note-content"},[t.content,ct("div",{class:"bb-note-footer"},"")])]),ooc:t=>ct("div",{class:"bb-ooc"},t.content),pindent:t=>ct("span",{class:"bb-pindent"},t.content),plain:t=>t.content,print:t=>{const e="print",n=(lt(t)._default||e).toLowerCase(),s=["print","line","graph","parchment"].includes(n)?n:e;return ct("div",{class:s===e?"bb-print":`bb-print-${s}`},t.content)},progress:t=>{const e=lt(t)._default;return ct("div",{class:"bb-progress"},[ct("div",{class:"bb-progress-text"},t.content),ct("div",{class:"bb-progress-bar",style:`width: calc(${e}% - 6px)`},""),ct("div",{class:"bb-progress-bar-other"},"")])},quote:(t,e)=>{const n=lt(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"]},...Pt,thinprogress:(t,e)=>{const n=lt(t,e.data.raw)._default;return ct("div",{class:"bb-progress-thin"},[ct("div",{class:"bb-progress-text"},t.content),ct("div",{class:"bb-progress-bar",style:`width: calc(${n}% - 6px)`},""),ct("div",{class:"bb-progress-bar-other"},"")])},savenl:t=>({isWhitespaceSensitive:!0,content:t.content}),sh:t=>ct("h2",{},t.content),script:(t,e)=>{const n=lt(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=Mt.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}(lt(t,e.data.raw)._default);return ct("div",{class:"bb-scroll",style:`height: ${n}px`},t.content)},side:t=>{const e=lt(t)._default||"left";return ct("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=lt(t,e.data.raw)._default;return ct("details",{class:"bb-spoiler"},[ct("summary",{},"Spoiler"+(n?`: ${n}`:"")),ct("div",{class:"bb-spoiler-content"},t.content)])},sub:t=>ct("sub",{},t.content),sup:t=>ct("sup",{},t.content),tab:(t,e)=>{if(!t.isValid)return[ut(t,e.data.raw),...t.content,dt(t,e.data.raw)];const n=lt(t,e.data.raw),s=n._default||n.name||"Tab",r=`tab-${s.replace(/\W/g,"_")}-${$t()}`;return[ct("input",{type:"radio",id:r,name:"tab-group-"+t.groupId,class:"bb-tab",checked:t.open}),ct("label",{class:"bb-tab-label",for:r,style:n.style},s),ct("div",{class:"bb-tab-content"},t.content)]},tabs:(t,e)=>{const n=t.content.filter((t=>u(t)&&"tab"===t.tag)),s=$t();return n.forEach((t=>{t.isValid=!0,t.groupId=s})),n.length?(n[0].open=!0,ct("div",{class:"bb-tabs"},n)):[ut(t,e.data.raw),...t.content,dt(t,e.data.raw)]},...Rt,b:t=>ct("span",{class:"bbcode-b"},t.content),i:t=>t.gen?t:ct("span",{class:"bbcode-i"},t.content),u:t=>ct("span",{class:"bbcode-u"},t.content),s:t=>ct("span",{class:"bbcode-s"},t.content)},Jt=Object.keys(Ft),Zt=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}(Ft);function Ht(t){return t.replaceAll(ht,"").replaceAll(pt,"").replaceAll("\n"+ft,"").replaceAll(ft+"\n","").replaceAll(ft,"")}function Kt(t){return t.replaceAll(wt,"").replaceAll(vt,"").replaceAll(xt,"")}function Qt(t,e){const n=e.hoistMap;for(const[e,s]of Object.entries(n))t=t.replaceAll(e,s);return t}function Xt(t,e){if(0===e.styles.length)return t;return'"+t}function Yt(t,e){if(0===e.bbscripts.length)return t;return e.bbscripts.map((t=>``)).join("")+t}function te(t,e){const n={};let s=0;const r=(e,s,r,o=!1)=>{const a=$t();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=gt(t,mt,s));){const e=mt.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=gt(t,a,s+r.length),c=$t();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 ee(t,e){let n=0;for(;-1!==(n=gt(t,yt,n));){const e=yt.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 ne={onlyAllowTags:[...Jt],caseFreeTags:!0,contextFreeTags:["plain","code","icode","class","fa"],enableEscapeTags:!0,onError:t=>{ne.previewing&&console.warn(t.message,t.lineNumber,t.columnNumber)}},se=Zt();t.RpNBBCode=(t,e)=>{const n=[se];e.preserveWhitespace&&n.push((t=>St(t))),n.push((t=>Tt(t)));const[s,r]=function(t){let e={};const n=[te,ee];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:K,render:n,data:null},o=r.parser||K,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)?et(t||[],r):et(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 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 +{"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\nconst MD_BROKEN_ORDERED_LIST = \"
\\n
    \";\nconst MD_BROKEN_UNORDERED_LIST = \"\\n
      \";\nconst MD_BROKEN_BLOCKQUOTE = \"\\n
      \";\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 MD_BROKEN_ORDERED_LIST,\n MD_BROKEN_UNORDERED_LIST,\n MD_BROKEN_BLOCKQUOTE,\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 reduceWordsToLines(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 * Reduces the list into lines, so that we can process them by line.\n * Performs in place.\n * @param {(string|Object)[]} words\n */\nconst reduceWordsToLines = (words) => {\n const lines = [];\n let line = \"\";\n for (const word of words) {\n if (isString(word) && !isEOL(word)) {\n line += word;\n } else if (isString(word) && isEOL(word)) {\n if (line) {\n lines.push(line);\n }\n lines.push(word);\n line = \"\";\n } else {\n lines.push(line);\n lines.push(word);\n line = \"\";\n }\n }\n if (line) {\n lines.push(line);\n }\n words.splice(0, words.length, ...lines);\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 {\n MD_BROKEN_BLOCKQUOTE,\n MD_BROKEN_ORDERED_LIST,\n MD_BROKEN_UNORDERED_LIST,\n MD_NEWLINE_INJECT,\n MD_NEWLINE_INJECT_COMMENT,\n MD_NEWLINE_PRE_INJECT,\n} 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\nfunction cleanMultilineMDBlocks(raw) {\n const processed = raw\n .replaceAll(MD_BROKEN_ORDERED_LIST, \"\")\n .replaceAll(MD_BROKEN_UNORDERED_LIST, \"\")\n .replaceAll(MD_BROKEN_BLOCKQUOTE, \"\");\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 cleanMultilineMDBlocks,\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","isEOL","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","MD_BROKEN_ORDERED_LIST","MD_BROKEN_UNORDERED_LIST","MD_BROKEN_BLOCKQUOTE","generateGUID","d","Date","getTime","window","performance","now","random","isString","disableLineBreakConversion","reduceWordsToLines","unshift","child","splice","isWhitespaceSensitive","test","words","lines","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","cleanMultilineMDBlocks","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/assets/stylesheets/common/markdown-shims.scss b/assets/stylesheets/common/markdown-shims.scss index 7f5049c..f02beb7 100644 --- a/assets/stylesheets/common/markdown-shims.scss +++ b/assets/stylesheets/common/markdown-shims.scss @@ -8,3 +8,7 @@ pre:has(> code) + br { aside.quote + br { display: none; } + +:is(ul, ol, blockquote) + br:has(+ ul, + ol, + blockquote) { + display: none; +} diff --git a/bbcode-src/plugins/lineBreak.js b/bbcode-src/plugins/lineBreak.js index e6ce85a..89b710a 100644 --- a/bbcode-src/plugins/lineBreak.js +++ b/bbcode-src/plugins/lineBreak.js @@ -27,6 +27,7 @@ const walk = (t, disableLineBreakConversion = false) => { const tree = t; if (Array.isArray(tree)) { + reduceWordsToLines(tree); if (tree.some(isString)) { // array contains strings. Might be md compatible tree.unshift(MD_NEWLINE_INJECT); @@ -69,6 +70,35 @@ const walk = (t, disableLineBreakConversion = false) => { return tree; }; +/** + * Reduces the list into lines, so that we can process them by line. + * Performs in place. + * @param {(string|Object)[]} words + */ +const reduceWordsToLines = (words) => { + const lines = []; + let line = ""; + for (const word of words) { + if (isString(word) && !isEOL(word)) { + line += word; + } else if (isString(word) && isEOL(word)) { + if (line) { + lines.push(line); + } + lines.push(word); + line = ""; + } else { + lines.push(line); + lines.push(word); + line = ""; + } + } + if (line) { + lines.push(line); + } + words.splice(0, words.length, ...lines); +}; + /** * Converts `\n` to `
      ` self closing tag. Supply this as the last plugin in the preset lists * diff --git a/bbcode-src/utils/common.js b/bbcode-src/utils/common.js index bb00296..c250cb6 100644 --- a/bbcode-src/utils/common.js +++ b/bbcode-src/utils/common.js @@ -121,6 +121,10 @@ const ESCAPABLES_REGEX = /((\n|^)(?```+|~~~+)(?.*\n))|(?\[(?i?code|plain)(=.*)?\])|(?(?`{1,2})(.*)(?\k))/im; const MD_TABLE_REGEX = /^(\|[^\n]+\|\r?\n)((?:\| ?:?[-]+:? ?)+\|)(\n(?:\|[^\n]+\|\r?\n?)*)?$/m; +const MD_BROKEN_ORDERED_LIST = "
\n
    "; +const MD_BROKEN_UNORDERED_LIST = "\n
      "; +const MD_BROKEN_BLOCKQUOTE = "\n
      "; + /** * Generates a random GUID. * @@ -156,4 +160,7 @@ export { MD_TABLE_REGEX, URL_REGEX_SINGLE_LINE, ESCAPABLES_REGEX, + MD_BROKEN_ORDERED_LIST, + MD_BROKEN_UNORDERED_LIST, + MD_BROKEN_BLOCKQUOTE, }; diff --git a/bbcode-src/utils/postprocess.js b/bbcode-src/utils/postprocess.js index 966d18c..3617ed6 100644 --- a/bbcode-src/utils/postprocess.js +++ b/bbcode-src/utils/postprocess.js @@ -1,4 +1,11 @@ -import { MD_NEWLINE_INJECT, MD_NEWLINE_INJECT_COMMENT, MD_NEWLINE_PRE_INJECT } from "./common"; +import { + MD_BROKEN_BLOCKQUOTE, + MD_BROKEN_ORDERED_LIST, + MD_BROKEN_UNORDERED_LIST, + MD_NEWLINE_INJECT, + MD_NEWLINE_INJECT_COMMENT, + MD_NEWLINE_PRE_INJECT, +} from "./common"; /** * Post Processing designed to fix issues with Markdown and BBCode that the parser can't fix. @@ -17,6 +24,14 @@ function removeNewlineInjects(raw) { return processed; } +function cleanMultilineMDBlocks(raw) { + const processed = raw + .replaceAll(MD_BROKEN_ORDERED_LIST, "") + .replaceAll(MD_BROKEN_UNORDERED_LIST, "") + .replaceAll(MD_BROKEN_BLOCKQUOTE, ""); + return processed; +} + /** * Injects hoisted code blocks back into the raw string * @param {string} raw input to inject hoisted code blocks into @@ -81,6 +96,7 @@ export function postprocess(raw, data) { removeNewlineInjects, createClassStyleTagTemplate, createScriptTagTemplate, + cleanMultilineMDBlocks, renderHoistedCodeBlocks, ]; for (const postprocessor of postprocessors) { From be3daef5fa9700fb85a37d3f163052678f9f9270 Mon Sep 17 00:00:00 2001 From: Alteras1 <42795314+Alteras1@users.noreply.github.com.> Date: Mon, 17 Mar 2025 16:04:02 -0700 Subject: [PATCH 2/2] Convert `reduceWordsToLines()` to use moving index --- assets/bundled/bbcode-parser.min.js | 2 +- assets/bundled/bbcode-parser.min.js.map | 2 +- bbcode-src/plugins/lineBreak.js | 35 +++++++++++++------------ 3 files changed, 20 insertions(+), 19 deletions(-) diff --git a/assets/bundled/bbcode-parser.min.js b/assets/bundled/bbcode-parser.min.js index d7b7b93..5e09ad7 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){return t===e}function h(t,e,n){return Object.keys(t).reduce(((n,s)=>e(n,s,t)),n)}function p(t){return u(t)&&Array.isArray(t.content)?t.content.reduce(((t,e)=>t+p(e)),0):d(t)?String(t).length:0}function f(t){return t.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'").replace(/(javascript|data|vbscript):/gi,"$1%3A")}function b(t,e){switch(typeof e){case"boolean":return e?`${t}`:"";case"number":return`${t}="${e}"`;case"string":return`${t}="${f(e)}"`;case"object":return`${t}="${f(JSON.stringify(e))}"`;default:return""}}function m(t){return null==t?"":h(t,((t,e,n)=>[...t,b(e,n[e])]),[""]).join(" ")}const y=(t,e)=>{const n=h(e||{},((t,e,n)=>n[e]===e?n[e]:null),null);if(n){const s=b(t,n),r={...e};delete r[String(n)];return`${s}${m(r)}`}return`${t}${m(e)}`};class w{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 p(this)}toTagStart({openTag:t=a,closeTag:e=i}={}){return`${t}${y(String(this.tag),this.attrs)}${e}`}toTagEnd({openTag:t=a,closeTag:e=i}={}){return`${t}${c}${this.tag}${e}`}toTagNode(){const t=new w(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 w(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 v="t",x=t=>t&&void 0!==t.v?t.v:"",$=t=>x(t).charCodeAt(0)===c.charCodeAt(0);class k{get type(){return this[v]}isEmpty(){return 0===this[v]||isNaN(this[v])}isText(){return!(!(t=this)||void 0===t[v]||5!==t[v]&&6!==t[v]&&1!==t[v]);var t}isTag(){return!(!(t=this)||void 0===t[v])&&2===t[v];var t}isAttrName(){return!(!(t=this)||void 0===t[v])&&3===t[v];var t}isAttrValue(){return!(!(t=this)||void 0===t[v])&&4===t[v];var t}isStart(){return!$(this)}isEnd(){return $(this)}getName(){return(t=>{const e=x(t);return $(t)?e.slice(1):e})(this)}getValue(){return x(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+=x(t),e+=i,e})(this)}constructor(t,e,n=0,s=0,r=0,o=0){this.l=n,this.r=s,this[v]=t||0,this.v=String(e),this.s=r,this.e=o}}const T=1,A=2,S=3,_=4,C=5,j=6;class L{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 N=(t,e)=>new L(t,e),O="!";const E=0,W=1,I=2,U=0,V=1,q=2,D=[o,n],G=[s,o,n],z=2,P=t=>D.indexOf(t)>=0,M=t=>t===l,B=t=>G.indexOf(t)>=0,R=t=>t===e,F=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 J(t,u={}){let d=0,g=0,h=0,p=-1,f=E,b=U,m="";const y=new Array(Math.floor(t.length)),w=u.openTag||a,v=u.closeTag||i,x=!!u.enableEscapeTags,$=(u.contextFreeTags||[]).filter(Boolean).map((t=>t.toLowerCase())),L=new Map,D=u.onToken||(()=>{}),G=[v,w,r,l,o,n,s,e,O],J=[w,o,n,e],Z=t=>G.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&&$.includes(t.toLowerCase())&&(m=t)},Y=N(t,{onSkip:Q});function tt(t,e,n,s){const r=function(t,e,n=0,s=0,r=0,o=0){return new k(t,e,n,s,r,o)}(t,e,d,g,n,s);D(r),g=h,p+=1,y[p]=r}function et(t,e,n){if(b===V){const e=t=>!(t===s||P(t)),n=t.grabWhile(e),r=t.isLast(),o=t.getCurr()!==s;return t.skip(),r||o?tt(_,F(n)):tt(S,n),r?U:o?V:q}if(b===q){let n=!1;const o=o=>{const a=o===r,i=t.getPrev(),c=t.getNext(),u=i===l,d=c===s,g=P(o),h=c&&P(c);return!(!n||!B(o))||!!(!a||u||(n=!n,n||d||h))&&(!!e||!g)},a=t.grabWhile(o);return t.skip(),tt(_,F(a)),t.getPrev()===r&&g++,t.isLast()?U:V}const o=n+t.getPos()-1,a=t.grabWhile((e=>!(e===s||P(e)||t.isLast())));if(tt(A,a,o,n+t.getLength()+1),X(a),t.skip(),g++,e)return q;return t.includes(s)?V:q}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(T,t),E;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+z;return Y.skip(),tt(A,e,t,n),X(e,a),E}return I}function st(){const t=Y.getPos(),e=Y.grabWhile((t=>t!==v),!0),n=N(e,{onSkip:Q}),s=n.includes(o);for(b=U;n.hasNext();)b=et(n,!s,t);return Y.skip(),E}function rt(){if(R(Y.getCurr()))return tt(j,Y.getCurr()),Y.skip(),h=0,g=0,d++,E;if(P(Y.getCurr())){const t=Y.grabWhile(P);return tt(C,t),E}if(Y.getCurr()===w){if(m){const t=w.length+c.length+m.length,e=`${w}${c}${m}`;if(Y.grabN(t)===e)return W}else if(Y.includes(v))return W;return tt(T,Y.getCurr()),Y.skip(),g++,E}if(x){if(M(Y.getCurr())){const t=Y.getCurr(),e=Y.getNext();return Y.skip(),e&&K(e)?(Y.skip(),tt(T,e),E):(tt(T,t),E)}const t=t=>H(t)&&!M(t),e=Y.grabWhile(t);return tt(T,e),E}const t=Y.grabWhile(H);return tt(T,t),E}return{tokenize:function(){for(f=E;Y.hasNext();)switch(f){case W:f=nt();break;case I:f=st();break;default:f=rt()}return y.length=p+1,y},isTokenNested:function(e){const n=w+c+e.getValue();if(L.has(n))return!!L.get(n);{const e=t.indexOf(n)>-1;return L.set(n,e),e}}}}class Z{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 H=()=>new Z;function K(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=H(),d=H(),g=H(),h=H(),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 y(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()):y(t,e)):t.push(e))}function x(t){b();const e=w.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:J;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)&&y(m(),T,!1),l.toArray()}const Q=t=>"object"==typeof t&&null!==t,X=t=>"boolean"==typeof t;function Y(t,e){const n=t;if(Array.isArray(n))for(let t=0;t[].some.call(e,(e=>tt(t,e))))):!(!Q(t)||!Q(e))&&Object.keys(t).every((n=>{const s=e[n],r=t[n];return Q(r)&&Q(s)?tt(r,s):X(r)?r!==(null===s):s===r})):t===e)}function et(t,e){const n=t;return n.messages=[...n.messages||[]],n.options={...e,...n.options},n.walk=function(t){return Y(this,t)},n.match=function(t,e){return function(t,e,n){return Array.isArray(e)?Y(t,(t=>{for(let s=0;stt(e,t)?n(t):t))}(this,t,e)},n}const nt="/>",st="";function at(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 it(t,e);if(u(t)){if(n)return it(t.content,e);const s=m(t.attrs);return null===t.content?rt+t.tag+s+nt:rt+t.tag+s+ot+it(t.content,e)+st+t.tag+ot}return""}function it(t,e){return t&&Array.isArray(t)?t.reduce(((t,n)=>t+at(n,e)),""):t?at(t,e):""}const ct=(t,e,n=[])=>({tag:t,attrs:e,content:n,gen:!0}),lt=(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}},ut=(t,e)=>{if(t.start)return e.substring(t.start.from,t.start.to);if(!t.attrs)return`[${t.tag}]`;const n=lt(t,e);return n._default?`[${t.tag}=${n._default}]`:t.toTagStart()},dt=(t,e)=>t.end?e.substring(t.end.from,t.end.to):t.toTagEnd(),gt=(t,e,n)=>{const s=t.substring(n||0).search(e);return s>=0?s+(n||0):s},ht="\x3c!-- bbcode injected newlines --\x3e\n\n",pt="\n\n\x3c!-- bbcode pre injected newlines --\x3e",ft="\x3c!-- bbcode injected newlines --\x3e",bt=new RegExp(`^${/(http|ftp|https|upload):\/\/([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:\/~+#-]*[\w@?^=%&\/~+#-])/.source}|${/\!?\[.*\]\((http|ftp|https|upload):\/\/([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:\/~+#-]*[\w@?^=%&\/~+#-])\)/.source}$`),mt=/((\n|^)(?```+|~~~+)(?.*\n))|(?\[(?i?code|plain)(=.*)?\])|(?(?`{1,2})(.*)(?\k))/im,yt=/^(\|[^\n]+\|\r?\n)((?:\| ?:?[-]+:? ?)+\|)(\n(?:\|[^\n]+\|\r?\n?)*)?$/m,wt="
\n
    ",vt="\n
      ",xt="\n
      ";function $t(){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 kt=t=>"string"==typeof t,Tt=(t,e=!1)=>{const n=t;if(Array.isArray(n)){At(n),n.some(kt)&&(n.unshift(ht),n.push(ht));for(let t=0;t{const e=[];let n="";for(const s of t)kt(s)&&!g(s)?n+=s:kt(s)&&g(s)?(n&&e.push(n),e.push(s),n=""):(e.push(n),e.push(s),n="");n&&e.push(n),t.splice(0,t.length,...e)},St=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 Ct=Symbol("slide-title-open"),jt=Symbol("slide-title-close"),Lt=Symbol("slide-close"),Nt=/(?\{slide=)|(?\})|(?\{\/slide\})/i;function Ot(t){switch(t){case Ct:return"{slide=";case jt:return"}";case Lt:return"{/slide}";default:return t}}const Et={accordion:(t,e)=>{const n=$t(),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=gt(n,Nt);if(-1===s){e.push(t.shift());continue}const r=n.match(Nt),o=n.slice(0,s),a=n.slice(s+r[0].length);o.length&&e.push(o),r.groups.slideTitleOpen&&e.push(Ct),r.groups.slideTitleClose&&e.push(jt),r.groups.slideClose&&e.push(Lt),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===Ct&&null===s)n=w.create("slide"),n.content=[],n.customTitle=[],s=Ct;else{if(r===jt&&s===Ct){s=jt;continue}r===Lt&&n&&s===jt?(e.push(n),n=null,s=null):n?s===Ct?n.customTitle.push(Ot(r)):n.content.push(Ot(r)):e.push(Ot(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[ut(t,e.data.raw),...t.content,dt(t,e.data.raw)];const a=lt(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};`),ct("div",{class:"bb-accordion "+i,"data-group-id":n,style:c},o)},slide:(t,e)=>{if(!t.isValid)return[ut(t,e.data.raw),...t.content,dt(t,e.data.raw)];const n=lt(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[ct("details",{class:"bb-slide",open:r},[ct("summary",{class:"bb-slide-title",style:`text-align: ${o}; ${n.style||""}`},s),ct("div",{class:"bb-slide-content"},t.content)])]}},Wt={left:t=>ct("div",{class:"bb-left"},t.content),center:t=>ct("div",{class:"bb-center"},t.content),right:t=>ct("div",{class:"bb-right"},t.content)},It={a:(t,e)=>{const n=lt(t,e.data.raw)._default||"";return ct("a",{id:`user-anchor-${n.trim()}`,name:`user-anchor-${n.trim()}`},t.content)},goto:(t,e)=>{const n=lt(t,e.data.raw)._default||"";return ct("a",{href:`#user-anchor-${n.trim()}`},t.content)}},Ut=["arial","book antiqua","courier new","georgia","tahoma","times new roman","trebuchet ms","verdana"],Vt={thin:"100",extralight:"200",light:"300",regular:"400",medium:"500",semibold:"600",bold:"700",extrabold:"800",black:"900"},qt=["ital","opsz","slnt","wdth","wght"],Dt=/(?[a-zA-Z]*)?\s?(?[0-9]*)?\s?(?italic)?/;const Gt=ct("div",{class:"bb-email-header"},""),zt=ct("div",{class:"bb-email-footer"},ct("div",{class:"bb-email-button"},"")),Pt={row:t=>ct("div",{class:"bb-row"},t.content),column:(t,e)=>{const n=lt(t,e.data.raw)._default||"8",s=n.startsWith("span")?`column-width-${n}`:`column-width-span${n}`;return ct("div",{class:"bb-column","data-span":s},t.content)}},Mt=["init","click","change","input","dblclick","mouseenter","mouseleave","scroll"];const Bt=["me","them","right","left"],Rt={textmessage:(t,e)=>{const n=lt(t,e.data.raw)._default||"Recipient",s=""!==n.trim()?n:"Recipient";return ct("div",{class:"bb-textmessage"},[ct("div",{class:"bb-textmessage-name"},s),ct("div",{class:"bb-textmessage-overflow"},[ct("div",{class:"bb-textmessage-content"},t.content)])])},message:(t,e)=>{let n=lt(t,e.data.raw)._default.toLowerCase();Bt.includes(n)&&"right"!==n||(n="me"),"left"===n&&(n="them");return ct("div",{class:"me"===n?"bb-message-me":"bb-message-them"},[ct("div",{class:"bb-message-content"},t.content)])}},Ft={...Et,...Wt,...It,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=lt(t,e.data.raw)?._default||"",r=t.content.filter((t=>u(t)&&"keyframe"===t.tag)).map((t=>{t.isValid=!0;const n=lt(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=lt(t,e.data.raw)._default;return ct("div",{style:`background-color: ${n};`,class:"bb-background"},t.content)},block:(t,e)=>{const n="block",s=(lt(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 ct("table",{class:"bb-block","data-bb-block":r},[ct("tbody",[ct("tr",[ct("td",{class:"bb-block-icon"}),ct("td",{class:"bb-block-content"},t.content)])])])},blockquote:(t,e)=>{const n=lt(t,e.data.raw)._default||"";return ct("div",{class:"bb-blockquote"},[ct("div",{class:"bb-blockquote-left"}),ct("div",{class:"bb-blockquote-content"},[t.content,ct("div",{class:"bb-blockquote-speaker"},""!==n?`- ${n}`:"")]),ct("div",{class:"bb-blockquote-right"})])},border:(t,e)=>{const n=lt(t,e.data.raw)._default;return ct("div",{style:`border: ${n};`,class:"bb-border"},t.content)},br:()=>ct("br",{},null),centerblock:(t,e)=>{const n=lt(t,e.data.raw)._default||"50";return ct("div",{style:`margin: 0 auto; width: ${n}%`},t.content)},check:(t,e)=>{const n=lt(t,e.data.raw)._default||"dot";return ct("div",{class:"bb-check","data-type":n},t.content)},class:(t,e)=>{const n=lt(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:["```"+(lt(t)._default||"bbcode")+"\n",t.content,"\n```\n"]}),color:t=>{const e=lt(t)._default||"";return""===e.trim()?t.content:ct("span",{style:`color: ${e}`},t.content)},comment:t=>ct("span",{class:"hidden"},t.content),div:(t,e)=>{if(t.gen)return t;const n=lt(t,e.data.raw),s=n.style||n._default,r=n.class;if(!r?.trim())return ct("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 ct("div",{class:a,style:s},t.content)},divide:t=>{const e=(lt(t)._default||"").toLowerCase();return ct("span",{class:"bb-divide","data-type":e},t.content)},fieldset:(t,e)=>{const n=lt(t,e.data.raw)._default||"";return ct("fieldset",{class:"bb-fieldset"},[ct("legend",{class:"bb-fieldset-legend"},n),ct("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"]};`:"",ct("i",{"data-bbcode-fa":null},[ct("i",{class:(t.content||[]).join(""),style:n,"data-fa-transform":e["fa-transform"]||""},[])])},font:(t,e)=>{const n=lt(t,e.data.raw),s=n?._default||n.family||n.name;if(""===s.trim())return t.content;if(Ut.includes(s.trim().toLowerCase()))return ct("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=Dt.exec(n).groups||{};s?.italic&&(e.ital=1);const r=s.weight;r&&r>=0&&r<=900?e.wght=r:Object.keys(Vt).includes(s.named_weight||"")&&(e.wght=Vt[s.named_weight]),e={...e,...Object.fromEntries(Object.entries(t).filter((([t])=>qt.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(", ")+";"),ct("span",{style:`font-family: '${s}'; font-weight: ${r.wght}; font-style: ${a}; ${c}`,"data-font":o},t.content)},h:t=>ct("h1",{},t.content),h1:t=>ct("h1",{},t.content),h2:t=>ct("h2",{},t.content),h3:t=>ct("h3",{},t.content),h4:t=>ct("h4",{},t.content),h5:t=>ct("h5",{},t.content),h6:t=>ct("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}(lt(t)._default).toString();return ct("div","0"===e?{class:"bb-height-restrict"}:{class:"bb-height-restrict",style:`height: ${e}px;`},t.content)},highlight:t=>ct("span",{class:"bb-highlight"},t.content),icode:t=>({isWhitespaceSensitive:!0,content:["`",t.content,"`"]}),imagefloat:t=>{const e=lt(t)._default||"";return ct("div",{class:`bb-float-${e}`},t.content)},inlinespoiler:t=>ct("span",{class:"bb-inline-spoiler"},t.content),justify:t=>ct("div",{class:"bb-justify"},t.content),keyframe:(t,e)=>t.isValid?[]:[ut(t,e.data.raw),...t.content,dt(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 ct("div",{class:"bb-email","data-bb-email":n.mailOption},[Gt,(o=n.person,ct("div",{class:"bb-email-address"},o)),(r=n.subject,ct("div",{class:"bb-email-subject"},r)),(s=t.content,ct("div",{class:"bb-email-content"},s)),zt]);var s,r,o},newspaper:t=>ct("div",{class:"bb-newspaper"},t.content),nobr:t=>({disableLineBreakConversion:!0,content:t.content}),note:t=>ct("div",{class:"bb-note"},[ct("div",{class:"bb-note-tape"},""),ct("div",{class:"bb-note-content"},[t.content,ct("div",{class:"bb-note-footer"},"")])]),ooc:t=>ct("div",{class:"bb-ooc"},t.content),pindent:t=>ct("span",{class:"bb-pindent"},t.content),plain:t=>t.content,print:t=>{const e="print",n=(lt(t)._default||e).toLowerCase(),s=["print","line","graph","parchment"].includes(n)?n:e;return ct("div",{class:s===e?"bb-print":`bb-print-${s}`},t.content)},progress:t=>{const e=lt(t)._default;return ct("div",{class:"bb-progress"},[ct("div",{class:"bb-progress-text"},t.content),ct("div",{class:"bb-progress-bar",style:`width: calc(${e}% - 6px)`},""),ct("div",{class:"bb-progress-bar-other"},"")])},quote:(t,e)=>{const n=lt(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"]},...Pt,thinprogress:(t,e)=>{const n=lt(t,e.data.raw)._default;return ct("div",{class:"bb-progress-thin"},[ct("div",{class:"bb-progress-text"},t.content),ct("div",{class:"bb-progress-bar",style:`width: calc(${n}% - 6px)`},""),ct("div",{class:"bb-progress-bar-other"},"")])},savenl:t=>({isWhitespaceSensitive:!0,content:t.content}),sh:t=>ct("h2",{},t.content),script:(t,e)=>{const n=lt(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=Mt.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}(lt(t,e.data.raw)._default);return ct("div",{class:"bb-scroll",style:`height: ${n}px`},t.content)},side:t=>{const e=lt(t)._default||"left";return ct("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=lt(t,e.data.raw)._default;return ct("details",{class:"bb-spoiler"},[ct("summary",{},"Spoiler"+(n?`: ${n}`:"")),ct("div",{class:"bb-spoiler-content"},t.content)])},sub:t=>ct("sub",{},t.content),sup:t=>ct("sup",{},t.content),tab:(t,e)=>{if(!t.isValid)return[ut(t,e.data.raw),...t.content,dt(t,e.data.raw)];const n=lt(t,e.data.raw),s=n._default||n.name||"Tab",r=`tab-${s.replace(/\W/g,"_")}-${$t()}`;return[ct("input",{type:"radio",id:r,name:"tab-group-"+t.groupId,class:"bb-tab",checked:t.open}),ct("label",{class:"bb-tab-label",for:r,style:n.style},s),ct("div",{class:"bb-tab-content"},t.content)]},tabs:(t,e)=>{const n=t.content.filter((t=>u(t)&&"tab"===t.tag)),s=$t();return n.forEach((t=>{t.isValid=!0,t.groupId=s})),n.length?(n[0].open=!0,ct("div",{class:"bb-tabs"},n)):[ut(t,e.data.raw),...t.content,dt(t,e.data.raw)]},...Rt,b:t=>ct("span",{class:"bbcode-b"},t.content),i:t=>t.gen?t:ct("span",{class:"bbcode-i"},t.content),u:t=>ct("span",{class:"bbcode-u"},t.content),s:t=>ct("span",{class:"bbcode-s"},t.content)},Jt=Object.keys(Ft),Zt=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}(Ft);function Ht(t){return t.replaceAll(ht,"").replaceAll(pt,"").replaceAll("\n"+ft,"").replaceAll(ft+"\n","").replaceAll(ft,"")}function Kt(t){return t.replaceAll(wt,"").replaceAll(vt,"").replaceAll(xt,"")}function Qt(t,e){const n=e.hoistMap;for(const[e,s]of Object.entries(n))t=t.replaceAll(e,s);return t}function Xt(t,e){if(0===e.styles.length)return t;return'"+t}function Yt(t,e){if(0===e.bbscripts.length)return t;return e.bbscripts.map((t=>``)).join("")+t}function te(t,e){const n={};let s=0;const r=(e,s,r,o=!1)=>{const a=$t();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=gt(t,mt,s));){const e=mt.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=gt(t,a,s+r.length),c=$t();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 ee(t,e){let n=0;for(;-1!==(n=gt(t,yt,n));){const e=yt.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 ne={onlyAllowTags:[...Jt],caseFreeTags:!0,contextFreeTags:["plain","code","icode","class","fa"],enableEscapeTags:!0,onError:t=>{ne.previewing&&console.warn(t.message,t.lineNumber,t.columnNumber)}},se=Zt();t.RpNBBCode=(t,e)=>{const n=[se];e.preserveWhitespace&&n.push((t=>St(t))),n.push((t=>Tt(t)));const[s,r]=function(t){let e={};const n=[te,ee];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:K,render:n,data:null},o=r.parser||K,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)?et(t||[],r):et(c,r);for(let t=0;te(n,s,t)),n)}function p(t){return u(t)&&Array.isArray(t.content)?t.content.reduce(((t,e)=>t+p(e)),0):d(t)?String(t).length:0}function f(t){return t.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'").replace(/(javascript|data|vbscript):/gi,"$1%3A")}function b(t,e){switch(typeof e){case"boolean":return e?`${t}`:"";case"number":return`${t}="${e}"`;case"string":return`${t}="${f(e)}"`;case"object":return`${t}="${f(JSON.stringify(e))}"`;default:return""}}function m(t){return null==t?"":h(t,((t,e,n)=>[...t,b(e,n[e])]),[""]).join(" ")}const y=(t,e)=>{const n=h(e||{},((t,e,n)=>n[e]===e?n[e]:null),null);if(n){const s=b(t,n),r={...e};delete r[String(n)];return`${s}${m(r)}`}return`${t}${m(e)}`};class w{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 p(this)}toTagStart({openTag:t=i,closeTag:e=a}={}){return`${t}${y(String(this.tag),this.attrs)}${e}`}toTagEnd({openTag:t=i,closeTag:e=a}={}){return`${t}${c}${this.tag}${e}`}toTagNode(){const t=new w(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=i,closeTag:e=a}={}){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 w(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 v="t",x=t=>t&&void 0!==t.v?t.v:"",$=t=>x(t).charCodeAt(0)===c.charCodeAt(0);class k{get type(){return this[v]}isEmpty(){return 0===this[v]||isNaN(this[v])}isText(){return!(!(t=this)||void 0===t[v]||5!==t[v]&&6!==t[v]&&1!==t[v]);var t}isTag(){return!(!(t=this)||void 0===t[v])&&2===t[v];var t}isAttrName(){return!(!(t=this)||void 0===t[v])&&3===t[v];var t}isAttrValue(){return!(!(t=this)||void 0===t[v])&&4===t[v];var t}isStart(){return!$(this)}isEnd(){return $(this)}getName(){return(t=>{const e=x(t);return $(t)?e.slice(1):e})(this)}getValue(){return x(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=i;return e+=x(t),e+=a,e})(this)}constructor(t,e,n=0,s=0,r=0,o=0){this.l=n,this.r=s,this[v]=t||0,this.v=String(e),this.s=r,this.e=o}}const T=1,A=2,S=3,_=4,j=5,C=6;class L{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 N=(t,e)=>new L(t,e),O="!";const E=0,W=1,I=2,U=0,V=1,q=2,D=[o,n],G=[s,o,n],z=2,P=t=>D.indexOf(t)>=0,M=t=>t===l,B=t=>G.indexOf(t)>=0,R=t=>t===e,F=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 J(t,u={}){let d=0,g=0,h=0,p=-1,f=E,b=U,m="";const y=new Array(Math.floor(t.length)),w=u.openTag||i,v=u.closeTag||a,x=!!u.enableEscapeTags,$=(u.contextFreeTags||[]).filter(Boolean).map((t=>t.toLowerCase())),L=new Map,D=u.onToken||(()=>{}),G=[v,w,r,l,o,n,s,e,O],J=[w,o,n,e],Z=t=>G.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&&$.includes(t.toLowerCase())&&(m=t)},Y=N(t,{onSkip:Q});function tt(t,e,n,s){const r=function(t,e,n=0,s=0,r=0,o=0){return new k(t,e,n,s,r,o)}(t,e,d,g,n,s);D(r),g=h,p+=1,y[p]=r}function et(t,e,n){if(b===V){const e=t=>!(t===s||P(t)),n=t.grabWhile(e),r=t.isLast(),o=t.getCurr()!==s;return t.skip(),r||o?tt(_,F(n)):tt(S,n),r?U:o?V:q}if(b===q){let n=!1;const o=o=>{const i=o===r,a=t.getPrev(),c=t.getNext(),u=a===l,d=c===s,g=P(o),h=c&&P(c);return!(!n||!B(o))||!!(!i||u||(n=!n,n||d||h))&&(!!e||!g)},i=t.grabWhile(o);return t.skip(),tt(_,F(i)),t.getPrev()===r&&g++,t.isLast()?U:V}const o=n+t.getPos()-1,i=t.grabWhile((e=>!(e===s||P(e)||t.isLast())));if(tt(A,i,o,n+t.getLength()+1),X(i),t.skip(),g++,e)return q;return t.includes(s)?V:q}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(T,t),E;const o=-1===n.indexOf(s),i=n[0]===c;if(o||i){const t=Y.getPos()-1,e=Y.grabWhile((t=>t!==v)),n=t+e.length+z;return Y.skip(),tt(A,e,t,n),X(e,i),E}return I}function st(){const t=Y.getPos(),e=Y.grabWhile((t=>t!==v),!0),n=N(e,{onSkip:Q}),s=n.includes(o);for(b=U;n.hasNext();)b=et(n,!s,t);return Y.skip(),E}function rt(){if(R(Y.getCurr()))return tt(C,Y.getCurr()),Y.skip(),h=0,g=0,d++,E;if(P(Y.getCurr())){const t=Y.grabWhile(P);return tt(j,t),E}if(Y.getCurr()===w){if(m){const t=w.length+c.length+m.length,e=`${w}${c}${m}`;if(Y.grabN(t)===e)return W}else if(Y.includes(v))return W;return tt(T,Y.getCurr()),Y.skip(),g++,E}if(x){if(M(Y.getCurr())){const t=Y.getCurr(),e=Y.getNext();return Y.skip(),e&&K(e)?(Y.skip(),tt(T,e),E):(tt(T,t),E)}const t=t=>H(t)&&!M(t),e=Y.grabWhile(t);return tt(T,e),E}const t=Y.grabWhile(H);return tt(T,t),E}return{tokenize:function(){for(f=E;Y.hasNext();)switch(f){case W:f=nt();break;case I:f=st();break;default:f=rt()}return y.length=p+1,y},isTokenNested:function(e){const n=w+c+e.getValue();if(L.has(n))return!!L.get(n);{const e=t.indexOf(n)>-1;return L.set(n,e),e}}}}class Z{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 H=()=>new Z;function K(t,e={}){const n=e,s=n.openTag||i,r=n.closeTag||a,o=(n.onlyAllowTags||[]).filter(Boolean).map((t=>t.toLowerCase()));let c=null;const l=H(),d=H(),g=H(),h=H(),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 y(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()):y(t,e)):t.push(e))}function x(t){b();const e=w.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:J;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)&&y(m(),T,!1),l.toArray()}const Q=t=>"object"==typeof t&&null!==t,X=t=>"boolean"==typeof t;function Y(t,e){const n=t;if(Array.isArray(n))for(let t=0;t[].some.call(e,(e=>tt(t,e))))):!(!Q(t)||!Q(e))&&Object.keys(t).every((n=>{const s=e[n],r=t[n];return Q(r)&&Q(s)?tt(r,s):X(r)?r!==(null===s):s===r})):t===e)}function et(t,e){const n=t;return n.messages=[...n.messages||[]],n.options={...e,...n.options},n.walk=function(t){return Y(this,t)},n.match=function(t,e){return function(t,e,n){return Array.isArray(e)?Y(t,(t=>{for(let s=0;stt(e,t)?n(t):t))}(this,t,e)},n}const nt="/>",st="";function it(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=m(t.attrs);return null===t.content?rt+t.tag+s+nt:rt+t.tag+s+ot+at(t.content,e)+st+t.tag+ot}return""}function at(t,e){return t&&Array.isArray(t)?t.reduce(((t,n)=>t+it(n,e)),""):t?it(t,e):""}const ct=(t,e,n=[])=>({tag:t,attrs:e,content:n,gen:!0}),lt=(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 i=o[1].slice(0,-1).trim();return i.startsWith('"')&&i.endsWith('"')&&(i=i.slice(1,-1)),{_default:i}},ut=(t,e)=>{if(t.start)return e.substring(t.start.from,t.start.to);if(!t.attrs)return`[${t.tag}]`;const n=lt(t,e);return n._default?`[${t.tag}=${n._default}]`:t.toTagStart()},dt=(t,e)=>t.end?e.substring(t.end.from,t.end.to):t.toTagEnd(),gt=(t,e,n)=>{const s=t.substring(n||0).search(e);return s>=0?s+(n||0):s},ht="\x3c!-- bbcode injected newlines --\x3e\n\n",pt="\n\n\x3c!-- bbcode pre injected newlines --\x3e",ft="\x3c!-- bbcode injected newlines --\x3e",bt=new RegExp(`^${/(http|ftp|https|upload):\/\/([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:\/~+#-]*[\w@?^=%&\/~+#-])/.source}|${/\!?\[.*\]\((http|ftp|https|upload):\/\/([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:\/~+#-]*[\w@?^=%&\/~+#-])\)/.source}$`),mt=/((\n|^)(?```+|~~~+)(?.*\n))|(?\[(?i?code|plain)(=.*)?\])|(?(?`{1,2})(.*)(?\k))/im,yt=/^(\|[^\n]+\|\r?\n)((?:\| ?:?[-]+:? ?)+\|)(\n(?:\|[^\n]+\|\r?\n?)*)?$/m,wt="
\n
    ",vt="\n
      ",xt="\n
      ";function $t(){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 kt=t=>"object"==typeof t,Tt=t=>"string"==typeof t,At=(t,e=!1)=>{const n=t;if(Array.isArray(n)){St(n),n.some(Tt)&&(n.unshift(ht),n.push(ht));for(let t=0;t{let e=t.findLastIndex((t=>Tt(t)&&!g(t)))+1;for(let n=e-1;n>=0;n--)Tt(t[n])&&!g(t[n])||(g(t[n])?(t.splice(n+1,e-n-1,t.slice(n+1,e).join("")),e=n):kt(t[n])&&(n!==e-1&&t.splice(n+1,e-n-1,t.slice(n+1,e).join("")),e=n));0!==e&&t.splice(0,e-1,t.slice(0,e).join(""))},_t=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 jt(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 Ct=Symbol("slide-title-open"),Lt=Symbol("slide-title-close"),Nt=Symbol("slide-close"),Ot=/(?\{slide=)|(?\})|(?\{\/slide\})/i;function Et(t){switch(t){case Ct:return"{slide=";case Lt:return"}";case Nt:return"{/slide}";default:return t}}const Wt={accordion:(t,e)=>{const n=$t(),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=gt(n,Ot);if(-1===s){e.push(t.shift());continue}const r=n.match(Ot),o=n.slice(0,s),i=n.slice(s+r[0].length);o.length&&e.push(o),r.groups.slideTitleOpen&&e.push(Ct),r.groups.slideTitleClose&&e.push(Lt),r.groups.slideClose&&e.push(Nt),i.length?t[0]=i:t.shift()}return e}(t.content),r=function(t){const e=[];let n=null,s=null;for(const r of t)if(r===Ct&&null===s)n=w.create("slide"),n.content=[],n.customTitle=[],s=Ct;else{if(r===Lt&&s===Ct){s=Lt;continue}r===Nt&&n&&s===Lt?(e.push(n),n=null,s=null):n?s===Ct?n.customTitle.push(Et(r)):n.content.push(Et(r)):e.push(Et(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[ut(t,e.data.raw),...t.content,dt(t,e.data.raw)];const i=lt(t,e.data.raw);if(i._default){const t=i._default.split("|").map((t=>t.trim())),e=t.filter((t=>["bright","bcenter","bleft","fleft","fright"].includes(t))).pop();e&&(i.align??=e),(t.some((t=>t.endsWith("px")))||t.some((t=>t.endsWith("%"))))&&(i.width??=t.find((t=>t.endsWith("px")||t.endsWith("%"))))}let a=i.align?.toLowerCase()||"",c="";return(i.width?.endsWith("px")||i.width?.endsWith("%"))&&(c=`width: ${i.width};`),ct("div",{class:"bb-accordion "+a,"data-group-id":n,style:c},o)},slide:(t,e)=>{if(!t.isValid)return[ut(t,e.data.raw),...t.content,dt(t,e.data.raw)];const n=lt(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[ct("details",{class:"bb-slide",open:r},[ct("summary",{class:"bb-slide-title",style:`text-align: ${o}; ${n.style||""}`},s),ct("div",{class:"bb-slide-content"},t.content)])]}},It={left:t=>ct("div",{class:"bb-left"},t.content),center:t=>ct("div",{class:"bb-center"},t.content),right:t=>ct("div",{class:"bb-right"},t.content)},Ut={a:(t,e)=>{const n=lt(t,e.data.raw)._default||"";return ct("a",{id:`user-anchor-${n.trim()}`,name:`user-anchor-${n.trim()}`},t.content)},goto:(t,e)=>{const n=lt(t,e.data.raw)._default||"";return ct("a",{href:`#user-anchor-${n.trim()}`},t.content)}},Vt=["arial","book antiqua","courier new","georgia","tahoma","times new roman","trebuchet ms","verdana"],qt={thin:"100",extralight:"200",light:"300",regular:"400",medium:"500",semibold:"600",bold:"700",extrabold:"800",black:"900"},Dt=["ital","opsz","slnt","wdth","wght"],Gt=/(?[a-zA-Z]*)?\s?(?[0-9]*)?\s?(?italic)?/;const zt=ct("div",{class:"bb-email-header"},""),Pt=ct("div",{class:"bb-email-footer"},ct("div",{class:"bb-email-button"},"")),Mt={row:t=>ct("div",{class:"bb-row"},t.content),column:(t,e)=>{const n=lt(t,e.data.raw)._default||"8",s=n.startsWith("span")?`column-width-${n}`:`column-width-span${n}`;return ct("div",{class:"bb-column","data-span":s},t.content)}},Bt=["init","click","change","input","dblclick","mouseenter","mouseleave","scroll"];const Rt=["me","them","right","left"],Ft={textmessage:(t,e)=>{const n=lt(t,e.data.raw)._default||"Recipient",s=""!==n.trim()?n:"Recipient";return ct("div",{class:"bb-textmessage"},[ct("div",{class:"bb-textmessage-name"},s),ct("div",{class:"bb-textmessage-overflow"},[ct("div",{class:"bb-textmessage-content"},t.content)])])},message:(t,e)=>{let n=lt(t,e.data.raw)._default.toLowerCase();Rt.includes(n)&&"right"!==n||(n="me"),"left"===n&&(n="them");return ct("div",{class:"me"===n?"bb-message-me":"bb-message-them"},[ct("div",{class:"bb-message-content"},t.content)])}},Jt={...Wt,...It,...Ut,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=lt(t,e.data.raw)?._default||"",r=t.content.filter((t=>u(t)&&"keyframe"===t.tag)).map((t=>{t.isValid=!0;const n=lt(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=lt(t,e.data.raw)._default;return ct("div",{style:`background-color: ${n};`,class:"bb-background"},t.content)},block:(t,e)=>{const n="block",s=(lt(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 ct("table",{class:"bb-block","data-bb-block":r},[ct("tbody",[ct("tr",[ct("td",{class:"bb-block-icon"}),ct("td",{class:"bb-block-content"},t.content)])])])},blockquote:(t,e)=>{const n=lt(t,e.data.raw)._default||"";return ct("div",{class:"bb-blockquote"},[ct("div",{class:"bb-blockquote-left"}),ct("div",{class:"bb-blockquote-content"},[t.content,ct("div",{class:"bb-blockquote-speaker"},""!==n?`- ${n}`:"")]),ct("div",{class:"bb-blockquote-right"})])},border:(t,e)=>{const n=lt(t,e.data.raw)._default;return ct("div",{style:`border: ${n};`,class:"bb-border"},t.content)},br:()=>ct("br",{},null),centerblock:(t,e)=>{const n=lt(t,e.data.raw)._default||"50";return ct("div",{style:`margin: 0 auto; width: ${n}%`},t.content)},check:(t,e)=>{const n=lt(t,e.data.raw)._default||"dot";return ct("div",{class:"bb-check","data-type":n},t.content)},class:(t,e)=>{const n=lt(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,i=t.content.filter(d).map((t=>t.replaceAll("{post_id}",r).replaceAll(/[\[\]\{\}]/g,"")));let a="";const c=[];return["hover","focus","active","focus-within","focus-visible"].includes(n.state?.toLowerCase())&&(a=":"+n.state.toLowerCase()),n.selector&&(a=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})`),i.unshift(`.${o}${a} {`),i.push("}"),c.length&&(i.unshift(`@media ${c.join(" and ")} {`),i.push("}")),e.data.styles.push(i.join("")),[]},code:t=>({isWhitespaceSensitive:!0,content:["```"+(lt(t)._default||"bbcode")+"\n",t.content,"\n```\n"]}),color:t=>{const e=lt(t)._default||"";return""===e.trim()?t.content:ct("span",{style:`color: ${e}`},t.content)},comment:t=>ct("span",{class:"hidden"},t.content),div:(t,e)=>{if(t.gen)return t;const n=lt(t,e.data.raw),s=n.style||n._default,r=n.class;if(!r?.trim())return ct("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,i=r.split(" ").map((t=>t+"__"+o)).join(" ");return ct("div",{class:i,style:s},t.content)},divide:t=>{const e=(lt(t)._default||"").toLowerCase();return ct("span",{class:"bb-divide","data-type":e},t.content)},fieldset:(t,e)=>{const n=lt(t,e.data.raw)._default||"";return ct("fieldset",{class:"bb-fieldset"},[ct("legend",{class:"bb-fieldset-legend"},n),ct("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"]};`:"",ct("i",{"data-bbcode-fa":null},[ct("i",{class:(t.content||[]).join(""),style:n,"data-fa-transform":e["fa-transform"]||""},[])])},font:(t,e)=>{const n=lt(t,e.data.raw),s=n?._default||n.family||n.name;if(""===s.trim())return t.content;if(Vt.includes(s.trim().toLowerCase()))return ct("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=Gt.exec(n).groups||{};s?.italic&&(e.ital=1);const r=s.weight;r&&r>=0&&r<=900?e.wght=r:Object.keys(qt).includes(s.named_weight||"")&&(e.wght=qt[s.named_weight]),e={...e,...Object.fromEntries(Object.entries(t).filter((([t])=>Dt.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 i=1===r.ital?"italic":"normal",a=Object.entries(r).filter((([t])=>"wght"!==t&&"ital"!==t));let c="";return a.length&&(c="font-variation-settings: "+a.map((([t,e])=>`'${t}' ${e}`)).join(", ")+";"),ct("span",{style:`font-family: '${s}'; font-weight: ${r.wght}; font-style: ${i}; ${c}`,"data-font":o},t.content)},h:t=>ct("h1",{},t.content),h1:t=>ct("h1",{},t.content),h2:t=>ct("h2",{},t.content),h3:t=>ct("h3",{},t.content),h4:t=>ct("h4",{},t.content),h5:t=>ct("h5",{},t.content),h6:t=>ct("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}(lt(t)._default).toString();return ct("div","0"===e?{class:"bb-height-restrict"}:{class:"bb-height-restrict",style:`height: ${e}px;`},t.content)},highlight:t=>ct("span",{class:"bb-highlight"},t.content),icode:t=>({isWhitespaceSensitive:!0,content:["`",t.content,"`"]}),imagefloat:t=>{const e=lt(t)._default||"";return ct("div",{class:`bb-float-${e}`},t.content)},inlinespoiler:t=>ct("span",{class:"bb-inline-spoiler"},t.content),justify:t=>ct("div",{class:"bb-justify"},t.content),keyframe:(t,e)=>t.isValid?[]:[ut(t,e.data.raw),...t.content,dt(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 ct("div",{class:"bb-email","data-bb-email":n.mailOption},[zt,(o=n.person,ct("div",{class:"bb-email-address"},o)),(r=n.subject,ct("div",{class:"bb-email-subject"},r)),(s=t.content,ct("div",{class:"bb-email-content"},s)),Pt]);var s,r,o},newspaper:t=>ct("div",{class:"bb-newspaper"},t.content),nobr:t=>({disableLineBreakConversion:!0,content:t.content}),note:t=>ct("div",{class:"bb-note"},[ct("div",{class:"bb-note-tape"},""),ct("div",{class:"bb-note-content"},[t.content,ct("div",{class:"bb-note-footer"},"")])]),ooc:t=>ct("div",{class:"bb-ooc"},t.content),pindent:t=>ct("span",{class:"bb-pindent"},t.content),plain:t=>t.content,print:t=>{const e="print",n=(lt(t)._default||e).toLowerCase(),s=["print","line","graph","parchment"].includes(n)?n:e;return ct("div",{class:s===e?"bb-print":`bb-print-${s}`},t.content)},progress:t=>{const e=lt(t)._default;return ct("div",{class:"bb-progress"},[ct("div",{class:"bb-progress-text"},t.content),ct("div",{class:"bb-progress-bar",style:`width: calc(${e}% - 6px)`},""),ct("div",{class:"bb-progress-bar-other"},"")])},quote:(t,e)=>{const n=lt(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"]},...Mt,thinprogress:(t,e)=>{const n=lt(t,e.data.raw)._default;return ct("div",{class:"bb-progress-thin"},[ct("div",{class:"bb-progress-text"},t.content),ct("div",{class:"bb-progress-bar",style:`width: calc(${n}% - 6px)`},""),ct("div",{class:"bb-progress-bar-other"},"")])},savenl:t=>({isWhitespaceSensitive:!0,content:t.content}),sh:t=>ct("h2",{},t.content),script:(t,e)=>{const n=lt(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=Bt.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}(lt(t,e.data.raw)._default);return ct("div",{class:"bb-scroll",style:`height: ${n}px`},t.content)},side:t=>{const e=lt(t)._default||"left";return ct("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,i=3,a=.2,c=7,l=1;if(s&&(e=s[1])){switch(n.unit=(s[2]||"").toLowerCase(),n.unit){case"px":e>r?e=r:ei?e=i:ec?e=c:e{const n=lt(t,e.data.raw)._default;return ct("details",{class:"bb-spoiler"},[ct("summary",{},"Spoiler"+(n?`: ${n}`:"")),ct("div",{class:"bb-spoiler-content"},t.content)])},sub:t=>ct("sub",{},t.content),sup:t=>ct("sup",{},t.content),tab:(t,e)=>{if(!t.isValid)return[ut(t,e.data.raw),...t.content,dt(t,e.data.raw)];const n=lt(t,e.data.raw),s=n._default||n.name||"Tab",r=`tab-${s.replace(/\W/g,"_")}-${$t()}`;return[ct("input",{type:"radio",id:r,name:"tab-group-"+t.groupId,class:"bb-tab",checked:t.open}),ct("label",{class:"bb-tab-label",for:r,style:n.style},s),ct("div",{class:"bb-tab-content"},t.content)]},tabs:(t,e)=>{const n=t.content.filter((t=>u(t)&&"tab"===t.tag)),s=$t();return n.forEach((t=>{t.isValid=!0,t.groupId=s})),n.length?(n[0].open=!0,ct("div",{class:"bb-tabs"},n)):[ut(t,e.data.raw),...t.content,dt(t,e.data.raw)]},...Ft,b:t=>ct("span",{class:"bbcode-b"},t.content),i:t=>t.gen?t:ct("span",{class:"bbcode-i"},t.content),u:t=>ct("span",{class:"bbcode-u"},t.content),s:t=>ct("span",{class:"bbcode-s"},t.content)},Zt=Object.keys(Jt),Ht=function t(e,n=jt){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}(Jt);function Kt(t){return t.replaceAll(ht,"").replaceAll(pt,"").replaceAll("\n"+ft,"").replaceAll(ft+"\n","").replaceAll(ft,"")}function Qt(t){return t.replaceAll(wt,"").replaceAll(vt,"").replaceAll(xt,"")}function Xt(t,e){const n=e.hoistMap;for(const[e,s]of Object.entries(n))t=t.replaceAll(e,s);return t}function Yt(t,e){if(0===e.styles.length)return t;return'"+t}function te(t,e){if(0===e.bbscripts.length)return t;return e.bbscripts.map((t=>``)).join("")+t}function ee(t,e){const n={};let s=0;const r=(e,s,r,o=!1)=>{const i=$t();return-1!==s?(n[i]=t.substring(e,s),t=t.substring(0,e)+i+t.substring(s)):(n[i]=t.substring(e),t=t.substring(0,e)+i+r),o&&(n[i].startsWith("\n")&&(n[i]=n[i].substring(1)),n[i].endsWith("\n")&&(n[i]=n[i].substring(0,n[i].length-1))),e+i.length+r.length};for(;-1!==(s=gt(t,mt,s));){const e=mt.exec(t.substring(s));if(e.groups?.fence){const r=e.groups.fence,o=e.groups.fenceInfo;"\n"===t[s]&&(s+=1);const i=new RegExp("\n"+r+"(\n|$)"),a=gt(t,i,s+r.length),c=$t();n[c]=-1!==a?t.substring(s+r.length+o.length,a):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!==a?t.substring(a+1+r.length):""),s+=l.length}else if(e.groups?.bbcode){const n=e.groups.bbcode,o=`[/${e.groups.bbcodeTag.toLowerCase()}]`,i=t.toLowerCase().indexOf(o,s+1);s=r(s+n.length,i,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 ne(t,e){let n=0;for(;-1!==(n=gt(t,yt,n));){const e=yt.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 se={onlyAllowTags:[...Zt],caseFreeTags:!0,contextFreeTags:["plain","code","icode","class","fa"],enableEscapeTags:!0,onError:t=>{se.previewing&&console.warn(t.message,t.lineNumber,t.columnNumber)}},re=Ht();t.RpNBBCode=(t,e)=>{const n=[re];e.preserveWhitespace&&n.push((t=>_t(t))),n.push((t=>At(t)));const[s,r]=function(t){let e={};const n=[ee,ne];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:K,render:n,data:null},o=r.parser||K,i=r.render,a=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)?et(t||[],r):et(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\nconst MD_BROKEN_ORDERED_LIST = \"
\\n
    \";\nconst MD_BROKEN_UNORDERED_LIST = \"\\n
      \";\nconst MD_BROKEN_BLOCKQUOTE = \"\\n
      \";\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 MD_BROKEN_ORDERED_LIST,\n MD_BROKEN_UNORDERED_LIST,\n MD_BROKEN_BLOCKQUOTE,\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 reduceWordsToLines(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 * Reduces the list into lines, so that we can process them by line.\n * Performs in place.\n * @param {(string|Object)[]} words\n */\nconst reduceWordsToLines = (words) => {\n const lines = [];\n let line = \"\";\n for (const word of words) {\n if (isString(word) && !isEOL(word)) {\n line += word;\n } else if (isString(word) && isEOL(word)) {\n if (line) {\n lines.push(line);\n }\n lines.push(word);\n line = \"\";\n } else {\n lines.push(line);\n lines.push(word);\n line = \"\";\n }\n }\n if (line) {\n lines.push(line);\n }\n words.splice(0, words.length, ...lines);\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 {\n MD_BROKEN_BLOCKQUOTE,\n MD_BROKEN_ORDERED_LIST,\n MD_BROKEN_UNORDERED_LIST,\n MD_NEWLINE_INJECT,\n MD_NEWLINE_INJECT_COMMENT,\n MD_NEWLINE_PRE_INJECT,\n} 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\nfunction cleanMultilineMDBlocks(raw) {\n const processed = raw\n .replaceAll(MD_BROKEN_ORDERED_LIST, \"\")\n .replaceAll(MD_BROKEN_UNORDERED_LIST, \"\")\n .replaceAll(MD_BROKEN_BLOCKQUOTE, \"\");\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 cleanMultilineMDBlocks,\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","isEOL","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","MD_BROKEN_ORDERED_LIST","MD_BROKEN_UNORDERED_LIST","MD_BROKEN_BLOCKQUOTE","generateGUID","d","Date","getTime","window","performance","now","random","isString","disableLineBreakConversion","reduceWordsToLines","unshift","child","splice","isWhitespaceSensitive","test","words","lines","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","cleanMultilineMDBlocks","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 +{"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\nconst MD_BROKEN_ORDERED_LIST = \"
\\n
    \";\nconst MD_BROKEN_UNORDERED_LIST = \"\\n
      \";\nconst MD_BROKEN_BLOCKQUOTE = \"\\n
      \";\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 MD_BROKEN_ORDERED_LIST,\n MD_BROKEN_UNORDERED_LIST,\n MD_BROKEN_BLOCKQUOTE,\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 reduceWordsToLines(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 * Reduces the list into lines, so that we can process them by line.\n * Performs in place.\n * @param {(string|Object)[]} words\n */\nconst reduceWordsToLines = (words) => {\n let rightIdx = words.findLastIndex((w) => isString(w) && !isEOL(w)) + 1;\n\n for (let i = rightIdx - 1; i >= 0; i--) {\n if (isString(words[i]) && !isEOL(words[i])) {\n continue;\n }\n if (isEOL(words[i])) {\n words.splice(i + 1, rightIdx - i - 1, words.slice(i + 1, rightIdx).join(\"\"));\n rightIdx = i;\n continue;\n }\n if (isObj(words[i])) {\n if (i !== rightIdx - 1) {\n words.splice(i + 1, rightIdx - i - 1, words.slice(i + 1, rightIdx).join(\"\"));\n }\n rightIdx = i;\n }\n }\n\n if (0 !== rightIdx) {\n words.splice(0, rightIdx - 1, words.slice(0, rightIdx).join(\"\"));\n }\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 {\n MD_BROKEN_BLOCKQUOTE,\n MD_BROKEN_ORDERED_LIST,\n MD_BROKEN_UNORDERED_LIST,\n MD_NEWLINE_INJECT,\n MD_NEWLINE_INJECT_COMMENT,\n MD_NEWLINE_PRE_INJECT,\n} 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\nfunction cleanMultilineMDBlocks(raw) {\n const processed = raw\n .replaceAll(MD_BROKEN_ORDERED_LIST, \"\")\n .replaceAll(MD_BROKEN_UNORDERED_LIST, \"\")\n .replaceAll(MD_BROKEN_BLOCKQUOTE, \"\");\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 cleanMultilineMDBlocks,\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","isEOL","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","MD_BROKEN_ORDERED_LIST","MD_BROKEN_UNORDERED_LIST","MD_BROKEN_BLOCKQUOTE","generateGUID","d","Date","getTime","window","performance","now","random","isString","disableLineBreakConversion","reduceWordsToLines","unshift","child","splice","isWhitespaceSensitive","test","words","rightIdx","findLastIndex","w","i","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","u","availableTags","preset","createPreset","defTags","processor","presetFactory","presetExecutor","assign","extend","callback","removeNewlineInjects","cleanMultilineMDBlocks","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/plugins/lineBreak.js b/bbcode-src/plugins/lineBreak.js index 89b710a..429d619 100644 --- a/bbcode-src/plugins/lineBreak.js +++ b/bbcode-src/plugins/lineBreak.js @@ -76,27 +76,28 @@ const walk = (t, disableLineBreakConversion = false) => { * @param {(string|Object)[]} words */ const reduceWordsToLines = (words) => { - const lines = []; - let line = ""; - for (const word of words) { - if (isString(word) && !isEOL(word)) { - line += word; - } else if (isString(word) && isEOL(word)) { - if (line) { - lines.push(line); + let rightIdx = words.findLastIndex((w) => isString(w) && !isEOL(w)) + 1; + + for (let i = rightIdx - 1; i >= 0; i--) { + if (isString(words[i]) && !isEOL(words[i])) { + continue; + } + if (isEOL(words[i])) { + words.splice(i + 1, rightIdx - i - 1, words.slice(i + 1, rightIdx).join("")); + rightIdx = i; + continue; + } + if (isObj(words[i])) { + if (i !== rightIdx - 1) { + words.splice(i + 1, rightIdx - i - 1, words.slice(i + 1, rightIdx).join("")); } - lines.push(word); - line = ""; - } else { - lines.push(line); - lines.push(word); - line = ""; + rightIdx = i; } } - if (line) { - lines.push(line); + + if (0 !== rightIdx) { + words.splice(0, rightIdx - 1, words.slice(0, rightIdx).join("")); } - words.splice(0, words.length, ...lines); }; /**