{
"version": 3,
"sources": ["../../server/chat-formatter.ts"],
"sourcesContent": ["/**\n * Chat parser\n * Pokemon Showdown - http://pokemonshowdown.com/\n *\n * Parses formate.\n *\n * @license MIT\n */\n\n/*\nSOURCE FOR LINKREGEX (compile with https://regexfree.k55.io/ )\n\n\t(\n\t\t(\n\t\t\t# When using http://, allow any domain\n\t\t\thttps?:\\/\\/ [a-z0-9-]+ ( \\. [a-z0-9-]+ )*\n\t\t|\n\t\t\t# When using www., expect at least one more dot\n\t\t\twww \\. [a-z0-9-]+ ( \\. [a-z0-9-]+ )+\n\t\t|\n\t\t\t# Otherwise, allow any domain, but only if\n\t\t\t\\b [a-z0-9-]+ ( \\. [a-z0-9-]+ )* \\.\n\t\t\t(\n\t\t\t\t# followed either a common TLD...\n\t\t\t\t( com? | org | net | edu | info | us | jp ) \\b\n\t\t\t|\n\t\t\t\t# or any 2-3 letter TLD followed by a port or /\n\t\t\t\t[a-z]{2,3} (?= :[0-9] | / )\n\t\t\t)\n\t\t)\n\t\t# possible custom port\n\t\t( : [0-9]+ )?\n\t\t(\n\t\t\t\\/\n\t\t\t(\n\t\t\t\t# characters allowed inside URL paths\n\t\t\t\t(\n\t\t\t\t\t[^\\s()&<>[\\]] | & | "\n\t\t\t\t|\n\t\t\t\t\t# parentheses in URLs should be matched, so they're not confused\n\t\t\t\t\t# for parentheses around URLs\n\t\t\t\t\t\\( ( [^\\s()<>&[\\]] | & )* \\)\n\t \t\t\t|\n\t\t\t\t\t\\[ ( [^\\s()<>&[\\]] | & )* ]\n\t\t\t\t)*\n\t\t\t\t# URLs usually don't end with punctuation, so don't allow\n\t\t\t\t# punctuation symbols that probably arent related to URL.\n\t\t\t\t(\n\t\t\t\t\t[^\\s()[\\]{}\\\".,!?;:&<>*`^~\\\\]\n\t\t\t\t|\n\t\t\t\t\t# annoyingly, Wikipedia URLs often end in )\n\t\t\t\t\t\\( ( [^\\s()<>&[\\]] | & )* \\)\n\t\t\t\t)\n\t\t\t)?\n\t\t)?\n\t|\n\t\t# email address\n\t\t[a-z0-9.]+ @ [a-z0-9-]+ ( \\. [a-z0-9-]+ )* \\. [a-z]{2,}\n\t)\n\t(?! [^ ]*> )\n\n*/\nexport const linkRegex = /(?:(?:https?:\\/\\/[a-z0-9-]+(?:\\.[a-z0-9-]+)*|www\\.[a-z0-9-]+(?:\\.[a-z0-9-]+)+|\\b[a-z0-9-]+(?:\\.[a-z0-9-]+)*\\.(?:(?:com?|org|net|edu|info|us|jp)\\b|[a-z]{2,3}(?=:[0-9]|\\/)))(?::[0-9]+)?(?:\\/(?:(?:[^\\s()&<>[\\]]|&|"|\\((?:[^\\s()<>&[\\]]|&)*\\)|\\[(?:[^\\s()<>&[\\]]|&)*])*(?:[^\\s()[\\]{}\".,!?;:&<>*`^~\\\\]|\\((?:[^\\s()<>&[\\]]|&)*\\)))?)?|[a-z0-9.]+@[a-z0-9-]+(?:\\.[a-z0-9-]+)*\\.[a-z]{2,})(?![^ ]*>)/ig;\n\n/**\n * A span is a part of the text that's formatted. In the text:\n *\n * Hi, **this** is an example.\n *\n * The word `this` is a `*` span. Many spans are just a symbol repeated, and\n * that symbol is the span type, but also many are more complicated.\n * For an explanation of all of these, see the `TextFormatter#get` function\n * implementation.\n */\ntype SpanType = '_' | '*' | '~' | '^' | '\\\\' | '|' | '<' | '[' | '`' | 'a' | 'u' | 'spoiler' | '>' | '(';\n\ntype FormatSpan = [SpanType, number];\n\nclass TextFormatter {\n\treadonly str: string;\n\treadonly buffers: string[];\n\treadonly stack: FormatSpan[];\n\t/** Allows access to special formatting (links without URL preview, pokemon icons) */\n\treadonly isTrusted: boolean;\n\t/** Replace \\n with
*/\n\treadonly replaceLinebreaks: boolean;\n\t/** Discord-style WYSIWYM output; markup characters are in `` */\n\treadonly showSyntax: boolean;\n\t/** offset of str that's been parsed so far */\n\toffset: number;\n\n\tconstructor(str: string, isTrusted = false, replaceLinebreaks = false, showSyntax = false) {\n\t\t// escapeHTML, without escaping /\n\t\tstr = `${str}`\n\t\t\t.replace(/&/g, '&')\n\t\t\t.replace(//g, '>')\n\t\t\t.replace(/\"/g, '"')\n\t\t\t.replace(/'/g, ''');\n\n\t\t// filter links first\n\t\tstr = str.replace(linkRegex, uri => {\n\t\t\tif (showSyntax) return `${uri}`;\n\t\t\tlet fulluri;\n\t\t\tif (/^[a-z0-9.]+@/ig.test(uri)) {\n\t\t\t\tfulluri = 'mailto:' + uri;\n\t\t\t} else {\n\t\t\t\tfulluri = uri.replace(/^([a-z]*[^a-z:])/g, 'http://$1');\n\t\t\t\tif (uri.substr(0, 24) === 'https://docs.google.com/' || uri.substr(0, 16) === 'docs.google.com/') {\n\t\t\t\t\tif (uri.startsWith('https')) uri = uri.slice(8);\n\t\t\t\t\tif (uri.substr(-12) === '?usp=sharing' || uri.substr(-12) === '&usp=sharing') uri = uri.slice(0, -12);\n\t\t\t\t\tif (uri.substr(-6) === '#gid=0') uri = uri.slice(0, -6);\n\t\t\t\t\tlet slashIndex = uri.lastIndexOf('/');\n\t\t\t\t\tif (uri.length - slashIndex > 18) slashIndex = uri.length;\n\t\t\t\t\tif (slashIndex - 4 > 19 + 3) {\n\t\t\t\t\t\turi = `${uri.slice(0, 19)}${uri.slice(19, slashIndex - 4)}` +\n\t\t\t\t\t\t\t`${uri.slice(slashIndex - 4)}`;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn `${uri}`;\n\t\t});\n\t\t// (links don't have any specific syntax, they're just a pattern, so we detect them in a separate pass)\n\n\t\tthis.str = str;\n\t\tthis.buffers = [];\n\t\tthis.stack = [];\n\t\tthis.isTrusted = isTrusted;\n\t\tthis.replaceLinebreaks = this.isTrusted || replaceLinebreaks;\n\t\tthis.showSyntax = showSyntax;\n\t\tthis.offset = 0;\n\t}\n\t// debugAt(i=0, j=i+1) { console.log(`${this.slice(0, i)}[${this.slice(i, j)}]${this.slice(j, this.str.length)}`); }\n\n\tslice(start: number, end: number) {\n\t\treturn this.str.slice(start, end);\n\t}\n\n\tat(start: number) {\n\t\treturn this.str.charAt(start);\n\t}\n\n\t/**\n\t * We've encountered a possible start for a span. It's pushed onto our span\n\t * stack.\n\t *\n\t * The span stack saves the start position so it can be replaced with HTML\n\t * if we find an end for the span, but we don't actually replace it until\n\t * `closeSpan` is called, so nothing happens (it stays plaintext) if no end\n\t * is found.\n\t */\n\tpushSpan(spanType: SpanType, start: number, end: number) {\n\t\tthis.pushSlice(start);\n\t\tthis.stack.push([spanType, this.buffers.length]);\n\t\tthis.buffers.push(this.slice(start, end));\n\t\tthis.offset = end;\n\t}\n\n\tpushSlice(end: number) {\n\t\tif (end !== this.offset) {\n\t\t\tthis.buffers.push(this.slice(this.offset, end));\n\t\t\tthis.offset = end;\n\t\t}\n\t}\n\n\tcloseParenSpan(start: number) {\n\t\tlet stackPosition = -1;\n\t\tfor (let i = this.stack.length - 1; i >= 0; i--) {\n\t\t\tconst span = this.stack[i];\n\t\t\tif (span[0] === '(') {\n\t\t\t\tstackPosition = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (span[0] !== 'spoiler') break;\n\t\t}\n\t\tif (stackPosition === -1) return false;\n\n\t\tthis.pushSlice(start);\n\t\twhile (this.stack.length > stackPosition) this.popSpan(start);\n\t\tthis.offset = start;\n\t\treturn true;\n\t}\n\n\t/**\n\t * We've encountered a possible end for a span. If it's in the span stack,\n\t * we transform it into HTML.\n\t */\n\tcloseSpan(spanType: SpanType, start: number, end: number) {\n\t\t// loop backwards\n\t\tlet stackPosition = -1;\n\t\tfor (let i = this.stack.length - 1; i >= 0; i--) {\n\t\t\tconst span = this.stack[i];\n\t\t\tif (span[0] === spanType) {\n\t\t\t\tstackPosition = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (stackPosition === -1) return false;\n\n\t\tthis.pushSlice(start);\n\t\twhile (this.stack.length > stackPosition + 1) this.popSpan(start);\n\t\tconst span = this.stack.pop()!;\n\t\tconst startIndex = span[1];\n\t\tlet tagName = '';\n\t\tlet attrs = '';\n\t\tswitch (spanType) {\n\t\tcase '_': tagName = 'i'; break;\n\t\tcase '*': tagName = 'b'; break;\n\t\tcase '~': tagName = 's'; break;\n\t\tcase '^': tagName = 'sup'; break;\n\t\tcase '\\\\': tagName = 'sub'; break;\n\t\tcase '|': tagName = 'span'; attrs = (this.showSyntax ? ' class=\"spoiler-shown\"' : ' class=\"spoiler\"'); break;\n\t\t}\n\t\tconst syntax = (this.showSyntax ? `${spanType}${spanType}` : '');\n\t\tif (tagName) {\n\t\t\tthis.buffers[startIndex] = `${syntax}<${tagName}${attrs}>`;\n\t\t\tthis.buffers.push(`${tagName}>${syntax}`);\n\t\t\tthis.offset = end;\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * Ends a span without an ending symbol. For most spans, this means\n\t * they don't take effect, but certain spans like spoiler tags don't\n\t * require ending symbols.\n\t */\n\tpopSpan(end: number) {\n\t\tconst span = this.stack.pop();\n\t\tif (!span) return false;\n\t\tthis.pushSlice(end);\n\t\tswitch (span[0]) {\n\t\tcase 'spoiler':\n\t\t\tthis.buffers.push(``);\n\t\t\tthis.buffers[span[1]] = (this.showSyntax ? `` : ``);\n\t\t\tbreak;\n\t\tcase '>':\n\t\t\tthis.buffers.push(``);\n\t\t\tthis.buffers[span[1]] = ``;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\t// do nothing\n\t\t\tbreak;\n\t\t}\n\t\treturn true;\n\t}\n\n\tpopAllSpans(end: number) {\n\t\twhile (this.stack.length) this.popSpan(end);\n\t\tthis.pushSlice(end);\n\t}\n\n\ttoUriComponent(html: string) {\n\t\tconst component = html.replace(/</g, '<')\n\t\t\t.replace(/>/g, '>')\n\t\t\t.replace(/"/g, '\"')\n\t\t\t.replace(/'/g, '\\'')\n\t\t\t.replace(/&/g, '&');\n\t\treturn encodeURIComponent(component);\n\t}\n\n\t/**\n\t * Handles special cases.\n\t */\n\trunLookahead(spanType: SpanType, start: number) {\n\t\tswitch (spanType) {\n\t\tcase '`':\n\t\t\t// code span. Not only are the contents not formatted, but\n\t\t\t// the start and end delimiters must match in length.\n\t\t\t// ``Neither `this` nor ```this``` end this code span.``\n\t\t\t{\n\t\t\t\tlet delimLength = 0;\n\t\t\t\tlet i = start;\n\t\t\t\twhile (this.at(i) === '`') {\n\t\t\t\t\tdelimLength++;\n\t\t\t\t\ti++;\n\t\t\t\t}\n\t\t\t\tlet curDelimLength = 0;\n\t\t\t\twhile (i < this.str.length) {\n\t\t\t\t\tconst char = this.at(i);\n\t\t\t\t\tif (char === '\\n') break;\n\t\t\t\t\tif (char === '`') {\n\t\t\t\t\t\tcurDelimLength++;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (curDelimLength === delimLength) break;\n\t\t\t\t\t\tcurDelimLength = 0;\n\t\t\t\t\t}\n\t\t\t\t\ti++;\n\t\t\t\t}\n\t\t\t\tif (curDelimLength !== delimLength) return false;\n\t\t\t\tconst end = i;\n\t\t\t\t// matching delims found\n\t\t\t\tthis.pushSlice(start);\n\t\t\t\tlet innerStart = start + delimLength;\n\t\t\t\tlet innerEnd = i - delimLength;\n\t\t\t\tif (innerStart + 1 >= innerEnd) {\n\t\t\t\t\t// no special whitespace handling\n\t\t\t\t} else if (this.at(innerStart) === ' ' && this.at(innerEnd - 1) === ' ') {\n\t\t\t\t\tinnerStart++; // strip starting and ending space\n\t\t\t\t\tinnerEnd--;\n\t\t\t\t} else if (this.at(innerStart) === ' ' && this.at(innerStart + 1) === '`') {\n\t\t\t\t\tinnerStart++; // strip starting space\n\t\t\t\t} else if (this.at(innerEnd - 1) === ' ' && this.at(innerEnd - 2) === '`') {\n\t\t\t\t\tinnerEnd--; // strip ending space\n\t\t\t\t}\n\t\t\t\tif (this.showSyntax) this.buffers.push(`${this.slice(start, innerStart)}`);\n\t\t\t\tthis.buffers.push(``);\n\t\t\t\tthis.buffers.push(this.slice(innerStart, innerEnd));\n\t\t\t\tthis.buffers.push(`
`);\n\t\t\t\tif (this.showSyntax) this.buffers.push(`${this.slice(innerEnd, end)}`);\n\t\t\t\tthis.offset = end;\n\t\t\t}\n\t\t\treturn true;\n\t\tcase '[':\n\t\t\t// Link span. Several possiblilities:\n\t\t\t// [[text ]] - a link with custom text\n\t\t\t// [[search term]] - Google search\n\t\t\t// [[wiki: search term]] - Wikipedia search\n\t\t\t// [[pokemon: species name]] - icon (also item:, type:, category:)\n\t\t\t{\n\t\t\t\tif (this.slice(start, start + 2) !== '[[') return false;\n\t\t\t\tlet i = start + 2;\n\t\t\t\tlet colonPos = -1; // `:`\n\t\t\t\tlet anglePos = -1; // `<`\n\t\t\t\twhile (i < this.str.length) {\n\t\t\t\t\tconst char = this.at(i);\n\t\t\t\t\tif (char === ']' || char === '\\n') break;\n\t\t\t\t\tif (char === ':' && colonPos < 0) colonPos = i;\n\t\t\t\t\tif (char === '&' && this.slice(i, i + 4) === '<') anglePos = i;\n\t\t\t\t\ti++;\n\t\t\t\t}\n\t\t\t\tif (this.slice(i, i + 2) !== ']]') return false;\n\n\t\t\t\tthis.pushSlice(start);\n\t\t\t\tthis.offset = i + 2;\n\t\t\t\tlet termEnd = i;\n\t\t\t\tlet uri = '';\n\t\t\t\tif (anglePos >= 0 && this.slice(i - 4, i) === '>') { // `>`\n\t\t\t\t\turi = this.slice(anglePos + 4, i - 4);\n\t\t\t\t\ttermEnd = anglePos;\n\t\t\t\t\tif (this.at(termEnd - 1) === ' ') termEnd--;\n\t\t\t\t\turi = encodeURI(uri.replace(/^([a-z]*[^a-z:])/g, 'http://$1'));\n\t\t\t\t}\n\t\t\t\tlet term = this.slice(start + 2, termEnd).replace(/<\\/?[au](?: [^>]+)?>/g, '');\n\t\t\t\tif (this.showSyntax) {\n\t\t\t\t\tterm += `${this.slice(termEnd, i)}`;\n\t\t\t\t} else if (uri && !this.isTrusted) {\n\t\t\t\t\tconst shortUri = uri.replace(/^https?:\\/\\//, '').replace(/^www\\./, '').replace(/\\/$/, '');\n\t\t\t\t\tterm += ` <${shortUri}>`;\n\t\t\t\t\turi += '\" rel=\"noopener';\n\t\t\t\t}\n\n\t\t\t\tif (colonPos > 0) {\n\t\t\t\t\tconst key = this.slice(start + 2, colonPos).toLowerCase();\n\t\t\t\t\tswitch (key) {\n\t\t\t\t\tcase 'w':\n\t\t\t\t\tcase 'wiki':\n\t\t\t\t\t\tif (this.showSyntax) break;\n\t\t\t\t\t\tterm = term.slice(term.charAt(key.length + 1) === ' ' ? key.length + 2 : key.length + 1);\n\t\t\t\t\t\turi = `//en.wikipedia.org/w/index.php?title=Special:Search&search=${this.toUriComponent(term)}`;\n\t\t\t\t\t\tterm = `wiki: ${term}`;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'pokemon':\n\t\t\t\t\tcase 'item':\n\t\t\t\t\tcase 'type':\n\t\t\t\t\tcase 'category':\n\t\t\t\t\t\tif (this.showSyntax) {\n\t\t\t\t\t\t\tthis.buffers.push(`${this.slice(start, this.offset)}`);\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tterm = term.slice(term.charAt(key.length + 1) === ' ' ? key.length + 2 : key.length + 1);\n\n\t\t\t\t\t\tlet display = '';\n\t\t\t\t\t\tif (this.isTrusted) {\n\t\t\t\t\t\t\tdisplay = ``;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tdisplay = `[${term}]`;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlet dir = key;\n\t\t\t\t\t\tif (key === 'item') dir += 's';\n\t\t\t\t\t\tif (key === 'category') dir = 'categories' as 'category';\n\n\t\t\t\t\t\turi = `//dex.pokemonshowdown.com/${dir}/${toID(term)}`;\n\t\t\t\t\t\tterm = display;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (!uri) {\n\t\t\t\t\turi = `//www.google.com/search?ie=UTF-8&btnI&q=${this.toUriComponent(term)}`;\n\t\t\t\t}\n\t\t\t\tif (this.showSyntax) {\n\t\t\t\t\tthis.buffers.push(`[[${term}]]`);\n\t\t\t\t} else {\n\t\t\t\t\tthis.buffers.push(`${term}`);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\tcase '<':\n\t\t\t// Roomid-link span. Not to be confused with a URL span.\n\t\t\t// `<>`\n\t\t\t{\n\t\t\t\tif (this.slice(start, start + 8) !== '<<') return false; // <<\n\t\t\t\tlet i = start + 8;\n\t\t\t\twhile (/[a-z0-9-]/.test(this.at(i))) i++;\n\t\t\t\tif (this.slice(i, i + 8) !== '>>') return false; // >>\n\n\t\t\t\tthis.pushSlice(start);\n\t\t\t\tconst roomid = this.slice(start + 8, i);\n\t\t\t\tif (this.showSyntax) {\n\t\t\t\t\tthis.buffers.push(`<<${roomid}>>`);\n\t\t\t\t} else {\n\t\t\t\t\tthis.buffers.push(`«${roomid}»`);\n\t\t\t\t}\n\t\t\t\tthis.offset = i + 8;\n\t\t\t}\n\t\t\treturn true;\n\t\tcase 'a': case 'u':\n\t\t\t// URL span. Skip to the end of the link - where `` or `` is.\n\t\t\t// Nothing inside should be formatted further (obviously we don't want\n\t\t\t// `example.com/__foo__` to turn `foo` italic).\n\t\t\t{\n\t\t\t\tlet i = start + 2;\n\t\t\t\t// Find or .\n\t\t\t\t// We need to check the location of `>` to disambiguate from .\n\t\t\t\twhile (this.at(i) !== '<' || this.at(i + 1) !== '/' || this.at(i + 3) !== '>') i++;\n\t\t\t\ti += 4;\n\t\t\t\tthis.pushSlice(i);\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tget() {\n\t\tlet beginningOfLine = this.offset;\n\t\t// main loop! `i` tracks our position\n\t\t// Note that we skip around a lot; `i` is mutated inside the loop\n\t\t// pretty often.\n\t\tfor (let i = beginningOfLine; i < this.str.length; i++) {\n\t\t\tconst char = this.at(i);\n\t\t\tswitch (char) {\n\t\t\tcase '_':\n\t\t\tcase '*':\n\t\t\tcase '~':\n\t\t\tcase '^':\n\t\t\tcase '\\\\':\n\t\t\tcase '|':\n\t\t\t\t// Must be exactly two chars long.\n\t\t\t\tif (this.at(i + 1) === char && this.at(i + 2) !== char) {\n\t\t\t\t\t// This is a completely normal two-char span. Close it if it's\n\t\t\t\t\t// already open, open it if it's not.\n\t\t\t\t\t// The inside of regular spans must not start or end with a space.\n\t\t\t\t\tif (!(this.at(i - 1) !== ' ' && this.closeSpan(char, i, i + 2))) {\n\t\t\t\t\t\tif (this.at(i + 2) !== ' ') this.pushSpan(char, i, i + 2);\n\t\t\t\t\t}\n\t\t\t\t\tif (i < this.offset) {\n\t\t\t\t\t\ti = this.offset - 1;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\twhile (this.at(i + 1) === char) i++;\n\t\t\t\tbreak;\n\t\t\tcase '(':\n\t\t\t\t// `(` span - does nothing except end spans\n\t\t\t\tthis.stack.push(['(', -1]);\n\t\t\t\tbreak;\n\t\t\tcase ')':\n\t\t\t\t// end of `(` span\n\t\t\t\tthis.closeParenSpan(i);\n\t\t\t\tif (i < this.offset) {\n\t\t\t\t\ti = this.offset - 1;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase '`':\n\t\t\t\t// ` ``code`` ` span. Uses lookahead because its contents are not\n\t\t\t\t// formatted.\n\t\t\t\t// Must be at least two `` ` `` in a row.\n\t\t\t\tif (this.at(i + 1) === '`') this.runLookahead('`', i);\n\t\t\t\tif (i < this.offset) {\n\t\t\t\t\ti = this.offset - 1;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\twhile (this.at(i + 1) === '`') i++;\n\t\t\t\tbreak;\n\t\t\tcase '[':\n\t\t\t\t// `[` (link) span. Uses lookahead because it might contain a\n\t\t\t\t// URL which can't be formatted, or search terms that can't be\n\t\t\t\t// formatted.\n\t\t\t\tthis.runLookahead('[', i);\n\t\t\t\tif (i < this.offset) {\n\t\t\t\t\ti = this.offset - 1;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\twhile (this.at(i + 1) === '[') i++;\n\t\t\t\tbreak;\n\t\t\tcase ':':\n\t\t\t\t// Looks behind for `spoiler:` or `spoilers:`. Spoiler spans\n\t\t\t\t// are also weird because they don't require an ending symbol,\n\t\t\t\t// although that's not handled here.\n\t\t\t\tif (i < 7) break;\n\t\t\t\tif (this.slice(i - 7, i + 1).toLowerCase() === 'spoiler:' ||\n\t\t\t\t\tthis.slice(i - 8, i + 1).toLowerCase() === 'spoilers:') {\n\t\t\t\t\tif (this.at(i + 1) === ' ') i++;\n\t\t\t\t\tthis.pushSpan('spoiler', i + 1, i + 1);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase '&': // escaped '<' or '>'\n\t\t\t\t// greentext or roomid\n\t\t\t\tif (i === beginningOfLine && this.slice(i, i + 4) === '>') {\n\t\t\t\t\t// greentext span, normal except it lacks an ending span\n\t\t\t\t\t// check for certain emoticons like `>_>` or `>w<`\n\t\t\t\t\tif (!\"._/=:;\".includes(this.at(i + 4)) && !['w<', 'w>'].includes(this.slice(i + 4, i + 9))) {\n\t\t\t\t\t\tthis.pushSpan('>', i, i);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// completely normal `<>` span\n\t\t\t\t\t// uses lookahead because roomids can't be formatted.\n\t\t\t\t\tthis.runLookahead('<', i);\n\t\t\t\t}\n\t\t\t\tif (i < this.offset) {\n\t\t\t\t\ti = this.offset - 1;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\twhile (this.slice(i + 1, i + 5) === 'lt;&') i += 4;\n\t\t\t\tbreak;\n\t\t\tcase '<': // guaranteed to be or \n\t\t\t\t// URL span\n\t\t\t\t// The constructor has already converted `<` to `<` and URLs\n\t\t\t\t// to links, so `<` must be the start of a converted link.\n\t\t\t\tthis.runLookahead('a', i);\n\t\t\t\tif (i < this.offset) {\n\t\t\t\t\ti = this.offset - 1;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t// should never happen\n\t\t\t\tbreak;\n\t\t\tcase '\\r':\n\t\t\tcase '\\n':\n\t\t\t\t// End of the line. No spans span multiple lines.\n\t\t\t\tthis.popAllSpans(i);\n\t\t\t\tif (this.replaceLinebreaks) {\n\t\t\t\t\tthis.buffers.push(`
`);\n\t\t\t\t\tthis.offset++;\n\t\t\t\t}\n\t\t\t\tbeginningOfLine = i + 1;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tthis.popAllSpans(this.str.length);\n\t\treturn this.buffers.join('');\n\t}\n}\n\n/**\n * Takes a string and converts it to HTML by replacing standard chat formatting with the appropriate HTML tags.\n */\nexport function formatText(str: string, isTrusted = false, replaceLinebreaks = false, showSyntax = false) {\n\treturn new TextFormatter(str, isTrusted, replaceLinebreaks, showSyntax).get();\n}\n\n/**\n * Takes a string and strips all standard chat formatting except greentext from it, the text of a link is kept.\n */\nexport function stripFormatting(str: string) {\n\t// Doesn't match > meme arrows because the angle bracket appears in the chat still.\n\tstr = str.replace(/\\*\\*([^\\s*]+)\\*\\*|__([^\\s_]+)__|~~([^\\s~]+)~~|``([^\\s`]+)``|\\^\\^([^\\s^]+)\\^\\^|\\\\([^\\s\\\\]+)\\\\/g,\n\t\t(match, $1, $2, $3, $4, $5, $6) => $1 || $2 || $3 || $4 || $5 || $6);\n\t// Remove all of the link expect for the text in [[text]]\n\treturn str.replace(/\\[\\[(?:([^<]*)\\s*<[^>]+>|([^\\]]+))\\]\\]/g, (match, $1, $2) => $1 || $2 || '');\n}\n"],
"mappings": "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",
"names": ["span"]
}