{
"version": 3,
"sources": ["../../../server/chat-formatter.ts"],
"sourcesContent": ["/**\r\n * Chat parser\r\n * Pokemon Showdown - http://pokemonshowdown.com/\r\n *\r\n * Parses formate.\r\n *\r\n * @license MIT\r\n */\r\n\r\n/*\r\nREGEXFREE SOURCE FOR LINKREGEX\r\n\r\n\t(\r\n\t\t(\r\n\t\t\t# When using http://, allow any domain\r\n\t\t\thttps?:\\/\\/ [a-z0-9-]+ ( \\. [a-z0-9-]+ )*\r\n\t\t|\r\n\t\t\t# When using www., expect at least one more dot\r\n\t\t\twww \\. [a-z0-9-]+ ( \\. [a-z0-9-]+ )+\r\n\t\t|\r\n\t\t\t# Otherwise, allow any domain, but only if\r\n\t\t\t\\b [a-z0-9-]+ ( \\. [a-z0-9-]+ )* \\.\r\n\t\t\t(\r\n\t\t\t\t# followed either a common TLD...\r\n\t\t\t\t( com? | org | net | edu | info | us | jp ) \\b\r\n\t\t\t|\r\n\t\t\t\t# or any 2-3 letter TLD followed by a port or /\r\n\t\t\t\t[a-z]{2,3} (?= :[0-9] | / )\r\n\t\t\t)\r\n\t\t)\r\n\t\t# possible custom port\r\n\t\t( : [0-9]+ )?\r\n\t\t(\r\n\t\t\t\\/\r\n\t\t\t(\r\n\t\t\t\t# characters allowed inside URL paths\r\n\t\t\t\t(\r\n\t\t\t\t\t[^\\s()&<>] | & | "\r\n\t\t\t\t|\r\n\t\t\t\t\t# parentheses in URLs should be matched, so they're not confused\r\n\t\t\t\t\t# for parentheses around URLs\r\n\t\t\t\t\t\\( ( [^\\\\s()<>&] | & )* \\)\r\n\t\t\t\t)*\r\n\t\t\t\t# URLs usually don't end with punctuation, so don't allow\r\n\t\t\t\t# punctuation symbols that probably arent related to URL.\r\n\t\t\t\t(\r\n\t\t\t\t\t[^\\s()[\\]{}\\\".,!?;:&<>*`^~\\\\]\r\n\t\t\t\t|\r\n\t\t\t\t\t# annoyingly, Wikipedia URLs often end in )\r\n\t\t\t\t\t\\( ( [^\\s()<>&] | & )* \\)\r\n\t\t\t\t)\r\n\t\t\t)?\r\n\t\t)?\r\n\t|\r\n\t\t# email address\r\n\t\t[a-z0-9.]+ @ [a-z0-9-]+ ( \\. [a-z0-9-]+ )* \\. [a-z]{2,}\r\n\t)\r\n\t(?! [^ ]*> )\r\n\r\n*/\r\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()<>&]|&)*\\)))?)?|[a-z0-9.]+@[a-z0-9-]+(?:\\.[a-z0-9-]+)*\\.[a-z]{2,})(?![^ ]*>)/ig;\r\n\r\ntype SpanType = '_' | '*' | '~' | '^' | '\\\\' | '|' | '<' | '[' | '`' | 'a' | 'spoiler' | '>' | '(';\r\n\r\ntype FormatSpan = [SpanType, number];\r\n\r\nclass TextFormatter {\r\n\treadonly str: string;\r\n\treadonly buffers: string[];\r\n\treadonly stack: FormatSpan[];\r\n\treadonly isTrusted: boolean;\r\n\treadonly replaceLinebreaks: boolean;\r\n\t/** offset of str that's been parsed so far */\r\n\toffset: number;\r\n\r\n\tconstructor(str: string, isTrusted = false, replaceLinebreaks = false) {\r\n\t\t// escapeHTML, without escaping /\r\n\t\tstr = `${str}`\r\n\t\t\t.replace(/&/g, '&')\r\n\t\t\t.replace(//g, '>')\r\n\t\t\t.replace(/\"/g, '"')\r\n\t\t\t.replace(/'/g, ''');\r\n\r\n\t\t// filter links first\r\n\t\tstr = str.replace(linkRegex, uri => {\r\n\t\t\tlet fulluri;\r\n\t\t\tif (/^[a-z0-9.]+@/ig.test(uri)) {\r\n\t\t\t\tfulluri = 'mailto:' + uri;\r\n\t\t\t} else {\r\n\t\t\t\tfulluri = uri.replace(/^([a-z]*[^a-z:])/g, 'http://$1');\r\n\t\t\t\tif (uri.substr(0, 24) === 'https://docs.google.com/' || uri.substr(0, 16) === 'docs.google.com/') {\r\n\t\t\t\t\tif (uri.startsWith('https')) uri = uri.slice(8);\r\n\t\t\t\t\tif (uri.substr(-12) === '?usp=sharing' || uri.substr(-12) === '&usp=sharing') uri = uri.slice(0, -12);\r\n\t\t\t\t\tif (uri.substr(-6) === '#gid=0') uri = uri.slice(0, -6);\r\n\t\t\t\t\tlet slashIndex = uri.lastIndexOf('/');\r\n\t\t\t\t\tif (uri.length - slashIndex > 18) slashIndex = uri.length;\r\n\t\t\t\t\tif (slashIndex - 4 > 19 + 3) {\r\n\t\t\t\t\t\turi = uri.slice(0, 19) +\r\n\t\t\t\t\t\t'' + uri.slice(19, slashIndex - 4) + '' + uri.slice(slashIndex - 4);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn `${uri}`;\r\n\t\t});\r\n\t\t// (links don't have any specific syntax, they're just a pattern, so we detect them in a separate pass)\r\n\r\n\t\tthis.str = str;\r\n\t\tthis.buffers = [];\r\n\t\tthis.stack = [];\r\n\t\tthis.isTrusted = isTrusted;\r\n\t\tthis.replaceLinebreaks = this.isTrusted || replaceLinebreaks;\r\n\t\tthis.offset = 0;\r\n\t}\r\n\t// debugAt(i=0, j=i+1) { console.log(`${this.slice(0, i)}[${this.slice(i, j)}]${this.slice(j, this.str.length)}`); }\r\n\r\n\tslice(start: number, end: number) {\r\n\t\treturn this.str.slice(start, end);\r\n\t}\r\n\r\n\tat(start: number) {\r\n\t\treturn this.str.charAt(start);\r\n\t}\r\n\r\n\tpushSpan(spanType: SpanType, start: number, end: number) {\r\n\t\tthis.pushSlice(start);\r\n\t\tthis.stack.push([spanType, this.buffers.length]);\r\n\t\tthis.buffers.push(this.slice(start, end));\r\n\t\tthis.offset = end;\r\n\t}\r\n\r\n\tpushSlice(end: number) {\r\n\t\tif (end !== this.offset) {\r\n\t\t\tthis.buffers.push(this.slice(this.offset, end));\r\n\t\t\tthis.offset = end;\r\n\t\t}\r\n\t}\r\n\r\n\tcloseParenSpan(start: number) {\r\n\t\tlet stackPosition = -1;\r\n\t\tfor (let i = this.stack.length - 1; i >= 0; i--) {\r\n\t\t\tconst span = this.stack[i];\r\n\t\t\tif (span[0] === '(') {\r\n\t\t\t\tstackPosition = i;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tif (span[0] !== 'spoiler') break;\r\n\t\t}\r\n\t\tif (stackPosition === -1) return false;\r\n\r\n\t\tthis.pushSlice(start);\r\n\t\twhile (this.stack.length > stackPosition) this.popSpan(start);\r\n\t\tthis.offset = start;\r\n\t\treturn true;\r\n\t}\r\n\r\n\t/**\r\n\t * Attempt to close a span.\r\n\t */\r\n\tcloseSpan(spanType: SpanType, start: number, end: number) {\r\n\t\t// loop backwards\r\n\t\tlet stackPosition = -1;\r\n\t\tfor (let i = this.stack.length - 1; i >= 0; i--) {\r\n\t\t\tconst span = this.stack[i];\r\n\t\t\tif (span[0] === spanType) {\r\n\t\t\t\tstackPosition = i;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (stackPosition === -1) return false;\r\n\r\n\t\tthis.pushSlice(start);\r\n\t\twhile (this.stack.length > stackPosition + 1) this.popSpan(start);\r\n\t\tconst span = this.stack.pop()!;\r\n\t\tconst startIndex = span[1];\r\n\t\tlet tagName = '';\r\n\t\tlet attrs = '';\r\n\t\tswitch (spanType) {\r\n\t\tcase '_': tagName = 'i'; break;\r\n\t\tcase '*': tagName = 'b'; break;\r\n\t\tcase '~': tagName = 's'; break;\r\n\t\tcase '^': tagName = 'sup'; break;\r\n\t\tcase '\\\\': tagName = 'sub'; break;\r\n\t\tcase '|': tagName = 'span'; attrs = ' class=\"spoiler\"'; break;\r\n\t\t}\r\n\t\tif (tagName) {\r\n\t\t\tthis.buffers[startIndex] = `<${tagName}${attrs}>`;\r\n\t\t\tthis.buffers.push(`${tagName}>`);\r\n\t\t\tthis.offset = end;\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\t/**\r\n\t * Ends a span without an ending symbol. For most spans, this means\r\n\t * they don't take effect, but certain spans like spoiler tags don't\r\n\t * require ending symbols.\r\n\t */\r\n\tpopSpan(end: number) {\r\n\t\tconst span = this.stack.pop();\r\n\t\tif (!span) return false;\r\n\t\tthis.pushSlice(end);\r\n\t\tswitch (span[0]) {\r\n\t\tcase 'spoiler':\r\n\t\t\tthis.buffers.push(``);\r\n\t\t\tthis.buffers[span[1]] = ``;\r\n\t\t\tbreak;\r\n\t\tcase '>':\r\n\t\t\tthis.buffers.push(``);\r\n\t\t\tthis.buffers[span[1]] = ``;\r\n\t\t\tbreak;\r\n\t\tdefault:\r\n\t\t\t// do nothing\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\tpopAllSpans(end: number) {\r\n\t\twhile (this.stack.length) this.popSpan(end);\r\n\t\tthis.pushSlice(end);\r\n\t}\r\n\r\n\ttoUriComponent(html: string) {\r\n\t\tconst component = html.replace(/</g, '<')\r\n\t\t\t.replace(/>/g, '>')\r\n\t\t\t.replace(/"/g, '\"')\r\n\t\t\t.replace(/'/g, '\\'')\r\n\t\t\t.replace(/&/g, '&');\r\n\t\treturn encodeURIComponent(component);\r\n\t}\r\n\r\n\trunLookahead(spanType: SpanType, start: number) {\r\n\t\tswitch (spanType) {\r\n\t\tcase '`':\r\n\t\t\t{\r\n\t\t\t\tlet delimLength = 0;\r\n\t\t\t\tlet i = start;\r\n\t\t\t\twhile (this.at(i) === '`') {\r\n\t\t\t\t\tdelimLength++;\r\n\t\t\t\t\ti++;\r\n\t\t\t\t}\r\n\t\t\t\tlet curDelimLength = 0;\r\n\t\t\t\twhile (i < this.str.length) {\r\n\t\t\t\t\tconst char = this.at(i);\r\n\t\t\t\t\tif (char === '\\n') break;\r\n\t\t\t\t\tif (char === '`') {\r\n\t\t\t\t\t\tcurDelimLength++;\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tif (curDelimLength === delimLength) break;\r\n\t\t\t\t\t\tcurDelimLength = 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t\ti++;\r\n\t\t\t\t}\r\n\t\t\t\tif (curDelimLength !== delimLength) return false;\r\n\t\t\t\t// matching delims found\r\n\t\t\t\tthis.pushSlice(start);\r\n\t\t\t\tthis.buffers.push(``);\r\n\t\t\t\tlet innerStart = start + delimLength;\r\n\t\t\t\tlet innerEnd = i - delimLength;\r\n\t\t\t\tif (innerStart + 1 >= innerEnd) {\r\n\t\t\t\t\t// no special whitespace handling\r\n\t\t\t\t} else if (this.at(innerStart) === ' ' && this.at(innerEnd - 1) === ' ') {\r\n\t\t\t\t\tinnerStart++; // strip starting and ending space\r\n\t\t\t\t\tinnerEnd--;\r\n\t\t\t\t} else if (this.at(innerStart) === ' ' && this.at(innerStart + 1) === '`') {\r\n\t\t\t\t\tinnerStart++; // strip starting space\r\n\t\t\t\t} else if (this.at(innerEnd - 1) === ' ' && this.at(innerEnd - 2) === '`') {\r\n\t\t\t\t\tinnerEnd--; // strip ending space\r\n\t\t\t\t}\r\n\t\t\t\tthis.buffers.push(this.slice(innerStart, innerEnd));\r\n\t\t\t\tthis.buffers.push(``);\r\n\t\t\t\tthis.offset = i;\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\tcase '[':\r\n\t\t\t{\r\n\t\t\t\tif (this.slice(start, start + 2) !== '[[') return false;\r\n\t\t\t\tlet i = start + 2;\r\n\t\t\t\tlet colonPos = -1; // `:`\r\n\t\t\t\tlet anglePos = -1; // `<`\r\n\t\t\t\twhile (i < this.str.length) {\r\n\t\t\t\t\tconst char = this.at(i);\r\n\t\t\t\t\tif (char === ']' || char === '\\n') break;\r\n\t\t\t\t\tif (char === ':' && colonPos < 0) colonPos = i;\r\n\t\t\t\t\tif (char === '&' && this.slice(i, i + 4) === '<') anglePos = i;\r\n\t\t\t\t\ti++;\r\n\t\t\t\t}\r\n\t\t\t\tif (this.slice(i, i + 2) !== ']]') return false;\r\n\t\t\t\tlet termEnd = i;\r\n\t\t\t\tlet uri = '';\r\n\t\t\t\tif (anglePos >= 0 && this.slice(i - 4, i) === '>') { // `>`\r\n\t\t\t\t\turi = this.slice(anglePos + 4, i - 4);\r\n\t\t\t\t\ttermEnd = anglePos;\r\n\t\t\t\t\tif (this.at(termEnd - 1) === ' ') termEnd--;\r\n\t\t\t\t\turi = encodeURI(uri.replace(/^([a-z]*[^a-z:])/g, 'http://$1'));\r\n\t\t\t\t}\r\n\t\t\t\tlet term = this.slice(start + 2, termEnd).replace(/<\\/?a(?: [^>]+)?>/g, '');\r\n\t\t\t\tif (uri && !this.isTrusted) {\r\n\t\t\t\t\tconst shortUri = uri.replace(/^https?:\\/\\//, '').replace(/^www\\./, '').replace(/\\/$/, '');\r\n\t\t\t\t\tterm += ` <${shortUri}>`;\r\n\t\t\t\t\turi += '\" rel=\"noopener';\r\n\t\t\t\t}\r\n\t\t\t\tif (colonPos > 0) {\r\n\t\t\t\t\tconst key = this.slice(start + 2, colonPos).toLowerCase();\r\n\t\t\t\t\tswitch (key) {\r\n\t\t\t\t\tcase 'w':\r\n\t\t\t\t\tcase 'wiki':\r\n\t\t\t\t\t\tterm = term.slice(term.charAt(key.length + 1) === ' ' ? key.length + 2 : key.length + 1);\r\n\t\t\t\t\t\turi = `//en.wikipedia.org/w/index.php?title=Special:Search&search=${this.toUriComponent(term)}`;\r\n\t\t\t\t\t\tterm = `wiki: ${term}`;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'pokemon':\r\n\t\t\t\t\tcase 'item':\r\n\t\t\t\t\tcase 'type':\r\n\t\t\t\t\tcase 'category':\r\n\t\t\t\t\t\tterm = term.slice(term.charAt(key.length + 1) === ' ' ? key.length + 2 : key.length + 1);\r\n\r\n\t\t\t\t\t\tlet display = '';\r\n\t\t\t\t\t\tif (this.isTrusted) {\r\n\t\t\t\t\t\t\tdisplay = ``;\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tdisplay = `[${term}]`;\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tlet dir = key;\r\n\t\t\t\t\t\tif (key === 'item') dir += 's';\r\n\t\t\t\t\t\tif (key === 'category') dir = 'categories' as 'category';\r\n\r\n\t\t\t\t\t\turi = `//dex.pokemonshowdown.com/${dir}/${toID(term)}`;\r\n\t\t\t\t\t\tterm = display;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif (!uri) {\r\n\t\t\t\t\turi = `//www.google.com/search?ie=UTF-8&btnI&q=${this.toUriComponent(term)}`;\r\n\t\t\t\t}\r\n\t\t\t\tthis.pushSlice(start);\r\n\t\t\t\tthis.buffers.push(`${term}`);\r\n\t\t\t\tthis.offset = i + 2;\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\tcase '<':\r\n\t\t\t{\r\n\t\t\t\tif (this.slice(start, start + 8) !== '<<') return false; // <<\r\n\t\t\t\tlet i = start + 8;\r\n\t\t\t\twhile (/[a-z0-9-]/.test(this.at(i))) i++;\r\n\t\t\t\tif (this.slice(i, i + 8) !== '>>') return false; // >>\r\n\t\t\t\tthis.pushSlice(start);\r\n\t\t\t\tconst roomid = this.slice(start + 8, i);\r\n\t\t\t\tthis.buffers.push(`«${roomid}»`);\r\n\t\t\t\tthis.offset = i + 8;\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\tcase 'a':\r\n\t\t\t{\r\n\t\t\t\tlet i = start + 1;\r\n\t\t\t\twhile (this.at(i) !== '/' || this.at(i + 1) !== 'a' || this.at(i + 2) !== '>') i++; // \r\n\t\t\t\ti += 3;\r\n\t\t\t\tthis.pushSlice(i);\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\tget() {\r\n\t\tlet beginningOfLine = this.offset;\r\n\t\t// main loop! i tracks our position\r\n\t\tfor (let i = beginningOfLine; i < this.str.length; i++) {\r\n\t\t\tconst char = this.at(i);\r\n\t\t\tswitch (char) {\r\n\t\t\tcase '_':\r\n\t\t\tcase '*':\r\n\t\t\tcase '~':\r\n\t\t\tcase '^':\r\n\t\t\tcase '\\\\':\r\n\t\t\tcase '|':\r\n\t\t\t\tif (this.at(i + 1) === char && this.at(i + 2) !== char) {\r\n\t\t\t\t\tif (!(this.at(i - 1) !== ' ' && this.closeSpan(char, i, i + 2))) {\r\n\t\t\t\t\t\tif (this.at(i + 2) !== ' ') this.pushSpan(char, i, i + 2);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (i < this.offset) {\r\n\t\t\t\t\t\ti = this.offset - 1;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\twhile (this.at(i + 1) === char) i++;\r\n\t\t\t\tbreak;\r\n\t\t\tcase '(':\r\n\t\t\t\tthis.stack.push(['(', -1]);\r\n\t\t\t\tbreak;\r\n\t\t\tcase ')':\r\n\t\t\t\tthis.closeParenSpan(i);\r\n\t\t\t\tif (i < this.offset) {\r\n\t\t\t\t\ti = this.offset - 1;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase '`':\r\n\t\t\t\tif (this.at(i + 1) === '`') this.runLookahead('`', i);\r\n\t\t\t\tif (i < this.offset) {\r\n\t\t\t\t\ti = this.offset - 1;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\twhile (this.at(i + 1) === '`') i++;\r\n\t\t\t\tbreak;\r\n\t\t\tcase '[':\r\n\t\t\t\tthis.runLookahead('[', i);\r\n\t\t\t\tif (i < this.offset) {\r\n\t\t\t\t\ti = this.offset - 1;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\twhile (this.at(i + 1) === '[') i++;\r\n\t\t\t\tbreak;\r\n\t\t\tcase ':':\r\n\t\t\t\tif (i < 7) break;\r\n\t\t\t\tif (this.slice(i - 7, i + 1).toLowerCase() === 'spoiler:' ||\r\n\t\t\t\t\tthis.slice(i - 8, i + 1).toLowerCase() === 'spoilers:') {\r\n\t\t\t\t\tif (this.at(i + 1) === ' ') i++;\r\n\t\t\t\t\tthis.pushSpan('spoiler', i + 1, i + 1);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase '&': // escaped '<' or '>'\r\n\t\t\t\tif (i === beginningOfLine && this.slice(i, i + 4) === '>') {\r\n\t\t\t\t\tif (!\"._/=:;\".includes(this.at(i + 4)) && !['w<', 'w>'].includes(this.slice(i + 4, i + 9))) {\r\n\t\t\t\t\t\tthis.pushSpan('>', i, i);\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthis.runLookahead('<', i);\r\n\t\t\t\t}\r\n\t\t\t\tif (i < this.offset) {\r\n\t\t\t\t\ti = this.offset - 1;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\twhile (this.slice(i + 1, i + 5) === 'lt;&') i += 4;\r\n\t\t\t\tbreak;\r\n\t\t\tcase '<': // guaranteed to be `);\r\n\t\t\t\t\tthis.offset++;\r\n\t\t\t\t}\r\n\t\t\t\tbeginningOfLine = i + 1;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis.popAllSpans(this.str.length);\r\n\t\treturn this.buffers.join('');\r\n\t}\r\n}\r\n\r\n/**\r\n * Takes a string and converts it to HTML by replacing standard chat formatting with the appropriate HTML tags.\r\n */\r\nexport function formatText(str: string, isTrusted = false, replaceLinebreaks = false) {\r\n\treturn new TextFormatter(str, isTrusted, replaceLinebreaks).get();\r\n}\r\n\r\n/**\r\n * Takes a string and strips all standard chat formatting except greentext from it, the text of a link is kept.\r\n */\r\nexport function stripFormatting(str: string) {\r\n\t// Doesn't match > meme arrows because the angle bracket appears in the chat still.\r\n\tstr = str.replace(/\\*\\*([^\\s*]+)\\*\\*|__([^\\s_]+)__|~~([^\\s~]+)~~|``([^\\s`]+)``|\\^\\^([^\\s^]+)\\^\\^|\\\\([^\\s\\\\]+)\\\\/g,\r\n\t\t(match, $1, $2, $3, $4, $5, $6) => $1 || $2 || $3 || $4 || $5 || $6);\r\n\t// Remove all of the link expect for the text in [[text]]\r\n\treturn str.replace(/\\[\\[(?:([^<]*)\\s*<[^>]+>|([^\\]]+))\\]\\]/g, (match, $1, $2) => $1 || $2 || '');\r\n}\r\n"],
"mappings": "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",
"names": ["span"]
}