markdown-it
Version:
Markdown-it - modern pluggable markdown parser.
1 lines • 400 kB
Source Map (JSON)
{"version":3,"file":"markdown-it.esm.min.mjs","names":["decode","encode"],"sources":["../../node_modules/mdurl/lib/decode.mjs","../../node_modules/mdurl/lib/encode.mjs","../../node_modules/mdurl/lib/format.mjs","../../node_modules/mdurl/lib/parse.mjs","../../node_modules/mdurl/index.mjs","../../node_modules/uc.micro/build/index.mjs","../../node_modules/entities/dist/decode-codepoint.js","../../node_modules/entities/dist/internal/decode-shared.js","../../node_modules/entities/dist/generated/decode-data-html.js","../../node_modules/entities/dist/internal/bin-trie-flags.js","../../node_modules/entities/dist/decode.js","../../src/common/utils.ts","../../src/helpers/parse_link_label.ts","../../src/helpers/parse_link_destination.ts","../../src/helpers/parse_link_title.ts","../../src/helpers/index.ts","../../src/token.ts","../../src/ruler.ts","../../src/renderer.ts","../../src/rules_core/state_core.ts","../../src/rules_core/normalize.ts","../../src/rules_core/block.ts","../../src/rules_core/strip_references.ts","../../src/rules_core/inline.ts","../../src/rules_core/linkify.ts","../../src/rules_core/replacements.ts","../../src/rules_core/smartquotes.ts","../../src/rules_core/text_join.ts","../../src/parser_core.ts","../../src/rules_block/state_block.ts","../../src/rules_block/table.ts","../../src/rules_block/code.ts","../../src/rules_block/fence.ts","../../src/rules_block/blockquote.ts","../../src/rules_block/hr.ts","../../src/rules_block/list.ts","../../src/rules_block/reference.ts","../../src/common/html_blocks.ts","../../src/common/html_re.ts","../../src/rules_block/html_block.ts","../../src/rules_block/heading.ts","../../src/rules_block/lheading.ts","../../src/rules_block/paragraph.ts","../../src/parser_block.ts","../../src/rules_inline/state_inline.ts","../../src/rules_inline/text.ts","../../src/rules_inline/linkify.ts","../../src/rules_inline/newline.ts","../../src/rules_inline/escape.ts","../../src/rules_inline/backticks.ts","../../src/rules_inline/strikethrough.ts","../../src/rules_inline/emphasis.ts","../../src/rules_inline/link.ts","../../src/rules_inline/image.ts","../../src/rules_inline/autolink.ts","../../src/rules_inline/html_inline.ts","../../src/rules_inline/entity.ts","../../src/rules_inline/balance_pairs.ts","../../src/rules_inline/fragments_join.ts","../../src/parser_inline.ts","../../node_modules/linkify-it/build/index.mjs","../../node_modules/punycode.js/punycode.es6.js","../../src/presets/default.ts","../../src/presets/zero.ts","../../src/presets/commonmark.ts","../../src/markdownit.ts","../../src/index.ts"],"sourcesContent":["/* eslint-disable no-bitwise */\n\nconst decodeCache = {}\n\nfunction getDecodeCache (exclude) {\n let cache = decodeCache[exclude]\n if (cache) { return cache }\n\n cache = decodeCache[exclude] = []\n\n for (let i = 0; i < 128; i++) {\n const ch = String.fromCharCode(i)\n cache.push(ch)\n }\n\n for (let i = 0; i < exclude.length; i++) {\n const ch = exclude.charCodeAt(i)\n cache[ch] = '%' + ('0' + ch.toString(16).toUpperCase()).slice(-2)\n }\n\n return cache\n}\n\n// Decode percent-encoded string.\n//\nfunction decode (string, exclude) {\n if (typeof exclude !== 'string') {\n exclude = decode.defaultChars\n }\n\n const cache = getDecodeCache(exclude)\n\n return string.replace(/(%[a-f0-9]{2})+/gi, function (seq) {\n let result = ''\n\n for (let i = 0, l = seq.length; i < l; i += 3) {\n const b1 = parseInt(seq.slice(i + 1, i + 3), 16)\n\n if (b1 < 0x80) {\n result += cache[b1]\n continue\n }\n\n if ((b1 & 0xE0) === 0xC0 && (i + 3 < l)) {\n // 110xxxxx 10xxxxxx\n const b2 = parseInt(seq.slice(i + 4, i + 6), 16)\n\n if ((b2 & 0xC0) === 0x80) {\n const chr = ((b1 << 6) & 0x7C0) | (b2 & 0x3F)\n\n if (chr < 0x80) {\n result += '\\ufffd\\ufffd'\n } else {\n result += String.fromCharCode(chr)\n }\n\n i += 3\n continue\n }\n }\n\n if ((b1 & 0xF0) === 0xE0 && (i + 6 < l)) {\n // 1110xxxx 10xxxxxx 10xxxxxx\n const b2 = parseInt(seq.slice(i + 4, i + 6), 16)\n const b3 = parseInt(seq.slice(i + 7, i + 9), 16)\n\n if ((b2 & 0xC0) === 0x80 && (b3 & 0xC0) === 0x80) {\n const chr = ((b1 << 12) & 0xF000) | ((b2 << 6) & 0xFC0) | (b3 & 0x3F)\n\n if (chr < 0x800 || (chr >= 0xD800 && chr <= 0xDFFF)) {\n result += '\\ufffd\\ufffd\\ufffd'\n } else {\n result += String.fromCharCode(chr)\n }\n\n i += 6\n continue\n }\n }\n\n if ((b1 & 0xF8) === 0xF0 && (i + 9 < l)) {\n // 111110xx 10xxxxxx 10xxxxxx 10xxxxxx\n const b2 = parseInt(seq.slice(i + 4, i + 6), 16)\n const b3 = parseInt(seq.slice(i + 7, i + 9), 16)\n const b4 = parseInt(seq.slice(i + 10, i + 12), 16)\n\n if ((b2 & 0xC0) === 0x80 && (b3 & 0xC0) === 0x80 && (b4 & 0xC0) === 0x80) {\n let chr = ((b1 << 18) & 0x1C0000) | ((b2 << 12) & 0x3F000) | ((b3 << 6) & 0xFC0) | (b4 & 0x3F)\n\n if (chr < 0x10000 || chr > 0x10FFFF) {\n result += '\\ufffd\\ufffd\\ufffd\\ufffd'\n } else {\n chr -= 0x10000\n result += String.fromCharCode(0xD800 + (chr >> 10), 0xDC00 + (chr & 0x3FF))\n }\n\n i += 9\n continue\n }\n }\n\n result += '\\ufffd'\n }\n\n return result\n })\n}\n\ndecode.defaultChars = ';/?:@&=+$,#'\ndecode.componentChars = ''\n\nexport default decode\n","const encodeCache = {}\n\n// Create a lookup array where anything but characters in `chars` string\n// and alphanumeric chars is percent-encoded.\n//\nfunction getEncodeCache (exclude) {\n let cache = encodeCache[exclude]\n if (cache) { return cache }\n\n cache = encodeCache[exclude] = []\n\n for (let i = 0; i < 128; i++) {\n const ch = String.fromCharCode(i)\n\n if (/^[0-9a-z]$/i.test(ch)) {\n // always allow unencoded alphanumeric characters\n cache.push(ch)\n } else {\n cache.push('%' + ('0' + i.toString(16).toUpperCase()).slice(-2))\n }\n }\n\n for (let i = 0; i < exclude.length; i++) {\n cache[exclude.charCodeAt(i)] = exclude[i]\n }\n\n return cache\n}\n\n// Encode unsafe characters with percent-encoding, skipping already\n// encoded sequences.\n//\n// - string - string to encode\n// - exclude - list of characters to ignore (in addition to a-zA-Z0-9)\n// - keepEscaped - don't encode '%' in a correct escape sequence (default: true)\n//\nfunction encode (string, exclude, keepEscaped) {\n if (typeof exclude !== 'string') {\n // encode(string, keepEscaped)\n keepEscaped = exclude\n exclude = encode.defaultChars\n }\n\n if (typeof keepEscaped === 'undefined') {\n keepEscaped = true\n }\n\n const cache = getEncodeCache(exclude)\n let result = ''\n\n for (let i = 0, l = string.length; i < l; i++) {\n const code = string.charCodeAt(i)\n\n if (keepEscaped && code === 0x25 /* % */ && i + 2 < l) {\n if (/^[0-9a-f]{2}$/i.test(string.slice(i + 1, i + 3))) {\n result += string.slice(i, i + 3)\n i += 2\n continue\n }\n }\n\n if (code < 128) {\n result += cache[code]\n continue\n }\n\n if (code >= 0xD800 && code <= 0xDFFF) {\n if (code >= 0xD800 && code <= 0xDBFF && i + 1 < l) {\n const nextCode = string.charCodeAt(i + 1)\n if (nextCode >= 0xDC00 && nextCode <= 0xDFFF) {\n result += encodeURIComponent(string[i] + string[i + 1])\n i++\n continue\n }\n }\n result += '%EF%BF%BD'\n continue\n }\n\n result += encodeURIComponent(string[i])\n }\n\n return result\n}\n\nencode.defaultChars = \";/?:@&=+$,-_.!~*'()#\"\nencode.componentChars = \"-_.!~*'()\"\n\nexport default encode\n","export default function format (url) {\n let result = ''\n\n result += url.protocol || ''\n result += url.slashes ? '//' : ''\n result += url.auth ? url.auth + '@' : ''\n\n if (url.hostname && url.hostname.indexOf(':') !== -1) {\n // ipv6 address\n result += '[' + url.hostname + ']'\n } else {\n result += url.hostname || ''\n }\n\n result += url.port ? ':' + url.port : ''\n result += url.pathname || ''\n result += url.search || ''\n result += url.hash || ''\n\n return result\n};\n","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n//\n// Changes from joyent/node:\n//\n// 1. No leading slash in paths,\n// e.g. in `url.parse('http://foo?bar')` pathname is ``, not `/`\n//\n// 2. Backslashes are not replaced with slashes,\n// so `http:\\\\example.org\\` is treated like a relative path\n//\n// 3. Trailing colon is treated like a part of the path,\n// i.e. in `http://example.org:foo` pathname is `:foo`\n//\n// 4. Nothing is URL-encoded in the resulting object,\n// (in joyent/node some chars in auth and paths are encoded)\n//\n// 5. `url.parse()` does not have `parseQueryString` argument\n//\n// 6. Removed extraneous result properties: `host`, `path`, `query`, etc.,\n// which can be constructed using other parts of the url.\n//\n\nfunction Url () {\n this.protocol = null\n this.slashes = null\n this.auth = null\n this.port = null\n this.hostname = null\n this.hash = null\n this.search = null\n this.pathname = null\n}\n\n// Reference: RFC 3986, RFC 1808, RFC 2396\n\n// define these here so at least they only have to be\n// compiled once on the first module load.\nconst protocolPattern = /^([a-z0-9.+-]+:)/i\nconst portPattern = /:[0-9]*$/\n\n// Special case for a simple path URL\n/* eslint-disable-next-line no-useless-escape */\nconst simplePathPattern = /^(\\/\\/?(?!\\/)[^\\?\\s]*)(\\?[^\\s]*)?$/\n\n// RFC 2396: characters reserved for delimiting URLs.\n// We actually just auto-escape these.\nconst delims = ['<', '>', '\"', '`', ' ', '\\r', '\\n', '\\t']\n\n// RFC 2396: characters not allowed for various reasons.\nconst unwise = ['{', '}', '|', '\\\\', '^', '`'].concat(delims)\n\n// Allowed by RFCs, but cause of XSS attacks. Always escape these.\nconst autoEscape = ['\\''].concat(unwise)\n// Characters that are never ever allowed in a hostname.\n// Note that any invalid chars are also handled, but these\n// are the ones that are *expected* to be seen, so we fast-path\n// them.\nconst nonHostChars = ['%', '/', '?', ';', '#'].concat(autoEscape)\nconst hostEndingChars = ['/', '?', '#']\nconst hostnameMaxLen = 255\nconst hostnamePartPattern = /^[+a-z0-9A-Z_-]{0,63}$/\nconst hostnamePartStart = /^([+a-z0-9A-Z_-]{0,63})(.*)$/\n// protocols that can allow \"unsafe\" and \"unwise\" chars.\n// protocols that never have a hostname.\nconst hostlessProtocol = {\n javascript: true,\n 'javascript:': true\n}\n// protocols that always contain a // bit.\nconst slashedProtocol = {\n http: true,\n https: true,\n ftp: true,\n gopher: true,\n file: true,\n 'http:': true,\n 'https:': true,\n 'ftp:': true,\n 'gopher:': true,\n 'file:': true\n}\n\nfunction urlParse (url, slashesDenoteHost) {\n if (url && url instanceof Url) return url\n\n const u = new Url()\n u.parse(url, slashesDenoteHost)\n return u\n}\n\nUrl.prototype.parse = function (url, slashesDenoteHost) {\n let lowerProto, hec, slashes\n let rest = url\n\n // trim before proceeding.\n // This is to support parse stuff like \" http://foo.com \\n\"\n rest = rest.trim()\n\n if (!slashesDenoteHost && url.split('#').length === 1) {\n // Try fast path regexp\n const simplePath = simplePathPattern.exec(rest)\n if (simplePath) {\n this.pathname = simplePath[1]\n if (simplePath[2]) {\n this.search = simplePath[2]\n }\n return this\n }\n }\n\n let proto = protocolPattern.exec(rest)\n if (proto) {\n proto = proto[0]\n lowerProto = proto.toLowerCase()\n this.protocol = proto\n rest = rest.substr(proto.length)\n }\n\n // figure out if it's got a host\n // user@server is *always* interpreted as a hostname, and url\n // resolution will treat //foo/bar as host=foo,path=bar because that's\n // how the browser resolves relative URLs.\n /* eslint-disable-next-line no-useless-escape */\n if (slashesDenoteHost || proto || rest.match(/^\\/\\/[^@\\/]+@[^@\\/]+/)) {\n slashes = rest.substr(0, 2) === '//'\n if (slashes && !(proto && hostlessProtocol[proto])) {\n rest = rest.substr(2)\n this.slashes = true\n }\n }\n\n if (!hostlessProtocol[proto] &&\n (slashes || (proto && !slashedProtocol[proto]))) {\n // there's a hostname.\n // the first instance of /, ?, ;, or # ends the host.\n //\n // If there is an @ in the hostname, then non-host chars *are* allowed\n // to the left of the last @ sign, unless some host-ending character\n // comes *before* the @-sign.\n // URLs are obnoxious.\n //\n // ex:\n // http://a@b@c/ => user:a@b host:c\n // http://a@b?@c => user:a host:c path:/?@c\n\n // v0.12 TODO(isaacs): This is not quite how Chrome does things.\n // Review our test case against browsers more comprehensively.\n\n // find the first instance of any hostEndingChars\n let hostEnd = -1\n for (let i = 0; i < hostEndingChars.length; i++) {\n hec = rest.indexOf(hostEndingChars[i])\n if (hec !== -1 && (hostEnd === -1 || hec < hostEnd)) {\n hostEnd = hec\n }\n }\n\n // at this point, either we have an explicit point where the\n // auth portion cannot go past, or the last @ char is the decider.\n let auth, atSign\n if (hostEnd === -1) {\n // atSign can be anywhere.\n atSign = rest.lastIndexOf('@')\n } else {\n // atSign must be in auth portion.\n // http://a@b/c@d => host:b auth:a path:/c@d\n atSign = rest.lastIndexOf('@', hostEnd)\n }\n\n // Now we have a portion which is definitely the auth.\n // Pull that off.\n if (atSign !== -1) {\n auth = rest.slice(0, atSign)\n rest = rest.slice(atSign + 1)\n this.auth = auth\n }\n\n // the host is the remaining to the left of the first non-host char\n hostEnd = -1\n for (let i = 0; i < nonHostChars.length; i++) {\n hec = rest.indexOf(nonHostChars[i])\n if (hec !== -1 && (hostEnd === -1 || hec < hostEnd)) {\n hostEnd = hec\n }\n }\n // if we still have not hit it, then the entire thing is a host.\n if (hostEnd === -1) {\n hostEnd = rest.length\n }\n\n if (rest[hostEnd - 1] === ':') { hostEnd-- }\n const host = rest.slice(0, hostEnd)\n rest = rest.slice(hostEnd)\n\n // pull out port.\n this.parseHost(host)\n\n // we've indicated that there is a hostname,\n // so even if it's empty, it has to be present.\n this.hostname = this.hostname || ''\n\n // if hostname begins with [ and ends with ]\n // assume that it's an IPv6 address.\n const ipv6Hostname = this.hostname[0] === '[' &&\n this.hostname[this.hostname.length - 1] === ']'\n\n // validate a little.\n if (!ipv6Hostname) {\n const hostparts = this.hostname.split(/\\./)\n for (let i = 0, l = hostparts.length; i < l; i++) {\n const part = hostparts[i]\n if (!part) { continue }\n if (!part.match(hostnamePartPattern)) {\n let newpart = ''\n for (let j = 0, k = part.length; j < k; j++) {\n if (part.charCodeAt(j) > 127) {\n // we replace non-ASCII char with a temporary placeholder\n // we need this to make sure size of hostname is not\n // broken by replacing non-ASCII by nothing\n newpart += 'x'\n } else {\n newpart += part[j]\n }\n }\n // we test again with ASCII char only\n if (!newpart.match(hostnamePartPattern)) {\n const validParts = hostparts.slice(0, i)\n const notHost = hostparts.slice(i + 1)\n const bit = part.match(hostnamePartStart)\n if (bit) {\n validParts.push(bit[1])\n notHost.unshift(bit[2])\n }\n if (notHost.length) {\n rest = notHost.join('.') + rest\n }\n this.hostname = validParts.join('.')\n break\n }\n }\n }\n }\n\n if (this.hostname.length > hostnameMaxLen) {\n this.hostname = ''\n }\n\n // strip [ and ] from the hostname\n // the host field still retains them, though\n if (ipv6Hostname) {\n this.hostname = this.hostname.substr(1, this.hostname.length - 2)\n }\n }\n\n // chop off from the tail first.\n const hash = rest.indexOf('#')\n if (hash !== -1) {\n // got a fragment string.\n this.hash = rest.substr(hash)\n rest = rest.slice(0, hash)\n }\n const qm = rest.indexOf('?')\n if (qm !== -1) {\n this.search = rest.substr(qm)\n rest = rest.slice(0, qm)\n }\n if (rest) { this.pathname = rest }\n if (slashedProtocol[lowerProto] &&\n this.hostname && !this.pathname) {\n this.pathname = ''\n }\n\n return this\n}\n\nUrl.prototype.parseHost = function (host) {\n let port = portPattern.exec(host)\n if (port) {\n port = port[0]\n if (port !== ':') {\n this.port = port.substr(1)\n }\n host = host.substr(0, host.length - port.length)\n }\n if (host) { this.hostname = host }\n}\n\nexport default urlParse\n","import decode from './lib/decode.mjs'\nimport encode from './lib/encode.mjs'\nimport format from './lib/format.mjs'\nimport parse from './lib/parse.mjs'\n\nexport {\n decode,\n encode,\n format,\n parse\n}\n","const Any = /[\\0-\\uD7FF\\uE000-\\uFFFF]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF]/;\nconst Cc = /[\\0-\\x1F\\x7F-\\x9F]/;\nconst Cf = /[\\xAD\\u0600-\\u0605\\u061C\\u06DD\\u070F\\u0890\\u0891\\u08E2\\u180E\\u200B-\\u200F\\u202A-\\u202E\\u2060-\\u2064\\u2066-\\u206F\\uFEFF\\uFFF9-\\uFFFB]|\\uD804[\\uDCBD\\uDCCD]|\\uD80D[\\uDC30-\\uDC3F]|\\uD82F[\\uDCA0-\\uDCA3]|\\uD834[\\uDD73-\\uDD7A]|\\uDB40[\\uDC01\\uDC20-\\uDC7F]/;\nconst P = /[!-#%-\\*,-\\/:;\\?@\\[-\\]_\\{\\}\\xA1\\xA7\\xAB\\xB6\\xB7\\xBB\\xBF\\u037E\\u0387\\u055A-\\u055F\\u0589\\u058A\\u05BE\\u05C0\\u05C3\\u05C6\\u05F3\\u05F4\\u0609\\u060A\\u060C\\u060D\\u061B\\u061D-\\u061F\\u066A-\\u066D\\u06D4\\u0700-\\u070D\\u07F7-\\u07F9\\u0830-\\u083E\\u085E\\u0964\\u0965\\u0970\\u09FD\\u0A76\\u0AF0\\u0C77\\u0C84\\u0DF4\\u0E4F\\u0E5A\\u0E5B\\u0F04-\\u0F12\\u0F14\\u0F3A-\\u0F3D\\u0F85\\u0FD0-\\u0FD4\\u0FD9\\u0FDA\\u104A-\\u104F\\u10FB\\u1360-\\u1368\\u1400\\u166E\\u169B\\u169C\\u16EB-\\u16ED\\u1735\\u1736\\u17D4-\\u17D6\\u17D8-\\u17DA\\u1800-\\u180A\\u1944\\u1945\\u1A1E\\u1A1F\\u1AA0-\\u1AA6\\u1AA8-\\u1AAD\\u1B4E\\u1B4F\\u1B5A-\\u1B60\\u1B7D-\\u1B7F\\u1BFC-\\u1BFF\\u1C3B-\\u1C3F\\u1C7E\\u1C7F\\u1CC0-\\u1CC7\\u1CD3\\u2010-\\u2027\\u2030-\\u2043\\u2045-\\u2051\\u2053-\\u205E\\u207D\\u207E\\u208D\\u208E\\u2308-\\u230B\\u2329\\u232A\\u2768-\\u2775\\u27C5\\u27C6\\u27E6-\\u27EF\\u2983-\\u2998\\u29D8-\\u29DB\\u29FC\\u29FD\\u2CF9-\\u2CFC\\u2CFE\\u2CFF\\u2D70\\u2E00-\\u2E2E\\u2E30-\\u2E4F\\u2E52-\\u2E5D\\u3001-\\u3003\\u3008-\\u3011\\u3014-\\u301F\\u3030\\u303D\\u30A0\\u30FB\\uA4FE\\uA4FF\\uA60D-\\uA60F\\uA673\\uA67E\\uA6F2-\\uA6F7\\uA874-\\uA877\\uA8CE\\uA8CF\\uA8F8-\\uA8FA\\uA8FC\\uA92E\\uA92F\\uA95F\\uA9C1-\\uA9CD\\uA9DE\\uA9DF\\uAA5C-\\uAA5F\\uAADE\\uAADF\\uAAF0\\uAAF1\\uABEB\\uFD3E\\uFD3F\\uFE10-\\uFE19\\uFE30-\\uFE52\\uFE54-\\uFE61\\uFE63\\uFE68\\uFE6A\\uFE6B\\uFF01-\\uFF03\\uFF05-\\uFF0A\\uFF0C-\\uFF0F\\uFF1A\\uFF1B\\uFF1F\\uFF20\\uFF3B-\\uFF3D\\uFF3F\\uFF5B\\uFF5D\\uFF5F-\\uFF65]|\\uD800[\\uDD00-\\uDD02\\uDF9F\\uDFD0]|\\uD801\\uDD6F|\\uD802[\\uDC57\\uDD1F\\uDD3F\\uDE50-\\uDE58\\uDE7F\\uDEF0-\\uDEF6\\uDF39-\\uDF3F\\uDF99-\\uDF9C]|\\uD803[\\uDD6E\\uDEAD\\uDED0\\uDF55-\\uDF59\\uDF86-\\uDF89]|\\uD804[\\uDC47-\\uDC4D\\uDCBB\\uDCBC\\uDCBE-\\uDCC1\\uDD40-\\uDD43\\uDD74\\uDD75\\uDDC5-\\uDDC8\\uDDCD\\uDDDB\\uDDDD-\\uDDDF\\uDE38-\\uDE3D\\uDEA9\\uDFD4\\uDFD5\\uDFD7\\uDFD8]|\\uD805[\\uDC4B-\\uDC4F\\uDC5A\\uDC5B\\uDC5D\\uDCC6\\uDDC1-\\uDDD7\\uDE41-\\uDE43\\uDE60-\\uDE6C\\uDEB9\\uDF3C-\\uDF3E]|\\uD806[\\uDC3B\\uDD44-\\uDD46\\uDDE2\\uDE3F-\\uDE46\\uDE9A-\\uDE9C\\uDE9E-\\uDEA2\\uDF00-\\uDF09\\uDFE1]|\\uD807[\\uDC41-\\uDC45\\uDC70\\uDC71\\uDEF7\\uDEF8\\uDF43-\\uDF4F\\uDFFF]|\\uD809[\\uDC70-\\uDC74]|\\uD80B[\\uDFF1\\uDFF2]|\\uD81A[\\uDE6E\\uDE6F\\uDEF5\\uDF37-\\uDF3B\\uDF44]|\\uD81B[\\uDD6D-\\uDD6F\\uDE97-\\uDE9A\\uDFE2]|\\uD82F\\uDC9F|\\uD836[\\uDE87-\\uDE8B]|\\uD839\\uDDFF|\\uD83A[\\uDD5E\\uDD5F]/;\nconst S = /[\\$\\+<->\\^`\\|~\\xA2-\\xA6\\xA8\\xA9\\xAC\\xAE-\\xB1\\xB4\\xB8\\xD7\\xF7\\u02C2-\\u02C5\\u02D2-\\u02DF\\u02E5-\\u02EB\\u02ED\\u02EF-\\u02FF\\u0375\\u0384\\u0385\\u03F6\\u0482\\u058D-\\u058F\\u0606-\\u0608\\u060B\\u060E\\u060F\\u06DE\\u06E9\\u06FD\\u06FE\\u07F6\\u07FE\\u07FF\\u0888\\u09F2\\u09F3\\u09FA\\u09FB\\u0AF1\\u0B70\\u0BF3-\\u0BFA\\u0C7F\\u0D4F\\u0D79\\u0E3F\\u0F01-\\u0F03\\u0F13\\u0F15-\\u0F17\\u0F1A-\\u0F1F\\u0F34\\u0F36\\u0F38\\u0FBE-\\u0FC5\\u0FC7-\\u0FCC\\u0FCE\\u0FCF\\u0FD5-\\u0FD8\\u109E\\u109F\\u1390-\\u1399\\u166D\\u17DB\\u1940\\u19DE-\\u19FF\\u1B61-\\u1B6A\\u1B74-\\u1B7C\\u1FBD\\u1FBF-\\u1FC1\\u1FCD-\\u1FCF\\u1FDD-\\u1FDF\\u1FED-\\u1FEF\\u1FFD\\u1FFE\\u2044\\u2052\\u207A-\\u207C\\u208A-\\u208C\\u20A0-\\u20C1\\u2100\\u2101\\u2103-\\u2106\\u2108\\u2109\\u2114\\u2116-\\u2118\\u211E-\\u2123\\u2125\\u2127\\u2129\\u212E\\u213A\\u213B\\u2140-\\u2144\\u214A-\\u214D\\u214F\\u218A\\u218B\\u2190-\\u2307\\u230C-\\u2328\\u232B-\\u2429\\u2440-\\u244A\\u249C-\\u24E9\\u2500-\\u2767\\u2794-\\u27C4\\u27C7-\\u27E5\\u27F0-\\u2982\\u2999-\\u29D7\\u29DC-\\u29FB\\u29FE-\\u2B73\\u2B76-\\u2BFF\\u2CE5-\\u2CEA\\u2E50\\u2E51\\u2E80-\\u2E99\\u2E9B-\\u2EF3\\u2F00-\\u2FD5\\u2FF0-\\u2FFF\\u3004\\u3012\\u3013\\u3020\\u3036\\u3037\\u303E\\u303F\\u309B\\u309C\\u3190\\u3191\\u3196-\\u319F\\u31C0-\\u31E5\\u31EF\\u3200-\\u321E\\u322A-\\u3247\\u3250\\u3260-\\u327F\\u328A-\\u32B0\\u32C0-\\u33FF\\u4DC0-\\u4DFF\\uA490-\\uA4C6\\uA700-\\uA716\\uA720\\uA721\\uA789\\uA78A\\uA828-\\uA82B\\uA836-\\uA839\\uAA77-\\uAA79\\uAB5B\\uAB6A\\uAB6B\\uFB29\\uFBB2-\\uFBD2\\uFD40-\\uFD4F\\uFD90\\uFD91\\uFDC8-\\uFDCF\\uFDFC-\\uFDFF\\uFE62\\uFE64-\\uFE66\\uFE69\\uFF04\\uFF0B\\uFF1C-\\uFF1E\\uFF3E\\uFF40\\uFF5C\\uFF5E\\uFFE0-\\uFFE6\\uFFE8-\\uFFEE\\uFFFC\\uFFFD]|\\uD800[\\uDD37-\\uDD3F\\uDD79-\\uDD89\\uDD8C-\\uDD8E\\uDD90-\\uDD9C\\uDDA0\\uDDD0-\\uDDFC]|\\uD802[\\uDC77\\uDC78\\uDEC8]|\\uD803[\\uDD8E\\uDD8F\\uDED1-\\uDED8]|\\uD805\\uDF3F|\\uD807[\\uDFD5-\\uDFF1]|\\uD81A[\\uDF3C-\\uDF3F\\uDF45]|\\uD82F\\uDC9C|\\uD833[\\uDC00-\\uDCEF\\uDCFA-\\uDCFC\\uDD00-\\uDEB3\\uDEBA-\\uDED0\\uDEE0-\\uDEF0\\uDF50-\\uDFC3]|\\uD834[\\uDC00-\\uDCF5\\uDD00-\\uDD26\\uDD29-\\uDD64\\uDD6A-\\uDD6C\\uDD83\\uDD84\\uDD8C-\\uDDA9\\uDDAE-\\uDDEA\\uDE00-\\uDE41\\uDE45\\uDF00-\\uDF56]|\\uD835[\\uDEC1\\uDEDB\\uDEFB\\uDF15\\uDF35\\uDF4F\\uDF6F\\uDF89\\uDFA9\\uDFC3]|\\uD836[\\uDC00-\\uDDFF\\uDE37-\\uDE3A\\uDE6D-\\uDE74\\uDE76-\\uDE83\\uDE85\\uDE86]|\\uD838[\\uDD4F\\uDEFF]|\\uD83B[\\uDCAC\\uDCB0\\uDD2E\\uDEF0\\uDEF1]|\\uD83C[\\uDC00-\\uDC2B\\uDC30-\\uDC93\\uDCA0-\\uDCAE\\uDCB1-\\uDCBF\\uDCC1-\\uDCCF\\uDCD1-\\uDCF5\\uDD0D-\\uDDAD\\uDDE6-\\uDE02\\uDE10-\\uDE3B\\uDE40-\\uDE48\\uDE50\\uDE51\\uDE60-\\uDE65\\uDF00-\\uDFFF]|\\uD83D[\\uDC00-\\uDED8\\uDEDC-\\uDEEC\\uDEF0-\\uDEFC\\uDF00-\\uDFD9\\uDFE0-\\uDFEB\\uDFF0]|\\uD83E[\\uDC00-\\uDC0B\\uDC10-\\uDC47\\uDC50-\\uDC59\\uDC60-\\uDC87\\uDC90-\\uDCAD\\uDCB0-\\uDCBB\\uDCC0\\uDCC1\\uDCD0-\\uDCD8\\uDD00-\\uDE57\\uDE60-\\uDE6D\\uDE70-\\uDE7C\\uDE80-\\uDE8A\\uDE8E-\\uDEC6\\uDEC8\\uDECD-\\uDEDC\\uDEDF-\\uDEEA\\uDEEF-\\uDEF8\\uDF00-\\uDF92\\uDF94-\\uDFEF\\uDFFA]/;\nconst Z = /[ \\xA0\\u1680\\u2000-\\u200A\\u2028\\u2029\\u202F\\u205F\\u3000]/;\n\nexport { Any, Cc, Cf, P, S, Z };\n","// Adapted from https://github.com/mathiasbynens/he/blob/36afe179392226cf1b6ccdb16ebbb7a5a844d93a/src/he.js#L106-L134\nconst decodeMap = new Map([\n [0, 65_533],\n // C1 Unicode control character reference replacements\n [128, 8364],\n [130, 8218],\n [131, 402],\n [132, 8222],\n [133, 8230],\n [134, 8224],\n [135, 8225],\n [136, 710],\n [137, 8240],\n [138, 352],\n [139, 8249],\n [140, 338],\n [142, 381],\n [145, 8216],\n [146, 8217],\n [147, 8220],\n [148, 8221],\n [149, 8226],\n [150, 8211],\n [151, 8212],\n [152, 732],\n [153, 8482],\n [154, 353],\n [155, 8250],\n [156, 339],\n [158, 382],\n [159, 376],\n]);\n/**\n * Replace the given code point with a replacement character if it is a\n * surrogate or is outside the valid range. Otherwise return the code\n * point unchanged.\n * @param codePoint Unicode code point to convert.\n */\nexport function replaceCodePoint(codePoint) {\n if ((codePoint >= 0xd8_00 && codePoint <= 0xdf_ff) ||\n codePoint > 0x10_ff_ff) {\n return 0xff_fd;\n }\n return decodeMap.get(codePoint) ?? codePoint;\n}\n//# sourceMappingURL=decode-codepoint.js.map","/**\n * Shared base64 decode helper for generated decode data.\n * Assumes global atob is available.\n * @param input Input string to encode or decode.\n */\nexport function decodeBase64(input) {\n const binary = atob(input);\n const evenLength = binary.length & ~1; // Round down to even length\n const out = new Uint16Array(evenLength / 2);\n for (let index = 0, outIndex = 0; index < evenLength; index += 2) {\n const lo = binary.charCodeAt(index);\n const hi = binary.charCodeAt(index + 1);\n out[outIndex++] = lo | (hi << 8);\n }\n return out;\n}\n//# sourceMappingURL=decode-shared.js.map","// Generated using scripts/write-decode-map.ts\nimport { decodeBase64 } from \"../internal/decode-shared.js\";\n/** Packed HTML decode trie data. */\nexport const htmlDecodeTree = /* #__PURE__ */ decodeBase64(\"QR08ALkAAgH6AYsDNQR2BO0EPgXZBQEGLAbdBxMISQrvCmQLfQurDKQNLw4fD4YPpA+6D/IPAAAAAAAAAAAAAAAAKhBMEY8TmxUWF2EYLBkxGuAa3RsJHDscWR8YIC8jSCSIJcMl6ie3Ku8rEC0CLjoupS7kLgAIRU1hYmNmZ2xtbm9wcnN0dVQAWgBeAGUAaQBzAHcAfgCBAIQAhwCSAJoAoACsALMAbABpAGcAO4DGAMZAUAA7gCYAJkBjAHUAdABlADuAwQDBQHIiZXZlAAJhAAFpeW0AcgByAGMAO4DCAMJAEGRyAADgNdgE3XIAYQB2AGUAO4DAAMBA8CFoYZFj4SFjcgBhZAAAoFMqAAFncIsAjgBvAG4ABGFmAADgNdg43fAlbHlGdW5jdGlvbgCgYSBpAG4AZwA7gMUAxUAAAWNzpACoAHIAAOA12Jzc6SFnbgCgVCJpAGwAZABlADuAwwDDQG0AbAA7gMQAxEAABGFjZWZvcnN1xQDYANoA7QDxAPYA+QD8AAABY3LJAM8AayNzbGFzaAAAoBYidgHTANUAAKDnKmUAZAAAoAYjeQARZIABY3J0AOAA5QDrAGEidXNlAACgNSLuI291bGxpcwCgLCFhAJJjcgAA4DXYBd1wAGYAAOA12Dnd5SF2ZdhiYwDyAOoAbSJwZXEAAKBOIgAHSE9hY2RlZmhpbG9yc3UXARoBHwE6AVIBVQFiAWQBZgGCAakB6QHtAfIBYwB5ACdkUABZADuAqQCpQIABY3B5ACUBKAE1AfUhdGUGYWmg0iJ0KGFsRGlmZmVyZW50aWFsRAAAoEUhbCJleXMAAKAtIQACYWVpb0EBRAFKAU0B8iFvbgxhZABpAGwAO4DHAMdAcgBjAAhhbiJpbnQAAKAwIm8AdAAKYQABZG5ZAV0BaSJsbGEAuGB0I2VyRG90ALdg8gA5AWkAp2NyImNsZQAAAkRNUFRwAXQBeQF9AW8AdAAAoJkiaSJudXMAAKCWIuwhdXMAoJUiaSJtZXMAAKCXIm8AAAFjc4cBlAFrKndpc2VDb250b3VySW50ZWdyYWwAAKAyImUjQ3VybHkAAAFEUZwBpAFvJXVibGVRdW90ZQAAoB0gdSJvdGUAAKAZIAACbG5wdbABtgHNAdgBbwBuAGWgNyIAoHQqgAFnaXQAvAHBAcUB8iJ1ZW50AKBhIm4AdAAAoC8i7yV1ckludGVncmFsAKAuIgABZnLRAdMBAKACIe8iZHVjdACgECJuLnRlckNsb2Nrd2lzZUNvbnRvdXJJbnRlZ3JhbAAAoDMi7yFzcwCgLypjAHIAAOA12J7ccABDoNMiYQBwAACgTSKABURKU1phY2VmaW9zAAsCEgIVAhgCGwIsAjQCOQI9AnMCfwNvoEUh9CJyYWhkAKARKWMAeQACZGMAeQAFZGMAeQAPZIABZ3JzACECJQIoAuchZXIAoCEgcgAAoKEhaAB2AACg5CoAAWF5MAIzAvIhb24OYRRkbAB0oAciYQCUY3IAAOA12AfdAAFhZkECawIAAWNtRQJnAvIjaXRpY2FsAAJBREdUUAJUAl8CYwJjInV0ZQC0YG8AdAFZAloC2WJiJGxlQWN1dGUA3WJyImF2ZQBgYGkibGRlANxi7yFuZACgxCJmJWVyZW50aWFsRAAAoEYhcAR9AgAAAAAAAIECjgIAABoDZgAA4DXYO91EoagAhQKJAm8AdAAAoNwgcSJ1YWwAAKBQIuIhbGUAA0NETFJVVpkCqAK1Au8C/wIRA28AbgB0AG8AdQByAEkAbgB0AGUAZwByAGEA7ADEAW8AdAKvAgAAAACwAqhgbiNBcnJvdwAAoNMhAAFlb7kC0AJmAHQAgAFBUlQAwQLGAs0CciJyb3cAAKDQIekkZ2h0QXJyb3cAoNQhZQDlACsCbgBnAAABTFLWAugC5SFmdAABQVLcAuECciJyb3cAAKD4J+kkZ2h0QXJyb3cAoPon6SRnaHRBcnJvdwCg+SdpImdodAAAAUFU9gL7AnIicm93AACg0iFlAGUAAKCoInAAQQIGAwAAAAALA3Iicm93AACg0SFvJHduQXJyb3cAAKDVIWUlcnRpY2FsQmFyAACgJSJuAAADQUJMUlRhJAM2AzoDWgNxA3oDciJyb3cAAKGTIUJVLAMwA2EAcgAAoBMpcCNBcnJvdwAAoPUhciJldmUAEWPlIWZ00gJDAwAASwMAAFIDaSVnaHRWZWN0b3IAAKBQKWUkZVZlY3RvcgAAoF4p5SJjdG9yQqC9IWEAcgAAoFYpaSJnaHQA1AFiAwAAaQNlJGVWZWN0b3IAAKBfKeUiY3RvckKgwSFhAHIAAKBXKWUAZQBBoKQiciJyb3cAAKCnIXIAcgBvAPcAtAIAAWN0gwOHA3IA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YwAAoN8i4SFycnCgtiEAoD0pgKIqImJjZG9zACsVMBU6FT4VQRVyImNhcAAAoEgqAAFhdTQVNxVwAACgRipwAACgSipvAHQAAKCNInIAAKBFKgDgKiIA/gACYWxydksVURVuFXMVcgByAG2gtyEAoDwpeQCAAWV2dwBYFWUVaRVxAHACXxUAAAAAYxVyAGUA4wAXFXUA4wAZFWUAZQAAoM4iZSJkZ2UAAKDPImUAbgA7gKQApEBlI2Fycm93AAABbHJ7FX8V5SFmdACgtiFpImdodAAAoLchZQDkAG0VAAFjaYsVkRVvAG4AaQBuAPQAkwFuAHQAAKAxImwiY3R5AACgLSOACUFIYWJjZGVmaGlqbG9yc3R1d3oAuBW7Fb8V1RXgFegV+RUKFhUWHxZUFlcWZRbFFtsW7xb7FgUXChdyAPIAtAJhAHIAAKBlKQACZ2xyc8YVyhXOFdAV5yFlcgCgICDlIXRoAKA4IfIA9QxoAHagECAAoKMiawHZFd4VYSJyb3cAAKAPKWEA4wBfAgABYXnkFecV8iFvbg9hNGQAoUYhYW/tFfQVAAFnciEC8RVyAACgyiF0InNlcQAAoHcqgAFnbG0A/xUCFgUWO4CwALBAdABhALRjcCJ0eXYAAKCxKQABaXIOFhIW8yFodACgfykA4DXYId1hAHIAAAFschsWHRYAoMMhAKDCIYACYWVnc3YAKBauAjYWOhY+Fm0AAKHEIm9zLhY0Fm4AZABzoMQi9SFpdACgZiZhIm1tYQDdY2kAbgAAoPIiAKH3AGlvQxZRFmQAZQAAgfcAO29KFksW90BuI3RpbWVzAACgxyJuAPgAUBZjAHkAUmRjAG8CXhYAAAAAYhZyAG4AAKAeI28AcAAAoA0jgAJscHR1dwBuFnEWdRaSFp4W7CFhciRgZgAA4DXYVd0AotkCZW1wc30WhBaJFo0WcQBkoFAibwB0AACgUSJpIm51cwAAoDgi7CF1cwCgFCLxInVhcmUAoKEiYgBsAGUAYgBhAHIAdwBlAGQAZwDlANcAbgCAAWFkaAClFqoWtBZyAHIAbwD3APUMbwB3AG4AYQByAHIAbwB3APMA8xVhI3Jwb29uAAABbHK8FsAWZQBmAPQAHBZpAGcAaAD0AB4WYgHJFs8WawBhAHIAbwD3AJILbwLUFgAAAADYFnIAbgAAoB8jbwBwAACgDCOAAWNvdADhFukW7BYAAXJ55RboFgDgNdi53FVkbAAAoPYp8iFvaxFhAAFkcvMW9xZvAHQAAKDxImkA5qC/JVsSAAFhaP8WAhdyAPIANQNhAPIA1wvhIm5nbGUAoKYpAAFjaQ4XEBd5AF9k5yJyYXJyAKD/JwAJRGFjZGVmZ2xtbm9wcXJzdHV4MRc4F0YXWxcyBF4XaRd5F40XrBe0F78X2RcVGCEYLRg1GEAYAAFEbzUXgRZvAPQA+BUAAWNzPBdCF3UAdABlADuA6QDpQPQhZXIAoG4qAAJhaW95TRdQF1YXWhfyIW9uG2FyAGOgViI7gOoA6kDsIW9uAKBVIk1kbwB0ABdhAAFEcmIXZhdvAHQAAKBSIgDgNdgi3XKhmipuF3QXYQB2AGUAO4DoAOhAZKCWKm8AdAAAoJgqgKGZKmlscwCAF4UXhxfuInRlcnMAoOcjAKATIWSglSpvAHQAAKCXKoABYXBzAJMXlheiF2MAcgATYXQAeQBzogUinxcAAAAAoRdlAHQAAKAFInAAMaADIDMBqRerFwCgBCAAoAUgAAFnc7AXsRdLYXAAAKACIAABZ3C4F7sXbwBuABlhZgAA4DXYVt2AAWFscwDFF8sXzxdyAHOg1SJsAACg4yl1AHMAAKBxKmkAAKG1A2x21RfYF28AbgC1Y/VjAAJjc3V24BfoF/0XEBgAAWlv5BdWF3IAYwAAoFYiaQLuFwAAAADwF+0ADQThIW50AAFnbPUX+Rd0AHIAAKCWKuUhc3MAoJUqgAFhZWkAAxgGGAoYbABzAD1gcwB0AACgXyJ2AESgYSJEAACgeCrwImFyc2wAoOUpAAFEYRkYHRhvAHQAAKBTInIAcgAAoHEpgAFjZGkAJxgqGO0XcgAAoC8hbwD0AIwCAAFhaDEYMhi3YzuA8ADwQAABbXI5GD0YbAA7gOsA60BvAACgrCCAAWNpcABGGEgYSxhsACFgcwD0ACwEAAFlb08YVxhjAHQAYQB0AGkAbwDuABoEbgBlAG4AdABpAGEAbADlADME4Ql1GAAAgRgAAIMYiBgAAAAAoRilGAAAqhgAALsYvhjRGAAA1xgnGWwAbABpAG4AZwBkAG8AdABzAGUA8QBlF3kARGRtImFsZQAAoEAmgAFpbHIAjRiRGJ0Y7CFpZwCgA/tpApcYAAAAAJoYZwAAoAD7aQBnAACgBPsA4DXYI93sIWlnAKAB++whaWcA4GYAagCAAWFsdACvGLIYthh0AACgbSZpAGcAAKAC+24AcwAAoLElbwBmAJJh8AHCGAAAxhhmAADgNdhX3QABYWvJGMwYbADsAGsEdqDUIgCg2SphI3J0aW50AACgDSoAAWFv2hgiGQABY3PeGB8ZsQPnGP0YBRkSGRUZAAAdGbID7xjyGPQY9xj5GAAA+xg7gL0AvUAAoFMhO4C8ALxAAKBVIQCgWSEAoFshswEBGQAAAxkAoFQhAKBWIbQCCxkOGQAAAAAQGTuAvgC+QACgVyEAoFwhNQAAoFghtgEZGQAAGxkAoFohAKBdITgAAKBeIWwAAKBEIHcAbgAAoCIjYwByAADgNdi73IAIRWFiY2RlZmdpamxub3JzdHYARhlKGVoZXhlmGWkZkhmWGZkZnRmgGa0ZxhnLGc8Z4BkjGmygZyIAoIwqgAFjbXAAUBlTGVgZ9SF0ZfVhbQBhAOSgswM6FgCghipyImV2ZQAfYQABaXliGWUZcgBjAB1hM2RvAHQAIWGAoWUibHFzAMYEcBl6GfGhZSLOBAAAdhlsAGEAbgD0AN8EgKF+KmNkbACBGYQZjBljAACgqSpvAHQAb6CAKmyggioAoIQqZeDbIgD+cwAAoJQqcgAA4DXYJN3noGsirATtIWVsAKA3IWMAeQBTZIChdyJFYWoApxmpGasZAKCSKgCgpSoAoKQqAAJFYWVztBm2Gb0ZwhkAoGkicABwoIoq8iFveACgiipxoIgq8aCIKrUZaQBtAACg5yJwAGYAAOA12FjdYQB2AOUAYwIAAWNp0xnWGXIAAKAKIW0AAKFzImVs3BneGQCgjioAoJAqAIM+ADtjZGxxco0E6xn0GfgZ/BkBGgABY2nvGfEZAKCnKnIAAKB6Km8AdAAAoNci0CFhcgCglSl1ImVzdAAAoHwqgAJhZGVscwAKGvQZFhrVBCAa8AEPGgAAFBpwAHIAbwD4AFkZcgAAoHgpcQAAAWxxxAQbGmwAZQBzAPMASRlpAO0A5AQAAWVuJxouGnIjdG5lcXEAAOBpIgD+xQAsGgAFQWFiY2Vma29zeUAaQxpmGmoabRqDGocalhrCGtMacgDyAMwCAAJpbG1yShpOGlAaVBpyAHMA8ABxD2YAvWBpAGwA9AASBQABZHJYGlsaYwB5AEpkAKGUIWN3YBpkGmkAcgAAoEgpAKCtIWEAcgAAoA8h6SFyYyVhgAFhbHIAcxp7Gn8a8iF0c3WgZSZpAHQAAKBlJuwhaXAAoCYg4yFvbgCguSJyAADgNdgl3XMAAAFld4wakRphInJvdwAAoCUpYSJyb3cAAKAmKYACYW1vcHIAnxqjGqcauhq+GnIAcgAAoP8h9CFodACgOyJrAAABbHKsGrMaZSRmdGFycm93AACgqSHpJGdodGFycm93AKCqIWYAAOA12Fnd4iFhcgCgFSCAAWNsdADIGswa0BpyAADgNdi93GEAcwDoAGka8iFvaydhAAFicNca2xr1IWxsAKBDIOghZW4AoBAg4Qr2GgAA/RoAAAgbExsaGwAAIRs7GwAAAAA+G2IbmRuVG6sbAACyG80b0htjAHUAdABlADuA7QDtQAChYyBpeQEbBhtyAGMAO4DuAO5AOGQAAWN4CxsNG3kANWRjAGwAO4ChAKFAAAFmcssCFhsA4DXYJt1yAGEAdgBlADuA7ADsQIChSCFpbm8AJxsyGzYbAAFpbisbLxtuAHQAAKAMKnQAAKAtIuYhaW4AoNwpdABhAACgKSHsIWlnM2GAAWFvcABDG1sbXhuAAWNndABJG0sbWRtyACthgAFlbHAAcQVRG1UbaQBuAOUAyAVhAHIA9AByBWgAMWFmAACgtyJlAGQAtWEAoggiY2ZvdGkbbRt1G3kb4SFyZQCgBSFpAG4AdKAeImkAZQAAoN0pZABvAPQAWxsAoisiY2VscIEbhRuPG5QbYQBsAACguiIAAWdyiRuNG2UAcgDzACMQ4wCCG2EicmhrAACgFyryIW9kAKA8KgACY2dwdJ8boRukG6gbeQBRZG8AbgAvYWYAAOA12FrdYQC5Y3UAZQBzAHQAO4C/AL9AAAFjabUbuRtyAADgNdi+3G4AAKIIIkVkc3bCG8QbyBvQAwCg+SJvAHQAAKD1Inag9CIAoPMiaaBiIOwhZGUpYesB1hsAANkbYwB5AFZkbAA7gO8A70AAA2NmbW9zdeYb7hvyG/Ub+hsFHAABaXnqG+0bcgBjADVhOWRyAADgNdgn3eEhdGg3YnAAZgAA4DXYW93jAf8bAAADHHIAAOA12L/c8iFjeVhk6yFjeVRkAARhY2ZnaGpvcxUcGhwiHCYcKhwtHDAcNRzwIXBhdqC6A/BjAAFleR4cIRzkIWls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ZmdobG1vcHJzdHV3CiwNLBEsHSwnLDEsQCxLLFIsYix6LIQsjyzLLOgs7Sz/LAotcgDyAAkDYQByAACgYykAAWNyFSwbLHUAdABlADuA+gD6QPIACQ1yAOMBIywAACUseQBeZHYAZQBtYQABaXkrLDAscgBjADuA+wD7QENkgAFhYmgANyw6LD0scgDyANEO7CFhY3FhYQDyAOAOAAFpckQsSCzzIWh0AKB+KQDgNdgy3XIAYQB2AGUAO4D5APlAYQFWLF8scgAAAWxyWixcLACgvyEAoL4hbABrAACggCUAAWN0Zix2LG8CbCwAAAAAcyxyAG4AZaAcI3IAAKAcI28AcAAAoA8jcgBpAACg+CUAAWFsfiyBLGMAcgBrYTuAqACoQAABZ3CILIssbwBuAHNhZgAA4DXYZt0AA2FkaGxzdZksniynLLgsuyzFLHIAcgBvAPcACQ1vAHcAbgBhAHIAcgBvAPcA2A5hI3Jwb29uAAABbHKvLLMsZQBmAPQAWyxpAGcAaAD0AF0sdQDzAKYOaQAAocUDaGzBLMIs0mNvAG4AxWPwI2Fycm93cwCgyCGAAWNpdADRLOEs5CxvAtcsAAAAAN4scgBuAGWgHSNyAACgHSNvAHAAAKAOI24AZwBvYXIAaQAAoPklYwByAADgNdjK3IABZGlyAPMs9yz6LG8AdAAAoPAi7CFkZWlhaQBmoLUlAKC0JQABYW0DLQYtcgDyAMosbAA7gPwA/EDhIm5nbGUAoKcpgAdBQkRhY2RlZmxub3Byc3oAJy0qLTAtNC2bLZ0toS2/LcMtxy3TLdgt3C3gLfwtcgDyABADYQByAHag6CoAoOkqYQBzAOgA/gIAAW5yOC08LechcnQAoJwpgANla25wcnN0AJkpSC1NLVQtXi1iLYItYQBwAHAA4QAaHG8AdABoAGkAbgDnAKEXgAFoaXIAoSmzJFotbwBwAPQAdCVooJUh7wD4JgABaXVmLWotZwBtAOEAuygAAWJwbi14LXMjZXRuZXEAceCKIgD+AODLKgD+cyNldG5lcQBx4IsiAP4A4MwqAP4AAWhyhi2KLWUAdADhABIraSNhbmdsZQAAAWxyki2WLeUhZnQAoLIiaSJnaHQAAKCzInkAMmThIXNoAKCiIoABZWxyAKcttC24LWKiKCKuLQAAAACyLWEAcgAAoLsicQAAoFoi7CFpcACg7iIAAWJ0vC1eD2EA8gBfD3IAAOA12DPddAByAOkAlS1zAHUAAAFicM0t0C0A4IIi0iAA4IMi0iBwAGYAAOA12GfdcgBvAPAAWQt0AHIA6QCaLQABY3XkLegtcgAA4DXYy9wAAWJw7C30LW4AAAFFZXUt8S0A4IoiAP5uAAABRWV/LfktAOCLIgD+6SJnemFnAKCaKYADY2Vmb3BycwANLhAuJS4pLiMuLi40LukhcmN1YQABZGkULiEuAAFiZxguHC5hAHIAAKBfKmUAcaAnIgCgWSLlIXJwAKAYIXIAAOA12DTdcABmAADgNdho3WWgQCJhAHQA6ABqD2MAcgAA4DXYzNzjCuQRUC4AAFQuAABYLmIuAAAAAGMubS5wLnQuAAAAAIguki4AAJouJxIqEnQAcgDpAB0ScgAA4DXYNd0AAUFhWy5eLnIA8gDnAnIA8gCTB75jAAFBYWYuaS5yAPIA4AJyAPIAjAdhAPAAeh5pAHMAAKD7IoABZHB0APgReS6DLgABZmx9LoAuAOA12GnddQDzAP8RaQBtAOUABBIAAUFhiy6OLnIA8gDuAnIA8gCaBwABY3GVLgoScgAA4DXYzdwAAXB0nS6hLmwAdQDzACUScgDpACASAARhY2VmaW9zdbEuvC7ELsguzC7PLtQu2S5jAAABdXm2LrsudABlADuA/QD9QE9kAAFpecAuwy5yAGMAd2FLZG4AO4ClAKVAcgAA4DXYNt1jAHkAV2RwAGYAAOA12GrdYwByAADgNdjO3AABY23dLt8ueQBOZGwAO4D/AP9AAAVhY2RlZmhpb3N38y73Lv8uAi8MLxAvEy8YLx0vIi9jInV0ZQB6YQABYXn7Lv4u8iFvbn5hN2RvAHQAfGEAAWV0Bi8KL3QAcgDmAB8QYQC2Y3IAAOA12DfdYwB5ADZk5yJyYXJyAKDdIXAAZgAA4DXYa91jAHIAAOA12M/cAAFqbiYvKC8AoA0gagAAoAwg\");\n//# sourceMappingURL=decode-data-html.js.map","/**\n * Bit flags & masks for the binary trie encoding used for entity decoding.\n *\n * Bit layout (16 bits total):\n * 15..14 VALUE_LENGTH (+1 encoding; 0 => no value)\n * 13 FLAG13. If valueLength>0: semicolon required flag (implicit ';').\n * If valueLength==0: compact run flag.\n * 12..7 BRANCH_LENGTH Branch length (0 => single branch in 6..0 if jumpOffset==char) OR run length (when compact run)\n * 6..0 JUMP_TABLE Jump offset (jump table) OR single-branch char code OR first run char\n */\nexport var BinTrieFlags;\n(function (BinTrieFlags) {\n BinTrieFlags[BinTrieFlags[\"VALUE_LENGTH\"] = 49152] = \"VALUE_LENGTH\";\n BinTrieFlags[BinTrieFlags[\"FLAG13\"] = 8192] = \"FLAG13\";\n BinTrieFlags[BinTrieFlags[\"BRANCH_LENGTH\"] = 8064] = \"BRANCH_LENGTH\";\n BinTrieFlags[BinTrieFlags[\"JUMP_TABLE\"] = 127] = \"JUMP_TABLE\";\n})(BinTrieFlags || (BinTrieFlags = {}));\n//# sourceMappingURL=bin-trie-flags.js.map","import { replaceCodePoint } from \"./decode-codepoint.js\";\nimport { htmlDecodeTree } from \"./generated/decode-data-html.js\";\nimport { xmlDecodeTree } from \"./generated/decode-data-xml.js\";\nimport { BinTrieFlags } from \"./internal/bin-trie-flags.js\";\nvar CharCodes;\n(function (CharCodes) {\n CharCodes[CharCodes[\"NUM\"] = 35] = \"NUM\";\n CharCodes[CharCodes[\"SEMI\"] = 59] = \"SEMI\";\n CharCodes[CharCodes[\"EQUALS\"] = 61] = \"EQUALS\";\n CharCodes[CharCodes[\"ZERO\"] = 48] = \"ZERO\";\n CharCodes[CharCodes[\"NINE\"] = 57] = \"NINE\";\n CharCodes[CharCodes[\"LOWER_A\"] = 97] = \"LOWER_A\";\n CharCodes[CharCodes[\"LOWER_F\"] = 102] = \"LOWER_F\";\n CharCodes[CharCodes[\"LOWER_X\"] = 120] = \"LOWER_X\";\n CharCodes[CharCodes[\"LOWER_Z\"] = 122] = \"LOWER_Z\";\n CharCodes[CharCodes[\"UPPER_A\"] = 65] = \"UPPER_A\";\n CharCodes[CharCodes[\"UPPER_F\"] = 70] = \"UPPER_F\";\n CharCodes[CharCodes[\"UPPER_Z\"] = 90] = \"UPPER_Z\";\n})(CharCodes || (CharCodes = {}));\n/** Bit that needs to be set to convert an upper case ASCII character to lower case */\nconst TO_LOWER_BIT = 0b10_0000;\nfunction isNumber(code) {\n return code >= CharCodes.ZERO && code <= CharCodes.NINE;\n}\nfunction isHexadecimalCharacter(code) {\n return ((code >= CharCodes.UPPER_A && code <= CharCodes.UPPER_F) ||\n (code >= CharCodes.LOWER_A && code <= CharCodes.LOWER_F));\n}\nfunction isAsciiAlphaNumeric(code) {\n return ((code >= CharCodes.UPPER_A && code <= CharCodes.UPPER_Z) ||\n (code >= CharCodes.LOWER_A && code <= CharCodes.LOWER_Z) ||\n isNumber(code));\n}\n/**\n * Checks if the given character is a valid end character for an entity in an attribute.\n *\n * Attribute values that aren't terminated properly aren't parsed, and shouldn't lead to a parser error.\n * See the example in https://html.spec.whatwg.org/multipage/parsing.html#named-character-reference-state\n * @param code Code point to decode.\n */\nfunction isEntityInAttributeInvalidEnd(code) {\n return code === CharCodes.EQUALS || isAsciiAlphaNumeric(code);\n}\nvar EntityDecoderState;\n(function (EntityDecoderState) {\n EntityDecoderState[EntityDecoderState[\"EntityStart\"] = 0] = \"EntityStart\";\n EntityDecoderState[EntityDecoderState[\"NumericStart\"] = 1] = \"NumericStart\";\n EntityDecoderState[EntityDecoderState[\"NumericDecimal\"] = 2] = \"NumericDecimal\";\n EntityDecoderState[EntityDecoderState[\"NumericHex\"] = 3] = \"NumericHex\";\n EntityDecoderState[EntityDecoderState[\"NamedEntity\"] = 4] = \"NamedEntity\";\n})(EntityDecoderState || (EntityDecoderState = {}));\n/**\n * Decoding mode for named entities.\n */\nexport var DecodingMode;\n(function (DecodingMode) {\n /** Entities in text nodes that can end with any character. */\n DecodingMode[DecodingMode[\"Legacy\"] = 0] = \"Legacy\";\n /** Only allow entities terminated with a semicolon. */\n DecodingMode[DecodingMode[\"Strict\"] = 1] = \"Strict\";\n /** Entities in attributes have limitations on ending characters. */\n DecodingMode[DecodingMode[\"Attribute\"] = 2] = \"Attribute\";\n})(DecodingMode || (DecodingMode = {}));\n/**\n * Token decoder with support of writing partial entities.\n */\nexport class EntityDecoder {\n decodeTree;\n emitCodePoint;\n errors;\n constructor(\n /** The tree used to decode entities. */\n // biome-ignore lint/correctness/noUnusedPrivateClassMembers: False positive\n decodeTree, \n /**\n * The function that is called when a codepoint is decoded.\n *\n * For multi-byte named entities, this will be called multiple times,\n * with the second codepoint, and the same `consumed` value.\n * @param codepoint The decoded codepoint.\n * @param consumed The number of bytes consumed by the decoder.\n */\n emitCodePoint, \n /** An object that is used to produce errors. */\n errors) {\n this.decodeTree = decodeTree;\n this.emitCodePoint = emitCodePoint;\n this.errors = errors;\n }\n /** The current state of the decoder. */\n state = EntityDecoderState.EntityStart;\n /** Characters that were consumed while parsing an entity. */\n consumed = 1;\n /**\n * The result of the entity.\n *\n * Either the result index of a numeric entity, or the codepoint of a\n * numeric entity.\n */\n result = 0;\n /** The current index in the decode tree. */\n treeIndex = 0;\n /** The number of characters that were consumed in excess. */\n excess = 1;\n /** The mode in which the decoder is operating. */\n decodeMode = DecodingMode.Strict;\n /** The number of characters that have been consumed in the current run. */\n runConsumed = 0;\n /**\n * Resets the instance to make it reusable.\n * @param decodeMode Entity decoding mode to use.\n */\n startEntity(decodeMode) {\n this.decodeMode = decodeMode;\n this.state = EntityDecoderState.EntityStart;\n this.result = 0;\n this.treeIndex = 0;\n this.excess = 1;\n this.consumed = 1;\n this.runConsumed = 0;\n }\n /**\n * Write an entity to the decoder. This can be called multiple times with partial entities.\n * If the entity is incomplete, the decoder will return -1.\n *\n * Mirrors the implementation of `getDecoder`, but with the ability to stop decoding if the\n * entity is incomplete, and resume when the next string is written.\n * @param input The string containing the entity (or a continuation of the entity).\n * @param offset The offset at which the entity begins. Should be 0 if this is not the first call.\n * @returns The number of characters that were consumed, or -1 if the entity is incomplete.\n */\n write(input, offset) {\n switch (this.state) {\n case EntityDecoderState.EntityStart: {\n if (input.charCodeAt(offset) === CharCodes.NUM) {\n this.state = EntityDecoderState.NumericStart;\n this.consumed += 1;\n return this.stateNumericStart(input, offset + 1);\n }\n this.state = EntityDecoderState.NamedEntity;\n return this.stateNamedEntity(input, offset);\n }\n case EntityDecoderState.NumericStart: {\n return this.stateNumericStart(input, offset);\n }\n case EntityDecoderState.NumericDecimal: {\n return this.stateNumericDecimal(input, offset);\n }\n case EntityDecoderState.NumericHex: {\n return this.stateNumericHex(input, offset);\n }\n case EntityDecoderState.NamedEntity: {\n return this.stateNamedEntity(input, offset);\n }\n }\n }\n /**\n * Switches between the numeric decimal and hexadecimal states.\n *\n * Equivalent to the `Numeric character reference state` in the HTML spec.\n * @param input The string containing the entity (or a continuation of the entity).\n * @param offset The current offset.\n * @returns The number of characters that were consumed, or -1 if the entity is incomplete.\n */\n stateNumericStart(input, offset) {\n if (offset >= input.length) {\n return -1;\n }\n if ((input.charCodeAt(offset) | TO_LOWER_BIT) === CharCodes.LOWER_X) {\n this.state = EntityDecoderState.NumericHex;\n this.consumed += 1;\n return this.stateNumericHex(input, offset + 1);\n }\n this.state = EntityDecoderState.NumericDecimal;\n return this.stateNumericDecimal(input, offset);\n }\n /**\n * Parses a hexadecimal numeric entity.\n *\n * Equivalent to the `Hexademical character reference state` in the HTML spec.\n * @param input The string containing the entity (or a continuation of the entity).\n * @param offset The current offset.\n * @returns The number of characters that were consumed, or -1 if the entity is incomplete.\n */\n stateNumericHex(input, offset) {\n while (offset < input.length) {\n const char = input.charCodeAt(offset);\n if (isNumber(char) || isHexadecimalCharacter(char)) {\n // Convert hex digit to value (0-15); 'a'/'A' -> 10.\n const digit = char <= CharCodes.NINE\n ? char - CharCodes.ZERO\n : (char | TO_LOWER_BIT) - CharCodes.LOWER_A + 10;\n this.result = this.result * 16 + digit;\n this.consumed++;\n offset++;\n }\n else {\n return this.emitNumericEntity(char, 3);\n }\n }\n return -1; // Incomplete entity\n }\n /**\n * Parses a decimal numeric entity.\n *\n * Equivalent to the `Decimal character reference state` in the HTML spec.\n * @param input The string containing the entity (or a continuation of the entity).\n * @param offset The current offset.\n * @returns The number of characters that were consumed, or -1 if the entity is incomplete.\n */\n stateNumericDecimal(input, offset) {\n while (offset < input.length) {\n const char = input.charCodeAt(offset);\n if (isNumber(char)) {\n this.result = this.result * 10 + (char - CharCodes.ZERO);\n this.consumed++;\n offset++;\n }\n else {\n return this.emitNumericEntity(char, 2);\n }\n }\n return -1; // Incomplete entity\n }\n /**\n * Validate and emit a numeric entity.\n *\n * Implements the logic from the `Hexademical character reference start\n * state` and `Numeric character reference end state` in the HTML spec.\n * @param lastCp The last code point of the entity. Used to see if the\n * entity was terminated with a semicolon.\n * @param expectedLength The minimum number of characters that should be\n * consumed. Used to validate that at least one digit\n * was consumed.\n * @returns The number of characters that were consumed.\n */\n emitNumericEntity(lastCp, expectedLength) {\n // Ensure we consumed at least one digit.\n if (this.consumed <= expectedLength) {\n this.errors?.absenceOfDigitsInNumericCharacterReference(this.consumed);\n return 0;\n }\n // Figure out if this is a legit end of the entity\n if (lastCp === CharCodes.SEMI) {\n this.consumed += 1;\n }\n else if (this.decodeMode === DecodingMode.Strict) {\n return 0;\n }\n this.emitCodePoint(replaceCodePoint(this.result), this.consumed);\n if (this.errors) {\n if (lastCp !== CharCodes.SEMI) {\n this.errors.missingSemicolonAfterCharacterReference();\n }\n this.errors.validateNumericCharacterReference(this.result);\n }\n return this.consumed;\n }\n /**\n * Parses a named entity.\n *\n * Equivalent to the `Named character reference state` in the HTML spec.\n * @param input The string containing the entity (or a continuation of the entity).\n * @param offset The current offset.\n * @returns The number of characters that were consumed, or -1 if the entity is incomplete.\n */\n stateNamedEntity(input, offset) {\n const { decodeTree } = this;\n let current = decodeTree[this.treeIndex];\n // The length is the number of bytes of the value, including the current byte.\n let valueLength = (current & BinTrieFlags.VALUE_LENGTH) >> 14;\n while (offset < input.length) {\n // Handle compact runs (possibly inline): valueLength == 0 and SEMI_REQUIRED bit set.\n if (valueLength === 0 && (current & BinTrieFlags.FLAG13) !== 0) {\n const runLength = (current & BinTrieFlags.BRANCH_LENGTH) >> 7; /* 2..63 */\n // If we are starting a run, check the first char.\n if (this.runConsumed === 0) {\n const firstChar = current & BinTrieFlags.JUMP_TABLE;\n if (input.charCodeAt(offset) !== firstChar) {\n return this.result === 0\n ? 0\n : this.emitNotTerminatedNamedEntity();\n }\n offset++;\n this.excess++;\n this.runConsumed++;\n }\n // Check remaining characters in the run.\n while (this.runConsumed < runLength) {\n if (offset >= input.length) {\n return -1;\n }\n const charIndexInPacked = this.runConsumed - 1;\n const packedWord = decodeTree[this.treeIndex + 1 + (charIndexInPacked >> 1)];\n const expectedChar = charIndexInPacked % 2 === 0\n ? packedWord & 0xff\n : (packedWord >> 8) & 0xff;\n if (input.charCodeAt(offset) !== expectedChar) {\n this.runConsumed = 0;\n return this.result === 0\n ? 0\n : this.emitNotTerminatedNamedEntity();\n }\n offset++;\n this.excess++;\n this.runConsumed++;\n }\n this.runConsumed = 0;\n this.treeIndex += 1 + (runLength >> 1);\n current = decodeTree[this.treeIndex];\n valueLength = (current & BinTrieFlags.VALUE_LENGTH) >> 14;\n }\n if (offset >= input.length)\n break;\n const char = input.charCodeAt(offset);\n /*\n * Implicit semicolon handling for nodes that require a semicolon but\n * don't have an explicit ';' branch stored in the trie. If we have\n * a value on the current node, it requires a semicolon, and the\n * current input character is a semicolon, emit the entity using the\n * current node (without descending further).\n */\n if (char === CharCodes.SEMI &&\n valueLength !== 0 &&\n (current & BinTrieFlags.FLAG13) !== 0) {\n return this.emitNamedEntityData(this.treeIndex, valueLength, this.consumed + this.excess);\n }\n this.treeIndex = determineBranch(decodeTree, current, this.treeIndex + Math.max(1, valueLength), char);\n if (this.treeIndex < 0) {\n return this.result === 0 ||\n // If we are parsing an attribute\n (this.decodeMode === DecodingMode.Attribute &&\n // We shouldn't have consumed any characters after the entity,\n (valueLength === 0 ||\n // And there should be no invalid characters.\n isEntityInAttributeInvalidEnd(char)))\n ? 0\n : this.emitNotTerminatedNamedEntity();\n }\n current = decodeTree[this.treeIndex];\n valueLength = (current & BinTrieFlags.VALUE_LENGTH) >> 14;\n // If the branch is a value, store it and continue\n if (valueLength !== 0) {\n // If the entity is terminated by a semicolon, we are done.\n if (char === CharCodes.SEMI) {\n return this.emitNamedEntityData(this.treeIndex, valueLength, this.consumed + this.excess);\n }\n // If we encounter a non-terminated (legacy) entity while parsing strictly, then ignore it.\n if (this.decodeMode !== DecodingMode.Strict &&\n (current & BinTrieFlags.FLAG13) === 0) {\n this.result = this.treeIndex;\n this.consumed += this.excess;\n this.excess = 0;\n }\n }\n // Increment offset & excess for next iteration\n offset++;\n this.excess++;\n }\n return -1;\n }\n /**\n * Emit a named entity that was not terminated with a semicolon.\n * @returns The number of characters consumed.\n */\n emitNotTerminatedNamedEntity() {\n const { result, decodeTree } = this;\n const valueLength = (decodeTree[result] & BinTrieFlags.VALUE_LENGTH) >> 14;\n this.emitNamedEntityData(result, valueLength, this.consumed);\n this.errors?.missingSemicolonAfterCharacterReference();\n return this.consumed;\n }\n /**\n * Emit a named entity.\n * @param result The index of the entity in the decode tree.\n * @param valueLength The number of bytes in the entity.\n * @param consumed The number of characters consumed.\n * @returns The number of characters consumed.\n */\n emitNamedEntityData(result, valueLength, consumed) {\n const { decodeTree } = this;\n this.emitCodePoint(valueLength === 1\n ? decodeTree[result] &\n ~(BinTrieFlags.VALUE_LENGTH | BinTrieFlags.FLAG13)\n : decodeTree[result + 1], consumed);\n if (valueLength === 3) {\n // For multi-byte values, we need to emit the second byte.\n this.emitCodePoint(decodeTree[result + 2], consumed);\n }\n return consumed;\n }\n /**\n * Signal to the parser that the end of the input was reached.\n *\n * Remaining data will be emitted and relevant errors will be produced.\n * @returns The number of characters consumed.\n */\n end() {\n switch (this.state) {\n case EntityDecoderState.NamedEntity: {\n // Emit a named entity if we have one.\n return this.result !== 0 &&\n (this.decodeMode !== DecodingMode.Attribute ||\n this.result === this.treeIndex)\n ? this.emitNotTerminatedNamedEntity()\n : 0;\n }\n // Otherwise, emit a numeric entity if we have one.\n case EntityDecoderState.NumericDecimal: {\n return this.emitNumericEntity(0, 2);\n }\n case EntityDecoderState.NumericHex: {\n return this.emitNumericEntity(0, 3);\n }\n case EntityDecoderState.NumericStart: {\n this.errors?.absenceOfDigitsInNumericCharacterReference(this.consumed);\n return 0;\n }\n case EntityDecoderState.EntityStart: {\n // Return 0 if we have no entity.\n return 0;\n }\n }\n }\n}\n/**\n * Creates a function that decodes entities in a string.\n * @param decodeTree The decode tree.\n * @returns A function that decodes entities in a string.\n */\nfunction getDecoder(decodeTree) {\n let returnValue = \"\";\n const decoder = new EntityDecoder(decodeTree, (data) => (returnValue += String.fromCodePoint(data)));\n return function decodeWithTrie(input, decodeMode) {\n let lastIndex = 0;\n let offset = 0;\n while ((offset = input.indexOf(\"&\", offset)) >= 0) {\n returnValue += input.slice(lastIndex, offset);\n decoder.startEntity(decodeMode);\n const length = decoder.write(input, \n // Skip the \"&\"\n offset + 1);\n if (length < 0) {\n lastIndex = offset + decoder.end();\n break;\n }\n lastIndex = offset + length;\n // If `length` is 0, skip the current `&` and continue.\n offset = length === 0 ? lastIndex + 1 : lastIndex;\n }\n const result = returnValue + input.slice(lastIndex);\n // Make sure we don't keep a reference to the final string.\n returnValue = \"\";\n return result;\n };\n}\n/**\n * Determines the branch of the current node that is taken given the current\n * character. This function is used to traverse the trie.\n * @param decodeTree The trie.\n * @param current The current node.\n * @param nodeIndex Index immediately after the current node header.\n * @param char The current character.\n * @returns The index of the next node, or -1 if no branch is taken.\n */\nexport function determineBranch(decodeTree, current, nodeIndex, char) {\n const branchCount = (current & BinTrieFlags.BRANCH_LENGTH) >> 7;\n const jumpOffset = current & BinTrieFlags.JUMP_TABLE;\n // Case 1: Single branch encoded in jump offset\n if (branchCount === 0) {\n return jumpOffset !== 0 && char === jumpOffset ? nodeIndex : -1;\n }\n // Case 2: Multiple branches encoded in jump table\n if (jumpOffset) {\n const value = char - jumpOffset;\n return value < 0 || value >= branchCount\n ? -1\n : decodeTree[nodeIndex + value] - 1;\n }\n // Case 3: Multiple branches encoded in packed dictionary (two keys per uint16)\n const packedKeySlots = (branchCount + 1) >> 1;\n /*\n * Treat packed keys as a virtual sorted array of length `branchCount`.\n * Key(i) = low byte for even i, high byte for odd i in slot i>>1.\n */\n let lo = 0;\n let hi = branchCount - 1;\n while (lo <= hi) {\n const mid = (lo + hi) >>> 1;\n const slot = mid >> 1;\n const packed = decodeTree[nodeIndex + slot];\n const midKey = (packed >> ((mid & 1) * 8)) & 0xff;\n if (midKey < char) {\n lo = mid + 1;\n }\n else if (midKey > char) {\n hi = mid - 1;\n }\n else {\n return decodeTree[nodeIndex + packedKeySlots + mid];\n }\n }\n return -1;\n}\nconst htmlDecoder = /* #__PURE__ */ getDecoder(htmlDecodeTree);\nconst xmlDecoder = /* #__PURE__ */ getDecoder(xmlDecodeTree);\n/**\n * Decodes an HTML string.\n * @param htmlString The string to decode.\n * @param mode The decoding mode.\n * @returns The decoded string.\n */\nexport function decodeHTML(htmlString, mode = DecodingMode.Legacy) {\n return htmlDecoder(htmlString, mode);\n}\n/**\n * Decodes an HTML string in an attribute.\n * @param htmlAttribute The string to decode.\n * @returns The decoded string.\n */\nexport function decodeHTMLAttribute(htmlAttribute) {\n return htmlDecoder(htmlAttribute, DecodingMode.Attribute);\n}\n/**\n * Decodes an HTML string, requiring all entities to be terminated by a semicolon.\n * @param htmlString The string to decode.\n * @returns The decoded string.\n */\nexport function decodeHTMLStrict(htmlString) {\n return htmlDecoder(htmlString, DecodingMode.Strict);\n}\n/**\n * Decodes an XML string, requiring all entities to be terminated by a semicolon.\n * @param xmlString The string to decode.\n * @returns The decoded string.\n */\nexport function decodeXML(xmlString) {\n return xmlDecoder(xmlString, DecodingMode.Strict);\n}\nexport { replaceCodePoint } from \"./decode-codepoint.js\";\n// Re-export for use by eg. htmlparser2\nexport { htmlDecodeTree } from \"./generated/decode-data-html.js\";\nexport { xmlDecodeTree } from \"./generated/decode-data-xml.js\";\n//# sourceMappingURL=decode.js.map","/**\n * Common utility functions exposed through `md.utils` for use by plugins.\n *\n * @module md.utils\n */\n\nimport * as mdurl from 'mdurl'\nimport * as ucmicro from 'uc.micro'\nimport { decodeHTMLStrict } from 'entities'\n\n/** @hidden */\ntype ClassToWrap = new (...args: any[]) => object\n\n/** Wraps a class so it can be called with or without `new`. */\nfunction callable<T extends ClassToWrap> (\n cls: T\n): T & ((...args: ConstructorParameters<T>) => InstanceType<T>)\nfunction callable<T extends ClassToWrap> (cls: T) {\n const wrapper = function (...args: ConstructorParameters<T>) {\n const newTarget =\n new.target && new.target !== wrapper\n ? new.target\n : cls\n\n return Reflect.construct(cls, args, newTarget)\n }\n\n Object.defineProperty(wrapper, 'name', { value: cls.name })\n Object.setPrototypeOf(wrapper, cls)\n wrapper.prototype = cls.prototype\n\n return wrapper\n}\n\n/**\n * Returns a copy of a token array with the token at `pos` replaced by\n * `newElements`. Used to transform token streams without modifying the\n * original array.\n */\nfunction arrayReplaceAt<T> (src: T[], pos: number, newElements: T[]): T[] {\n return ([] as T[]).concat(src.slice(0, pos), newElements, src.slice(pos + 1))\n}\n\n/** Checks whether a code point can be decoded from a numeric HTML entity. */\nfunction isValidEntityCode (c: number) {\n // broken sequence\n if (c >= 0xD800 && c <= 0xDFFF) { return false }\n // never used\n if (c >= 0xFDD0 && c <= 0xFDEF) { return false }\n if ((c & 0xFFFF) === 0xFFFF || (c & 0xFFFF) === 0xFFFE) { return false }\n // control codes\n if (c >= 0x00 && c <= 0x08) { return false }\n if (c === 0x0B) { return false }\n if (c >= 0x0E && c <= 0x1F) { return false }\n if (c >= 0x7F && c <= 0x9F) { return false }\n // out of range\n if (c > 0x10FFFF) { return false }\n return true\n}\n\n/**\n * Converts a Unicode code point to a string, like `String.fromCodePoint()`,\n * but does not throw for invalid input.\n */\nfunction fromCodePoint (c: number) {\n /* eslint no-bitwise:0 */\n if (c > 0xffff) {\n c -= 0x10000\n const surrogate1 = 0xd800 + (c >> 10)\n const surrogate2 = 0xdc00 + (c & 0x3ff)\n\n return String.fromCharCode(surrogate1, surrogate2)\n }\n return String.fromCharCode(c)\n}\n\nconst UNESCAPE_MD_RE = /\\\\([!\"#$%&'()*+,\\-./:;<=>?@[\\\\\\]^_`{|}~])/g\nconst ENTITY_RE = /&([a-z#][a-z0-9]{1,31});/gi\nconst UNESCAPE_ALL_RE = new RegExp(`${UNESCAPE_MD_RE.source}|${ENTITY_RE.source}`, 'gi')\n\nconst DIGITAL_ENTITY_TEST_RE = /^#((?:x[a-f0-9]{1,8}|[0-9]{1,8}))$/i\n\nfunction replaceEntityPattern (match: string, name: string) {\n if (name.charCodeAt(0) === 0x23/* # */ && DIGITAL_ENTITY_TEST_RE.test(name)) {\n const code = name[1].toLowerCase() === 'x'\n ? parseInt(name.slice(2), 16)\n : parseInt(name.slice(1), 10)\n\n if (isValidEntityCode(code)) {\n return fromCodePoint(code)\n }\n\n return match\n }\n\n const decoded = decodeHTMLStrict(match)\n if (decoded !== match) {\n return decoded\n }\n\n return match\n}\n\n/** Decodes Markdown backslash escapes. */\nfunction unescapeMd (str: string) {\n if (str.indexOf('\\\\') < 0) { return str }\n return str.replace(UNESCAPE_MD_RE, '$1')\n}\n\n/**\n * Decodes Markdown backslash escapes and HTML character references in link\n * destinations, link titles, and fenced code info strings.\n */\nfunction unescapeAll (str: string) {\n if (str.indexOf('\\\\') < 0 && str.indexOf('&') < 0) { return str }\n\n return str.replace(UNESCAPE_ALL_RE, function (match, escaped, entity) {\n if (escaped) { return escaped }\n return replaceEntityPattern(match, entity)\n })\n}\n\nconst HTML_ESCAPE_TEST_RE = /[&<>\"]/\nconst HTML_ESCAPE_REPLACE_RE = /[&<>\"]/g\nconst HTML_REPLACEMENTS = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"'\n}\n\nfunction replaceUnsafeChar (ch: string): string {\n return HTML_REPLACEMENTS[ch as keyof typeof HTML_REPLACEMENTS]\n}\n\n/** Escapes HTML special characters in a string. */\nfunction escapeHtml (str: string) {\n if (HTML_ESCAPE_TEST_RE.test(str)) {\n return str.replace(HTML_ESCAPE_REPLACE_RE, replaceUnsafeChar)\n }\n return str\n}\n\nconst REGEXP_ESCAPE_RE = /[.?*+^$[\\]\\\\(){}|-]/g\n\n/** Escapes regular expression metacharacters in a string. */\nfunction escapeRE (str: string) {\n return str.replace(REGEXP_ESCAPE_RE, '\\\\$&')\n}\n\n/** Checks whether a character code is an ASCII space or tab. */\nfunction isSpace (code: number) {\n switch (code) {\n case 0x09:\n case 0x20:\n return true\n }\n return false\n}\n\n/**\n * Checks whether a character code is whitespace recognized by Markdown.\n *\n * Matches the Unicode `Zs` category or `\\t`, `\\f`, `\\v`, `\\r`, `\\n`.\n */\nfunction isWhiteSpace (code: number) {\n if (code >= 0x2000 && code <= 0x200A) { return true }\n switch (code) {\n case 0x09: // \\t\n case 0x0A: // \\n\n case 0x0B: // \\v\n case 0x0C: // \\f\n case 0x0D: // \\r\n case 0x20:\n case 0xA0:\n case 0x1680:\n case 0x202F:\n case 0x205F:\n case 0x3000:\n return true\n }\n return false\n}\n\n/**\n * Checks whether a character is Unicode punctuation or a symbol.\n *\n * Does not support astral characters.\n */\nfunction isPunctChar (ch: string) {\n return ucmicro.P.test(ch) || ucmicro.S.test(ch)\n}\n\n/** Checks whether a Unicode code point is punctuation or a symbol. */\nfunction isPunctCharCode (code: number) {\n return isPunctChar(fromCodePoint(code))\n}\n\n/**\n * Markdown ASCII punctuation characters.\n *\n * !, \", #, $, %, &, ', (, ), *, +, ,, -, ., /, :, ;, <, =, >, ?, @,\n * [, \\, ], ^, _, `, {, |, }, or ~\n *\n * http://spec.commonmark.org/0.15/#ascii-punctuation-character\n *\n * Don't confuse with Unicode punctuation. It lacks some characters in the\n * ASCII range.\n */\nfunction isMdAsciiPunct (ch: number) {\n switch (ch) {\n case 0x21/* ! */:\n case 0x22/* \" */:\n case 0x23/* # */:\n case 0x24/* $ */:\n case 0x25/* % */:\n case 0x26/* & */:\n case 0x27/* ' */:\n case 0x28/* ( */:\n case 0x29/* ) */:\n case 0x2A/* * */:\n case 0x2B/* + */:\n case 0x2C/* , */:\n case 0x2D/* - */:\n case 0x2E/* . */:\n case 0x2F/* / */:\n case 0x3A/* : */:\n case 0x3B/* ; */:\n case 0x3C/* < */:\n case 0x3D/* = */:\n case 0x3E/* > */:\n case 0x3F/* ? */:\n case 0x40/* @ */:\n case 0x5B/* [ */:\n case 0x5C/* \\ */:\n case 0x5D/* ] */:\n case 0x5E/* ^ */:\n case 0x5F/* _ */:\n case 0x60/* ` */:\n case 0x7B/* { */:\n case 0x7C/* | */:\n case 0x7D/* } */:\n case 0x7E/* ~ */:\n return true\n default:\n return false\n }\n}\n\n/** Normalizes `[reference labels]` for case-insensitive lookup. */\nfunction normalizeReference (str: string) {\n // Trim and collapse whitespace\n //\n str = str.trim().replace(/\\s+/g, ' ')\n\n // .toLowerCase().toUpperCase() should get rid of all differences\n // between letter variants.\n //\n // Simple .toLowerCase() doesn't normalize 125 code points correctly,\n // and .toUpperCase doesn't normalize 6 of them (list of exceptions:\n // İ, ϴ, ẞ, Ω, K, Å - those are already uppercased, but have differently\n // uppercased versions).\n //\n // Here's an example showing how it happens. Lets take greek letter omega:\n // uppercase U+0398 (Θ), U+03f4 (ϴ) and lowercase U+03b8 (θ), U+03d1 (ϑ)\n //\n // Unicode entries:\n // 0398;GREEK CAPITAL LETTER THETA;Lu;0;L;;;;;N;;;;03B8;\n // 03B8;GREEK SMALL LETTER THETA;Ll;0;L;;;;;N;;;0398;;0398\n // 03D1;GREEK THETA SYMBOL;Ll;0;L;<compat> 03B8;;;;N;GREEK SMALL LETTER SCRIPT THETA;;0398;;0398\n // 03F4;GREEK CAPITAL THETA SYMBOL;Lu;0;L;<compat> 0398;;;;N;;;;03B8;\n //\n // Case-insensitive comparison should treat all of them as equivalent.\n //\n // But .toLowerCase() doesn't change ϑ (it's already lowercase),\n // and .toUpperCase() doesn't change ϴ (already uppercase).\n //\n // Applying first lower then upper case normalizes any character:\n // '\\u0398\\u03f4\\u03b8\\u03d1'.toLowerCase().toUpperCase() === '\\u0398\\u0398\\u0398\\u0398'\n //\n // Note: this is equivalent to unicode case folding; unicode normalization\n // is a different step that is not required here.\n //\n // Final result should be uppercased, because it's later stored in an object\n // (this avoid a conflict with Object.prototype members,\n // most notably, `__proto__`)\n //\n return str.toLowerCase().toUpperCase()\n}\n\nfunction isAsciiTrimmable (c: number) {\n return c === 0x20 || c === 0x09 || c === 0x0a || c === 0x0d\n}\n\n/**\n * \"Light\" `.trim()` for blocks (headings, paragraphs), where Unicode spaces\n * should be preserved.\n */\nfunction asciiTrim (str: string) {\n let start = 0\n for (; start < str.length; start++) {\n if (!isAsciiTrimmable(str.charCodeAt(start))) {\n break\n }\n }\n let end = str.length - 1\n for (; end >= start; end--) {\n if (!isAsciiTrimmable(str.charCodeAt(end))) {\n break\n }\n }\n return str.slice(start, end + 1)\n}\n\n/**\n * Libraries commonly used by markdown-it and its plugins, re-exported to\n * reduce duplicate dependencies in browser bundles.\n */\nconst lib = { mdurl, ucmicro }\n\nexport {\n lib,\n callable,\n unescapeMd,\n unescapeAll,\n isValidEntityCode,\n fromCodePoint,\n escapeHtml,\n arrayReplaceAt,\n isSpace,\n isWhiteSpace,\n isMdAsciiPunct,\n isPunctChar,\n isPunctCharCode,\n escapeRE,\n normalizeReference,\n asciiTrim\n}\n","import type StateInline from '../rules_inline/state_inline.ts'\n\n/** Finds the end of a link or image label (`[label]`). */\nexport default function parseLinkLabel (state: StateInline, start: number, disableNested?: boolean): number {\n let level, found, marker, prevPos\n\n const max = state.posMax\n const oldPos = state.pos\n\n state.pos = start + 1\n level = 1\n\n while (state.pos < max) {\n marker = state.src.charCodeAt(state.pos)\n if (marker === 0x5D /* ] */) {\n level--\n if (level === 0) {\n found = true\n break\n }\n }\n\n prevPos = state.pos\n state.md.inline.skipToken(state)\n if (marker === 0x5B /* [ */) {\n if (prevPos === state.pos - 1) {\n // increase level if we find text `[`, which is not a part of any token\n level++\n } else if (disableNested) {\n state.pos = oldPos\n return -1\n }\n }\n }\n\n let labelEnd = -1\n\n if (found) {\n labelEnd = state.pos\n }\n\n // restore old state\n state.pos = oldPos\n\n return labelEnd\n}\n","import { unescapeAll } from '../common/utils.ts'\n\n/** Parses the destination in `[label](destination \"title\")`. */\nexport default function parseLinkDestination (str: string, start: number, max: number) {\n let code\n let pos = start\n\n const result = {\n ok: false,\n pos: 0,\n str: ''\n }\n\n if (str.charCodeAt(pos) === 0x3C /* < */) {\n pos++\n while (pos < max) {\n code = str.charCodeAt(pos)\n if (code === 0x0A /* \\n */) { return result }\n if (code === 0x3C /* < */) { return result }\n if (code === 0x3E /* > */) {\n result.pos = pos + 1\n result.str = unescapeAll(str.slice(start + 1, pos))\n result.ok = true\n return result\n }\n if (code === 0x5C /* \\ */ && pos + 1 < max) {\n pos += 2\n continue\n }\n\n pos++\n }\n\n // no closing '>'\n return result\n }\n\n // this should be ... } else { ... branch\n\n let level = 0\n while (pos < max) {\n code = str.charCodeAt(pos)\n\n if (code === 0x20) { break }\n\n // ascii control characters\n if (code < 0x20 || code === 0x7F) { break }\n\n if (code === 0x5C /* \\ */ && pos + 1 < max) {\n if (str.charCodeAt(pos + 1) === 0x20) { pos++; continue }\n pos += 2\n continue\n }\n\n if (code === 0x28 /* ( */) {\n level++\n if (level > 32) { return result }\n }\n\n if (code === 0x29 /* ) */) {\n if (level === 0) { break }\n level--\n }\n\n pos++\n }\n\n if (start === pos) { return result }\n if (level !== 0) { return result }\n\n result.str = unescapeAll(str.slice(start, pos))\n result.pos = pos\n result.ok = true\n return result\n}\n","import { unescapeAll } from '../common/utils.ts'\n\n/** @inline */\ninterface ParseLinkTitleResult {\n ok: boolean\n can_continue: boolean\n pos: number\n str: string\n marker: number\n}\n\n/**\n * Parses the optional title in `[label](destination \"title\")` or\n * `[label]: destination \"title\"`.\n *\n * `prev_state` continues a reference title on the next source line.\n */\nexport default function parseLinkTitle (\n str: string,\n start: number,\n max: number,\n prev_state?: ParseLinkTitleResult\n): ParseLinkTitleResult {\n let code\n let pos = start\n\n const state = {\n // if `true`, this is a valid link title\n ok: false,\n // if `true`, this link can be continued on the next line\n can_continue: false,\n // if `ok`, it's the position of the first character after the closing marker\n pos: 0,\n // if `ok`, it's the unescaped title\n str: '',\n // expected closing marker character code\n marker: 0\n }\n\n if (prev_state) {\n // this is a continuation of a previous parseLinkTitle call on the next line,\n // used in reference links only\n state.str = prev_state.str\n state.marker = prev_state.marker\n } else {\n if (pos >= max) { return state }\n\n let marker = str.charCodeAt(pos)\n if (marker !== 0x22 /* \" */ && marker !== 0x27 /* ' */ && marker !== 0x28 /* ( */) { return state }\n\n start++\n pos++\n\n // if opening marker is \"(\", switch it to closing marker \")\"\n if (marker === 0x28) { marker = 0x29 }\n\n state.marker = marker\n }\n\n while (pos < max) {\n code = str.charCodeAt(pos)\n if (code === state.marker) {\n state.pos = pos + 1\n state.str += unescapeAll(str.slice(start, pos))\n state.ok = true\n return state\n } else if (code === 0x28 /* ( */ && state.marker === 0x29 /* ) */) {\n return state\n } else if (code === 0x5C /* \\ */ && pos + 1 < max) {\n pos++\n }\n\n pos++\n }\n\n // no closing marker found, but this link title may continue on the next line (for references)\n state.can_continue = true\n state.str += unescapeAll(str.slice(start, pos))\n return state\n}\n","/**\n * Functions used to parse links and images, split out of parser rules because\n * of their size.\n *\n * @module md.helpers\n */\n\n// Just a shortcut for bulk export\n\nimport parseLinkLabel from './parse_link_label.ts'\nimport parseLinkDestination from './parse_link_destination.ts'\nimport parseLinkTitle from './parse_link_title.ts'\n\nexport {\n parseLinkLabel,\n parseLinkDestination,\n parseLinkTitle\n}\n","// Token class\n\n/** @inline */\ntype TokenNesting = -1 | 0 | 1\n\n/** @inline */\ntype TokenAttribute = [name: string, value: string | number]\n\n/**\n * Represents one item in the parsed token stream, storing parsed data and\n * providing helpers for managing HTML attributes.\n */\nclass Token {\n /**\n * Type of the token (string, e.g. \"paragraph_open\")\n */\n declare type: string\n\n /**\n * html tag name, e.g. \"p\"\n */\n declare tag: string\n\n /** Html attributes. Format: `[ [ name1, value1 ], [ name2, value2 ] ]` */\n declare attrs: TokenAttribute[] | null\n\n /**\n * Source map info. Format: `[ line_begin, line_end ]`\n */\n map: [number, number] | null = null\n\n /**\n * Level change (number in {-1, 0, 1} set), where:\n *\n * - `1` means the tag is opening\n * - `0` means the tag is self-closing\n * - `-1` means the tag is closing\n */\n declare nesting: TokenNesting\n\n /**\n * nesting level, the same as `state.level`\n */\n level = 0\n\n /**\n * An array of child nodes (inline and img tokens)\n */\n children: Token[] | null = null\n\n /**\n * In a case of self-closing tag (code, html, fence, etc.),\n * it has contents of this tag.\n */\n content = ''\n\n /**\n * '*' or '_' for emphasis, fence string for fence, etc.\n */\n markup = ''\n\n /**\n * Additional information:\n *\n * - Info string for \"fence\" tokens\n * - The value \"auto\" for autolink \"link_open\" and \"link_close\" tokens\n * - The string value of the item marker for ordered-list \"list_item_open\" tokens\n */\n info = ''\n\n /** A place for plugins to store an arbitrary data */\n declare meta: Record<string, unknown> | null\n\n /**\n * True for block-level tokens, false for inline tokens.\n * Used in renderer to calculate line breaks\n */\n block = false\n\n /**\n * If it's true, ignore this element when rendering. Used for tight lists\n * to hide paragraphs.\n */\n hidden = false\n\n constructor (type: string, tag: string, nesting: TokenNesting) {\n this.type = type\n this.tag = tag\n\n this.attrs = null\n\n this.nesting = nesting\n\n this.meta = null\n }\n\n /**\n * Search attribute index by name.\n */\n attrIndex (name: string): number {\n if (!this.attrs) { return -1 }\n\n const attrs = this.attrs\n\n for (let i = 0, len = attrs.length; i < len; i++) {\n if (attrs[i][0] === name) { return i }\n }\n return -1\n }\n\n /**\n * Add `[ name, value ]` attribute to list. Init attrs if necessary\n */\n attrPush (attrData: TokenAttribute): void {\n if (this.attrs) {\n this.attrs.push(attrData)\n } else {\n this.attrs = [attrData]\n }\n }\n\n /**\n * Set `name` attribute to `value`. Override old value if exists.\n */\n attrSet (name: string, value: string | number): void {\n const idx = this.attrIndex(name)\n const attrData: TokenAttribute = [name, value]\n\n if (idx < 0) {\n this.attrPush(attrData)\n } else {\n this.attrs![idx] = attrData\n }\n }\n\n /**\n * Get the value of attribute `name`, or null if it does not exist.\n */\n attrGet (name: string): string | number | null {\n const idx = this.attrIndex(name)\n let value = null\n if (idx >= 0) {\n value = this.attrs![idx][1]\n }\n return value\n }\n\n /**\n * Join value to existing attribute via space. Or create new attribute if not\n * exists. Useful to operate with token classes.\n */\n attrJoin (name: string, value: string | number): void {\n const idx = this.attrIndex(name)\n\n if (idx < 0) {\n this.attrPush([name, value])\n } else {\n this.attrs![idx][1] = `${this.attrs![idx][1]} ${value}`\n }\n }\n}\n\nexport default Token\n","/** @inline */\ntype RuleOptions = { alt?: string[] }\n\n/**\n * Helper class, used by {@link MarkdownIt.core}, {@link MarkdownIt.block} and\n * {@link MarkdownIt.inline} to manage sequences of functions (rules):\n *\n * - keep rules in defined order\n * - assign the name to each rule\n * - enable/disable rules\n * - add/replace rules\n * - allow assign rules to additional named chains (in the same)\n * - cacheing lists of active rules\n *\n * You will not need use this class directly until write plugins. For simple\n * rules control use {@link MarkdownIt.disable}, {@link MarkdownIt.enable} and\n * {@link MarkdownIt.use}.\n */\nclass Ruler<Args extends unknown[], Result> {\n /** @internal */\n __rules__: Array<{\n name: string\n enabled: boolean\n fn: (...args: Args) => Result\n alt: string[]\n }> = []\n\n // Cached rule chains.\n //\n // First level - chain name, '' for default.\n // Second level - diginal anchor for fast filtering by charcodes.\n //\n /** @internal */\n __cache__: Record<string, Array<(...args: Args) => Result>> | null = null\n\n /** @internal */\n __find__ (name: string): number {\n for (let i = 0; i < this.__rules__.length; i++) {\n if (this.__rules__[i].name === name) {\n return i\n }\n }\n return -1\n }\n\n /** @internal */\n __compile__ (): void {\n const chains = new Set<string>()\n\n // collect unique names\n this.__rules__.forEach(rule => {\n if (!rule.enabled) return\n rule.alt.forEach(altName => {\n if (altName) chains.add(altName)\n })\n })\n\n this.__cache__ = Object.create(null)\n\n // Collect default chain\n this.__cache__![''] = []\n this.__rules__.forEach(rule => {\n if (rule.enabled) this.__cache__![''].push(rule.fn)\n })\n\n // Collect alt chains\n chains.forEach(chain => {\n this.__cache__![chain] = []\n\n this.__rules__.forEach(rule => {\n if (rule.enabled && rule.alt.indexOf(chain) >= 0) {\n this.__cache__![chain].push(rule.fn)\n }\n })\n })\n }\n\n /**\n * Replace rule by name with new function & options. Throws error if name not\n * found.\n *\n * @example Replace existing typographer replacement rule with new one\n * ```javascript\n * import MarkdownIt from 'markdown-it'\n * const md = new MarkdownIt()\n *\n * md.core.ruler.at('replacements', function replace(state) {\n * //...\n * });\n * ```\n */\n at (name: string, fn: (...args: Args) => Result, options: RuleOptions = {}): void {\n const index = this.__find__(name)\n\n if (index === -1) { throw new Error(`Parser rule not found: ${name}`) }\n\n this.__rules__[index].fn = fn\n this.__rules__[index].alt = options.alt || []\n this.__cache__ = null\n }\n\n /**\n * Add new rule to chain before one with given name. See also\n * {@link Ruler.after}, {@link Ruler.push}.\n *\n * @example\n * ```javascript\n * import MarkdownIt from 'markdown-it'\n * const md = new MarkdownIt()\n *\n * md.block.ruler.before('paragraph', 'my_rule', function replace(state) {\n * //...\n * });\n * ```\n */\n before (beforeName: string, ruleName: string, fn: (...args: Args) => Result, options: RuleOptions = {}): void {\n const index = this.__find__(beforeName)\n\n if (index === -1) { throw new Error(`Parser rule not found: ${beforeName}`) }\n\n this.__rules__.splice(index, 0, {\n name: ruleName,\n enabled: true,\n fn,\n alt: options.alt || []\n })\n\n this.__cache__ = null\n }\n\n /**\n * Add new rule to chain after one with given name. See also\n * {@link Ruler.before}, {@link Ruler.push}.\n *\n * @example\n * ```javascript\n * import MarkdownIt from 'markdown-it'\n * const md = new MarkdownIt()\n *\n * md.inline.ruler.after('text', 'my_rule', function replace(state) {\n * //...\n * });\n * ```\n */\n after (afterName: string, ruleName: string, fn: (...args: Args) => Result, options: RuleOptions = {}): void {\n const index = this.__find__(afterName)\n\n if (index === -1) { throw new Error(`Parser rule not found: ${afterName}`) }\n\n this.__rules__.splice(index + 1, 0, {\n name: ruleName,\n enabled: true,\n fn,\n alt: options.alt || []\n })\n\n this.__cache__ = null\n }\n\n /**\n * Push new rule to the end of chain. See also\n * {@link Ruler.before}, {@link Ruler.after}.\n *\n * @example\n * ```javascript\n * import MarkdownIt from 'markdown-it'\n * const md = new MarkdownIt()\n *\n * md.core.ruler.push('my_rule', function replace(state) {\n * //...\n * });\n * ```\n */\n push (ruleName: string, fn: (...args: Args) => Result, options: RuleOptions = {}): void {\n this.__rules__.push({\n name: ruleName,\n enabled: true,\n fn,\n alt: options.alt || []\n })\n\n this.__cache__ = null\n }\n\n /**\n * Enable rules with given names. If any rule name not found - throw Error.\n * Errors can be disabled by second param.\n *\n * See also {@link Ruler.disable}, {@link Ruler.enableOnly}.\n *\n * Returns list of found rule names (if no exception happened).\n */\n enable (list: string | string[], ignoreInvalid = false): string[] {\n if (!Array.isArray(list)) { list = [list] }\n\n const result: string[] = []\n\n // Search by name and enable\n list.forEach(name => {\n const idx = this.__find__(name)\n\n if (idx < 0) {\n if (ignoreInvalid) { return }\n throw new Error(`Rules manager: invalid rule name ${name}`)\n }\n this.__rules__[idx].enabled = true\n result.push(name)\n })\n\n this.__cache__ = null\n return result\n }\n\n /**\n * Enable rules with given names, and disable everything else. If any rule name\n * not found - throw Error. Errors can be disabled by second param.\n *\n * See also {@link Ruler.disable}, {@link Ruler.enable}.\n */\n enableOnly (list: string | string[], ignoreInvalid = false): void {\n if (!Array.isArray(list)) { list = [list] }\n\n this.__rules__.forEach(rule => { rule.enabled = false })\n\n this.enable(list, ignoreInvalid)\n }\n\n /**\n * Disable rules with given names. If any rule name not found - throw Error.\n * Errors can be disabled by second param.\n *\n * See also {@link Ruler.enable}, {@link Ruler.enableOnly}.\n *\n * Returns list of found rule names (if no exception happened).\n */\n disable (list: string | string[], ignoreInvalid = false): string[] {\n if (!Array.isArray(list)) { list = [list] }\n\n const result: string[] = []\n\n // Search by name and disable\n list.forEach(name => {\n const idx = this.__find__(name)\n\n if (idx < 0) {\n if (ignoreInvalid) { return }\n throw new Error(`Rules manager: invalid rule name ${name}`)\n }\n this.__rules__[idx].enabled = false\n result.push(name)\n })\n\n this.__cache__ = null\n return result\n }\n\n /**\n * Return array of active functions (rules) for given chain name. It analyzes\n * rules configuration, compiles caches if not exists and returns result.\n *\n * Default chain name is `''` (empty string). It can't be skipped. That's\n * done intentionally, to keep signature monomorphic for high speed.\n */\n getRules (chainName: string): Array<(...args: Args) => Result> {\n if (!this.__cache__) this.__compile__()\n\n // Chain can be empty, if rules disabled. But we still have to return Array.\n return this.__cache__![chainName] || []\n }\n}\n\nexport default Ruler\n","import { unescapeAll, escapeHtml } from './common/utils.ts'\nimport type Token from './token.ts'\nimport type { Env, MarkdownItOptions } from './types.ts'\n\n/** Function that renders a token at a given position in a token stream. */\nexport type RendererRule = (\n tokens: Token[],\n idx: number,\n options: Required<MarkdownItOptions>,\n env: Env | undefined,\n renderer: Renderer\n) => string\n\nconst default_rules: Record<string, RendererRule> = {}\n\ndefault_rules.code_inline = function (\n tokens: Token[],\n idx: number,\n options: Required<MarkdownItOptions>,\n env: Env | undefined,\n slf: Renderer\n): string {\n const token = tokens[idx]\n\n return `<code${slf.renderAttrs(token)}>${escapeHtml(token.content)}</code>`\n}\n\ndefault_rules.code_block = function (\n tokens: Token[],\n idx: number,\n options: Required<MarkdownItOptions>,\n env: Env | undefined,\n slf: Renderer\n): string {\n const token = tokens[idx]\n\n return `<pre${slf.renderAttrs(token)}><code>${escapeHtml(tokens[idx].content)}</code></pre>\\n`\n}\n\ndefault_rules.fence = function (\n tokens: Token[],\n idx: number,\n options: Required<MarkdownItOptions>,\n env: Env | undefined,\n slf: Renderer\n): string {\n const token = tokens[idx]\n const info = token.info ? unescapeAll(token.info).trim() : ''\n let langName = ''\n let langAttrs = ''\n\n if (info) {\n const arr = info.split(/(\\s+)/g)\n langName = arr[0]\n langAttrs = arr.slice(2).join('')\n }\n\n let highlighted\n if (options.highlight) {\n highlighted = options.highlight(token.content, langName, langAttrs) || escapeHtml(token.content)\n } else {\n highlighted = escapeHtml(token.content)\n }\n\n if (highlighted.indexOf('<pre') === 0) {\n return highlighted + '\\n'\n }\n\n // If language exists, inject class gently, without modifying original token.\n // May be, one day we will add .deepClone() for token and simplify this part, but\n // now we prefer to keep things local.\n if (info) {\n const i = token.attrIndex('class')\n const tmpAttrs = token.attrs ? token.attrs.slice() : []\n\n if (i < 0) {\n tmpAttrs.push(['class', `${options.langPrefix}${langName}`])\n } else {\n tmpAttrs[i] = [tmpAttrs[i][0], tmpAttrs[i][1]] // shallow clone\n tmpAttrs[i][1] += ` ${options.langPrefix}${langName}`\n }\n\n // Fake token just to render attributes\n const tmpToken = {\n attrs: tmpAttrs\n }\n\n return `<pre><code${slf.renderAttrs(tmpToken)}>${highlighted}</code></pre>\\n`\n }\n\n return `<pre><code${slf.renderAttrs(token)}>${highlighted}</code></pre>\\n`\n}\n\ndefault_rules.image = function (\n tokens: Token[],\n idx: number,\n options: Required<MarkdownItOptions>,\n env: Env | undefined,\n slf: Renderer\n): string {\n const token = tokens[idx]\n\n // \"alt\" attr MUST be set, even if empty. Because it's mandatory and\n // should be placed on proper position for tests.\n //\n // Replace content with actual value\n\n token.attrs![token.attrIndex('alt')][1] =\n slf.renderInlineAsText(token.children!, options, env)\n\n return slf.renderToken(tokens, idx, options)\n}\n\ndefault_rules.hardbreak = function (\n tokens: Token[],\n idx: number,\n options: Required<MarkdownItOptions>\n): string {\n return options.xhtmlOut ? '<br />\\n' : '<br>\\n'\n}\ndefault_rules.softbreak = function (\n tokens: Token[],\n idx: number,\n options: Required<MarkdownItOptions>\n): string {\n return options.breaks ? (options.xhtmlOut ? '<br />\\n' : '<br>\\n') : '\\n'\n}\n\ndefault_rules.text = function (tokens: Token[], idx: number): string {\n return escapeHtml(tokens[idx].content)\n}\n\ndefault_rules.html_block = function (tokens: Token[], idx: number): string {\n return tokens[idx].content\n}\ndefault_rules.html_inline = function (tokens: Token[], idx: number): string {\n return tokens[idx].content\n}\n\n/**\n * Generates HTML from parsed token stream. Each instance has independent\n * copy of rules. Those can be rewritten with ease. Also, you can add new\n * rules if you create plugin and adds new token types.\n *\n * Creates new renderer instance and fills {@link Renderer.rules} with defaults.\n */\nclass Renderer {\n /**\n * Contains render rules for tokens. Can be updated and extended.\n *\n * See [source code](https://github.com/markdown-it/markdown-it/blob/master/src/renderer.ts)\n * for more details and examples.\n *\n * @example Custom render rules\n * ```javascript\n * import MarkdownIt from 'markdown-it'\n * const md = new MarkdownIt()\n *\n * md.renderer.rules.strong_open = function () { return '<b>'; };\n * md.renderer.rules.strong_close = function () { return '</b>'; };\n *\n * const result = md.renderInline(...);\n * ```\n *\n * @example Each rule is called as independent static function with fixed signature\n * ```javascript\n * function my_token_render(tokens, idx, options, env, renderer) {\n * // ...\n * return renderedHTML;\n * }\n * ```\n */\n rules: Record<string, RendererRule> = Object.assign({}, default_rules)\n\n /**\n * Render token attributes to string.\n */\n renderAttrs (token: Pick<Token, 'attrs'>): string {\n let i, l, result\n\n if (!token.attrs) { return '' }\n\n result = ''\n\n for (i = 0, l = token.attrs.length; i < l; i++) {\n result += ` ${escapeHtml(token.attrs[i][0])}=\"${escapeHtml(String(token.attrs[i][1]))}\"`\n }\n\n return result\n }\n\n /**\n * Default token renderer. Can be overriden by custom function\n * in {@link Renderer.rules}.\n */\n renderToken (tokens: Token[], idx: number, options: Required<MarkdownItOptions>): string {\n const token = tokens[idx]\n let result = ''\n\n // Tight list paragraphs\n if (token.hidden) {\n return ''\n }\n\n // Insert a newline between hidden paragraph and subsequent opening\n // block-level tag.\n //\n // For example, here we should insert a newline before blockquote:\n // - a\n // >\n //\n // Only closing hidden tokens count, to not break on other hidden ones.\n //\n // Hidden tokens without nesting (`reference_definition`) are skipped here\n // and below, or they would break line feeds around neighbour blocks.\n //\n let prev = idx - 1\n while (prev >= 0 && tokens[prev].hidden && tokens[prev].nesting === 0) { prev-- }\n\n if (token.block && token.nesting !== -1 && prev >= 0 &&\n tokens[prev].hidden && tokens[prev].nesting === -1) {\n result += '\\n'\n }\n\n // Add token name, e.g. `<img`\n result += (token.nesting === -1 ? '</' : '<') + token.tag\n\n // Encode attributes, e.g. `<img src=\"foo\"`\n result += this.renderAttrs(token)\n\n // Add a slash for self-closing tags, e.g. `<img src=\"foo\" /`\n if (token.nesting === 0 && options.xhtmlOut) {\n result += ' /'\n }\n\n // Check if we need to add a newline after this tag\n let needLf = false\n if (token.block) {\n needLf = true\n\n if (token.nesting === 1) {\n let next = idx + 1\n while (next < tokens.length && tokens[next].hidden && tokens[next].nesting === 0) { next++ }\n\n if (next < tokens.length) {\n const nextToken = tokens[next]\n\n if (nextToken.type === 'inline' || nextToken.hidden) {\n // Block-level tag containing an inline tag.\n //\n needLf = false\n } else if (nextToken.nesting === -1 && nextToken.tag === token.tag) {\n // Opening tag + closing tag of the same type. E.g. `<li></li>`.\n //\n needLf = false\n }\n }\n }\n }\n\n result += needLf ? '>\\n' : '>'\n\n return result\n }\n\n /**\n * The same as {@link Renderer.render}, but for single token of `inline` type.\n */\n renderInline (tokens: Token[], options: Required<MarkdownItOptions>, env: Env | undefined): string {\n let result = ''\n const rules = this.rules\n\n for (let i = 0, len = tokens.length; i < len; i++) {\n const type = tokens[i].type\n\n if (typeof rules[type] !== 'undefined') {\n result += rules[type](tokens, i, options, env, this)\n } else {\n result += this.renderToken(tokens, i, options)\n }\n }\n\n return result\n }\n\n /**\n * Special kludge for image `alt` attributes to conform CommonMark spec.\n * Don't try to use it! Spec requires to show `alt` content with stripped markup,\n * instead of simple escaping.\n */\n renderInlineAsText (tokens: Token[], options: Required<MarkdownItOptions>, env: Env | undefined): string {\n let result = ''\n\n for (let i = 0, len = tokens.length; i < len; i++) {\n switch (tokens[i].type) {\n case 'text':\n case 'code_inline':\n // code content is added as plain text, without backticks\n result += tokens[i].content\n break\n case 'image':\n result += this.renderInlineAsText(tokens[i].children!, options, env)\n break\n case 'html_inline':\n case 'html_block':\n result += tokens[i].content\n break\n case 'softbreak':\n case 'hardbreak':\n result += '\\n'\n break\n default:\n // all other tokens are skipped\n }\n }\n\n return result\n }\n\n /**\n * Takes token stream and generates HTML. Probably, you will never need to call\n * this method directly.\n */\n render (tokens: Token[], options: Required<MarkdownItOptions>, env?: Env): string {\n let result = ''\n const rules = this.rules\n\n for (let i = 0, len = tokens.length; i < len; i++) {\n const type = tokens[i].type\n\n if (type === 'inline') {\n result += this.renderInline(tokens[i].children!, options, env)\n } else if (typeof rules[type] !== 'undefined') {\n result += rules[type](tokens, i, options, env, this)\n } else {\n result += this.renderToken(tokens, i, options)\n }\n }\n\n return result\n }\n}\n\nexport default Renderer\n","import Token from '../token.ts'\nimport type MarkdownIt from '../markdownit.ts'\nimport type { Env } from '../types.ts'\n\n/** Mutable state passed through the core rules chain. */\nclass StateCore {\n declare src: string\n declare env: Env\n tokens: Token[] = []\n inlineMode = false\n declare md: MarkdownIt\n\n // re-export Token class to use in core rules\n Token = Token\n\n constructor (src: string, md: MarkdownIt, env: Env) {\n this.src = src\n this.env = env\n this.md = md // link to parser instance\n }\n}\n\nexport default StateCore\n","// Normalize input string\n\nimport type StateCore from './state_core.ts'\n\n// https://spec.commonmark.org/0.29/#line-ending\nconst UNNORMALIZED_NEWLINE_RE = /\\r\\n?/g\nconst NULL_RE = /\\0/g\n\nexport default function normalize (state: StateCore): void {\n let str\n\n // Normalize newlines\n str = state.src.replace(UNNORMALIZED_NEWLINE_RE, '\\n')\n\n // Replace NULL characters\n str = str.replace(NULL_RE, '\\uFFFD')\n\n state.src = str\n}\n","import type StateCore from './state_core.ts'\n\nexport default function block (state: StateCore): void {\n let token\n\n if (state.inlineMode) {\n token = new state.Token('inline', '', 0)\n token.content = state.src\n token.map = [0, 1]\n token.children = []\n state.tokens.push(token)\n } else {\n state.md.block.parse(state.src, state.md, state.env, state.tokens)\n }\n}\n","// Drop `reference_definition` tokens to keep the stream backward compatible\n//\n// Those tokens mark places link definitions took in the source. They are new,\n// and plugins walking block tokens may not expect them, so by default the\n// stream stays as it always was. Disable this rule to opt in.\n//\n\nimport type StateCore from './state_core.ts'\n\nexport default function strip_references (state: StateCore): void {\n const tokens = state.tokens\n let last = 0\n\n for (let curr = 0; curr < tokens.length; curr++) {\n if (tokens[curr].type === 'reference_definition') continue\n\n if (curr !== last) { tokens[last] = tokens[curr] }\n\n last++\n }\n\n if (tokens.length !== last) { tokens.length = last }\n}\n","import type StateCore from './state_core.ts'\n\nexport default function inline (state: StateCore): void {\n const tokens = state.tokens\n\n // Parse inlines\n for (let i = 0, l = tokens.length; i < l; i++) {\n const tok = tokens[i]\n if (tok.type === 'inline') {\n state.md.inline.parse(tok.content, state.md, state.env, tok.children!)\n }\n }\n}\n","// Replace link-like texts with link nodes.\n//\n// Currently restricted by `md.validateLink()` to http/https/ftp\n//\n\nimport type StateCore from './state_core.ts'\n\nfunction isLinkOpen (str: string) {\n return /^<a[>\\s]/i.test(str)\n}\nfunction isLinkClose (str: string) {\n return /^<\\/a\\s*>/i.test(str)\n}\n\nexport default function linkify (state: StateCore): void {\n const blockTokens = state.tokens\n\n if (!state.md.options.linkify) { return }\n\n for (let j = 0, l = blockTokens.length; j < l; j++) {\n if (blockTokens[j].type !== 'inline' ||\n !state.md.linkify.test(blockTokens[j].content)) {\n continue\n }\n\n const tokens = blockTokens[j].children!\n const replacements: Array<{ index: number, nodes: typeof tokens }> = []\n\n let htmlLinkLevel = 0\n\n // We scan from the end, to keep position when new tags added.\n // Use reversed logic in links start/end match\n for (let i = tokens.length - 1; i >= 0; i--) {\n const currentToken = tokens[i]\n\n // Skip content of markdown links\n if (currentToken.type === 'link_close') {\n i--\n while (tokens[i].level !== currentToken.level && tokens[i].type !== 'link_open') {\n i--\n }\n continue\n }\n\n // Skip content of html tag links\n if (currentToken.type === 'html_inline') {\n if (isLinkOpen(currentToken.content) && htmlLinkLevel > 0) {\n htmlLinkLevel--\n }\n if (isLinkClose(currentToken.content)) {\n htmlLinkLevel++\n }\n }\n if (htmlLinkLevel > 0) { continue }\n\n if (currentToken.type === 'text' && state.md.linkify.test(currentToken.content)) {\n const text = currentToken.content\n let links = state.md.linkify.match(text)!\n\n // Now split string to nodes\n const nodes = []\n let level = currentToken.level\n let lastPos = 0\n\n // forbid escape sequence at the start of the string,\n // this avoids http\\://example.com/ from being linkified as\n // http:<a href=\"//example.com/\">//example.com/</a>\n if (links.length > 0 &&\n links[0].index === 0 &&\n i > 0 &&\n tokens[i - 1].type === 'text_special') {\n links = links.slice(1)\n }\n\n for (let ln = 0; ln < links.length; ln++) {\n const url = links[ln].url\n const fullUrl = state.md.normalizeLink(url)\n if (!state.md.validateLink(fullUrl)) { continue }\n\n let urlText = links[ln].text\n\n // Linkifier might send raw hostnames like \"example.com\", where url\n // starts with domain name. So we prepend http:// in those cases,\n // and remove it afterwards.\n //\n if (!links[ln].schema) {\n urlText = state.md.normalizeLinkText(`http://${urlText}`).replace(/^http:\\/\\//, '')\n } else if (links[ln].schema === 'mailto:' && !/^mailto:/i.test(urlText)) {\n urlText = state.md.normalizeLinkText(`mailto:${urlText}`).replace(/^mailto:/, '')\n } else {\n urlText = state.md.normalizeLinkText(urlText)\n }\n\n const pos = links[ln].index\n\n if (pos > lastPos) {\n const token = new state.Token('text', '', 0)\n token.content = text.slice(lastPos, pos)\n token.level = level\n nodes.push(token)\n }\n\n const token_o = new state.Token('link_open', 'a', 1)\n token_o.attrs = [['href', fullUrl]]\n token_o.level = level++\n token_o.markup = 'linkify'\n token_o.info = 'auto'\n nodes.push(token_o)\n\n const token_t = new state.Token('text', '', 0)\n token_t.content = urlText\n token_t.level = level\n nodes.push(token_t)\n\n const token_c = new state.Token('link_close', 'a', -1)\n token_c.level = --level\n token_c.markup = 'linkify'\n token_c.info = 'auto'\n nodes.push(token_c)\n\n lastPos = links[ln].lastIndex\n }\n if (lastPos < text.length) {\n const token = new state.Token('text', '', 0)\n token.content = text.slice(lastPos)\n token.level = level\n nodes.push(token)\n }\n\n replacements.push({ index: i, nodes })\n }\n }\n\n if (replacements.length > 0) {\n let newTokensLength = tokens.length\n for (const replacement of replacements) {\n newTokensLength += replacement.nodes.length - 1\n }\n\n const newTokens = new Array<(typeof tokens)[number]>(newTokensLength)\n let replacementIndex = 0\n let newTokenIndex = 0\n\n replacements.reverse()\n\n for (let i = 0; i < tokens.length; i++) {\n const replacement = replacements[replacementIndex]\n\n if (replacement?.index === i) {\n for (const node of replacement.nodes) {\n newTokens[newTokenIndex++] = node\n }\n replacementIndex++\n } else {\n newTokens[newTokenIndex++] = tokens[i]\n }\n }\n\n blockTokens[j].children = newTokens\n }\n }\n}\n","// Simple typographic replacements\n//\n// (c) (C) → ©\n// (tm) (TM) → ™\n// (r) (R) → ®\n// +- → ±\n// ... → … (also ?.... → ?.., !.... → !..)\n// ???????? → ???, !!!!! → !!!, `,,` → `,`\n// -- → –, --- → —\n//\n\n// TODO:\n// - fractionals 1/2, 1/4, 3/4 -> ½, ¼, ¾\n// - multiplications 2 x 4 -> 2 × 4\n\nimport type StateCore from './state_core.ts'\nimport type Token from '../token.ts'\n\nconst RARE_RE = /\\+-|\\.\\.|\\?\\?\\?\\?|!!!!|,,|--/\n\n// Workaround for phantomjs - need regex without /g flag,\n// or root check will fail every second time\nconst SCOPED_ABBR_TEST_RE = /\\((c|tm|r)\\)/i\n\nconst SCOPED_ABBR_RE = /\\((c|tm|r)\\)/ig\nconst SCOPED_ABBR: Record<string, string> = {\n c: '©',\n r: '®',\n tm: '™'\n}\n\nfunction replaceFn (match: string, name: string) {\n return SCOPED_ABBR[name.toLowerCase()]\n}\n\nfunction replace_scoped (inlineTokens: Token[]) {\n let inside_autolink = 0\n\n for (let i = inlineTokens.length - 1; i >= 0; i--) {\n const token = inlineTokens[i]\n\n if (token.type === 'text' && !inside_autolink) {\n token.content = token.content.replace(SCOPED_ABBR_RE, replaceFn)\n }\n\n if (token.type === 'link_open' && token.info === 'auto') {\n inside_autolink--\n }\n\n if (token.type === 'link_close' && token.info === 'auto') {\n inside_autolink++\n }\n }\n}\n\nfunction replace_rare (inlineTokens: Token[]) {\n let inside_autolink = 0\n\n for (let i = inlineTokens.length - 1; i >= 0; i--) {\n const token = inlineTokens[i]\n\n if (token.type === 'text' && !inside_autolink) {\n if (RARE_RE.test(token.content)) {\n token.content = token.content\n .replace(/\\+-/g, '±')\n // .., ..., ....... -> …\n // but ?..... & !..... -> ?.. & !..\n .replace(/\\.{2,}/g, '…').replace(/([?!])…/g, '$1..')\n .replace(/([?!]){4,}/g, '$1$1$1').replace(/,{2,}/g, ',')\n // em-dash\n .replace(/(^|[^-])---(?=[^-]|$)/mg, '$1\\u2014')\n // en-dash\n .replace(/(^|\\s)--(?=\\s|$)/mg, '$1\\u2013')\n .replace(/(^|[^-\\s])--(?=[^-\\s]|$)/mg, '$1\\u2013')\n }\n }\n\n if (token.type === 'link_open' && token.info === 'auto') {\n inside_autolink--\n }\n\n if (token.type === 'link_close' && token.info === 'auto') {\n inside_autolink++\n }\n }\n}\n\nexport default function replace (state: StateCore): void {\n let blkIdx\n\n if (!state.md.options.typographer) { return }\n\n for (blkIdx = state.tokens.length - 1; blkIdx >= 0; blkIdx--) {\n if (state.tokens[blkIdx].type !== 'inline') { continue }\n\n if (SCOPED_ABBR_TEST_RE.test(state.tokens[blkIdx].content)) {\n replace_scoped(state.tokens[blkIdx].children!)\n }\n\n if (RARE_RE.test(state.tokens[blkIdx].content)) {\n replace_rare(state.tokens[blkIdx].children!)\n }\n }\n}\n","// Convert straight quotation marks to typographic ones\n//\n\nimport { isWhiteSpace, isPunctCharCode, isMdAsciiPunct } from '../common/utils.ts'\nimport type Token from '../token.ts'\nimport type StateCore from './state_core.ts'\n\nconst QUOTE_TEST_RE = /['\"]/\nconst QUOTE_RE = /['\"]/g\nconst APOSTROPHE = '\\u2019' /* ’ */\n\ninterface Replacement {\n pos: number\n ch: string\n}\n\ntype ReplacementMap = Record<string, Replacement[]>\n\nfunction addReplacement (\n replacements: ReplacementMap,\n tokenIdx: number,\n pos: number,\n ch: string\n) {\n if (!replacements[tokenIdx]) {\n replacements[tokenIdx] = []\n }\n\n replacements[tokenIdx].push({ pos, ch })\n}\n\nfunction applyReplacements (str: string, replacements: Replacement[]) {\n let result = ''\n let lastPos = 0\n\n replacements.sort((a, b) => a.pos - b.pos)\n\n for (let i = 0; i < replacements.length; i++) {\n const replacement = replacements[i]\n\n result += str.slice(lastPos, replacement.pos) + replacement.ch\n lastPos = replacement.pos + 1\n }\n\n return result + str.slice(lastPos)\n}\n\nfunction process_inlines (tokens: Token[], state: StateCore) {\n let j\n\n const stack = []\n // token index -> list of replacements in the original token content\n const replacements: ReplacementMap = {}\n\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i]\n\n const thisLevel = tokens[i].level\n\n for (j = stack.length - 1; j >= 0; j--) {\n if (stack[j].level <= thisLevel) { break }\n }\n stack.length = j + 1\n\n if (token.type !== 'text') { continue }\n\n const text = token.content\n let pos = 0\n const max = text.length\n\n /* eslint no-labels:0,block-scoped-var:0 */\n OUTER:\n while (pos < max) {\n QUOTE_RE.lastIndex = pos\n const t = QUOTE_RE.exec(text)\n if (!t) { break }\n\n let canOpen = true\n let canClose = true\n pos = t.index + 1\n const isSingle = (t[0] === \"'\")\n\n // Find previous character,\n // default to space if it's the beginning of the line\n //\n let lastChar = 0x20\n\n if (t.index - 1 >= 0) {\n lastChar = text.charCodeAt(t.index - 1)\n } else {\n for (j = i - 1; j >= 0; j--) {\n if (tokens[j].type === 'softbreak' || tokens[j].type === 'hardbreak') break // lastChar defaults to 0x20\n if (!tokens[j].content) continue // should skip all tokens except 'text', 'html_inline' or 'code_inline'\n\n lastChar = tokens[j].content.charCodeAt(tokens[j].content.length - 1)\n break\n }\n }\n\n // Find next character,\n // default to space if it's the end of the line\n //\n let nextChar = 0x20\n\n if (pos < max) {\n nextChar = text.charCodeAt(pos)\n } else {\n for (j = i + 1; j < tokens.length; j++) {\n if (tokens[j].type === 'softbreak' || tokens[j].type === 'hardbreak') break // nextChar defaults to 0x20\n if (!tokens[j].content) continue // should skip all tokens except 'text', 'html_inline' or 'code_inline'\n\n nextChar = tokens[j].content.charCodeAt(0)\n break\n }\n }\n\n const isLastPunctChar = isMdAsciiPunct(lastChar) || isPunctCharCode(lastChar)\n const isNextPunctChar = isMdAsciiPunct(nextChar) || isPunctCharCode(nextChar)\n\n const isLastWhiteSpace = isWhiteSpace(lastChar)\n const isNextWhiteSpace = isWhiteSpace(nextChar)\n\n if (isNextWhiteSpace) {\n canOpen = false\n } else if (isNextPunctChar) {\n if (!(isLastWhiteSpace || isLastPunctChar)) {\n canOpen = false\n }\n }\n\n if (isLastWhiteSpace) {\n canClose = false\n } else if (isLastPunctChar) {\n if (!(isNextWhiteSpace || isNextPunctChar)) {\n canClose = false\n }\n }\n\n if (nextChar === 0x22 /* \" */ && t[0] === '\"') {\n if (lastChar >= 0x30 /* 0 */ && lastChar <= 0x39 /* 9 */) {\n // special case: 1\"\" - count first quote as an inch\n canClose = canOpen = false\n }\n }\n\n if (canOpen && canClose) {\n // Replace quotes in the middle of punctuation sequence, but not\n // in the middle of the words, i.e.:\n //\n // 1. foo \" bar \" baz - not replaced\n // 2. foo-\"-bar-\"-baz - replaced\n // 3. foo\"bar\"baz - not replaced\n //\n canOpen = isLastPunctChar\n canClose = isNextPunctChar\n }\n\n if (!canOpen && !canClose) {\n // middle of word\n if (isSingle) {\n addReplacement(replacements, i, t.index, APOSTROPHE)\n }\n continue\n }\n\n if (canClose) {\n // this could be a closing quote, rewind the stack to get a match\n for (j = stack.length - 1; j >= 0; j--) {\n let item = stack[j]\n if (stack[j].level < thisLevel) { break }\n if (item.single === isSingle && stack[j].level === thisLevel) {\n item = stack[j]\n\n let openQuote\n let closeQuote\n if (isSingle) {\n openQuote = state.md.options.quotes[2]\n closeQuote = state.md.options.quotes[3]\n } else {\n openQuote = state.md.options.quotes[0]\n closeQuote = state.md.options.quotes[1]\n }\n\n addReplacement(replacements, i, t.index, closeQuote)\n addReplacement(replacements, item.token, item.pos, openQuote)\n\n stack.length = j\n continue OUTER\n }\n }\n }\n\n if (canOpen) {\n stack.push({\n token: i,\n pos: t.index,\n single: isSingle,\n level: thisLevel\n })\n } else if (canClose && isSingle) {\n addReplacement(replacements, i, t.index, APOSTROPHE)\n }\n }\n }\n\n Object.keys(replacements).forEach(function (tokenIdx) {\n const idx = Number(tokenIdx)\n tokens[idx].content = applyReplacements(tokens[idx].content, replacements[tokenIdx])\n })\n}\n\nexport default function smartquotes (state: StateCore): void {\n /* eslint max-depth:0 */\n if (!state.md.options.typographer) { return }\n\n for (let blkIdx = state.tokens.length - 1; blkIdx >= 0; blkIdx--) {\n if (state.tokens[blkIdx].type !== 'inline' ||\n !QUOTE_TEST_RE.test(state.tokens[blkIdx].content)) {\n continue\n }\n\n process_inlines(state.tokens[blkIdx].children!, state)\n }\n}\n","// Join raw text tokens with the rest of the text\n//\n// This is set as a separate rule to provide an opportunity for plugins\n// to run text replacements after text join, but before escape join.\n//\n// For example, `\\:)` shouldn't be replaced with an emoji.\n//\n\nimport type StateCore from './state_core.ts'\nimport type Token from '../token.ts'\n\nfunction join_alt (tokens: Token[]): void {\n let curr, last\n const max = tokens.length\n\n for (curr = 0; curr < max; curr++) {\n if (tokens[curr].type === 'text_special') tokens[curr].type = 'text'\n }\n\n for (curr = last = 0; curr < max; curr++) {\n if (tokens[curr].type === 'text' &&\n curr + 1 < max &&\n tokens[curr + 1].type === 'text') {\n tokens[curr + 1].content = tokens[curr].content + tokens[curr + 1].content\n } else {\n if (curr !== last) { tokens[last] = tokens[curr] }\n\n last++\n }\n }\n\n if (curr !== last) tokens.length = last\n}\n\nexport default function text_join (state: StateCore): void {\n let curr, last\n const blockTokens = state.tokens\n const l = blockTokens.length\n\n for (let j = 0; j < l; j++) {\n if (blockTokens[j].type !== 'inline') continue\n\n const tokens = blockTokens[j].children!\n const max = tokens.length\n\n for (curr = 0; curr < max; curr++) {\n if (tokens[curr].type === 'text_special') tokens[curr].type = 'text'\n\n // image `alt` is parsed into its own token tree\n if (tokens[curr].children) join_alt(tokens[curr].children!)\n }\n\n for (curr = last = 0; curr < max; curr++) {\n if (tokens[curr].type === 'text' &&\n curr + 1 < max &&\n tokens[curr + 1].type === 'text') {\n // collapse two adjacent text nodes\n tokens[curr + 1].content = tokens[curr].content + tokens[curr + 1].content\n } else {\n if (curr !== last) { tokens[last] = tokens[curr] }\n\n last++\n }\n }\n\n if (curr !== last) tokens.length = last\n }\n}\n","import Ruler from './ruler.ts'\nimport StateCore from './rules_core/state_core.ts'\n\nimport r_normalize from './rules_core/normalize.ts'\nimport r_block from './rules_core/block.ts'\nimport r_strip_references from './rules_core/strip_references.ts'\nimport r_inline from './rules_core/inline.ts'\nimport r_linkify from './rules_core/linkify.ts'\nimport r_replacements from './rules_core/replacements.ts'\nimport r_smartquotes from './rules_core/smartquotes.ts'\nimport r_text_join from './rules_core/text_join.ts'\n\nconst _rules: Array<[\n name: string,\n rule: (state: StateCore) => void\n]> = [\n ['normalize', r_normalize],\n ['block', r_block],\n ['strip_references', r_strip_references],\n ['inline', r_inline],\n ['linkify', r_linkify],\n ['replacements', r_replacements],\n ['smartquotes', r_smartquotes],\n // `text_join` finds `text_special` tokens (for escape sequences)\n // and joins them with the rest of the text\n ['text_join', r_text_join]\n]\n\n/**\n * Top-level rules executor. Glues block/inline parsers and does intermediate\n * transformations.\n */\nclass ParserCore {\n /**\n * {@link Ruler} instance. Keep configuration of core rules.\n */\n ruler = new Ruler<[StateCore], void>()\n\n State = StateCore\n\n constructor () {\n for (let i = 0; i < _rules.length; i++) {\n this.ruler.push(_rules[i][0], _rules[i][1])\n }\n }\n\n /**\n * Executes core chain rules.\n */\n process (state: StateCore): void {\n const rules = this.ruler.getRules('')\n\n for (let i = 0, l = rules.length; i < l; i++) {\n rules[i](state)\n }\n }\n}\n\nexport default ParserCore\n","import Token from '../token.ts'\nimport { isSpace } from '../common/utils.ts'\nimport type MarkdownIt from '../markdownit.ts'\nimport type { Env } from '../types.ts'\n\n/** Mutable state passed to block rules while tokenizing a source document. */\nclass StateBlock {\n declare src: string\n declare md: MarkdownIt\n declare env: Env\n declare tokens: Token[]\n\n bMarks: number[] = [] // line begin offsets for fast jumps\n eMarks: number[] = [] // line end offsets for fast jumps\n tShift: number[] = [] // offsets of the first non-space characters (tabs not expanded)\n sCount: number[] = [] // indents for each line (tabs expanded)\n\n // An amount of virtual spaces (tabs expanded) between beginning\n // of each line (bMarks) and real beginning of that line.\n //\n // It exists only as a hack because blockquotes override bMarks\n // losing information in the process.\n //\n // It's used only when expanding tabs, you can think about it as\n // an initial tab length, e.g. bsCount=21 applied to string `\\t123`\n // means first tab should be expanded to 4-21%4 === 3 spaces.\n //\n bsCount: number[] = []\n\n // block parser variables\n\n // required block content indent (for example, if we are\n // inside a list, it would be positioned after list marker)\n blkIndent = 0\n line = 0 // line index in src\n lineMax = 0 // lines count\n tight = false // loose/tight mode for lists\n listIndent = -1 // indent of the current list block (-1 if there isn't any)\n\n // can be 'blockquote', 'list', 'root', 'paragraph' or 'reference'\n // used in lists to determine if they interrupt a paragraph\n parentType = 'root'\n\n level = 0\n\n // re-export Token class to use in block rules\n Token = Token\n\n constructor (src: string, md: MarkdownIt, env: Env, tokens: Token[]) {\n this.src = src\n\n // link to parser instance\n this.md = md\n\n this.env = env\n\n //\n // Internal state vartiables\n //\n\n this.tokens = tokens\n\n // Create caches\n // Generate markers.\n const s = this.src\n\n for (let start = 0, pos = 0, indent = 0, offset = 0, len = s.length, indent_found = false; pos < len; pos++) {\n const ch = s.charCodeAt(pos)\n\n if (!indent_found) {\n if (isSpace(ch)) {\n indent++\n\n if (ch === 0x09) {\n offset += 4 - offset % 4\n } else {\n offset++\n }\n continue\n } else {\n indent_found = true\n }\n }\n\n if (ch === 0x0A || pos === len - 1) {\n if (ch !== 0x0A) { pos++ }\n this.bMarks.push(start)\n this.eMarks.push(pos)\n this.tShift.push(indent)\n this.sCount.push(offset)\n this.bsCount.push(0)\n\n indent_found = false\n indent = 0\n offset = 0\n start = pos + 1\n }\n }\n\n // Push fake entry to simplify cache bounds checks\n this.bMarks.push(s.length)\n this.eMarks.push(s.length)\n this.tShift.push(0)\n this.sCount.push(0)\n this.bsCount.push(0)\n\n this.lineMax = this.bMarks.length - 1 // don't count last fake line\n }\n\n // Push new token to \"stream\".\n //\n push (type: string, tag: string, nesting: -1 | 0 | 1): Token {\n const token = new Token(type, tag, nesting)\n token.block = true\n\n if (nesting < 0) this.level-- // closing tag\n token.level = this.level\n if (nesting > 0) this.level++ // opening tag\n\n this.tokens.push(token)\n return token\n }\n\n isEmpty (line: number): boolean {\n return this.bMarks[line] + this.tShift[line] >= this.eMarks[line]\n }\n\n skipEmptyLines (from: number): number {\n for (let max = this.lineMax; from < max; from++) {\n if (this.bMarks[from] + this.tShift[from] < this.eMarks[from]) {\n break\n }\n }\n return from\n }\n\n // Skip spaces from given position.\n skipSpaces (pos: number): number {\n for (let max = this.src.length; pos < max; pos++) {\n const ch = this.src.charCodeAt(pos)\n if (!isSpace(ch)) { break }\n }\n return pos\n }\n\n // Skip spaces from given position in reverse.\n skipSpacesBack (pos: number, min: number): number {\n if (pos <= min) { return pos }\n\n while (pos > min) {\n if (!isSpace(this.src.charCodeAt(--pos))) { return pos + 1 }\n }\n return pos\n }\n\n // Skip char codes from given position\n skipChars (pos: number, code: number): number {\n for (let max = this.src.length; pos < max; pos++) {\n if (this.src.charCodeAt(pos) !== code) { break }\n }\n return pos\n }\n\n // Skip char codes reverse from given position - 1\n skipCharsBack (pos: number, code: number, min: number): number {\n if (pos <= min) { return pos }\n\n while (pos > min) {\n if (code !== this.src.charCodeAt(--pos)) { return pos + 1 }\n }\n return pos\n }\n\n // cut lines range from source.\n getLines (begin: number, end: number, indent: number, keepLastLF: boolean): string {\n if (begin >= end) {\n return ''\n }\n\n const queue = new Array(end - begin)\n\n for (let i = 0, line = begin; line < end; line++, i++) {\n let lineIndent = 0\n const lineStart = this.bMarks[line]\n let first = lineStart\n let last\n\n if (line + 1 < end || keepLastLF) {\n // No need for bounds check because we have fake entry on tail.\n last = this.eMarks[line] + 1\n } else {\n last = this.eMarks[line]\n }\n\n while (first < last && lineIndent < indent) {\n const ch = this.src.charCodeAt(first)\n\n if (isSpace(ch)) {\n if (ch === 0x09) {\n lineIndent += 4 - (lineIndent + this.bsCount[line]) % 4\n } else {\n lineIndent++\n }\n } else if (first - lineStart < this.tShift[line]) {\n // patched tShift masked characters to look like spaces (blockquotes, list markers)\n lineIndent++\n } else {\n break\n }\n\n first++\n }\n\n if (lineIndent > indent) {\n // partially expanding tabs in code blocks, e.g '\\t\\tfoobar'\n // with indent=2 becomes ' \\tfoobar'\n queue[i] = new Array(lineIndent - indent + 1).join(' ') + this.src.slice(first, last)\n } else {\n queue[i] = this.src.slice(first, last)\n }\n }\n\n return queue.join('')\n }\n}\n\nexport default StateBlock\n","// GFM table, https://github.github.com/gfm/#tables-extension-\n\nimport { isSpace } from '../common/utils.ts'\nimport type StateBlock from './state_block.ts'\n\n// Limit the amount of empty autocompleted cells in a table,\n// see https://github.com/markdown-it/markdown-it/issues/1000,\n//\n// Both pulldown-cmark and commonmark-hs limit the number of cells this way to ~200k.\n// We set it to 65k, which can expand user input by a factor of x370\n// (256x256 square is 1.8kB expanded into 650kB).\nconst MAX_AUTOCOMPLETED_CELLS = 0x10000\n\nfunction getLine (state: StateBlock, line: number) {\n const pos = state.bMarks[line] + state.tShift[line]\n const max = state.eMarks[line]\n\n return state.src.slice(pos, max)\n}\n\nfunction escapedSplit (str: string) {\n const result = []\n const max = str.length\n\n let pos = 0\n let ch = str.charCodeAt(pos)\n let isEscaped = false\n let lastPos = 0\n let current = ''\n\n while (pos < max) {\n if (ch === 0x7c/* | */) {\n if (!isEscaped) {\n // pipe separating cells, '|'\n result.push(current + str.substring(lastPos, pos))\n current = ''\n lastPos = pos + 1\n } else {\n // escaped pipe, '\\|'\n current += str.substring(lastPos, pos - 1)\n lastPos = pos\n }\n }\n\n isEscaped = (ch === 0x5c/* \\ */)\n pos++\n\n ch = str.charCodeAt(pos)\n }\n\n result.push(current + str.substring(lastPos))\n\n return result\n}\n\nexport default function table (state: StateBlock, startLine: number, endLine: number, silent: boolean): boolean {\n // should have at least two lines\n if (startLine + 2 > endLine) { return false }\n\n let nextLine = startLine + 1\n\n if (state.sCount[nextLine] < state.blkIndent) { return false }\n\n // if it's indented more than 3 spaces, it should be a code block\n if (state.sCount[nextLine] - state.blkIndent >= 4) { return false }\n\n // first character of the second line should be '|', '-', ':',\n // and no other characters are allowed but spaces;\n // basically, this is the equivalent of /^[-:|][-:|\\s]*$/ regexp\n\n let pos = state.bMarks[nextLine] + state.tShift[nextLine]\n if (pos >= state.eMarks[nextLine]) { return false }\n\n const firstCh = state.src.charCodeAt(pos++)\n if (firstCh !== 0x7C/* | */ && firstCh !== 0x2D/* - */ && firstCh !== 0x3A/* : */) { return false }\n\n if (pos >= state.eMarks[nextLine]) { return false }\n\n const secondCh = state.src.charCodeAt(pos++)\n if (secondCh !== 0x7C/* | */ && secondCh !== 0x2D/* - */ && secondCh !== 0x3A/* : */ && !isSpace(secondCh)) {\n return false\n }\n\n // if first character is '-', then second character must not be a space\n // (due to parsing ambiguity with list)\n if (firstCh === 0x2D/* - */ && isSpace(secondCh)) { return false }\n\n while (pos < state.eMarks[nextLine]) {\n const ch = state.src.charCodeAt(pos)\n\n if (ch !== 0x7C/* | */ && ch !== 0x2D/* - */ && ch !== 0x3A/* : */ && !isSpace(ch)) { return false }\n\n pos++\n }\n\n let lineText = getLine(state, startLine + 1)\n let columns = lineText.split('|')\n const aligns = []\n for (let i = 0; i < columns.length; i++) {\n const t = columns[i].trim()\n if (!t) {\n // allow empty columns before and after table, but not in between columns;\n // e.g. allow ` |---| `, disallow ` ---||--- `\n if (i === 0 || i === columns.length - 1) {\n continue\n } else {\n return false\n }\n }\n\n if (!/^:?-+:?$/.test(t)) { return false }\n if (t.charCodeAt(t.length - 1) === 0x3A/* : */) {\n aligns.push(t.charCodeAt(0) === 0x3A/* : */ ? 'center' : 'right')\n } else if (t.charCodeAt(0) === 0x3A/* : */) {\n aligns.push('left')\n } else {\n aligns.push('')\n }\n }\n\n lineText = getLine(state, startLine).trim()\n if (lineText.indexOf('|') === -1) { return false }\n if (state.sCount[startLine] - state.blkIndent >= 4) { return false }\n columns = escapedSplit(lineText)\n if (columns.length && columns[0] === '') columns.shift()\n if (columns.length && columns[columns.length - 1] === '') columns.pop()\n\n // header row will define an amount of columns in the entire table,\n // and align row should be exactly the same (the rest of the rows can differ)\n const columnCount = columns.length\n if (columnCount === 0 || columnCount !== aligns.length) { return false }\n\n if (silent) { return true }\n\n const oldParentType = state.parentType\n state.parentType = 'table'\n\n // use 'blockquote' lists for termination because it's\n // the most similar to tables\n const terminatorRules = state.md.block.ruler.getRules('blockquote')\n\n const token_to = state.push('table_open', 'table', 1)\n const tableLines: [number, number] = [startLine, 0]\n token_to.map = tableLines\n\n const token_tho = state.push('thead_open', 'thead', 1)\n token_tho.map = [startLine, startLine + 1]\n\n const token_htro = state.push('tr_open', 'tr', 1)\n token_htro.map = [startLine, startLine + 1]\n\n for (let i = 0; i < columns.length; i++) {\n const token_ho = state.push('th_open', 'th', 1)\n if (aligns[i]) {\n token_ho.attrs = [['style', `text-align:${aligns[i]}`]]\n }\n\n const token_il = state.push('inline', '', 0)\n token_il.content = columns[i].trim()\n token_il.children = []\n\n state.push('th_close', 'th', -1)\n }\n\n state.push('tr_close', 'tr', -1)\n state.push('thead_close', 'thead', -1)\n\n let tbodyLines: [number, number] | undefined\n let autocompletedCells = 0\n\n for (nextLine = startLine + 2; nextLine < endLine; nextLine++) {\n if (state.sCount[nextLine] < state.blkIndent) { break }\n\n let terminate = false\n for (let i = 0, l = terminatorRules.length; i < l; i++) {\n if (terminatorRules[i](state, nextLine, endLine, true)) {\n terminate = true\n break\n }\n }\n\n if (terminate) { break }\n lineText = getLine(state, nextLine).trim()\n if (!lineText) { break }\n if (state.sCount[nextLine] - state.blkIndent >= 4) { break }\n columns = escapedSplit(lineText)\n if (columns.length && columns[0] === '') columns.shift()\n if (columns.length && columns[columns.length - 1] === '') columns.pop()\n\n // note: autocomplete count can be negative if user specifies more columns than header,\n // but that does not affect intended use (which is limiting expansion)\n autocompletedCells += columnCount - columns.length\n if (autocompletedCells > MAX_AUTOCOMPLETED_CELLS) { break }\n\n if (nextLine === startLine + 2) {\n const token_tbo = state.push('tbody_open', 'tbody', 1)\n token_tbo.map = tbodyLines = [startLine + 2, 0]\n }\n\n const token_tro = state.push('tr_open', 'tr', 1)\n token_tro.map = [nextLine, nextLine + 1]\n\n for (let i = 0; i < columnCount; i++) {\n const token_tdo = state.push('td_open', 'td', 1)\n if (aligns[i]) {\n token_tdo.attrs = [['style', `text-align:${aligns[i]}`]]\n }\n\n const token_il = state.push('inline', '', 0)\n token_il.content = columns[i] ? columns[i].trim() : ''\n token_il.children = []\n\n state.push('td_close', 'td', -1)\n }\n state.push('tr_close', 'tr', -1)\n }\n\n if (tbodyLines) {\n state.push('tbody_close', 'tbody', -1)\n tbodyLines[1] = nextLine\n }\n\n state.push('table_close', 'table', -1)\n tableLines[1] = nextLine\n\n state.parentType = oldParentType\n state.line = nextLine\n return true\n}\n","// Code block (4 spaces padded)\n\nimport type StateBlock from './state_block.ts'\n\nexport default function code (state: StateBlock, startLine: number, endLine: number/*, silent */): boolean {\n if (state.sCount[startLine] - state.blkIndent < 4) { return false }\n\n let nextLine = startLine + 1\n let last = nextLine\n\n while (nextLine < endLine) {\n if (state.isEmpty(nextLine)) {\n nextLine++\n continue\n }\n\n if (state.sCount[nextLine] - state.blkIndent >= 4) {\n nextLine++\n last = nextLine\n continue\n }\n break\n }\n\n state.line = last\n\n const token = state.push('code_block', 'code', 0)\n token.content = state.getLines(startLine, last, 4 + state.blkIndent, false) + '\\n'\n token.map = [startLine, state.line]\n\n return true\n}\n","// fences (``` lang, ~~~ lang)\n\nimport type StateBlock from './state_block.ts'\n\nexport default function fence (state: StateBlock, startLine: number, endLine: number, silent: boolean): boolean {\n let pos = state.bMarks[startLine] + state.tShift[startLine]\n let max = state.eMarks[startLine]\n\n // if it's indented more than 3 spaces, it should be a code block\n if (state.sCount[startLine] - state.blkIndent >= 4) { return false }\n\n if (pos + 3 > max) { return false }\n\n const marker = state.src.charCodeAt(pos)\n\n if (marker !== 0x7E/* ~ */ && marker !== 0x60 /* ` */) {\n return false\n }\n\n // scan marker length\n let mem = pos\n pos = state.skipChars(pos, marker)\n\n let len = pos - mem\n\n if (len < 3) { return false }\n\n const markup = state.src.slice(mem, pos)\n const params = state.src.slice(pos, max)\n\n if (marker === 0x60 /* ` */) {\n if (params.indexOf(String.fromCharCode(marker)) >= 0) {\n return false\n }\n }\n\n // Since start is found, we can report success here in validation mode\n if (silent) { return true }\n\n // search end of block\n let nextLine = startLine\n let haveEndMarker = false\n\n for (;;) {\n nextLine++\n if (nextLine >= endLine) {\n // unclosed block should be autoclosed by end of document.\n // also block seems to be autoclosed by end of parent\n break\n }\n\n pos = mem = state.bMarks[nextLine] + state.tShift[nextLine]\n max = state.eMarks[nextLine]\n\n if (pos < max && state.sCount[nextLine] < state.blkIndent) {\n // non-empty line with negative indent should stop the list:\n // - ```\n // test\n break\n }\n\n if (state.src.charCodeAt(pos) !== marker) { continue }\n\n if (state.sCount[nextLine] - state.blkIndent >= 4) {\n // closing fence should be indented less than 4 spaces\n continue\n }\n\n pos = state.skipChars(pos, marker)\n\n // closing code fence must be at least as long as the opening one\n if (pos - mem < len) { continue }\n\n // make sure tail has spaces only\n pos = state.skipSpaces(pos)\n\n if (pos < max) { continue }\n\n haveEndMarker = true\n // found!\n break\n }\n\n // If a fence has heading spaces, they should be removed from its inner block\n len = state.sCount[startLine]\n\n state.line = nextLine + (haveEndMarker ? 1 : 0)\n\n const token = state.push('fence', 'code', 0)\n token.info = params\n token.content = state.getLines(startLine + 1, nextLine, len, true)\n token.markup = markup\n token.map = [startLine, state.line]\n\n return true\n}\n","// Block quotes\n\nimport { isSpace } from '../common/utils.ts'\nimport type StateBlock from './state_block.ts'\n\nexport default function blockquote (state: StateBlock, startLine: number, endLine: number, silent: boolean): boolean {\n let pos = state.bMarks[startLine] + state.tShift[startLine]\n let max = state.eMarks[startLine]\n\n const oldLineMax = state.lineMax\n\n // if it's indented more than 3 spaces, it should be a code block\n if (state.sCount[startLine] - state.blkIndent >= 4) { return false }\n\n // check the block quote marker\n if (state.src.charCodeAt(pos) !== 0x3E/* > */) { return false }\n\n // we know that it's going to be a valid blockquote,\n // so no point trying to find the end of it in silent mode\n if (silent) { return true }\n\n const oldBMarks = []\n const oldBSCount = []\n const oldSCount = []\n const oldTShift = []\n\n const terminatorRules = state.md.block.ruler.getRules('blockquote')\n\n const oldParentType = state.parentType\n state.parentType = 'blockquote'\n let lastLineEmpty = false\n let nextLine\n\n // Search the end of the block\n //\n // Block ends with either:\n // 1. an empty line outside:\n // ```\n // > test\n //\n // ```\n // 2. an empty line inside:\n // ```\n // >\n // test\n // ```\n // 3. another tag:\n // ```\n // > test\n // - - -\n // ```\n for (nextLine = startLine; nextLine < endLine; nextLine++) {\n // check if it's outdented, i.e. it's inside list item and indented\n // less than said list item:\n //\n // ```\n // 1. anything\n // > current blockquote\n // 2. checking this line\n // ```\n const isOutdented = state.sCount[nextLine] < state.blkIndent\n\n pos = state.bMarks[nextLine] + state.tShift[nextLine]\n max = state.eMarks[nextLine]\n\n if (pos >= max) {\n // Case 1: line is not inside the blockquote, and this line is empty.\n break\n }\n\n if (state.src.charCodeAt(pos++) === 0x3E/* > */ && !isOutdented) {\n // This line is inside the blockquote.\n\n // set offset past spaces and \">\"\n let initial = state.sCount[nextLine] + 1\n let spaceAfterMarker\n let adjustTab\n\n // skip one optional space after '>'\n if (state.src.charCodeAt(pos) === 0x20 /* space */) {\n // ' > test '\n // ^ -- position start of line here:\n pos++\n initial++\n adjustTab = false\n spaceAfterMarker = true\n } else if (state.src.charCodeAt(pos) === 0x09 /* tab */) {\n spaceAfterMarker = true\n\n if ((state.bsCount[nextLine] + initial) % 4 === 3) {\n // ' >\\t test '\n // ^ -- position start of line here (tab has width===1)\n pos++\n initial++\n adjustTab = false\n } else {\n // ' >\\t test '\n // ^ -- position start of line here + shift bsCount slightly\n // to make extra space appear\n adjustTab = true\n }\n } else {\n spaceAfterMarker = false\n }\n\n let offset = initial\n oldBMarks.push(state.bMarks[nextLine])\n state.bMarks[nextLine] = pos\n\n while (pos < max) {\n const ch = state.src.charCodeAt(pos)\n\n if (isSpace(ch)) {\n if (ch === 0x09) {\n offset += 4 - (offset + state.bsCount[nextLine] + (adjustTab ? 1 : 0)) % 4\n } else {\n offset++\n }\n } else {\n break\n }\n\n pos++\n }\n\n lastLineEmpty = pos >= max\n\n oldBSCount.push(state.bsCount[nextLine])\n state.bsCount[nextLine] = state.sCount[nextLine] + 1 + (spaceAfterMarker ? 1 : 0)\n\n oldSCount.push(state.sCount[nextLine])\n state.sCount[nextLine] = offset - initial\n\n oldTShift.push(state.tShift[nextLine])\n state.tShift[nextLine] = pos - state.bMarks[nextLine]\n continue\n }\n\n // Case 2: line is not inside the blockquote, and the last line was empty.\n if (lastLineEmpty) { break }\n\n // Case 3: another tag found.\n let terminate = false\n for (let i = 0, l = terminatorRules.length; i < l; i++) {\n if (terminatorRules[i](state, nextLine, endLine, true)) {\n terminate = true\n break\n }\n }\n\n if (terminate) {\n // Quirk to enforce \"hard termination mode\" for paragraphs;\n // normally if you call `tokenize(state, startLine, nextLine)`,\n // paragraphs will look below nextLine for paragraph continuation,\n // but if blockquote is terminated by another tag, they shouldn't\n state.lineMax = nextLine\n\n if (state.blkIndent !== 0) {\n // state.blkIndent was non-zero, we now set it to zero,\n // so we need to re-calculate all offsets to appear as\n // if indent wasn't changed\n oldBMarks.push(state.bMarks[nextLine])\n oldBSCount.push(state.bsCount[nextLine])\n oldTShift.push(state.tShift[nextLine])\n oldSCount.push(state.sCount[nextLine])\n state.sCount[nextLine] -= state.blkIndent\n }\n\n break\n }\n\n oldBMarks.push(state.bMarks[nextLine])\n oldBSCount.push(state.bsCount[nextLine])\n oldTShift.push(state.tShift[nextLine])\n oldSCount.push(state.sCount[nextLine])\n\n // A negative indentation means that this is a paragraph continuation\n //\n state.sCount[nextLine] = -1\n }\n\n const oldIndent = state.blkIndent\n state.blkIndent = 0\n\n const token_o = state.push('blockquote_open', 'blockquote', 1)\n token_o.markup = '>'\n const lines: [number, number] = [startLine, 0]\n token_o.map = lines\n\n state.md.block.tokenize(state, startLine, nextLine)\n\n const token_c = state.push('blockquote_close', 'blockquote', -1)\n token_c.markup = '>'\n\n state.lineMax = oldLineMax\n state.parentType = oldParentType\n lines[1] = state.line\n\n // Restore original tShift; this might not be necessary since the parser\n // has already been here, but just to make sure we can do that.\n for (let i = 0; i < oldTShift.length; i++) {\n state.bMarks[i + startLine] = oldBMarks[i]\n state.tShift[i + startLine] = oldTShift[i]\n state.sCount[i + startLine] = oldSCount[i]\n state.bsCount[i + startLine] = oldBSCount[i]\n }\n state.blkIndent = oldIndent\n\n return true\n}\n","// Horizontal rule\n\nimport { isSpace } from '../common/utils.ts'\nimport type StateBlock from './state_block.ts'\n\nexport default function hr (state: StateBlock, startLine: number, endLine: number, silent: boolean): boolean {\n const max = state.eMarks[startLine]\n // if it's indented more than 3 spaces, it should be a code block\n if (state.sCount[startLine] - state.blkIndent >= 4) { return false }\n\n let pos = state.bMarks[startLine] + state.tShift[startLine]\n const marker = state.src.charCodeAt(pos++)\n\n // Check hr marker\n if (marker !== 0x2A/* * */ &&\n marker !== 0x2D/* - */ &&\n marker !== 0x5F/* _ */) {\n return false\n }\n\n // markers can be mixed with spaces, but there should be at least 3 of them\n\n let cnt = 1\n while (pos < max) {\n const ch = state.src.charCodeAt(pos++)\n if (ch !== marker && !isSpace(ch)) { return false }\n if (ch === marker) { cnt++ }\n }\n\n if (cnt < 3) { return false }\n\n if (silent) { return true }\n\n state.line = startLine + 1\n\n const token = state.push('hr', 'hr', 0)\n token.map = [startLine, state.line]\n token.markup = Array(cnt + 1).join(String.fromCharCode(marker))\n\n return true\n}\n","// Lists\n\nimport { isSpace } from '../common/utils.ts'\nimport type StateBlock from './state_block.ts'\n\n// Search `[-+*][\\n ]`, returns next pos after marker on success\n// or -1 on fail.\nfunction skipBulletListMarker (state: StateBlock, startLine: number) {\n const max = state.eMarks[startLine]\n let pos = state.bMarks[startLine] + state.tShift[startLine]\n\n const marker = state.src.charCodeAt(pos++)\n // Check bullet\n if (marker !== 0x2A/* * */ &&\n marker !== 0x2D/* - */ &&\n marker !== 0x2B/* + */) {\n return -1\n }\n\n if (pos < max) {\n const ch = state.src.charCodeAt(pos)\n\n if (!isSpace(ch)) {\n // \" -test \" - is not a list item\n return -1\n }\n }\n\n return pos\n}\n\n// Search `\\d+[.)][\\n ]`, returns next pos after marker on success\n// or -1 on fail.\nfunction skipOrderedListMarker (state: StateBlock, startLine: number) {\n const start = state.bMarks[startLine] + state.tShift[startLine]\n const max = state.eMarks[startLine]\n let pos = start\n\n // List marker should have at least 2 chars (digit + dot)\n if (pos + 1 >= max) { return -1 }\n\n let ch = state.src.charCodeAt(pos++)\n\n if (ch < 0x30/* 0 */ || ch > 0x39/* 9 */) { return -1 }\n\n for (;;) {\n // EOL -> fail\n if (pos >= max) { return -1 }\n\n ch = state.src.charCodeAt(pos++)\n\n if (ch >= 0x30/* 0 */ && ch <= 0x39/* 9 */) {\n // List marker should have no more than 9 digits\n // (prevents integer overflow in browsers)\n if (pos - start >= 10) { return -1 }\n\n continue\n }\n\n // found valid marker\n if (ch === 0x29/* ) */ || ch === 0x2e/* . */) {\n break\n }\n\n return -1\n }\n\n if (pos < max) {\n ch = state.src.charCodeAt(pos)\n\n if (!isSpace(ch)) {\n // \" 1.test \" - is not a list item\n return -1\n }\n }\n return pos\n}\n\nfunction markTightParagraphs (state: StateBlock, idx: number) {\n const level = state.level + 2\n\n for (let i = idx + 2, l = state.tokens.length - 2; i < l; i++) {\n if (state.tokens[i].level === level && state.tokens[i].type === 'paragraph_open') {\n state.tokens[i + 2].hidden = true\n state.tokens[i].hidden = true\n i += 2\n }\n }\n}\n\nexport default function list (state: StateBlock, startLine: number, endLine: number, silent: boolean): boolean {\n let max, pos, start, token\n let nextLine = startLine\n let tight = true\n\n // if it's indented more than 3 spaces, it should be a code block\n if (state.sCount[nextLine] - state.blkIndent >= 4) { return false }\n\n // Special case:\n // - item 1\n // - item 2\n // - item 3\n // - item 4\n // - this one is a paragraph continuation\n if (state.listIndent >= 0 &&\n state.sCount[nextLine] - state.listIndent >= 4 &&\n state.sCount[nextLine] < state.blkIndent) {\n return false\n }\n\n let isTerminatingParagraph = false\n\n // limit conditions when list can interrupt\n // a paragraph (validation mode only)\n if (silent && state.parentType === 'paragraph') {\n // Next list item should still terminate previous list item;\n //\n // This code can fail if plugins use blkIndent as well as lists,\n // but I hope the spec gets fixed long before that happens.\n //\n if (state.sCount[nextLine] >= state.blkIndent) {\n isTerminatingParagraph = true\n }\n }\n\n // Detect list type and position after marker\n let isOrdered\n let markerValue\n let posAfterMarker\n if ((posAfterMarker = skipOrderedListMarker(state, nextLine)) >= 0) {\n isOrdered = true\n start = state.bMarks[nextLine] + state.tShift[nextLine]\n markerValue = Number(state.src.slice(start, posAfterMarker - 1))\n\n // If we're starting a new ordered list right after\n // a paragraph, it should start with 1.\n if (isTerminatingParagraph && markerValue !== 1) return false\n } else if ((posAfterMarker = skipBulletListMarker(state, nextLine)) >= 0) {\n isOrdered = false\n } else {\n return false\n }\n\n // If we're starting a new unordered list right after\n // a paragraph, first line should not be empty.\n if (isTerminatingParagraph) {\n if (state.skipSpaces(posAfterMarker) >= state.eMarks[nextLine]) return false\n }\n\n // For validation mode we can terminate immediately\n if (silent) { return true }\n\n // We should terminate list on style change. Remember first one to compare.\n const markerCharCode = state.src.charCodeAt(posAfterMarker - 1)\n\n // Start list\n const listTokIdx = state.tokens.length\n\n if (isOrdered) {\n token = state.push('ordered_list_open', 'ol', 1)\n if (markerValue !== 1) {\n token.attrs = [['start', markerValue!]]\n }\n } else {\n token = state.push('bullet_list_open', 'ul', 1)\n }\n\n const listLines: [number, number] = [nextLine, 0]\n token.map = listLines\n token.markup = String.fromCharCode(markerCharCode)\n\n //\n // Iterate list items\n //\n\n let prevEmptyEnd = false\n const terminatorRules = state.md.block.ruler.getRules('list')\n\n const oldParentType = state.parentType\n state.parentType = 'list'\n\n while (nextLine < endLine) {\n pos = posAfterMarker\n max = state.eMarks[nextLine]\n\n const initial = state.sCount[nextLine] + posAfterMarker - (state.bMarks[nextLine] + state.tShift[nextLine])\n let offset = initial\n\n while (pos < max) {\n const ch = state.src.charCodeAt(pos)\n\n if (ch === 0x09) {\n offset += 4 - (offset + state.bsCount[nextLine]) % 4\n } else if (ch === 0x20) {\n offset++\n } else {\n break\n }\n\n pos++\n }\n\n const contentStart = pos\n let indentAfterMarker\n\n if (contentStart >= max) {\n // trimming space in \"- \\n 3\" case, indent is 1 here\n indentAfterMarker = 1\n } else {\n indentAfterMarker = offset - initial\n }\n\n // If we have more than 4 spaces, the indent is 1\n // (the rest is just indented code block)\n if (indentAfterMarker > 4) { indentAfterMarker = 1 }\n\n // \" - test\"\n // ^^^^^ - calculating total length of this thing\n const indent = initial + indentAfterMarker\n\n // Run subparser & write tokens\n token = state.push('list_item_open', 'li', 1)\n token.markup = String.fromCharCode(markerCharCode)\n const itemLines: [number, number] = [nextLine, 0]\n token.map = itemLines\n if (isOrdered) {\n token.info = state.src.slice(start, posAfterMarker - 1)\n }\n\n // change current state, then restore it after parser subcall\n const oldTight = state.tight\n const oldTShift = state.tShift[nextLine]\n const oldSCount = state.sCount[nextLine]\n\n // - example list\n // ^ listIndent position will be here\n // ^ blkIndent position will be here\n //\n const oldListIndent = state.listIndent\n state.listIndent = state.blkIndent\n state.blkIndent = indent\n\n state.tight = true\n state.tShift[nextLine] = contentStart - state.bMarks[nextLine]\n state.sCount[nextLine] = offset\n\n if (contentStart >= max && state.isEmpty(nextLine + 1)) {\n // workaround for this case\n // (list item is empty, list terminates before \"foo\"):\n // ~~~~~~~~\n // -\n //\n // foo\n // ~~~~~~~~\n state.line = Math.min(state.line + 2, endLine)\n } else {\n state.md.block.tokenize(state, nextLine, endLine)\n }\n\n // If any of list item is tight, mark list as tight\n if (!state.tight || prevEmptyEnd) {\n tight = false\n }\n // Item become loose if finish with empty line,\n // but we should filter last element, because it means list finish\n prevEmptyEnd = (state.line - nextLine) > 1 && state.isEmpty(state.line - 1)\n\n state.blkIndent = state.listIndent\n state.listIndent = oldListIndent\n state.tShift[nextLine] = oldTShift\n state.sCount[nextLine] = oldSCount\n state.tight = oldTight\n\n token = state.push('list_item_close', 'li', -1)\n token.markup = String.fromCharCode(markerCharCode)\n\n nextLine = state.line\n itemLines[1] = nextLine\n\n if (nextLine >= endLine) { break }\n\n //\n // Try to check if list is terminated or continued.\n //\n if (state.sCount[nextLine] < state.blkIndent) { break }\n\n // if it's indented more than 3 spaces, it should be a code block\n if (state.sCount[nextLine] - state.blkIndent >= 4) { break }\n\n // fail if terminating block found\n let terminate = false\n for (let i = 0, l = terminatorRules.length; i < l; i++) {\n if (terminatorRules[i](state, nextLine, endLine, true)) {\n terminate = true\n break\n }\n }\n if (terminate) { break }\n\n // fail if list has another type\n if (isOrdered) {\n posAfterMarker = skipOrderedListMarker(state, nextLine)\n if (posAfterMarker < 0) { break }\n start = state.bMarks[nextLine] + state.tShift[nextLine]\n } else {\n posAfterMarker = skipBulletListMarker(state, nextLine)\n if (posAfterMarker < 0) { break }\n }\n\n if (markerCharCode !== state.src.charCodeAt(posAfterMarker - 1)) { break }\n }\n\n // Finalize list\n if (isOrdered) {\n token = state.push('ordered_list_close', 'ol', -1)\n } else {\n token = state.push('bullet_list_close', 'ul', -1)\n }\n token.markup = String.fromCharCode(markerCharCode)\n\n listLines[1] = nextLine\n state.line = nextLine\n\n state.parentType = oldParentType\n\n // mark paragraphs tight if needed\n if (tight) {\n markTightParagraphs(state, listTokIdx)\n }\n\n return true\n}\n","import { isSpace, normalizeReference } from '../common/utils.ts'\nimport type StateBlock from './state_block.ts'\n\nexport default function reference (state: StateBlock, startLine: number, _endLine: number, silent: boolean): boolean {\n let pos = state.bMarks[startLine] + state.tShift[startLine]\n let max = state.eMarks[startLine]\n let nextLine = startLine + 1\n\n // if it's indented more than 3 spaces, it should be a code block\n if (state.sCount[startLine] - state.blkIndent >= 4) { return false }\n\n if (state.src.charCodeAt(pos) !== 0x5B/* [ */) { return false }\n\n function getNextLine (nextLine: number) {\n const endLine = state.lineMax\n\n if (nextLine >= endLine || state.isEmpty(nextLine)) {\n // empty line or end of input\n return null\n }\n\n let isContinuation = false\n\n // this would be a code block normally, but after paragraph\n // it's considered a lazy continuation regardless of what's there\n if (state.sCount[nextLine] - state.blkIndent > 3) { isContinuation = true }\n\n // quirk for blockquotes, this line should already be checked by that rule\n if (state.sCount[nextLine] < 0) { isContinuation = true }\n\n if (!isContinuation) {\n const terminatorRules = state.md.block.ruler.getRules('reference')\n const oldParentType = state.parentType\n state.parentType = 'reference'\n\n // Some tags can terminate paragraph without empty line.\n let terminate = false\n for (let i = 0, l = terminatorRules.length; i < l; i++) {\n if (terminatorRules[i](state, nextLine, endLine, true)) {\n terminate = true\n break\n }\n }\n\n state.parentType = oldParentType\n if (terminate) {\n // terminated by another block\n return null\n }\n }\n\n const pos = state.bMarks[nextLine] + state.tShift[nextLine]\n const max = state.eMarks[nextLine]\n\n // max + 1 explicitly includes the newline\n return state.src.slice(pos, max + 1)\n }\n\n let str = state.src.slice(pos, max + 1)\n\n max = str.length\n let labelEnd = -1\n\n for (pos = 1; pos < max; pos++) {\n const ch = str.charCodeAt(pos)\n if (ch === 0x5B /* [ */) {\n return false\n } else if (ch === 0x5D /* ] */) {\n labelEnd = pos\n break\n } else if (ch === 0x0A /* \\n */) {\n const lineContent = getNextLine(nextLine)\n if (lineContent !== null) {\n str += lineContent\n max = str.length\n nextLine++\n }\n } else if (ch === 0x5C /* \\ */) {\n pos++\n if (pos < max && str.charCodeAt(pos) === 0x0A) {\n const lineContent = getNextLine(nextLine)\n if (lineContent !== null) {\n str += lineContent\n max = str.length\n nextLine++\n }\n }\n }\n }\n\n if (labelEnd < 0 || str.charCodeAt(labelEnd + 1) !== 0x3A/* : */) { return false }\n\n // [label]: destination 'title'\n // ^^^ skip optional whitespace here\n for (pos = labelEnd + 2; pos < max; pos++) {\n const ch = str.charCodeAt(pos)\n if (ch === 0x0A) {\n const lineContent = getNextLine(nextLine)\n if (lineContent !== null) {\n str += lineContent\n max = str.length\n nextLine++\n }\n } else if (isSpace(ch)) {\n /* eslint no-empty:0 */\n } else {\n break\n }\n }\n\n // [label]: destination 'title'\n // ^^^^^^^^^^^ parse this\n const destRes = state.md.helpers.parseLinkDestination(str, pos, max)\n if (!destRes.ok) { return false }\n\n const href = state.md.normalizeLink(destRes.str)\n if (!state.md.validateLink(href)) { return false }\n\n pos = destRes.pos\n\n // save cursor state, we could require to rollback later\n const destEndPos = pos\n const destEndLineNo = nextLine\n\n // [label]: destination 'title'\n // ^^^ skipping those spaces\n const start = pos\n for (; pos < max; pos++) {\n const ch = str.charCodeAt(pos)\n if (ch === 0x0A) {\n const lineContent = getNextLine(nextLine)\n if (lineContent !== null) {\n str += lineContent\n max = str.length\n nextLine++\n }\n } else if (isSpace(ch)) {\n /* Nothing */\n } else {\n break\n }\n }\n\n // [label]: destination 'title'\n // ^^^^^^^ parse this\n let titleRes = state.md.helpers.parseLinkTitle(str, pos, max)\n while (titleRes.can_continue) {\n const lineContent = getNextLine(nextLine)\n if (lineContent === null) break\n str += lineContent\n pos = max\n max = str.length\n nextLine++\n titleRes = state.md.helpers.parseLinkTitle(str, pos, max, titleRes)\n }\n let title\n\n if (pos < max && start !== pos && titleRes.ok) {\n title = titleRes.str\n pos = titleRes.pos\n } else {\n title = ''\n pos = destEndPos\n nextLine = destEndLineNo\n }\n\n // skip trailing spaces until the rest of the line\n while (pos < max) {\n const ch = str.charCodeAt(pos)\n if (!isSpace(ch)) { break }\n pos++\n }\n\n if (pos < max && str.charCodeAt(pos) !== 0x0A) {\n if (title) {\n // garbage at the end of the line after title,\n // but it could still be a valid reference if we roll back\n title = ''\n pos = destEndPos\n nextLine = destEndLineNo\n while (pos < max) {\n const ch = str.charCodeAt(pos)\n if (!isSpace(ch)) { break }\n pos++\n }\n }\n }\n\n if (pos < max && str.charCodeAt(pos) !== 0x0A) {\n // garbage at the end of the line\n return false\n }\n\n const label = normalizeReference(str.slice(1, labelEnd))\n if (!label) {\n // CommonMark 0.20 disallows empty labels\n return false\n }\n\n // Reference can not terminate anything. This check is for safety only.\n /* istanbul ignore if */\n if (silent) { return true }\n\n if (typeof state.env.references === 'undefined') {\n state.env.references = {}\n }\n if (typeof state.env.references[label] === 'undefined') {\n state.env.references[label] = { title, href }\n }\n\n // Marks the place definition took in the source. Renders to nothing,\n // href/title stay in `env.references`.\n const token = state.push('reference_definition', '', 0)\n token.map = [startLine, nextLine]\n token.hidden = true\n\n const meta: Record<string, unknown> = Object.create(null)\n meta.label = label\n token.meta = meta\n\n state.line = nextLine\n return true\n}\n","// List of valid html blocks names, according to commonmark spec\n// https://spec.commonmark.org/0.30/#html-blocks\n\nexport default [\n 'address',\n 'article',\n 'aside',\n 'base',\n 'basefont',\n 'blockquote',\n 'body',\n 'caption',\n 'center',\n 'col',\n 'colgroup',\n 'dd',\n 'details',\n 'dialog',\n 'dir',\n 'div',\n 'dl',\n 'dt',\n 'fieldset',\n 'figcaption',\n 'figure',\n 'footer',\n 'form',\n 'frame',\n 'frameset',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'head',\n 'header',\n 'hr',\n 'html',\n 'iframe',\n 'legend',\n 'li',\n 'link',\n 'main',\n 'menu',\n 'menuitem',\n 'nav',\n 'noframes',\n 'ol',\n 'optgroup',\n 'option',\n 'p',\n 'param',\n 'search',\n 'section',\n 'summary',\n 'table',\n 'tbody',\n 'td',\n 'tfoot',\n 'th',\n 'thead',\n 'title',\n 'tr',\n 'track',\n 'ul'\n]\n","// Regexps to match html elements\n\nconst attr_name = '[a-zA-Z_:][a-zA-Z0-9:._-]*'\n\nconst unquoted = '[^\"\\'=<>`\\\\x00-\\\\x20]+'\nconst single_quoted = \"'[^']*'\"\nconst double_quoted = '\"[^\"]*\"'\n\nconst attr_value = `(?:${unquoted}|${single_quoted}|${double_quoted})`\n\nconst attribute = `(?:\\\\s+${attr_name}(?:\\\\s*=\\\\s*${attr_value})?)`\n\nconst open_tag = `<[A-Za-z][A-Za-z0-9\\\\-]*${attribute}*\\\\s*\\\\/?>`\n\nconst close_tag = '<\\\\/[A-Za-z][A-Za-z0-9\\\\-]*\\\\s*>'\nconst comment = '<!---?>|<!--(?:[^-]|-[^-]|--[^>])*-->'\nconst processing = '<[?][\\\\s\\\\S]*?[?]>'\nconst declaration = '<![A-Za-z][^>]*>'\nconst cdata = '<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?\\\\]\\\\]>'\n\nconst HTML_TAG_RE = new RegExp(\n `^(?:${open_tag}|${close_tag}|${comment}|${processing}|${declaration}|${cdata})`\n)\nconst HTML_OPEN_CLOSE_TAG_RE = new RegExp(`^(?:${open_tag}|${close_tag})`)\n\nexport { HTML_TAG_RE, HTML_OPEN_CLOSE_TAG_RE }\n","// HTML block\n\nimport block_names from '../common/html_blocks.ts'\nimport { HTML_OPEN_CLOSE_TAG_RE } from '../common/html_re.ts'\nimport type StateBlock from './state_block.ts'\n\n// An array of opening and corresponding closing sequences for html tags,\n// last argument defines whether it can terminate a paragraph or not\n//\nconst HTML_SEQUENCES: Array<[\n open: RegExp,\n close: RegExp,\n canTerminateParagraph: boolean\n]> = [\n [/^<(script|pre|style|textarea)(?=(\\s|>|$))/i, /<\\/(script|pre|style|textarea)>/i, true],\n [/^<!--/, /-->/, true],\n [/^<\\?/, /\\?>/, true],\n [/^<![A-Za-z]/, />/, true],\n [/^<!\\[CDATA\\[/, /\\]\\]>/, true],\n [new RegExp(`^</?(${block_names.join('|')})(?=(\\\\s|/?>|$))`, 'i'), /^$/, true],\n [new RegExp(`${HTML_OPEN_CLOSE_TAG_RE.source}\\\\s*$`), /^$/, false]\n]\n\nexport default function html_block (state: StateBlock, startLine: number, endLine: number, silent: boolean): boolean {\n let pos = state.bMarks[startLine] + state.tShift[startLine]\n let max = state.eMarks[startLine]\n\n // if it's indented more than 3 spaces, it should be a code block\n if (state.sCount[startLine] - state.blkIndent >= 4) { return false }\n\n if (!state.md.options.html) { return false }\n\n if (state.src.charCodeAt(pos) !== 0x3C/* < */) { return false }\n\n let lineText = state.src.slice(pos, max)\n\n let i = 0\n for (; i < HTML_SEQUENCES.length; i++) {\n if (HTML_SEQUENCES[i][0].test(lineText)) { break }\n }\n if (i === HTML_SEQUENCES.length) { return false }\n\n if (silent) {\n // true if this sequence can be a terminator, false otherwise\n return HTML_SEQUENCES[i][2]\n }\n\n let nextLine = startLine + 1\n\n // Block types 6 and 7 (the only ones whose end condition is a blank line)\n // have `/^$/` as their closing regexp. For all other types (1-5, e.g.\n // `<!--` comments), a blank line is regular content and must not terminate\n // the block - it ends only when its closing sequence is found.\n const endsOnBlankLine = HTML_SEQUENCES[i][1].test('')\n\n // If we are here - we detected HTML block.\n // Let's roll down till block end.\n if (!HTML_SEQUENCES[i][1].test(lineText)) {\n for (; nextLine < endLine; nextLine++) {\n if (state.sCount[nextLine] < state.blkIndent) {\n // An outdented blank line shouldn't end a block that doesn't end on a\n // blank line (e.g. a `<!--` comment inside a list item). Such blocks\n // must continue until their closing sequence regardless of indent.\n if (endsOnBlankLine || !state.isEmpty(nextLine)) { break }\n }\n\n pos = state.bMarks[nextLine] + state.tShift[nextLine]\n max = state.eMarks[nextLine]\n lineText = state.src.slice(pos, max)\n\n if (HTML_SEQUENCES[i][1].test(lineText)) {\n if (lineText.length !== 0) { nextLine++ }\n break\n }\n }\n }\n\n state.line = nextLine\n\n const token = state.push('html_block', '', 0)\n token.map = [startLine, nextLine]\n token.content = state.getLines(startLine, nextLine, state.blkIndent, true)\n\n return true\n}\n","// heading (#, ##, ...)\n\nimport { isSpace, asciiTrim } from '../common/utils.ts'\nimport type StateBlock from './state_block.ts'\n\nexport default function heading (state: StateBlock, startLine: number, endLine: number, silent: boolean): boolean {\n let pos = state.bMarks[startLine] + state.tShift[startLine]\n let max = state.eMarks[startLine]\n\n // if it's indented more than 3 spaces, it should be a code block\n if (state.sCount[startLine] - state.blkIndent >= 4) { return false }\n\n let ch = state.src.charCodeAt(pos)\n\n if (ch !== 0x23/* # */ || pos >= max) { return false }\n\n // count heading level\n let level = 1\n ch = state.src.charCodeAt(++pos)\n while (ch === 0x23/* # */ && pos < max && level <= 6) {\n level++\n ch = state.src.charCodeAt(++pos)\n }\n\n if (level > 6 || (pos < max && !isSpace(ch))) { return false }\n\n if (silent) { return true }\n\n // Let's cut tails like ' ### ' from the end of string\n\n max = state.skipSpacesBack(max, pos)\n const tmp = state.skipCharsBack(max, 0x23, pos) // #\n if (tmp > pos && isSpace(state.src.charCodeAt(tmp - 1))) {\n max = tmp\n }\n\n state.line = startLine + 1\n\n const token_o = state.push('heading_open', `h${level}`, 1)\n token_o.markup = '########'.slice(0, level)\n token_o.map = [startLine, state.line]\n\n const token_i = state.push('inline', '', 0)\n token_i.content = asciiTrim(state.src.slice(pos, max))\n token_i.map = [startLine, state.line]\n token_i.children = []\n\n const token_c = state.push('heading_close', `h${level}`, -1)\n token_c.markup = '########'.slice(0, level)\n\n return true\n}\n","// lheading (---, ===)\n\nimport { asciiTrim } from '../common/utils.ts'\nimport type StateBlock from './state_block.ts'\n\nexport default function lheading (state: StateBlock, startLine: number, endLine: number/*, silent */): boolean {\n const terminatorRules = state.md.block.ruler.getRules('paragraph')\n\n // if it's indented more than 3 spaces, it should be a code block\n if (state.sCount[startLine] - state.blkIndent >= 4) { return false }\n\n const oldParentType = state.parentType\n state.parentType = 'paragraph' // use paragraph to match terminatorRules\n\n // jump line-by-line until empty one or EOF\n let level = 0\n let marker\n let nextLine = startLine + 1\n\n for (; nextLine < endLine && !state.isEmpty(nextLine); nextLine++) {\n // this would be a code block normally, but after paragraph\n // it's considered a lazy continuation regardless of what's there\n if (state.sCount[nextLine] - state.blkIndent > 3) { continue }\n\n //\n // Check for underline in setext header\n //\n if (state.sCount[nextLine] >= state.blkIndent) {\n let pos = state.bMarks[nextLine] + state.tShift[nextLine]\n const max = state.eMarks[nextLine]\n\n if (pos < max) {\n marker = state.src.charCodeAt(pos)\n\n if (marker === 0x2D/* - */ || marker === 0x3D/* = */) {\n pos = state.skipChars(pos, marker)\n pos = state.skipSpaces(pos)\n\n if (pos >= max) {\n level = (marker === 0x3D/* = */ ? 1 : 2)\n break\n }\n }\n }\n }\n\n // quirk for blockquotes, this line should already be checked by that rule\n if (state.sCount[nextLine] < 0) { continue }\n\n // Some tags can terminate paragraph without empty line.\n let terminate = false\n for (let i = 0, l = terminatorRules.length; i < l; i++) {\n if (terminatorRules[i](state, nextLine, endLine, true)) {\n terminate = true\n break\n }\n }\n if (terminate) { break }\n }\n\n if (!level) {\n // Didn't find valid underline\n state.parentType = oldParentType\n return false\n }\n\n const content = asciiTrim(state.getLines(startLine, nextLine, state.blkIndent, false))\n\n state.line = nextLine + 1\n\n const token_o = state.push('heading_open', `h${level}`, 1)\n token_o.markup = String.fromCharCode(marker!)\n token_o.map = [startLine, state.line]\n\n const token_i = state.push('inline', '', 0)\n token_i.content = content\n token_i.map = [startLine, state.line - 1]\n token_i.children = []\n\n const token_c = state.push('heading_close', `h${level}`, -1)\n token_c.markup = String.fromCharCode(marker!)\n\n state.parentType = oldParentType\n\n return true\n}\n","// Paragraph\n\nimport { asciiTrim } from '../common/utils.ts'\nimport type StateBlock from './state_block.ts'\n\nexport default function paragraph (state: StateBlock, startLine: number, endLine: number): boolean {\n const terminatorRules = state.md.block.ruler.getRules('paragraph')\n const oldParentType = state.parentType\n let nextLine = startLine + 1\n state.parentType = 'paragraph'\n\n // jump line-by-line until empty one or EOF\n for (; nextLine < endLine && !state.isEmpty(nextLine); nextLine++) {\n // this would be a code block normally, but after paragraph\n // it's considered a lazy continuation regardless of what's there\n if (state.sCount[nextLine] - state.blkIndent > 3) { continue }\n\n // quirk for blockquotes, this line should already be checked by that rule\n if (state.sCount[nextLine] < 0) { continue }\n\n // Some tags can terminate paragraph without empty line.\n let terminate = false\n for (let i = 0, l = terminatorRules.length; i < l; i++) {\n if (terminatorRules[i](state, nextLine, endLine, true)) {\n terminate = true\n break\n }\n }\n if (terminate) { break }\n }\n\n const content = asciiTrim(state.getLines(startLine, nextLine, state.blkIndent, false))\n\n state.line = nextLine\n\n const token_o = state.push('paragraph_open', 'p', 1)\n token_o.map = [startLine, state.line]\n\n const token_i = state.push('inline', '', 0)\n token_i.content = content\n token_i.map = [startLine, state.line]\n token_i.children = []\n\n state.push('paragraph_close', 'p', -1)\n\n state.parentType = oldParentType\n\n return true\n}\n","import Ruler from './ruler.ts'\nimport StateBlock from './rules_block/state_block.ts'\nimport type Token from './token.ts'\nimport type MarkdownIt from './markdownit.ts'\nimport type { Env } from './types.ts'\n\nimport r_table from './rules_block/table.ts'\nimport r_code from './rules_block/code.ts'\nimport r_fence from './rules_block/fence.ts'\nimport r_blockquote from './rules_block/blockquote.ts'\nimport r_hr from './rules_block/hr.ts'\nimport r_list from './rules_block/list.ts'\nimport r_reference from './rules_block/reference.ts'\nimport r_html_block from './rules_block/html_block.ts'\nimport r_heading from './rules_block/heading.ts'\nimport r_lheading from './rules_block/lheading.ts'\nimport r_paragraph from './rules_block/paragraph.ts'\n\nconst _rules: Array<[\n name: string,\n rule: (state: StateBlock, startLine: number, endLine: number, silent: boolean) => boolean,\n alt?: string[]\n]> = [\n // First 2 params - rule name & source. Secondary array - list of rules,\n // which can be terminated by this one.\n ['table', r_table, ['paragraph', 'reference']],\n ['code', r_code],\n ['fence', r_fence, ['paragraph', 'reference', 'blockquote', 'list']],\n ['blockquote', r_blockquote, ['paragraph', 'reference', 'blockquote', 'list']],\n ['hr', r_hr, ['paragraph', 'reference', 'blockquote', 'list']],\n ['list', r_list, ['paragraph', 'reference', 'blockquote']],\n ['reference', r_reference],\n ['html_block', r_html_block, ['paragraph', 'reference', 'blockquote']],\n ['heading', r_heading, ['paragraph', 'reference', 'blockquote']],\n ['lheading', r_lheading],\n ['paragraph', r_paragraph]\n]\n\n/**\n * Block-level tokenizer.\n */\nclass ParserBlock {\n /**\n * {@link Ruler} instance. Keep configuration of block rules.\n */\n ruler = new Ruler<[StateBlock, number, number, boolean], boolean>()\n\n State = StateBlock\n\n constructor () {\n for (let i = 0; i < _rules.length; i++) {\n this.ruler.push(_rules[i][0], _rules[i][1], { alt: (_rules[i][2] || []).slice() })\n }\n }\n\n // Generate tokens for input range\n //\n tokenize (state: StateBlock, startLine: number, endLine: number): void {\n const rules = this.ruler.getRules('')\n const len = rules.length\n const maxNesting = state.md.options.maxNesting\n let line = startLine\n let hasEmptyLines = false\n\n while (line < endLine) {\n state.line = line = state.skipEmptyLines(line)\n if (line >= endLine) { break }\n\n // Termination condition for nested calls.\n // Nested calls currently used for blockquotes & lists\n if (state.sCount[line] < state.blkIndent) { break }\n\n // If nesting level exceeded - skip tail to the end. That's not ordinary\n // situation and we should not care about content.\n if (state.level >= maxNesting) {\n state.line = endLine\n break\n }\n\n // Try all possible rules.\n // On success, rule should:\n //\n // - update `state.line`\n // - update `state.tokens`\n // - return true\n const prevLine = state.line\n let ok = false\n\n for (let i = 0; i < len; i++) {\n ok = rules[i](state, line, endLine, false)\n if (ok) {\n if (prevLine >= state.line) {\n throw new Error(\"block rule didn't increment state.line\")\n }\n break\n }\n }\n\n // this can only happen if user disables paragraph rule\n if (!ok) throw new Error('none of the block rules matched')\n\n // set state.tight if we had an empty line before current tag\n // i.e. latest empty line should not count\n state.tight = !hasEmptyLines\n\n // paragraph might \"eat\" one newline after it in nested lists\n if (state.isEmpty(state.line - 1)) {\n hasEmptyLines = true\n }\n\n line = state.line\n\n if (line < endLine && state.isEmpty(line)) {\n hasEmptyLines = true\n line++\n state.line = line\n }\n }\n }\n\n /**\n * Process input string and push block tokens into `outTokens`\n */\n parse (src: string, md: MarkdownIt, env: Env, outTokens: Token[]): void {\n if (!src) { return }\n\n const state = new this.State(src, md, env, outTokens)\n\n this.tokenize(state, state.line, state.lineMax)\n }\n}\n\nexport default ParserBlock\n","import Token from '../token.ts'\nimport { isWhiteSpace, isPunctCharCode, isMdAsciiPunct } from '../common/utils.ts'\nimport type MarkdownIt from '../markdownit.ts'\nimport type { Delimiter, Env } from '../types.ts'\n\n/** @inline */\ninterface ScannedDelimiters {\n can_open: boolean\n can_close: boolean\n length: number\n}\n\n/** @inline */\ntype StateTokenMeta = Record<string, unknown> & {\n delimiters?: Delimiter[]\n}\n\n/** Mutable state passed to inline rules while tokenizing inline content. */\nclass StateInline {\n declare src: string\n declare env: Env\n declare md: MarkdownIt\n declare tokens: Token[]\n declare tokens_meta: Array<StateTokenMeta | undefined>\n\n pos = 0\n declare posMax: number\n level = 0\n pending = ''\n pendingLevel = 0\n\n // Stores { start: end } pairs. Useful for backtrack\n // optimization of pairs parse (emphasis, strikes).\n cache: Record<number, number> = {}\n\n // backtick run length => position of its last run, built lazily on first use\n backticks: Record<number, number> = {}\n backticksScanned = false\n\n // Counter used to disable inline linkify-it execution\n // inside <a> and markdown links\n linkLevel = 0\n\n // List of emphasis-like delimiters for current tag\n delimiters: Delimiter[] = []\n\n // Stack of delimiter lists for upper level tags\n _prev_delimiters: Delimiter[][] = []\n\n // re-export Token class to use in block rules\n Token = Token\n\n constructor (src: string, md: MarkdownIt, env: Env, outTokens: Token[]) {\n this.src = src\n this.env = env\n this.md = md\n this.tokens = outTokens\n this.tokens_meta = Array(outTokens.length)\n\n this.posMax = this.src.length\n }\n\n // Flush pending text\n //\n pushPending (): Token {\n const token = new Token('text', '', 0)\n token.content = this.pending\n token.level = this.pendingLevel\n this.tokens.push(token)\n this.pending = ''\n return token\n }\n\n // Push new token to \"stream\".\n // If pending text exists - flush it as text token\n //\n push (type: string, tag: string, nesting: -1 | 0 | 1): Token {\n if (this.pending) {\n this.pushPending()\n }\n\n const token = new Token(type, tag, nesting)\n let token_meta = undefined\n\n if (nesting < 0) {\n // closing tag\n this.level--\n this.delimiters = this._prev_delimiters.pop()!\n }\n\n token.level = this.level\n\n if (nesting > 0) {\n // opening tag\n this.level++\n this._prev_delimiters.push(this.delimiters)\n this.delimiters = []\n token_meta = { delimiters: this.delimiters }\n }\n\n this.pendingLevel = this.level\n this.tokens.push(token)\n this.tokens_meta.push(token_meta)\n return token\n }\n\n // Scan a sequence of emphasis-like markers, and determine whether\n // it can start an emphasis sequence or end an emphasis sequence.\n //\n // - start - position to scan from (it should point at a valid marker);\n // - canSplitWord - determine if these markers can be found inside a word\n //\n scanDelims (start: number, canSplitWord: boolean): ScannedDelimiters {\n const max = this.posMax\n const marker = this.src.charCodeAt(start)\n\n // Astral characters below are combined manually, because .codePointAt()\n // does not guarantee numeric type output. And we don't wish JIT cache issues.\n // The broken surrogate pairs are evaluated as U+FFFD to prevent possible\n // crashes.\n\n let lastChar\n if (start === 0) {\n // treat beginning of the line as a whitespace\n lastChar = 0x20\n } else if (start === 1) {\n lastChar = this.src.charCodeAt(0)\n if ((lastChar & 0xF800) === 0xD800) { lastChar = 0xFFFD }\n } else {\n lastChar = this.src.charCodeAt(start - 1)\n if ((lastChar & 0xFC00) === 0xDC00) {\n // low surrogate => add high one, replace broken pair with U+FFFD\n const highSurr = this.src.charCodeAt(start - 2)\n lastChar = (highSurr & 0xFC00) === 0xD800\n ? 0x10000 + ((highSurr - 0xD800) << 10) + (lastChar - 0xDC00)\n : 0xFFFD\n } else if ((lastChar & 0xFC00) === 0xD800) {\n lastChar = 0xFFFD\n }\n }\n\n let pos = start\n while (pos < max && this.src.charCodeAt(pos) === marker) { pos++ }\n\n const count = pos - start\n\n // treat end of the line as a whitespace\n let nextChar = pos < max ? this.src.charCodeAt(pos) : 0x20\n if ((nextChar & 0xFC00) === 0xD800) {\n // high surrogate => add low one, replace broken pair with U+FFFD\n const lowSurr = this.src.charCodeAt(pos + 1)\n nextChar = (lowSurr & 0xFC00) === 0xDC00\n ? 0x10000 + ((nextChar - 0xD800) << 10) + (lowSurr - 0xDC00)\n : 0xFFFD\n } else if ((nextChar & 0xFC00) === 0xDC00) {\n nextChar = 0xFFFD\n }\n\n const isLastPunctChar = isMdAsciiPunct(lastChar) || isPunctCharCode(lastChar)\n const isNextPunctChar = isMdAsciiPunct(nextChar) || isPunctCharCode(nextChar)\n\n const isLastWhiteSpace = isWhiteSpace(lastChar)\n const isNextWhiteSpace = isWhiteSpace(nextChar)\n\n const left_flanking =\n !isNextWhiteSpace && (!isNextPunctChar || isLastWhiteSpace || isLastPunctChar)\n const right_flanking =\n !isLastWhiteSpace && (!isLastPunctChar || isNextWhiteSpace || isNextPunctChar)\n\n const can_open = left_flanking && (canSplitWord || !right_flanking || isLastPunctChar)\n const can_close = right_flanking && (canSplitWord || !left_flanking || isNextPunctChar)\n\n return { can_open, can_close, length: count }\n }\n}\n\nexport default StateInline\n","// Skip text characters for text token, place those to pending buffer\n// and increment current pos\n\nimport type StateInline from './state_inline.ts'\n\n// Rule to skip pure text\n// '{}$%@~+=:' reserved for extentions\n\n// !, \", #, $, %, &, ', (, ), *, +, ,, -, ., /, :, ;, <, =, >, ?, @, [, \\, ], ^, _, `, {, |, }, or ~\n\n// !!!! Don't confuse with \"Markdown ASCII Punctuation\" chars\n// http://spec.commonmark.org/0.15/#ascii-punctuation-character\nfunction isTerminatorChar (ch: number) {\n switch (ch) {\n case 0x0A/* \\n */:\n case 0x21/* ! */:\n case 0x23/* # */:\n case 0x24/* $ */:\n case 0x25/* % */:\n case 0x26/* & */:\n case 0x2A/* * */:\n case 0x2B/* + */:\n case 0x2D/* - */:\n case 0x3A/* : */:\n case 0x3C/* < */:\n case 0x3D/* = */:\n case 0x3E/* > */:\n case 0x40/* @ */:\n case 0x5B/* [ */:\n case 0x5C/* \\ */:\n case 0x5D/* ] */:\n case 0x5E/* ^ */:\n case 0x5F/* _ */:\n case 0x60/* ` */:\n case 0x7B/* { */:\n case 0x7D/* } */:\n case 0x7E/* ~ */:\n return true\n default:\n return false\n }\n}\n\nexport default function text (state: StateInline, silent: boolean): boolean {\n let pos = state.pos\n\n while (pos < state.posMax && !isTerminatorChar(state.src.charCodeAt(pos))) {\n pos++\n }\n\n if (pos === state.pos) { return false }\n\n if (!silent) { state.pending += state.src.slice(state.pos, pos) }\n\n state.pos = pos\n\n return true\n}\n\n// Alternative implementation, for memory.\n//\n// It costs 10% of performance, but allows extend terminators list, if place it\n// to `ParserInline` property. Probably, will switch to it sometime, such\n// flexibility required.\n\n/*\nvar TERMINATOR_RE = /[\\n!#$%&*+\\-:<=>@[\\\\\\]^_`{}~]/;\n\nmodule.exports = function text(state, silent) {\n var pos = state.pos,\n idx = state.src.slice(pos).search(TERMINATOR_RE);\n\n // first char is terminator -> empty text\n if (idx === 0) { return false; }\n\n // no terminator -> text till end of string\n if (idx < 0) {\n if (!silent) { state.pending += state.src.slice(pos); }\n state.pos = state.src.length;\n return true;\n }\n\n if (!silent) { state.pending += state.src.slice(pos, pos + idx); }\n\n state.pos += idx;\n\n return true;\n}; */\n","// Early process links like https://example.org/ to have priority\n// over emphasis, etc.\n\nimport type StateInline from './state_inline.ts'\n\n// RFC3986: scheme = ALPHA *( ALPHA / DIGIT / \"+\" / \"-\" / \".\" )\nfunction isAsciiAlpha (code: number): boolean {\n return (code >= 0x41 && code <= 0x5A) || (code >= 0x61 && code <= 0x7A)\n}\n\nfunction isSchemeChar (code: number): boolean {\n return (code >= 0x41 && code <= 0x5A) ||\n (code >= 0x61 && code <= 0x7A) ||\n (code >= 0x30 && code <= 0x39) ||\n code === 0x2B || code === 0x2D || code === 0x2E\n}\n\nexport default function linkify (state: StateInline, silent: boolean): boolean {\n if (!state.md.options.linkify) return false\n if (state.linkLevel > 0) return false\n\n const pos = state.pos\n const max = state.posMax\n\n if (pos + 3 > max) return false\n if (state.src.charCodeAt(pos) !== 0x3A/* : */) return false\n if (state.src.charCodeAt(pos + 1) !== 0x2F/* / */) return false\n if (state.src.charCodeAt(pos + 2) !== 0x2F/* / */) return false\n\n // Search backwards for the scheme, but no more than 10 characters, the length\n // of the pending string, or the length of the source prefix.\n // Use state.src instead of state.pending because it is faster to access.\n const protoMin = pos - Math.min(10, state.pending.length, pos)\n let protoStart = pos\n while (protoStart > protoMin && isSchemeChar(state.src.charCodeAt(protoStart - 1))) {\n protoStart--\n }\n\n if (protoStart === pos || !isAsciiAlpha(state.src.charCodeAt(protoStart))) return false\n\n const protoLength = pos - protoStart\n\n const link = state.md.linkify.matchAtStart(state.src.slice(protoStart))\n if (!link) return false\n\n let url = link.url\n\n // invalid link, but still detected by linkify somehow;\n // need to check to prevent infinite loop below\n if (url.length <= protoLength) return false\n\n // disallow '*' at the end of the link (conflicts with emphasis)\n // do manual backsearch to avoid perf issues with regex /\\*+$/ on \"****...****a\".\n let urlEnd = url.length\n while (urlEnd > 0 && url.charCodeAt(urlEnd - 1) === 0x2A/* * */) {\n urlEnd--\n }\n if (urlEnd !== url.length) {\n url = url.slice(0, urlEnd)\n }\n\n const fullUrl = state.md.normalizeLink(url)\n if (!state.md.validateLink(fullUrl)) return false\n\n if (!silent) {\n state.pending = state.pending.slice(0, -protoLength)\n\n const token_o = state.push('link_open', 'a', 1)\n token_o.attrs = [['href', fullUrl]]\n token_o.markup = 'linkify'\n token_o.info = 'auto'\n\n const token_t = state.push('text', '', 0)\n token_t.content = state.md.normalizeLinkText(url)\n\n const token_c = state.push('link_close', 'a', -1)\n token_c.markup = 'linkify'\n token_c.info = 'auto'\n }\n\n state.pos += url.length - protoLength\n return true\n}\n","// Proceess '\\n'\n\nimport { isSpace } from '../common/utils.ts'\nimport type StateInline from './state_inline.ts'\n\nexport default function newline (state: StateInline, silent: boolean): boolean {\n let pos = state.pos\n\n if (state.src.charCodeAt(pos) !== 0x0A/* \\n */) { return false }\n\n const pmax = state.pending.length - 1\n const max = state.posMax\n\n // ' \\n' -> hardbreak\n // Lookup in pending chars is bad practice! Don't copy to other rules!\n // Pending string is stored in concat mode, indexed lookups will cause\n // convertion to flat mode.\n if (!silent) {\n if (pmax >= 0 && state.pending.charCodeAt(pmax) === 0x20) {\n if (pmax >= 1 && state.pending.charCodeAt(pmax - 1) === 0x20) {\n // Find whitespaces tail of pending chars.\n let ws = pmax - 1\n while (ws >= 1 && state.pending.charCodeAt(ws - 1) === 0x20) ws--\n\n state.pending = state.pending.slice(0, ws)\n state.push('hardbreak', 'br', 0)\n } else {\n state.pending = state.pending.slice(0, -1)\n state.push('softbreak', 'br', 0)\n }\n } else {\n state.push('softbreak', 'br', 0)\n }\n }\n\n pos++\n\n // skip heading spaces for next line\n while (pos < max && isSpace(state.src.charCodeAt(pos))) { pos++ }\n\n state.pos = pos\n return true\n}\n","// Process escaped chars and hardbreaks\n\nimport { isSpace } from '../common/utils.ts'\nimport type StateInline from './state_inline.ts'\n\nconst ESCAPED: number[] = []\n\nfor (let i = 0; i < 256; i++) { ESCAPED.push(0) }\n\n'\\\\!\"#$%&\\'()*+,./:;<=>?@[]^_`{|}~-'\n .split('').forEach(function (ch) { ESCAPED[ch.charCodeAt(0)] = 1 })\n\nexport default function escape (state: StateInline, silent: boolean): boolean {\n let pos = state.pos\n const max = state.posMax\n\n if (state.src.charCodeAt(pos) !== 0x5C/* \\ */) return false\n pos++\n\n // '\\' at the end of the inline block\n if (pos >= max) return false\n\n let ch1 = state.src.charCodeAt(pos)\n\n if (ch1 === 0x0A) {\n if (!silent) {\n state.push('hardbreak', 'br', 0)\n }\n\n pos++\n // skip leading whitespaces from next line\n while (pos < max) {\n ch1 = state.src.charCodeAt(pos)\n if (!isSpace(ch1)) break\n pos++\n }\n\n state.pos = pos\n return true\n }\n\n // '\\' before a space is a literal backslash. Don't consume the space, so a\n // trailing two-space hard line break is still detected by the newline rule.\n if (ch1 === 0x20) {\n if (!silent) {\n const token = state.push('text_special', '', 0)\n token.content = '\\\\'\n token.markup = '\\\\'\n token.info = 'escape'\n }\n\n state.pos = pos\n return true\n }\n\n let escapedStr = state.src[pos]\n\n if (ch1 >= 0xD800 && ch1 <= 0xDBFF && pos + 1 < max) {\n const ch2 = state.src.charCodeAt(pos + 1)\n\n if (ch2 >= 0xDC00 && ch2 <= 0xDFFF) {\n escapedStr += state.src[pos + 1]\n pos++\n }\n }\n\n const origStr = '\\\\' + escapedStr\n\n if (!silent) {\n const token = state.push('text_special', '', 0)\n\n if (ch1 < 256 && ESCAPED[ch1] !== 0) {\n token.content = escapedStr\n } else {\n token.content = origStr\n }\n\n token.markup = origStr\n token.info = 'escape'\n }\n\n state.pos = pos + 1\n return true\n}\n","// Parse backticks\n\nimport type StateInline from './state_inline.ts'\n\n// Position of the last backtick run of each length. Derived from the string in\n// one pass, so unlike an incremental cache it never depends on how the parser\n// walks it, and stays valid across lookaheads and narrowed ranges.\nfunction buildLastRuns (src: string): Record<number, number> {\n const lastRuns: Record<number, number> = {}\n let pos = 0\n\n while ((pos = src.indexOf('`', pos)) !== -1) {\n const start = pos\n while (src.charCodeAt(++pos) === 0x60/* ` */) { /* scan run length */ }\n lastRuns[pos - start] = start\n }\n\n return lastRuns\n}\n\nexport default function backtick (state: StateInline, silent: boolean): boolean {\n const start = state.pos\n\n if (state.src.charCodeAt(start) !== 0x60/* ` */) { return false }\n\n const max = state.posMax\n let pos = start + 1\n\n // scan marker length\n while (pos < max && state.src.charCodeAt(pos) === 0x60/* ` */) { pos++ }\n\n const marker = state.src.slice(start, pos)\n const openerLength = marker.length\n\n if (!state.backticksScanned) {\n state.backticks = buildLastRuns(state.src)\n state.backticksScanned = true\n }\n\n // Nothing of the same length left in the string, so no closer can exist\n if ((state.backticks[openerLength] ?? -1) >= pos) {\n let matchEnd = pos\n let matchStart\n\n while ((matchStart = state.src.indexOf('`', matchEnd)) !== -1 && matchStart < max) {\n // Measure the whole run, not just its part inside the current range,\n // otherwise a run straddling `max` would be mistaken for a shorter one\n matchEnd = matchStart + 1\n while (state.src.charCodeAt(matchEnd) === 0x60/* ` */) { matchEnd++ }\n\n if (matchEnd > max) break\n\n if (matchEnd - matchStart === openerLength) {\n if (!silent) {\n const token = state.push('code_inline', 'code', 0)\n token.markup = marker\n let content = state.src.slice(pos, matchStart).replace(/\\n/g, ' ')\n\n // Strip one space from each side, unless the content is all spaces\n if (content.startsWith(' ') && content.endsWith(' ') && /[^ ]/.test(content)) {\n content = content.slice(1, -1)\n }\n\n token.content = content\n }\n state.pos = matchEnd\n return true\n }\n }\n }\n\n if (!silent) state.pending += marker\n state.pos = pos\n return true\n}\n","// ~~strike through~~\n//\n\nimport type { Delimiter } from '../types.ts'\nimport type StateInline from './state_inline.ts'\n\n// Insert each marker as a separate text token, and add it to delimiter list\n//\nfunction strikethrough_tokenize (state: StateInline, silent: boolean): boolean {\n const start = state.pos\n const marker = state.src.charCodeAt(start)\n\n if (silent) { return false }\n\n if (marker !== 0x7E/* ~ */) { return false }\n\n const scanned = state.scanDelims(state.pos, true)\n let len = scanned.length\n const ch = String.fromCharCode(marker)\n\n if (len < 2) { return false }\n\n let token\n\n if (len % 2) {\n token = state.push('text', '', 0)\n token.content = ch\n len--\n }\n\n for (let i = 0; i < len; i += 2) {\n token = state.push('text', '', 0)\n token.content = ch + ch\n\n state.delimiters.push({\n marker,\n length: 0, // disable \"rule of 3\" length checks meant for emphasis\n token: state.tokens.length - 1,\n end: -1,\n open: scanned.can_open,\n close: scanned.can_close\n })\n }\n\n state.pos += scanned.length\n\n return true\n}\n\nfunction postProcess (state: StateInline, delimiters: Delimiter[]) {\n let token\n const loneMarkers = []\n const max = delimiters.length\n\n for (let i = 0; i < max; i++) {\n const startDelim = delimiters[i]\n\n if (startDelim.marker !== 0x7E/* ~ */) {\n continue\n }\n\n if (startDelim.end === -1) {\n continue\n }\n\n const endDelim = delimiters[startDelim.end]\n\n token = state.tokens[startDelim.token]\n token.type = 's_open'\n token.tag = 's'\n token.nesting = 1\n token.markup = '~~'\n token.content = ''\n\n token = state.tokens[endDelim.token]\n token.type = 's_close'\n token.tag = 's'\n token.nesting = -1\n token.markup = '~~'\n token.content = ''\n\n if (state.tokens[endDelim.token - 1].type === 'text' &&\n state.tokens[endDelim.token - 1].content === '~') {\n loneMarkers.push(endDelim.token - 1)\n }\n }\n\n // If a marker sequence has an odd number of characters, it's splitted\n // like this: `~~~~~` -> `~` + `~~` + `~~`, leaving one marker at the\n // start of the sequence.\n //\n // So, we have to move all those markers after subsequent s_close tags.\n //\n while (loneMarkers.length) {\n const i = loneMarkers.pop()!\n let j = i + 1\n\n while (j < state.tokens.length && state.tokens[j].type === 's_close') {\n j++\n }\n\n j--\n\n if (i !== j) {\n token = state.tokens[j]\n state.tokens[j] = state.tokens[i]\n state.tokens[i] = token\n }\n }\n}\n\n// Walk through delimiter list and replace text tokens with tags\n//\nfunction strikethrough_postProcess (state: StateInline): void {\n const tokens_meta = state.tokens_meta\n const max = state.tokens_meta.length\n\n postProcess(state, state.delimiters)\n\n for (let curr = 0; curr < max; curr++) {\n const delimiters = tokens_meta[curr]?.delimiters\n if (delimiters) {\n postProcess(state, delimiters)\n }\n }\n}\n\nexport default {\n tokenize: strikethrough_tokenize,\n postProcess: strikethrough_postProcess\n}\n","// Process *this* and _that_\n//\n\nimport type { Delimiter } from '../types.ts'\nimport type StateInline from './state_inline.ts'\n\n// Insert each marker as a separate text token, and add it to delimiter list\n//\nfunction emphasis_tokenize (state: StateInline, silent: boolean): boolean {\n const start = state.pos\n const marker = state.src.charCodeAt(start)\n\n if (silent) { return false }\n\n if (marker !== 0x5F /* _ */ && marker !== 0x2A /* * */) { return false }\n\n const scanned = state.scanDelims(state.pos, marker === 0x2A)\n\n for (let i = 0; i < scanned.length; i++) {\n const token = state.push('text', '', 0)\n token.content = String.fromCharCode(marker)\n\n state.delimiters.push({\n // Char code of the starting marker (number).\n //\n marker,\n\n // Total length of these series of delimiters.\n //\n length: scanned.length,\n\n // A position of the token this delimiter corresponds to.\n //\n token: state.tokens.length - 1,\n\n // If this delimiter is matched as a valid opener, `end` will be\n // equal to its position, otherwise it's `-1`.\n //\n end: -1,\n\n // Boolean flags that determine if this delimiter could open or close\n // an emphasis.\n //\n open: scanned.can_open,\n close: scanned.can_close\n })\n }\n\n state.pos += scanned.length\n\n return true\n}\n\nfunction postProcess (state: StateInline, delimiters: Delimiter[]) {\n const max = delimiters.length\n\n for (let i = max - 1; i >= 0; i--) {\n const startDelim = delimiters[i]\n\n if (startDelim.marker !== 0x5F/* _ */ && startDelim.marker !== 0x2A/* * */) {\n continue\n }\n\n // Process only opening markers\n if (startDelim.end === -1) {\n continue\n }\n\n const endDelim = delimiters[startDelim.end]\n\n // If the previous delimiter has the same marker and is adjacent to this one,\n // merge those into one strong delimiter.\n //\n // `<em><em>whatever</em></em>` -> `<strong>whatever</strong>`\n //\n const isStrong = i > 0 &&\n delimiters[i - 1].end === startDelim.end + 1 &&\n // check that first two markers match and adjacent\n delimiters[i - 1].marker === startDelim.marker &&\n delimiters[i - 1].token === startDelim.token - 1 &&\n // check that last two markers are adjacent (we can safely assume they match)\n delimiters[startDelim.end + 1].token === endDelim.token + 1\n\n const ch = String.fromCharCode(startDelim.marker)\n\n const token_o = state.tokens[startDelim.token]\n token_o.type = isStrong ? 'strong_open' : 'em_open'\n token_o.tag = isStrong ? 'strong' : 'em'\n token_o.nesting = 1\n token_o.markup = isStrong ? ch + ch : ch\n token_o.content = ''\n\n const token_c = state.tokens[endDelim.token]\n token_c.type = isStrong ? 'strong_close' : 'em_close'\n token_c.tag = isStrong ? 'strong' : 'em'\n token_c.nesting = -1\n token_c.markup = isStrong ? ch + ch : ch\n token_c.content = ''\n\n if (isStrong) {\n state.tokens[delimiters[i - 1].token].content = ''\n state.tokens[delimiters[startDelim.end + 1].token].content = ''\n i--\n }\n }\n}\n\n// Walk through delimiter list and replace text tokens with tags\n//\nfunction emphasis_post_process (state: StateInline): void {\n const tokens_meta = state.tokens_meta\n const max = state.tokens_meta.length\n\n postProcess(state, state.delimiters)\n\n for (let curr = 0; curr < max; curr++) {\n const delimiters = tokens_meta[curr]?.delimiters\n if (delimiters) {\n postProcess(state, delimiters)\n }\n }\n}\n\nexport default {\n tokenize: emphasis_tokenize,\n postProcess: emphasis_post_process\n}\n","// Process [link](<to> \"stuff\")\n\nimport { normalizeReference, isSpace } from '../common/utils.ts'\nimport type StateInline from './state_inline.ts'\n\nexport default function link (state: StateInline, silent: boolean): boolean {\n let code, label, res, ref\n let href = ''\n let title = ''\n let start = state.pos\n let parseReference = true\n\n if (state.src.charCodeAt(state.pos) !== 0x5B/* [ */) { return false }\n\n const oldPos = state.pos\n const max = state.posMax\n const labelStart = state.pos + 1\n const labelEnd = state.md.helpers.parseLinkLabel(state, state.pos, true)\n\n // parser failed to find ']', so it's not a valid link\n if (labelEnd < 0) { return false }\n\n let pos = labelEnd + 1\n if (pos < max && state.src.charCodeAt(pos) === 0x28/* ( */) {\n //\n // Inline link\n //\n\n // might have found a valid shortcut link, disable reference parsing\n parseReference = false\n\n // [link]( <href> \"title\" )\n // ^^ skipping these spaces\n pos++\n for (; pos < max; pos++) {\n code = state.src.charCodeAt(pos)\n if (!isSpace(code) && code !== 0x0A) { break }\n }\n if (pos >= max) { return false }\n\n // [link]( <href> \"title\" )\n // ^^^^^^ parsing link destination\n start = pos\n res = state.md.helpers.parseLinkDestination(state.src, pos, state.posMax)\n if (res.ok) {\n href = state.md.normalizeLink(res.str)\n if (state.md.validateLink(href)) {\n pos = res.pos\n } else {\n href = ''\n }\n\n // [link]( <href> \"title\" )\n // ^^ skipping these spaces\n start = pos\n for (; pos < max; pos++) {\n code = state.src.charCodeAt(pos)\n if (!isSpace(code) && code !== 0x0A) { break }\n }\n\n // [link]( <href> \"title\" )\n // ^^^^^^^ parsing link title\n res = state.md.helpers.parseLinkTitle(state.src, pos, state.posMax)\n if (pos < max && start !== pos && res.ok) {\n title = res.str\n pos = res.pos\n\n // [link]( <href> \"title\" )\n // ^^ skipping these spaces\n for (; pos < max; pos++) {\n code = state.src.charCodeAt(pos)\n if (!isSpace(code) && code !== 0x0A) { break }\n }\n }\n }\n\n if (pos >= max || state.src.charCodeAt(pos) !== 0x29/* ) */) {\n // parsing a valid shortcut link failed, fallback to reference\n parseReference = true\n }\n pos++\n }\n\n if (parseReference) {\n //\n // Link reference\n //\n if (typeof state.env.references === 'undefined') { return false }\n\n if (pos < max && state.src.charCodeAt(pos) === 0x5B/* [ */) {\n start = pos + 1\n pos = state.md.helpers.parseLinkLabel(state, pos)\n if (pos >= 0) {\n label = state.src.slice(start, pos++)\n } else {\n pos = labelEnd + 1\n }\n } else {\n pos = labelEnd + 1\n }\n\n // covers label === '' and label === undefined\n // (collapsed reference link and shortcut reference link respectively)\n if (!label) { label = state.src.slice(labelStart, labelEnd) }\n\n label = normalizeReference(label)\n ref = state.env.references[label]\n if (!ref) {\n state.pos = oldPos\n return false\n }\n href = ref.href\n title = ref.title\n }\n\n //\n // We found the end of the link, and know for a fact it's a valid link;\n // so all that's left to do is to call tokenizer.\n //\n if (!silent) {\n state.pos = labelStart\n state.posMax = labelEnd\n\n const token_o = state.push('link_open', 'a', 1)\n const attrs: Array<[string, string]> = [['href', href]]\n token_o.attrs = attrs\n if (title) {\n attrs.push(['title', title])\n }\n if (label) {\n const meta: Record<string, unknown> = Object.create(null)\n meta.label = label\n token_o.meta = meta\n }\n\n state.linkLevel++\n state.md.inline.tokenize(state)\n state.linkLevel--\n\n state.push('link_close', 'a', -1)\n }\n\n state.pos = pos\n state.posMax = max\n return true\n}\n","// Process \n\nimport { normalizeReference, isSpace } from '../common/utils.ts'\nimport type Token from '../token.ts'\nimport type StateInline from './state_inline.ts'\n\nexport default function image (state: StateInline, silent: boolean): boolean {\n let code, content, label, pos, ref, res, title, start\n let href = ''\n const oldPos = state.pos\n const max = state.posMax\n\n if (state.src.charCodeAt(state.pos) !== 0x21/* ! */) { return false }\n if (state.src.charCodeAt(state.pos + 1) !== 0x5B/* [ */) { return false }\n\n const labelStart = state.pos + 2\n const labelEnd = state.md.helpers.parseLinkLabel(state, state.pos + 1, false)\n\n // parser failed to find ']', so it's not a valid link\n if (labelEnd < 0) { return false }\n\n pos = labelEnd + 1\n if (pos < max && state.src.charCodeAt(pos) === 0x28/* ( */) {\n //\n // Inline link\n //\n\n // [link]( <href> \"title\" )\n // ^^ skipping these spaces\n pos++\n for (; pos < max; pos++) {\n code = state.src.charCodeAt(pos)\n if (!isSpace(code) && code !== 0x0A) { break }\n }\n if (pos >= max) { return false }\n\n // [link]( <href> \"title\" )\n // ^^^^^^ parsing link destination\n start = pos\n res = state.md.helpers.parseLinkDestination(state.src, pos, state.posMax)\n if (res.ok) {\n href = state.md.normalizeLink(res.str)\n if (state.md.validateLink(href)) {\n pos = res.pos\n } else {\n href = ''\n }\n }\n\n // [link]( <href> \"title\" )\n // ^^ skipping these spaces\n start = pos\n for (; pos < max; pos++) {\n code = state.src.charCodeAt(pos)\n if (!isSpace(code) && code !== 0x0A) { break }\n }\n\n // [link]( <href> \"title\" )\n // ^^^^^^^ parsing link title\n res = state.md.helpers.parseLinkTitle(state.src, pos, state.posMax)\n if (pos < max && start !== pos && res.ok) {\n title = res.str\n pos = res.pos\n\n // [link]( <href> \"title\" )\n // ^^ skipping these spaces\n for (; pos < max; pos++) {\n code = state.src.charCodeAt(pos)\n if (!isSpace(code) && code !== 0x0A) { break }\n }\n } else {\n title = ''\n }\n\n if (pos >= max || state.src.charCodeAt(pos) !== 0x29/* ) */) {\n state.pos = oldPos\n return false\n }\n pos++\n } else {\n //\n // Link reference\n //\n if (typeof state.env.references === 'undefined') { return false }\n\n if (pos < max && state.src.charCodeAt(pos) === 0x5B/* [ */) {\n start = pos + 1\n pos = state.md.helpers.parseLinkLabel(state, pos)\n if (pos >= 0) {\n label = state.src.slice(start, pos++)\n } else {\n pos = labelEnd + 1\n }\n } else {\n pos = labelEnd + 1\n }\n\n // covers label === '' and label === undefined\n // (collapsed reference link and shortcut reference link respectively)\n if (!label) { label = state.src.slice(labelStart, labelEnd) }\n\n label = normalizeReference(label)\n ref = state.env.references[label]\n if (!ref) {\n state.pos = oldPos\n return false\n }\n href = ref.href\n title = ref.title\n }\n\n //\n // We found the end of the link, and know for a fact it's a valid link;\n // so all that's left to do is to call tokenizer.\n //\n if (!silent) {\n content = state.src.slice(labelStart, labelEnd)\n\n const tokens: Token[] = []\n state.md.inline.parse(\n content,\n state.md,\n state.env,\n tokens\n )\n\n const token = state.push('image', 'img', 0)\n const attrs: Array<[string, string]> = [['src', href], ['alt', '']]\n token.attrs = attrs\n token.children = tokens\n token.content = content\n\n if (title) {\n attrs.push(['title', title])\n }\n if (label) {\n const meta: Record<string, unknown> = Object.create(null)\n meta.label = label\n token.meta = meta\n }\n }\n\n state.pos = pos\n state.posMax = max\n return true\n}\n","// Process autolinks '<protocol:...>'\n\nimport type StateInline from './state_inline.ts'\n\n/* eslint max-len:0 */\nconst EMAIL_RE = /^([a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)$/\n/* eslint-disable-next-line no-control-regex */\nconst AUTOLINK_RE = /^([a-zA-Z][a-zA-Z0-9+.-]{1,31}):([^<>\\x00-\\x20]*)$/\n\nexport default function autolink (state: StateInline, silent: boolean): boolean {\n let pos = state.pos\n\n if (state.src.charCodeAt(pos) !== 0x3C/* < */) { return false }\n\n const start = state.pos\n const max = state.posMax\n\n for (;;) {\n if (++pos >= max) return false\n\n const ch = state.src.charCodeAt(pos)\n\n if (ch === 0x3C /* < */) return false\n if (ch === 0x3E /* > */) break\n }\n\n const url = state.src.slice(start + 1, pos)\n\n if (AUTOLINK_RE.test(url)) {\n const fullUrl = state.md.normalizeLink(url)\n if (!state.md.validateLink(fullUrl)) { return false }\n\n if (!silent) {\n const token_o = state.push('link_open', 'a', 1)\n token_o.attrs = [['href', fullUrl]]\n token_o.markup = 'autolink'\n token_o.info = 'auto'\n\n const token_t = state.push('text', '', 0)\n token_t.content = state.md.normalizeLinkText(url)\n\n const token_c = state.push('link_close', 'a', -1)\n token_c.markup = 'autolink'\n token_c.info = 'auto'\n }\n\n state.pos += url.length + 2\n return true\n }\n\n if (EMAIL_RE.test(url)) {\n const fullUrl = state.md.normalizeLink(`mailto:${url}`)\n if (!state.md.validateLink(fullUrl)) { return false }\n\n if (!silent) {\n const token_o = state.push('link_open', 'a', 1)\n token_o.attrs = [['href', fullUrl]]\n token_o.markup = 'autolink'\n token_o.info = 'auto'\n\n const token_t = state.push('text', '', 0)\n token_t.content = state.md.normalizeLinkText(url)\n\n const token_c = state.push('link_close', 'a', -1)\n token_c.markup = 'autolink'\n token_c.info = 'auto'\n }\n\n state.pos += url.length + 2\n return true\n }\n\n return false\n}\n","// Process html tags\n\nimport { HTML_TAG_RE } from '../common/html_re.ts'\nimport type StateInline from './state_inline.ts'\n\nfunction isLinkOpen (str: string) {\n return /^<a[>\\s]/i.test(str)\n}\nfunction isLinkClose (str: string) {\n return /^<\\/a\\s*>/i.test(str)\n}\n\nfunction isLetter (ch: number) {\n /* eslint no-bitwise:0 */\n const lc = ch | 0x20 // to lower case\n return (lc >= 0x61/* a */) && (lc <= 0x7a/* z */)\n}\n\nexport default function html_inline (state: StateInline, silent: boolean): boolean {\n if (!state.md.options.html) { return false }\n\n // Check start\n const max = state.posMax\n const pos = state.pos\n if (state.src.charCodeAt(pos) !== 0x3C/* < */ ||\n pos + 2 >= max) {\n return false\n }\n\n // Quick fail on second char\n const ch = state.src.charCodeAt(pos + 1)\n if (ch !== 0x21/* ! */ &&\n ch !== 0x3F/* ? */ &&\n ch !== 0x2F/* / */ &&\n !isLetter(ch)) {\n return false\n }\n\n const match = state.src.slice(pos).match(HTML_TAG_RE)\n if (!match) { return false }\n\n if (!silent) {\n const token = state.push('html_inline', '', 0)\n token.content = match[0]\n\n if (isLinkOpen(token.content)) state.linkLevel++\n if (isLinkClose(token.content)) state.linkLevel--\n }\n state.pos += match[0].length\n return true\n}\n","// Process html entity - {, ¯, ", ...\n\nimport { decodeHTMLStrict } from 'entities'\nimport { isValidEntityCode, fromCodePoint } from '../common/utils.ts'\nimport type StateInline from './state_inline.ts'\n\nconst DIGITAL_RE = /^&#((?:x[a-f0-9]{1,6}|[0-9]{1,7}));/i\nconst NAMED_RE = /^&([a-z][a-z0-9]{1,31});/i\n\nexport default function entity (state: StateInline, silent: boolean): boolean {\n const pos = state.pos\n const max = state.posMax\n\n if (state.src.charCodeAt(pos) !== 0x26/* & */) return false\n\n if (pos + 1 >= max) return false\n\n const ch = state.src.charCodeAt(pos + 1)\n\n if (ch === 0x23 /* # */) {\n const match = state.src.slice(pos).match(DIGITAL_RE)\n if (match) {\n if (!silent) {\n const code = match[1][0].toLowerCase() === 'x' ? parseInt(match[1].slice(1), 16) : parseInt(match[1], 10)\n\n const token = state.push('text_special', '', 0)\n token.content = isValidEntityCode(code) ? fromCodePoint(code) : fromCodePoint(0xFFFD)\n token.markup = match[0]\n token.info = 'entity'\n }\n state.pos += match[0].length\n return true\n }\n } else {\n const match = state.src.slice(pos).match(NAMED_RE)\n if (match) {\n const decoded = decodeHTMLStrict(match[0])\n if (decoded !== match[0]) {\n if (!silent) {\n const token = state.push('text_special', '', 0)\n token.content = decoded\n token.markup = match[0]\n token.info = 'entity'\n }\n state.pos += match[0].length\n return true\n }\n }\n }\n\n return false\n}\n","// For each opening emphasis-like marker find a matching closing one\n//\n\nimport type { Delimiter } from '../types.ts'\nimport type StateInline from './state_inline.ts'\n\nfunction processDelimiters (delimiters: Delimiter[]) {\n const openersBottom: Record<number, number[]> = {}\n const max = delimiters.length\n\n if (!max) return\n\n // headerIdx is the first delimiter of the current (where closer is) delimiter run\n let headerIdx = 0\n let lastTokenIdx = -2 // needs any value lower than -1\n const jumps: number[] = []\n\n for (let closerIdx = 0; closerIdx < max; closerIdx++) {\n const closer = delimiters[closerIdx]\n\n jumps.push(0)\n\n // markers belong to same delimiter run if:\n // - they have adjacent tokens\n // - AND markers are the same\n //\n if (delimiters[headerIdx].marker !== closer.marker || lastTokenIdx !== closer.token - 1) {\n headerIdx = closerIdx\n }\n\n lastTokenIdx = closer.token\n\n // Length is only used for emphasis-specific \"rule of 3\",\n // if it's not defined (in strikethrough or 3rd party plugins),\n // we can default it to 0 to disable those checks.\n //\n closer.length = closer.length || 0\n\n if (!closer.close) continue\n\n // Previously calculated lower bounds (previous fails)\n // for each marker, each delimiter length modulo 3,\n // and for whether this closer can be an opener;\n // https://github.com/commonmark/cmark/commit/34250e12ccebdc6372b8b49c44fab57c72443460\n /* eslint-disable-next-line no-prototype-builtins */\n if (!openersBottom.hasOwnProperty(closer.marker)) {\n openersBottom[closer.marker] = [-1, -1, -1, -1, -1, -1]\n }\n\n const minOpenerIdx = openersBottom[closer.marker][(closer.open ? 3 : 0) + (closer.length % 3)]\n\n let openerIdx = headerIdx - jumps[headerIdx] - 1\n\n let newMinOpenerIdx = openerIdx\n\n for (; openerIdx > minOpenerIdx; openerIdx -= jumps[openerIdx] + 1) {\n const opener = delimiters[openerIdx]\n\n if (opener.marker !== closer.marker) continue\n\n if (opener.open && opener.end < 0) {\n let isOddMatch = false\n\n // from spec:\n //\n // If one of the delimiters can both open and close emphasis, then the\n // sum of the lengths of the delimiter runs containing the opening and\n // closing delimiters must not be a multiple of 3 unless both lengths\n // are multiples of 3.\n //\n if (opener.close || closer.open) {\n if ((opener.length! + closer.length) % 3 === 0) {\n if (opener.length! % 3 !== 0 || closer.length % 3 !== 0) {\n isOddMatch = true\n }\n }\n }\n\n if (!isOddMatch) {\n // If previous delimiter cannot be an opener, we can safely skip\n // the entire sequence in future checks. This is required to make\n // sure algorithm has linear complexity (see *_*_*_*_*_... case).\n //\n const lastJump = openerIdx > 0 && !delimiters[openerIdx - 1].open\n ? jumps[openerIdx - 1] + 1\n : 0\n\n jumps[closerIdx] = closerIdx - openerIdx + lastJump\n jumps[openerIdx] = lastJump\n\n closer.open = false\n opener.end = closerIdx\n opener.close = false\n newMinOpenerIdx = -1\n // treat next token as start of run,\n // it optimizes skips in **<...>**a**<...>** pathological case\n lastTokenIdx = -2\n break\n }\n }\n }\n\n if (newMinOpenerIdx !== -1) {\n // If match for this delimiter run failed, we want to set lower bound for\n // future lookups. This is required to make sure algorithm has linear\n // complexity.\n //\n // See details here:\n // https://github.com/commonmark/cmark/issues/178#issuecomment-270417442\n //\n openersBottom[closer.marker][(closer.open ? 3 : 0) + ((closer.length || 0) % 3)] = newMinOpenerIdx\n }\n }\n}\n\nexport default function link_pairs (state: StateInline): void {\n const tokens_meta = state.tokens_meta\n const max = state.tokens_meta.length\n\n processDelimiters(state.delimiters)\n\n for (let curr = 0; curr < max; curr++) {\n const delimiters = tokens_meta[curr]?.delimiters\n if (delimiters) {\n processDelimiters(delimiters)\n }\n }\n}\n","// Clean up tokens after emphasis and strikethrough postprocessing:\n// merge adjacent text nodes into one and re-calculate all token levels\n//\n// This is necessary because initially emphasis delimiter markers (*, _, ~)\n// are treated as their own separate text tokens. Then emphasis rule either\n// leaves them as text (needed to merge with adjacent text) or turns them\n// into opening/closing tags (which messes up levels inside).\n//\n\nimport type StateInline from './state_inline.ts'\n\nexport default function fragments_join (state: StateInline): void {\n let curr, last\n let level = 0\n const tokens = state.tokens\n const max = state.tokens.length\n\n for (curr = last = 0; curr < max; curr++) {\n // re-calculate levels after emphasis/strikethrough turns some text nodes\n // into opening/closing tags\n if (tokens[curr].nesting < 0) level-- // closing tag\n tokens[curr].level = level\n if (tokens[curr].nesting > 0) level++ // opening tag\n\n if (tokens[curr].type === 'text' &&\n curr + 1 < max &&\n tokens[curr + 1].type === 'text') {\n // collapse two adjacent text nodes\n tokens[curr + 1].content = tokens[curr].content + tokens[curr + 1].content\n } else {\n if (curr !== last) { tokens[last] = tokens[curr] }\n\n last++\n }\n }\n\n if (curr !== last) {\n tokens.length = last\n }\n}\n","import Ruler from './ruler.ts'\nimport StateInline from './rules_inline/state_inline.ts'\nimport type Token from './token.ts'\nimport type MarkdownIt from './markdownit.ts'\nimport type { Env } from './types.ts'\n\nimport r_text from './rules_inline/text.ts'\nimport r_linkify from './rules_inline/linkify.ts'\nimport r_newline from './rules_inline/newline.ts'\nimport r_escape from './rules_inline/escape.ts'\nimport r_backticks from './rules_inline/backticks.ts'\nimport r_strikethrough from './rules_inline/strikethrough.ts'\nimport r_emphasis from './rules_inline/emphasis.ts'\nimport r_link from './rules_inline/link.ts'\nimport r_image from './rules_inline/image.ts'\nimport r_autolink from './rules_inline/autolink.ts'\nimport r_html_inline from './rules_inline/html_inline.ts'\nimport r_entity from './rules_inline/entity.ts'\n\nimport r_balance_pairs from './rules_inline/balance_pairs.ts'\nimport r_fragments_join from './rules_inline/fragments_join.ts'\n\n// Parser rules\n\nconst _rules: Array<[\n name: string,\n rule: (state: StateInline, silent: boolean) => boolean\n]> = [\n ['text', r_text],\n ['linkify', r_linkify],\n ['newline', r_newline],\n ['escape', r_escape],\n ['backticks', r_backticks],\n ['strikethrough', r_strikethrough.tokenize],\n ['emphasis', r_emphasis.tokenize],\n ['link', r_link],\n ['image', r_image],\n ['autolink', r_autolink],\n ['html_inline', r_html_inline],\n ['entity', r_entity]\n]\n\n// `rule2` ruleset was created specifically for emphasis/strikethrough\n// post-processing and may be changed in the future.\n//\n// Don't use this for anything except pairs (plugins working with `balance_pairs`).\n//\nconst _rules2: Array<[\n name: string,\n rule: (state: StateInline) => void\n]> = [\n ['balance_pairs', r_balance_pairs],\n ['strikethrough', r_strikethrough.postProcess],\n ['emphasis', r_emphasis.postProcess],\n // rules for pairs separate '**' into its own text tokens, which may be left unused,\n // rule below merges unused segments back with the rest of the text\n ['fragments_join', r_fragments_join]\n]\n\n/**\n * Tokenizes paragraph content.\n */\nclass ParserInline {\n /**\n * {@link Ruler} instance. Keep configuration of inline rules.\n */\n ruler = new Ruler<[StateInline, boolean], boolean>()\n\n /**\n * {@link Ruler} instance. Second ruler used for post-processing\n * (e.g. in emphasis-like rules).\n */\n ruler2 = new Ruler<[StateInline], void>()\n\n State = StateInline\n\n constructor () {\n for (let i = 0; i < _rules.length; i++) {\n this.ruler.push(_rules[i][0], _rules[i][1])\n }\n\n for (let i = 0; i < _rules2.length; i++) {\n this.ruler2.push(_rules2[i][0], _rules2[i][1])\n }\n }\n\n // Skip single token by running all rules in validation mode;\n // returns `true` if any rule reported success\n //\n skipToken (state: StateInline): void {\n const pos = state.pos\n const rules = this.ruler.getRules('')\n const len = rules.length\n const maxNesting = state.md.options.maxNesting\n const cache = state.cache\n\n if (typeof cache[pos] !== 'undefined') {\n state.pos = cache[pos]\n return\n }\n\n let ok = false\n\n if (state.level < maxNesting) {\n for (let i = 0; i < len; i++) {\n // Increment state.level and decrement it later to limit recursion.\n // It's harmless to do here, because no tokens are created. But ideally,\n // we'd need a separate private state variable for this purpose.\n //\n state.level++\n ok = rules[i](state, true)\n state.level--\n\n if (ok) {\n if (pos >= state.pos) { throw new Error(\"inline rule didn't increment state.pos\") }\n break\n }\n }\n } else {\n // Too much nesting, just skip until the end of the paragraph.\n //\n // NOTE: this will cause links to behave incorrectly in the following case,\n // when an amount of `[` is exactly equal to `maxNesting + 1`:\n //\n // [[[[[[[[[[[[[[[[[[[[[foo]()\n //\n // TODO: remove this workaround when CM standard will allow nested links\n // (we can replace it by preventing links from being parsed in\n // validation mode)\n //\n state.pos = state.posMax\n }\n\n if (!ok) { state.pos++ }\n cache[pos] = state.pos\n }\n\n // Generate tokens for input range\n //\n tokenize (state: StateInline): void {\n const rules = this.ruler.getRules('')\n const len = rules.length\n const end = state.posMax\n const maxNesting = state.md.options.maxNesting\n\n while (state.pos < end) {\n // Try all possible rules.\n // On success, rule should:\n //\n // - update `state.pos`\n // - update `state.tokens`\n // - return true\n const prevPos = state.pos\n let ok = false\n\n if (state.level < maxNesting) {\n for (let i = 0; i < len; i++) {\n ok = rules[i](state, false)\n if (ok) {\n if (prevPos >= state.pos) { throw new Error(\"inline rule didn't increment state.pos\") }\n break\n }\n }\n }\n\n if (ok) {\n if (state.pos >= end) { break }\n continue\n }\n\n state.pending += state.src[state.pos++]\n }\n\n if (state.pending) {\n state.pushPending()\n }\n }\n\n /**\n * Process input string and push inline tokens into `outTokens`\n */\n parse (str: string, md: MarkdownIt, env: Env, outTokens: Token[]): void {\n const state = new this.State(str, md, env, outTokens)\n\n this.tokenize(state)\n\n const rules = this.ruler2.getRules('')\n const len = rules.length\n\n for (let i = 0; i < len; i++) {\n rules[i](state)\n }\n }\n}\n\nexport default ParserInline\n","import { Any, Cc, P, Z } from \"uc.micro\";\n//#region src/rebuilder.ts\nvar REBuilder = class {\n\tsrc_Any = Any.source;\n\tsrc_Cc = Cc.source;\n\tsrc_Z = Z.source;\n\tsrc_P = P.source;\n\tsrc_ZPCc = [\n\t\tthis.src_Z,\n\t\tthis.src_P,\n\t\tthis.src_Cc\n\t].join(\"|\");\n\tsrc_ZCc = [this.src_Z, this.src_Cc].join(\"|\");\n\tcache = {};\n\topts = {\n\t\tmaxLength: 1e4,\n\t\turlAuth: false,\n\t\tschema_names: []\n\t};\n\tconstructor(opts = {}) {\n\t\tthis.opts = {\n\t\t\t...this.opts,\n\t\t\t...opts\n\t\t};\n\t}\n\tset(opts = {}) {\n\t\tthis.opts = {\n\t\t\t...this.opts,\n\t\t\t...opts\n\t\t};\n\t\tthis.cache = {};\n\t\treturn this;\n\t}\n\tescapeRE(str) {\n\t\treturn str.replace(/[.?*+^$[\\]\\\\(){}|-]/g, \"\\\\$&\");\n\t}\n\tnestedPairRE(open, close, depth = 4) {\n\t\tconst openRE = this.escapeRE(open);\n\t\tconst closeRE = this.escapeRE(close);\n\t\tconst atom = `(?:(?!${this.src_ZCc}|${openRE}|${closeRE}).)`;\n\t\tlet pair = `${openRE}${atom}{0,1000}${closeRE}`;\n\t\tfor (let level = 2; level <= depth; level++) pair = `${openRE}(?:${atom}|${pair}){0,1000}${closeRE}`;\n\t\treturn pair;\n\t}\n\tget_text_separators() {\n\t\treturn this.cache.text_separators ??= /[><\\uff5c]/;\n\t}\n\tget_pseudo_letter() {\n\t\treturn this.cache.src_pseudo_letter ??= new RegExp(`(?:(?!${this.get_text_separators().source}|${this.src_ZPCc})${this.src_Any})`);\n\t}\n\tget_ipv4_addr() {\n\t\treturn this.cache.src_ip4 ??= /* @__PURE__ */ new RegExp(\"(?:(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])[.]){3}(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\");\n\t}\n\tget_ipv6_addr() {\n\t\tconst h16 = \"[0-9A-Fa-f]{1,4}\";\n\t\tconst ls32 = `(?:(?:${h16}:${h16})|${this.get_ipv4_addr().source})`;\n\t\treturn this.cache.src_ip6_addr ??= new RegExp(`(?:(?:${h16}:){6}${ls32}|::(?:${h16}:){5}${ls32}|(?:${h16})?::(?:${h16}:){4}${ls32}|(?:(?:${h16}:){0,1}${h16})?::(?:${h16}:){3}${ls32}|(?:(?:${h16}:){0,2}${h16})?::(?:${h16}:){2}${ls32}|(?:(?:${h16}:){0,3}${h16})?::${h16}:${ls32}|(?:(?:${h16}:){0,4}${h16})?::${ls32}|(?:(?:${h16}:){0,5}${h16})?::${h16}|(?:(?:${h16}:){0,6}${h16})?::)`);\n\t}\n\tget_ipv6_url_host() {\n\t\treturn this.cache.src_ip6_host ??= new RegExp(`\\\\[${this.get_ipv6_addr().source}\\\\]`);\n\t}\n\tget_ipv6_mail_host() {\n\t\treturn this.cache.src_ipv6_mail_host ??= new RegExp(`\\\\[IPv6:${this.get_ipv6_addr().source}\\\\]`);\n\t}\n\tget_auth() {\n\t\treturn this.cache.src_auth ??= new RegExp(`(?:(?:(?!${this.src_ZCc}|[@/\\\\[\\\\]()]).){1,50}@)?`);\n\t}\n\tget_port() {\n\t\treturn this.cache.src_port ??= /* @__PURE__ */ new RegExp(\"(?::(?:6(?:[0-4]\\\\d{3}|5(?:[0-4]\\\\d{2}|5(?:[0-2]\\\\d|3[0-5])))|[1-5]?\\\\d{1,4}))?\");\n\t}\n\tget_host_terminator() {\n\t\treturn this.cache.src_host_terminator ??= new RegExp(`(?=$|${this.get_text_separators().source}|${this.src_ZPCc})(?!${this.opts[\"---\"] ? \"-(?!--)|\" : \"-|\"}_|:\\\\d|\\\\.-|\\\\.(?!$|${this.src_ZPCc}))`);\n\t}\n\tget_path_terminator() {\n\t\treturn this.cache.src_path_terminator ??= new RegExp(`${this.src_ZPCc}|${this.get_text_separators().source}`);\n\t}\n\tget_path() {\n\t\treturn this.cache.src_path ??= new RegExp(`(?:[/?#](?:${this.nestedPairRE(\"[\", \"]\")}|${this.nestedPairRE(\"(\", \")\")}|${this.nestedPairRE(\"{\", \"}\")}|\\\\\"(?:(?!${this.src_ZCc}|[\"]).){1,100}\\\\\"|\\\\'(?:(?!${this.src_ZCc}|[']).){1,100}\\\\'|\\\\'(?=${this.get_pseudo_letter().source}|[-])|\\\\.{2,20}[:]?[a-zA-Z0-9%/&]|\\\\.(?!${this.src_ZCc}|[.]|$)|` + (this.opts[\"---\"] ? \"\\\\-(?!--(?:[^-]|$))(?:-{0,19})|\" : \"\\\\-{1,20}|\") + `,(?!${this.src_ZCc}|$)|;(?!${this.src_ZCc}|$)|\\\\!{1,20}(?!${this.src_ZCc}|[!]|$)|\\\\?(?!${this.src_ZCc}|[?]|$)|` + this.get_path_extra().source + `[\\\\\\\\/:%@#&=_~*]|(?!${this.get_path_terminator().source}).){1,${this.opts.maxLength}}|\\\\/)?`);\n\t}\n\tget_mail_name() {\n\t\treturn this.cache.src_mail_name ??= /* @__PURE__ */ new RegExp(\"[-!#$%&'*+/=?^_`{|}~a-zA-Z0-9](?:[-!#$%&'*+/=?^_`{|}~a-zA-Z0-9]|[.](?=[-!#$%&'*+/=?^_`{|}~a-zA-Z0-9])){0,63}\");\n\t}\n\tget_xn() {\n\t\treturn this.cache.src_xn ??= /* @__PURE__ */ new RegExp(\"xn--[a-z0-9\\\\-]{1,59}\");\n\t}\n\tget_tld() {\n\t\tif (this.cache.tld) return this.cache.tld;\n\t\tconst tlds_src = [...new Set(this.opts.tlds || [])].sort().reverse().join(\"|\");\n\t\tthis.cache.tld = new RegExp(`${tlds_src || \"$#none#$\"}|${this.get_xn().source}`);\n\t\treturn this.cache.tld;\n\t}\n\tget_domain_root() {\n\t\treturn this.cache.src_domain_root ??= new RegExp(\"(?:\" + this.get_xn().source + `|${this.get_pseudo_letter().source}{1,63})`);\n\t}\n\tget_domain() {\n\t\treturn this.cache.src_domain ??= new RegExp(\"(?:\" + this.get_xn().source + `|(?:${this.get_pseudo_letter().source})|(?:${this.get_pseudo_letter().source}(?:-|${this.get_pseudo_letter().source}){0,61}${this.get_pseudo_letter().source}))`);\n\t}\n\tget_url_host_port() {\n\t\treturn this.cache.url_host_port ??= new RegExp(\"(?:\" + this.get_ipv6_url_host().source + `|(?:(?:(?:${this.get_domain().source})\\\\.){0,10}${this.get_domain().source}))` + this.get_port().source + this.get_host_terminator().source);\n\t}\n\tget_fuzzy_url_host_port() {\n\t\treturn this.cache.fuzzy_url_host_port ??= new RegExp(\"(?:\" + (this.opts.fuzzyIP ? this.get_ipv4_addr().source + \"|\" : \"\") + `(?:(?:(?:${this.get_domain().source})\\\\.){1,10}(?:${this.get_tld().source})))` + this.get_host_terminator().source);\n\t}\n\tget_mail_host() {\n\t\treturn this.cache.src_mail_host ??= new RegExp(\"(?:\" + this.get_ipv6_mail_host().source + `|(?:(?:(?:${this.get_domain().source})\\\\.){0,4}${this.get_domain().source}))` + this.get_host_terminator().source);\n\t}\n\tget_fuzzy_mail_host() {\n\t\treturn this.cache.src_fuzzy_mail_host ??= new RegExp(\"(?:\" + this.get_ipv6_mail_host().source + `|(?:(?:(?:${this.get_domain().source})[.]){1,4}${this.get_domain_root().source}))` + this.get_host_terminator().source);\n\t}\n\tget_path_extra() {\n\t\treturn this.cache.src_path_extra ??= /* @__PURE__ */ new RegExp(\"\");\n\t}\n\tget_fuzzy_mail_host_search() {\n\t\treturn this.cache.mail_fuzzy_host_search ??= new RegExp(`@${this.get_fuzzy_mail_host().source}`, \"ig\");\n\t}\n\tget_fuzzy_link_search() {\n\t\treturn this.cache.link_fuzzy_search ??= new RegExp(`(^|(?![.:/\\\\-_@])(?:[$+<=>^\\`|\\uff5c]|${this.src_ZPCc}))(?:(?![$+<=>^\\`|\\uff5c])${this.get_fuzzy_url_host_port().source}${this.get_path().source})`, \"ig\");\n\t}\n\tget_http_validator() {\n\t\treturn this.cache.http_validator ??= new RegExp(\"\\\\/\\\\/\" + (this.opts.urlAuth ? this.get_auth().source : \"\") + this.get_url_host_port().source + this.get_path().source, \"iy\");\n\t}\n\tget_relative_proto_validator() {\n\t\treturn this.cache.relative_proto_validator ??= new RegExp((this.opts.urlAuth ? this.get_auth().source : \"\") + `(?:localhost|${this.get_ipv6_url_host().source}|(?:(?:${this.get_domain().source})[.]){1,10}${this.get_domain_root().source})` + this.get_port().source + this.get_host_terminator().source + this.get_path().source, \"iy\");\n\t}\n\tget_mail_name_validator() {\n\t\treturn this.cache.mail_name_validator ??= new RegExp(`(?:^|${this.get_text_separators().source}|\"|\\\\(|${this.src_ZCc})(${this.get_mail_name().source})$`);\n\t}\n\tget_mailto_validator() {\n\t\treturn this.cache.mailto_validator ??= new RegExp(`${this.get_mail_name().source}@${this.get_mail_host().source}`, \"iy\");\n\t}\n\tget_schema_names() {\n\t\treturn this.cache.schema_names ??= new RegExp((this.opts.schema_names || []).map((name) => this.escapeRE(name)).join(\"|\"));\n\t}\n\tget_schema_search() {\n\t\treturn this.cache.schema_search ??= new RegExp(`(^|(?!_)(?:[><\\uff5c]|${this.src_ZPCc}))(${this.get_schema_names().source})`, \"ig\");\n\t}\n\tget_schema_at_start() {\n\t\treturn this.cache.schema_at_start ??= new RegExp(`^${this.get_schema_search().source}`, \"i\");\n\t}\n};\n//#endregion\n//#region src/linkifyit.ts\nvar web_schema = {\n\tvalidate: (text, pos, self) => {\n\t\tconst re = self.re.get_http_validator();\n\t\tre.lastIndex = pos;\n\t\tconst m = re.exec(text);\n\t\treturn m ? m[0].length : 0;\n\t},\n\tnormalize: (match, self) => self.normalize(match)\n};\nvar defaultSchemas = {\n\t\"http:\": web_schema,\n\t\"https:\": web_schema,\n\t\"ftp:\": web_schema,\n\t\"//\": {\n\t\tvalidate: function(text, pos, self) {\n\t\t\tconst re = self.re.get_relative_proto_validator();\n\t\t\tre.lastIndex = pos;\n\t\t\tconst m = re.exec(text);\n\t\t\tif (m) {\n\t\t\t\tif (pos >= 3 && text[pos - 3] === \":\") return 0;\n\t\t\t\tif (pos >= 3 && text[pos - 3] === \"/\") return 0;\n\t\t\t\treturn m[0].length;\n\t\t\t}\n\t\t\treturn 0;\n\t\t},\n\t\tnormalize: (match, self) => self.normalize(match)\n\t},\n\t\"mailto:\": {\n\t\tvalidate: function(text, pos, self) {\n\t\t\tconst re = self.re.get_mailto_validator();\n\t\t\tre.lastIndex = pos;\n\t\t\tconst m = re.exec(text);\n\t\t\treturn m ? m[0].length : 0;\n\t\t},\n\t\tnormalize: (match, self) => self.normalize(match)\n\t}\n};\nvar tlds_2ch = \"a:cdefgilmnoqrstuwxz|b:abdefghijmnorstvwyz|c:acdfghiklmnoruvwxyz|d:ejkmoz|e:cegrstu|f:ijkmor|g:abdefghilmnpqrstuwy|h:kmnrtu|i:delmnoqrst|j:emop|k:eghimnprwyz|l:abcikrstuvy|m:acdeghklmnopqrstuvwxyz|n:acefgilopruz|o:m|p:aefghklmnrstwy|q:a|r:eosuw|s:abcdeghijklmnortuvxyz|t:cdfghjklmnortvwz|u:agksyz|v:aceginu|w:fs|y:et|z:amw\";\nvar tlds_default = \"biz|com|edu|gov|net|org|pro|web|xxx|aero|asia|coop|info|museum|name|shop|рф\";\nfunction unpackTlds() {\n\tconst result = tlds_default.split(\"|\");\n\ttlds_2ch.split(\"|\").forEach((item) => {\n\t\tconst sep = item.indexOf(\":\");\n\t\tconst prefix = item.slice(0, sep);\n\t\tfor (const suffix of item.slice(sep + 1)) result.push(prefix + suffix);\n\t});\n\treturn result;\n}\nvar defaultOptions = {\n\tfuzzyLink: false,\n\tfuzzyEmail: true,\n\tfuzzyIP: false,\n\t\"---\": false,\n\ttlds: unpackTlds(),\n\turlAuth: false,\n\tmaxLength: 1e4\n};\n/**\n* Match result returned by {@link LinkifyIt.match} and\n* {@link LinkifyIt.matchAtStart}.\n*\n* @category types\n*/\nvar Match = class {\n\t/** Prefix (protocol) for matched string. Empty for fuzzy links. */\n\tschema;\n\t/** First position of matched string. */\n\tindex;\n\t/** Next position after matched string. */\n\tlastIndex;\n\t/** Matched string. */\n\traw;\n\t/** Normalized text of matched string. */\n\ttext;\n\t/** Normalized URL of matched string. */\n\turl;\n\tconstructor(text, schema, index, lastIndex) {\n\t\tconst raw = text.slice(index, lastIndex);\n\t\tthis.schema = schema.toLowerCase();\n\t\tthis.index = index;\n\t\tthis.lastIndex = lastIndex;\n\t\tthis.raw = raw;\n\t\tthis.text = raw;\n\t\tthis.url = raw;\n\t}\n};\n/** Linkifier instance. */\nvar LinkifyIt = class {\n\t__opts__;\n\t__schemas__;\n\tre;\n\t/**\n\t* Creates new linkifier instance.\n\t*\n\t* By default understands:\n\t*\n\t* - `http(s)://...` , `ftp://...`, `mailto:...` & `//...` links\n\t* - \"fuzzy\" emails (foo@bar.com).\n\t*\n\t* See {@link LinkifyConstructorOptions} for available options.\n\t*\n\t* @param options Recognition options.\n\t*\n\t* @example\n\t* ```javascript\n\t* import { LinkifyIt } from 'linkify-it'\n\t*\n\t* const linkify = new LinkifyIt({ fuzzyLink: true })\n\t*\n\t* linkify\n\t* .tlds(require('tlds')) // Reload with full TLD list\n\t* .tlds('onion', true) // Add unofficial `.onion` domain\n\t* .add('ftp:', null) // Disable `ftp:` protocol\n\t* .set({ fuzzyIP: true }) // Enable IPs in fuzzy links\n\t*\n\t* console.log(linkify.test('Site github.com!')) // true\n\t* console.log(linkify.match('Site github.com!'))\n\t* ```\n\t*/\n\tconstructor(options = {}) {\n\t\tconst { rebuilder, ...linkifyOptions } = options;\n\t\tthis.__opts__ = {\n\t\t\t...defaultOptions,\n\t\t\t...linkifyOptions\n\t\t};\n\t\tthis.__schemas__ = { ...defaultSchemas };\n\t\tthis.re = rebuilder || new REBuilder();\n\t\tthis.re.set({\n\t\t\t...this.__opts__,\n\t\t\tschema_names: Object.keys(this.__schemas__)\n\t\t});\n\t}\n\t/**\n\t* Add new rule definition.\n\t*\n\t* `schema` is a link prefix (usually, protocol name with `:` at the end,\n\t* `skype:` for example). `linkify-it` makes sure that prefix is not\n\t* preceded with alphanumeric char and symbols. Only whitespaces and\n\t* punctuation allowed.\n\t*\n\t* `definition` is a rule to check tail after link prefix. To disable an\n\t* existing rule, pass `null`.\n\t*\n\t* @param schema Rule name (fixed pattern prefix).\n\t* @param definition Schema definition, or `null` to disable the rule.\n\t*\n\t* See [twitter mentions example](https://github.com/markdown-it/linkify-it/blob/master/examples/twitter.mjs).\n\t*/\n\tadd(schema, definition = null) {\n\t\tif (!definition) delete this.__schemas__[schema];\n\t\telse {\n\t\t\tconst def = {\n\t\t\t\tnormalize: (match, self) => self.normalize(match),\n\t\t\t\t...definition\n\t\t\t};\n\t\t\tthis.__schemas__[schema] = def;\n\t\t}\n\t\tthis.re.set({\n\t\t\t...this.__opts__,\n\t\t\tschema_names: Object.keys(this.__schemas__)\n\t\t});\n\t\treturn this;\n\t}\n\t/**\n\t* Set recognition options for links without schema.\n\t*\n\t* @param options Recognition options.\n\t*/\n\tset(options = {}) {\n\t\tthis.__opts__ = {\n\t\t\t...this.__opts__,\n\t\t\t...options\n\t\t};\n\t\tthis.re.set({\n\t\t\t...this.__opts__,\n\t\t\tschema_names: Object.keys(this.__schemas__)\n\t\t});\n\t\treturn this;\n\t}\n\t/**\n\t* Searches linkifiable pattern and returns `true` on success or `false` on fail.\n\t*\n\t* @param text Text to scan.\n\t*/\n\ttest(text) {\n\t\tif (!text.length) return false;\n\t\tlet m, re;\n\t\tre = this.re.get_schema_search();\n\t\tre.lastIndex = 0;\n\t\twhile ((m = re.exec(text)) !== null) if (this.testSchemaAt(text, m[2], re.lastIndex)) return true;\n\t\tif (this.__opts__.fuzzyLink && this.__schemas__[\"http:\"]) {\n\t\t\tre = this.re.get_fuzzy_link_search();\n\t\t\tre.lastIndex = 0;\n\t\t\tif (re.exec(text) !== null) return true;\n\t\t}\n\t\tif (this.__opts__.fuzzyEmail && this.__schemas__[\"mailto:\"]) {\n\t\t\tif (text.indexOf(\"@\") >= 0) {\n\t\t\t\tconst mailHostRe = this.re.get_fuzzy_mail_host_search();\n\t\t\t\tconst mailNameRe = this.re.get_mail_name_validator();\n\t\t\t\tmailHostRe.lastIndex = 0;\n\t\t\t\twhile ((m = mailHostRe.exec(text)) !== null) {\n\t\t\t\t\tconst name = text.slice(Math.max(0, m.index - 65), m.index);\n\t\t\t\t\tif (mailNameRe.test(name)) return true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\t/**\n\t* Similar to {@link LinkifyIt.test} but checks only specific protocol tail exactly\n\t* at given position. Returns length of found pattern (0 on fail).\n\t*\n\t* @param text Text to scan.\n\t* @param schema Rule (schema) name.\n\t* @param pos Text offset to check from.\n\t*/\n\ttestSchemaAt(text, schema, pos) {\n\t\tif (!this.__schemas__[schema.toLowerCase()]) return 0;\n\t\treturn this.__schemas__[schema.toLowerCase()].validate(text.slice(0, pos + this.__opts__.maxLength), pos, this);\n\t}\n\t/**\n\t* Returns array of found link descriptions or `null` on fail. We strongly\n\t* recommend to use {@link LinkifyIt.test} first, for best speed.\n\t*\n\t* @param text Text to scan.\n\t*/\n\tmatch(text) {\n\t\tconst result = [];\n\t\tconst schemaRe = this.re.get_schema_search();\n\t\tlet fuzzyLinkRe;\n\t\tlet mailHostRe;\n\t\tlet mailNameRe;\n\t\tlet fuzzyLinkCandidate;\n\t\tlet fuzzyEmailCandidate;\n\t\tlet schemaPrefix;\n\t\tlet schemaDone = false;\n\t\tlet fuzzyLinkDone = false;\n\t\tlet fuzzyEmailDone = false;\n\t\tlet pos = 0;\n\t\tif (!text.length) return null;\n\t\tschemaRe.lastIndex = 0;\n\t\tif (this.__opts__.fuzzyLink && this.__schemas__[\"http:\"]) {\n\t\t\tfuzzyLinkRe = this.re.get_fuzzy_link_search();\n\t\t\tfuzzyLinkRe.lastIndex = 0;\n\t\t}\n\t\tif (this.__opts__.fuzzyEmail && this.__schemas__[\"mailto:\"]) {\n\t\t\tmailHostRe = this.re.get_fuzzy_mail_host_search();\n\t\t\tmailHostRe.lastIndex = 0;\n\t\t\tmailNameRe = this.re.get_mail_name_validator();\n\t\t}\n\t\tfor (;;) {\n\t\t\tconst scanFrom = Math.max(pos - 1, 0);\n\t\t\tif (mailHostRe && mailNameRe && !fuzzyEmailDone && (!fuzzyEmailCandidate || fuzzyEmailCandidate.index < pos)) {\n\t\t\t\tif (mailHostRe.lastIndex < scanFrom) mailHostRe.lastIndex = scanFrom;\n\t\t\t\tfor (;;) {\n\t\t\t\t\tconst m = mailHostRe.exec(text);\n\t\t\t\t\tif (!m) {\n\t\t\t\t\t\tfuzzyEmailDone = true;\n\t\t\t\t\t\tfuzzyEmailCandidate = void 0;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tconst name = mailNameRe.exec(text.slice(Math.max(0, m.index - 65), m.index));\n\t\t\t\t\tif (!name) continue;\n\t\t\t\t\tfuzzyEmailCandidate = {\n\t\t\t\t\t\tschema: \"mailto:\",\n\t\t\t\t\t\tindex: m.index - name[1].length,\n\t\t\t\t\t\tlastIndex: m.index + m[0].length\n\t\t\t\t\t};\n\t\t\t\t\tif (fuzzyEmailCandidate.index >= pos) break;\n\t\t\t\t\tif (mailHostRe.lastIndex < scanFrom) mailHostRe.lastIndex = scanFrom;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (fuzzyLinkRe && !fuzzyLinkDone && (!fuzzyLinkCandidate || fuzzyLinkCandidate.index < pos)) {\n\t\t\t\tif (fuzzyLinkRe.lastIndex < scanFrom) fuzzyLinkRe.lastIndex = scanFrom;\n\t\t\t\tfor (;;) {\n\t\t\t\t\tconst m = fuzzyLinkRe.exec(text);\n\t\t\t\t\tif (!m) {\n\t\t\t\t\t\tfuzzyLinkDone = true;\n\t\t\t\t\t\tfuzzyLinkCandidate = void 0;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tfuzzyLinkCandidate = {\n\t\t\t\t\t\tschema: \"\",\n\t\t\t\t\t\tindex: m.index + m[1].length,\n\t\t\t\t\t\tlastIndex: m.index + m[0].length\n\t\t\t\t\t};\n\t\t\t\t\tif (fuzzyLinkCandidate.index >= pos) break;\n\t\t\t\t\tif (fuzzyLinkRe.lastIndex < scanFrom) fuzzyLinkRe.lastIndex = scanFrom;\n\t\t\t\t}\n\t\t\t}\n\t\t\tlet fuzzyCandidate = fuzzyEmailCandidate;\n\t\t\tif (!fuzzyCandidate || fuzzyLinkCandidate && (fuzzyLinkCandidate.index < fuzzyCandidate.index || fuzzyLinkCandidate.index === fuzzyCandidate.index && fuzzyLinkCandidate.lastIndex > fuzzyCandidate.lastIndex)) fuzzyCandidate = fuzzyLinkCandidate;\n\t\t\tlet schemaCandidate;\n\t\t\tif (!schemaDone) for (;;) {\n\t\t\t\tif (!schemaPrefix) {\n\t\t\t\t\tif (schemaRe.lastIndex < scanFrom) schemaRe.lastIndex = scanFrom;\n\t\t\t\t\tconst m = schemaRe.exec(text);\n\t\t\t\t\tif (!m) {\n\t\t\t\t\t\tschemaDone = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tschemaPrefix = {\n\t\t\t\t\t\tschema: m[2],\n\t\t\t\t\t\tindex: m.index + m[1].length,\n\t\t\t\t\t\tlastIndex: m.index + m[0].length\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tif (schemaPrefix.index < pos) {\n\t\t\t\t\tschemaPrefix = void 0;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (fuzzyCandidate && schemaPrefix.index > fuzzyCandidate.index) break;\n\t\t\t\tconst prefix = schemaPrefix;\n\t\t\t\tschemaPrefix = void 0;\n\t\t\t\tconst len = this.testSchemaAt(text, prefix.schema, prefix.lastIndex);\n\t\t\t\tif (len) {\n\t\t\t\t\tschemaCandidate = {\n\t\t\t\t\t\tschema: prefix.schema,\n\t\t\t\t\t\tindex: prefix.index,\n\t\t\t\t\t\tlastIndex: prefix.lastIndex + len\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tlet candidate = schemaCandidate;\n\t\t\tif (!candidate || fuzzyEmailCandidate && (fuzzyEmailCandidate.index < candidate.index || fuzzyEmailCandidate.index === candidate.index && fuzzyEmailCandidate.lastIndex > candidate.lastIndex)) candidate = fuzzyEmailCandidate;\n\t\t\tif (!candidate || fuzzyLinkCandidate && (fuzzyLinkCandidate.index < candidate.index || fuzzyLinkCandidate.index === candidate.index && fuzzyLinkCandidate.lastIndex > candidate.lastIndex)) candidate = fuzzyLinkCandidate;\n\t\t\tif (!candidate) break;\n\t\t\tif (candidate === fuzzyEmailCandidate) fuzzyEmailCandidate = void 0;\n\t\t\telse if (candidate === fuzzyLinkCandidate) fuzzyLinkCandidate = void 0;\n\t\t\tconst match = new Match(text, candidate.schema, candidate.index, candidate.lastIndex);\n\t\t\tif (match.schema) this.__schemas__[match.schema].normalize(match, this);\n\t\t\telse this.normalize(match);\n\t\t\tresult.push(match);\n\t\t\tpos = candidate.lastIndex;\n\t\t}\n\t\tif (result.length) return result;\n\t\treturn null;\n\t}\n\t/**\n\t* Returns fully-formed (not fuzzy) link if it starts at the beginning\n\t* of the string, and null otherwise.\n\t*\n\t* @param text Text to scan.\n\t*/\n\tmatchAtStart(text) {\n\t\tif (!text.length) return null;\n\t\tconst m = this.re.get_schema_at_start().exec(text);\n\t\tif (!m) return null;\n\t\tconst len = this.testSchemaAt(text, m[2], m[0].length);\n\t\tif (!len) return null;\n\t\tconst match = new Match(text, m[2], m.index + m[1].length, m.index + m[0].length + len);\n\t\tthis.__schemas__[match.schema].normalize(match, this);\n\t\treturn match;\n\t}\n\t/**\n\t* Load (or merge) new TLDs list. Those are used for fuzzy links (without\n\t* prefix) to avoid false positives. By default this algorithm is used:\n\t*\n\t* - hostname with any 2-letter root zones are ok.\n\t* - biz|com|edu|gov|net|org|pro|web|xxx|aero|asia|coop|info|museum|name|shop|рф\n\t* are ok.\n\t* - encoded (`xn--...`) root zones are ok.\n\t*\n\t* If list is replaced, then exact match for 2-chars root zones will be checked.\n\t*\n\t* @param list List of TLDs.\n\t* @param keepOld Merge with current list if `true` (`false` by default).\n\t*/\n\ttlds(list, keepOld = false) {\n\t\tlist = Array.isArray(list) ? list : [list];\n\t\tif (!keepOld) this.__opts__.tlds = list;\n\t\telse this.__opts__.tlds = this.__opts__.tlds.concat(list);\n\t\tthis.re.set({\n\t\t\t...this.__opts__,\n\t\t\tschema_names: Object.keys(this.__schemas__)\n\t\t});\n\t\treturn this;\n\t}\n\t/**\n\t* Default normalizer (if schema does not define its own).\n\t*\n\t* @param match Match to normalize.\n\t*/\n\tnormalize(match) {\n\t\tif (!match.schema) match.url = `http://${match.url}`;\n\t\tif (match.schema === \"mailto:\" && !/^mailto:/i.test(match.url)) match.url = `mailto:${match.url}`;\n\t}\n};\nfunction linkifyit(options = {}) {\n\treturn new LinkifyIt(options);\n}\n//#endregion\nexport { LinkifyIt, REBuilder, linkifyit };\n\n//# sourceMappingURL=index.mjs.map","'use strict';\n\n/** Highest positive signed 32-bit float value */\nconst maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1\n\n/** Bootstring parameters */\nconst base = 36;\nconst tMin = 1;\nconst tMax = 26;\nconst skew = 38;\nconst damp = 700;\nconst initialBias = 72;\nconst initialN = 128; // 0x80\nconst delimiter = '-'; // '\\x2D'\n\n/** Regular expressions */\nconst regexPunycode = /^xn--/;\nconst regexNonASCII = /[^\\0-\\x7F]/; // Note: U+007F DEL is excluded too.\nconst regexSeparators = /[\\x2E\\u3002\\uFF0E\\uFF61]/g; // RFC 3490 separators\n\n/** Error messages */\nconst errors = {\n\t'overflow': 'Overflow: input needs wider integers to process',\n\t'not-basic': 'Illegal input >= 0x80 (not a basic code point)',\n\t'invalid-input': 'Invalid input'\n};\n\n/** Convenience shortcuts */\nconst baseMinusTMin = base - tMin;\nconst floor = Math.floor;\nconst stringFromCharCode = String.fromCharCode;\n\n/*--------------------------------------------------------------------------*/\n\n/**\n * A generic error utility function.\n * @private\n * @param {String} type The error type.\n * @returns {Error} Throws a `RangeError` with the applicable error message.\n */\nfunction error(type) {\n\tthrow new RangeError(errors[type]);\n}\n\n/**\n * A generic `Array#map` utility function.\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} callback The function that gets called for every array\n * item.\n * @returns {Array} A new array of values returned by the callback function.\n */\nfunction map(array, callback) {\n\tconst result = [];\n\tlet length = array.length;\n\twhile (length--) {\n\t\tresult[length] = callback(array[length]);\n\t}\n\treturn result;\n}\n\n/**\n * A simple `Array#map`-like wrapper to work with domain name strings or email\n * addresses.\n * @private\n * @param {String} domain The domain name or email address.\n * @param {Function} callback The function that gets called for every\n * character.\n * @returns {String} A new string of characters returned by the callback\n * function.\n */\nfunction mapDomain(domain, callback) {\n\tconst parts = domain.split('@');\n\tlet result = '';\n\tif (parts.length > 1) {\n\t\t// In email addresses, only the domain name should be punycoded. Leave\n\t\t// the local part (i.e. everything up to `@`) intact.\n\t\tresult = parts[0] + '@';\n\t\tdomain = parts[1];\n\t}\n\t// Avoid `split(regex)` for IE8 compatibility. See #17.\n\tdomain = domain.replace(regexSeparators, '\\x2E');\n\tconst labels = domain.split('.');\n\tconst encoded = map(labels, callback).join('.');\n\treturn result + encoded;\n}\n\n/**\n * Creates an array containing the numeric code points of each Unicode\n * character in the string. While JavaScript uses UCS-2 internally,\n * this function will convert a pair of surrogate halves (each of which\n * UCS-2 exposes as separate characters) into a single code point,\n * matching UTF-16.\n * @see `punycode.ucs2.encode`\n * @see <https://mathiasbynens.be/notes/javascript-encoding>\n * @memberOf punycode.ucs2\n * @name decode\n * @param {String} string The Unicode input string (UCS-2).\n * @returns {Array} The new array of code points.\n */\nfunction ucs2decode(string) {\n\tconst output = [];\n\tlet counter = 0;\n\tconst length = string.length;\n\twhile (counter < length) {\n\t\tconst value = string.charCodeAt(counter++);\n\t\tif (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n\t\t\t// It's a high surrogate, and there is a next character.\n\t\t\tconst extra = string.charCodeAt(counter++);\n\t\t\tif ((extra & 0xFC00) == 0xDC00) { // Low surrogate.\n\t\t\t\toutput.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n\t\t\t} else {\n\t\t\t\t// It's an unmatched surrogate; only append this code unit, in case the\n\t\t\t\t// next code unit is the high surrogate of a surrogate pair.\n\t\t\t\toutput.push(value);\n\t\t\t\tcounter--;\n\t\t\t}\n\t\t} else {\n\t\t\toutput.push(value);\n\t\t}\n\t}\n\treturn output;\n}\n\n/**\n * Creates a string based on an array of numeric code points.\n * @see `punycode.ucs2.decode`\n * @memberOf punycode.ucs2\n * @name encode\n * @param {Array} codePoints The array of numeric code points.\n * @returns {String} The new Unicode string (UCS-2).\n */\nconst ucs2encode = codePoints => String.fromCodePoint(...codePoints);\n\n/**\n * Converts a basic code point into a digit/integer.\n * @see `digitToBasic()`\n * @private\n * @param {Number} codePoint The basic numeric code point value.\n * @returns {Number} The numeric value of a basic code point (for use in\n * representing integers) in the range `0` to `base - 1`, or `base` if\n * the code point does not represent a value.\n */\nconst basicToDigit = function(codePoint) {\n\tif (codePoint >= 0x30 && codePoint < 0x3A) {\n\t\treturn 26 + (codePoint - 0x30);\n\t}\n\tif (codePoint >= 0x41 && codePoint < 0x5B) {\n\t\treturn codePoint - 0x41;\n\t}\n\tif (codePoint >= 0x61 && codePoint < 0x7B) {\n\t\treturn codePoint - 0x61;\n\t}\n\treturn base;\n};\n\n/**\n * Converts a digit/integer into a basic code point.\n * @see `basicToDigit()`\n * @private\n * @param {Number} digit The numeric value of a basic code point.\n * @returns {Number} The basic code point whose value (when used for\n * representing integers) is `digit`, which needs to be in the range\n * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is\n * used; else, the lowercase form is used. The behavior is undefined\n * if `flag` is non-zero and `digit` has no uppercase form.\n */\nconst digitToBasic = function(digit, flag) {\n\t// 0..25 map to ASCII a..z or A..Z\n\t// 26..35 map to ASCII 0..9\n\treturn digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);\n};\n\n/**\n * Bias adaptation function as per section 3.4 of RFC 3492.\n * https://tools.ietf.org/html/rfc3492#section-3.4\n * @private\n */\nconst adapt = function(delta, numPoints, firstTime) {\n\tlet k = 0;\n\tdelta = firstTime ? floor(delta / damp) : delta >> 1;\n\tdelta += floor(delta / numPoints);\n\tfor (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) {\n\t\tdelta = floor(delta / baseMinusTMin);\n\t}\n\treturn floor(k + (baseMinusTMin + 1) * delta / (delta + skew));\n};\n\n/**\n * Converts a Punycode string of ASCII-only symbols to a string of Unicode\n * symbols.\n * @memberOf punycode\n * @param {String} input The Punycode string of ASCII-only symbols.\n * @returns {String} The resulting string of Unicode symbols.\n */\nconst decode = function(input) {\n\t// Don't use UCS-2.\n\tconst output = [];\n\tconst inputLength = input.length;\n\tlet i = 0;\n\tlet n = initialN;\n\tlet bias = initialBias;\n\n\t// Handle the basic code points: let `basic` be the number of input code\n\t// points before the last delimiter, or `0` if there is none, then copy\n\t// the first basic code points to the output.\n\n\tlet basic = input.lastIndexOf(delimiter);\n\tif (basic < 0) {\n\t\tbasic = 0;\n\t}\n\n\tfor (let j = 0; j < basic; ++j) {\n\t\t// if it's not a basic code point\n\t\tif (input.charCodeAt(j) >= 0x80) {\n\t\t\terror('not-basic');\n\t\t}\n\t\toutput.push(input.charCodeAt(j));\n\t}\n\n\t// Main decoding loop: start just after the last delimiter if any basic code\n\t// points were copied; start at the beginning otherwise.\n\n\tfor (let index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) {\n\n\t\t// `index` is the index of the next character to be consumed.\n\t\t// Decode a generalized variable-length integer into `delta`,\n\t\t// which gets added to `i`. The overflow checking is easier\n\t\t// if we increase `i` as we go, then subtract off its starting\n\t\t// value at the end to obtain `delta`.\n\t\tconst oldi = i;\n\t\tfor (let w = 1, k = base; /* no condition */; k += base) {\n\n\t\t\tif (index >= inputLength) {\n\t\t\t\terror('invalid-input');\n\t\t\t}\n\n\t\t\tconst digit = basicToDigit(input.charCodeAt(index++));\n\n\t\t\tif (digit >= base) {\n\t\t\t\terror('invalid-input');\n\t\t\t}\n\t\t\tif (digit > floor((maxInt - i) / w)) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\n\t\t\ti += digit * w;\n\t\t\tconst t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n\n\t\t\tif (digit < t) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tconst baseMinusT = base - t;\n\t\t\tif (w > floor(maxInt / baseMinusT)) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\n\t\t\tw *= baseMinusT;\n\n\t\t}\n\n\t\tconst out = output.length + 1;\n\t\tbias = adapt(i - oldi, out, oldi == 0);\n\n\t\t// `i` was supposed to wrap around from `out` to `0`,\n\t\t// incrementing `n` each time, so we'll fix that now:\n\t\tif (floor(i / out) > maxInt - n) {\n\t\t\terror('overflow');\n\t\t}\n\n\t\tn += floor(i / out);\n\t\ti %= out;\n\n\t\t// Insert `n` at position `i` of the output.\n\t\toutput.splice(i++, 0, n);\n\n\t}\n\n\treturn String.fromCodePoint(...output);\n};\n\n/**\n * Converts a string of Unicode symbols (e.g. a domain name label) to a\n * Punycode string of ASCII-only symbols.\n * @memberOf punycode\n * @param {String} input The string of Unicode symbols.\n * @returns {String} The resulting Punycode string of ASCII-only symbols.\n */\nconst encode = function(input) {\n\tconst output = [];\n\n\t// Convert the input in UCS-2 to an array of Unicode code points.\n\tinput = ucs2decode(input);\n\n\t// Cache the length.\n\tconst inputLength = input.length;\n\n\t// Initialize the state.\n\tlet n = initialN;\n\tlet delta = 0;\n\tlet bias = initialBias;\n\n\t// Handle the basic code points.\n\tfor (const currentValue of input) {\n\t\tif (currentValue < 0x80) {\n\t\t\toutput.push(stringFromCharCode(currentValue));\n\t\t}\n\t}\n\n\tconst basicLength = output.length;\n\tlet handledCPCount = basicLength;\n\n\t// `handledCPCount` is the number of code points that have been handled;\n\t// `basicLength` is the number of basic code points.\n\n\t// Finish the basic string with a delimiter unless it's empty.\n\tif (basicLength) {\n\t\toutput.push(delimiter);\n\t}\n\n\t// Main encoding loop:\n\twhile (handledCPCount < inputLength) {\n\n\t\t// All non-basic code points < n have been handled already. Find the next\n\t\t// larger one:\n\t\tlet m = maxInt;\n\t\tfor (const currentValue of input) {\n\t\t\tif (currentValue >= n && currentValue < m) {\n\t\t\t\tm = currentValue;\n\t\t\t}\n\t\t}\n\n\t\t// Increase `delta` enough to advance the decoder's <n,i> state to <m,0>,\n\t\t// but guard against overflow.\n\t\tconst handledCPCountPlusOne = handledCPCount + 1;\n\t\tif (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {\n\t\t\terror('overflow');\n\t\t}\n\n\t\tdelta += (m - n) * handledCPCountPlusOne;\n\t\tn = m;\n\n\t\tfor (const currentValue of input) {\n\t\t\tif (currentValue < n && ++delta > maxInt) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\t\t\tif (currentValue === n) {\n\t\t\t\t// Represent delta as a generalized variable-length integer.\n\t\t\t\tlet q = delta;\n\t\t\t\tfor (let k = base; /* no condition */; k += base) {\n\t\t\t\t\tconst t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n\t\t\t\t\tif (q < t) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tconst qMinusT = q - t;\n\t\t\t\t\tconst baseMinusT = base - t;\n\t\t\t\t\toutput.push(\n\t\t\t\t\t\tstringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0))\n\t\t\t\t\t);\n\t\t\t\t\tq = floor(qMinusT / baseMinusT);\n\t\t\t\t}\n\n\t\t\t\toutput.push(stringFromCharCode(digitToBasic(q, 0)));\n\t\t\t\tbias = adapt(delta, handledCPCountPlusOne, handledCPCount === basicLength);\n\t\t\t\tdelta = 0;\n\t\t\t\t++handledCPCount;\n\t\t\t}\n\t\t}\n\n\t\t++delta;\n\t\t++n;\n\n\t}\n\treturn output.join('');\n};\n\n/**\n * Converts a Punycode string representing a domain name or an email address\n * to Unicode. Only the Punycoded parts of the input will be converted, i.e.\n * it doesn't matter if you call it on a string that has already been\n * converted to Unicode.\n * @memberOf punycode\n * @param {String} input The Punycoded domain name or email address to\n * convert to Unicode.\n * @returns {String} The Unicode representation of the given Punycode\n * string.\n */\nconst toUnicode = function(input) {\n\treturn mapDomain(input, function(string) {\n\t\treturn regexPunycode.test(string)\n\t\t\t? decode(string.slice(4).toLowerCase())\n\t\t\t: string;\n\t});\n};\n\n/**\n * Converts a Unicode string representing a domain name or an email address to\n * Punycode. Only the non-ASCII parts of the domain name will be converted,\n * i.e. it doesn't matter if you call it with a domain that's already in\n * ASCII.\n * @memberOf punycode\n * @param {String} input The domain name or email address to convert, as a\n * Unicode string.\n * @returns {String} The Punycode representation of the given domain name or\n * email address.\n */\nconst toASCII = function(input) {\n\treturn mapDomain(input, function(string) {\n\t\treturn regexNonASCII.test(string)\n\t\t\t? 'xn--' + encode(string)\n\t\t\t: string;\n\t});\n};\n\n/*--------------------------------------------------------------------------*/\n\n/** Define the public API */\nconst punycode = {\n\t/**\n\t * A string representing the current Punycode.js version number.\n\t * @memberOf punycode\n\t * @type String\n\t */\n\t'version': '2.3.1',\n\t/**\n\t * An object of methods to convert from JavaScript's internal character\n\t * representation (UCS-2) to Unicode code points, and back.\n\t * @see <https://mathiasbynens.be/notes/javascript-encoding>\n\t * @memberOf punycode\n\t * @type Object\n\t */\n\t'ucs2': {\n\t\t'decode': ucs2decode,\n\t\t'encode': ucs2encode\n\t},\n\t'decode': decode,\n\t'encode': encode,\n\t'toASCII': toASCII,\n\t'toUnicode': toUnicode\n};\n\nexport { ucs2decode, ucs2encode, decode, encode, toASCII, toUnicode };\nexport default punycode;\n","// markdown-it default options\n\nimport type { MarkdownItOptions } from '../types.ts'\n\nconst options: Required<MarkdownItOptions> = {\n // Enable HTML tags in source\n html: false,\n\n // Use '/' to close single tags (<br />)\n xhtmlOut: false,\n\n // Convert '\\n' in paragraphs into <br>\n breaks: false,\n\n // CSS language prefix for fenced blocks\n langPrefix: 'language-',\n\n // autoconvert URL-like texts to links\n linkify: false,\n\n // Enable some language-neutral replacements + quotes beautification\n typographer: false,\n\n // Double + single quotes replacement pairs, when typographer enabled,\n // and smartquotes on. Could be either a String or an Array.\n //\n // For example, you can use '«»„“' for Russian, '„“‚‘' for German,\n // and ['«\\xA0', '\\xA0»', '‹\\xA0', '\\xA0›'] for French (including nbsp).\n quotes: '\\u201c\\u201d\\u2018\\u2019', /* “”‘’ */\n\n // Highlighter function. Should return escaped HTML,\n // or '' if the source string is not changed and should be escaped externaly.\n // If result starts with <pre... internal wrapper is skipped.\n //\n // function (/*str, lang*/) { return ''; }\n //\n highlight: null,\n\n // Internal protection, recursion limit\n maxNesting: 100\n}\n\nexport default {\n options,\n\n components: {\n core: {},\n block: {},\n inline: {}\n }\n}\n","// \"Zero\" preset, with nothing enabled. Useful for manual configuring of simple\n// modes. For example, to parse bold/italic only.\n\nimport type { MarkdownItOptions } from '../types.ts'\n\nconst options: Required<MarkdownItOptions> = {\n // Enable HTML tags in source\n html: false,\n\n // Use '/' to close single tags (<br />)\n xhtmlOut: false,\n\n // Convert '\\n' in paragraphs into <br>\n breaks: false,\n\n // CSS language prefix for fenced blocks\n langPrefix: 'language-',\n\n // autoconvert URL-like texts to links\n linkify: false,\n\n // Enable some language-neutral replacements + quotes beautification\n typographer: false,\n\n // Double + single quotes replacement pairs, when typographer enabled,\n // and smartquotes on. Could be either a String or an Array.\n //\n // For example, you can use '«»„“' for Russian, '„“‚‘' for German,\n // and ['«\\xA0', '\\xA0»', '‹\\xA0', '\\xA0›'] for French (including nbsp).\n quotes: '\\u201c\\u201d\\u2018\\u2019', /* “”‘’ */\n\n // Highlighter function. Should return escaped HTML,\n // or '' if the source string is not changed and should be escaped externaly.\n // If result starts with <pre... internal wrapper is skipped.\n //\n // function (/*str, lang*/) { return ''; }\n //\n highlight: null,\n\n // Internal protection, recursion limit\n maxNesting: 20\n}\n\nexport default {\n options,\n\n components: {\n\n core: {\n rules: [\n 'normalize',\n 'block',\n 'strip_references',\n 'inline',\n 'text_join'\n ]\n },\n\n block: {\n rules: [\n 'paragraph'\n ]\n },\n\n inline: {\n rules: [\n 'text'\n ],\n rules2: [\n 'balance_pairs',\n 'fragments_join'\n ]\n }\n }\n}\n","// Commonmark default options\n\nimport type { MarkdownItOptions } from '../types.ts'\n\nconst options: Required<MarkdownItOptions> = {\n // Enable HTML tags in source\n html: true,\n\n // Use '/' to close single tags (<br />)\n xhtmlOut: true,\n\n // Convert '\\n' in paragraphs into <br>\n breaks: false,\n\n // CSS language prefix for fenced blocks\n langPrefix: 'language-',\n\n // autoconvert URL-like texts to links\n linkify: false,\n\n // Enable some language-neutral replacements + quotes beautification\n typographer: false,\n\n // Double + single quotes replacement pairs, when typographer enabled,\n // and smartquotes on. Could be either a String or an Array.\n //\n // For example, you can use '«»„“' for Russian, '„“‚‘' for German,\n // and ['«\\xA0', '\\xA0»', '‹\\xA0', '\\xA0›'] for French (including nbsp).\n quotes: '\\u201c\\u201d\\u2018\\u2019', /* “”‘’ */\n\n // Highlighter function. Should return escaped HTML,\n // or '' if the source string is not changed and should be escaped externaly.\n // If result starts with <pre... internal wrapper is skipped.\n //\n // function (/*str, lang*/) { return ''; }\n //\n highlight: null,\n\n // Internal protection, recursion limit\n maxNesting: 20\n}\n\nexport default {\n options,\n\n components: {\n\n core: {\n rules: [\n 'normalize',\n 'block',\n 'strip_references',\n 'inline',\n 'text_join'\n ]\n },\n\n block: {\n rules: [\n 'blockquote',\n 'code',\n 'fence',\n 'heading',\n 'hr',\n 'html_block',\n 'lheading',\n 'list',\n 'reference',\n 'paragraph'\n ]\n },\n\n inline: {\n rules: [\n 'autolink',\n 'backticks',\n 'emphasis',\n 'entity',\n 'escape',\n 'html_inline',\n 'image',\n 'link',\n 'newline',\n 'text'\n ],\n rules2: [\n 'balance_pairs',\n 'emphasis',\n 'fragments_join'\n ]\n }\n }\n}\n","// Main parser class\n\nimport * as utils from './common/utils.ts'\nimport * as helpers from './helpers/index.ts'\nimport Token from './token.ts'\nimport Ruler from './ruler.ts'\nimport Renderer from './renderer.ts'\nimport ParserCore from './parser_core.ts'\nimport StateCore from './rules_core/state_core.ts'\nimport ParserBlock from './parser_block.ts'\nimport StateBlock from './rules_block/state_block.ts'\nimport ParserInline from './parser_inline.ts'\nimport StateInline from './rules_inline/state_inline.ts'\nimport { LinkifyIt } from 'linkify-it'\nimport * as mdurl from 'mdurl'\nimport punycode from 'punycode.js'\n\nimport cfg_default from './presets/default.ts'\nimport cfg_zero from './presets/zero.ts'\nimport cfg_commonmark from './presets/commonmark.ts'\nimport type { Env, MarkdownItOptions } from './types.ts'\n\nconst config = {\n default: cfg_default,\n zero: cfg_zero,\n commonmark: cfg_commonmark\n}\n\ntype MarkdownItPresetName = keyof typeof config\n\n/**\n * Parser preset containing options and enabled rules for each parser component.\n */\nexport interface MarkdownItPreset {\n options?: Required<MarkdownItOptions>\n components?: {\n core?: {\n rules?: string[]\n }\n block?: {\n rules?: string[]\n }\n inline?: {\n rules?: string[]\n rules2?: string[]\n }\n }\n}\n\ntype MarkdownItComponentName = keyof NonNullable<MarkdownItPreset['components']>\n\n//\n// This validator can prohibit more than really needed to prevent XSS. It's a\n// tradeoff to keep code simple and to be secure by default.\n//\n// If you need different setup - override validator method as you wish. Or\n// replace it with dummy function and use external sanitizer.\n//\n\nconst BAD_PROTO_RE = /^(vbscript|javascript|file|data):/\nconst GOOD_DATA_RE = /^data:image\\/(gif|png|jpeg|webp);/\n\nconst RECODE_HOSTNAME_FOR = ['http:', 'https:', 'mailto:']\n\n/**\n * Parses Markdown into tokens and renders them to HTML.\n *\n * @category Main\n */\nclass MarkdownIt {\n /**\n * Instance of {@link ParserInline}. You may need it to add new rules when\n * writing plugins. For simple rules control use {@link MarkdownIt.disable}\n * and {@link MarkdownIt.enable}.\n */\n inline = new ParserInline()\n\n /**\n * Instance of {@link ParserBlock}. You may need it to add new rules when\n * writing plugins. For simple rules control use {@link MarkdownIt.disable}\n * and {@link MarkdownIt.enable}.\n */\n block = new ParserBlock()\n\n /**\n * Instance of {@link ParserCore} chain executor. You may need it to add new\n * rules when writing plugins. For simple rules control use\n * {@link MarkdownIt.disable} and {@link MarkdownIt.enable}.\n */\n core = new ParserCore()\n\n /**\n * Instance of {@link Renderer}. Use it to modify output look. Or to add rendering\n * rules for new token types, generated by plugins.\n *\n * See {@link Renderer} docs and\n * [source code](https://github.com/markdown-it/markdown-it/blob/master/src/renderer.ts).\n *\n * @example\n * ```javascript\n * import MarkdownIt from 'markdown-it'\n * const md = new MarkdownIt()\n *\n * function myToken(tokens, idx, options, env, self) {\n * //...\n * return result;\n * };\n *\n * md.renderer.rules['my_token'] = myToken\n * ```\n */\n renderer = new Renderer()\n\n /**\n * [linkify-it](https://github.com/markdown-it/linkify-it) instance.\n * Used by [linkify](https://github.com/markdown-it/markdown-it/blob/master/src/rules_core/linkify.ts)\n * rule.\n */\n linkify = new LinkifyIt()\n\n /**\n * Link validation function. CommonMark allows too much in links. By default\n * we disable `javascript:`, `vbscript:`, `file:` schemas, and almost all `data:...` schemas\n * except some embedded image types.\n *\n * You can change this behaviour:\n *\n * @example\n * ```javascript\n * import MarkdownIt from 'markdown-it'\n * const md = new MarkdownIt()\n *\n * // enable everything\n * md.validateLink = function () { return true; }\n * ```\n */\n validateLink (url: string): boolean {\n // url should be normalized at this point, and existing entities are decoded\n const str = url.trim().toLowerCase()\n\n return BAD_PROTO_RE.test(str) ? GOOD_DATA_RE.test(str) : true\n }\n\n /**\n * Function used to encode link url to a machine-readable format,\n * which includes url-encoding, punycode, etc.\n */\n normalizeLink (url: string): string {\n // Each url part should be encoded separately, with proper encoder\n const parsed = mdurl.parse(url, true)\n\n if (parsed.hostname) {\n // Encode hostnames in urls like:\n // `http://host/`, `https://host/`, `mailto:user@host`, `//host/`\n //\n // We don't encode unknown schemas, because it's likely that we encode\n // something we shouldn't (e.g. `skype:name` treated as `skype:host`)\n //\n if (!parsed.protocol || RECODE_HOSTNAME_FOR.indexOf(parsed.protocol) >= 0) {\n try {\n parsed.hostname = punycode.toASCII(parsed.hostname)\n } catch (er) { /**/ }\n }\n }\n\n if (parsed.auth) parsed.auth = mdurl.encode(parsed.auth)\n if (parsed.hostname) parsed.hostname = mdurl.encode(parsed.hostname)\n if (parsed.pathname) parsed.pathname = mdurl.encode(parsed.pathname)\n if (parsed.search) parsed.search = mdurl.encode(parsed.search)\n if (parsed.hash) parsed.hash = mdurl.encode(parsed.hash)\n\n return mdurl.format(parsed)\n }\n\n /**\n * Function used to decode link url to a human-readable format`\n */\n normalizeLinkText (url: string): string {\n const parsed = mdurl.parse(url, true)\n\n if (parsed.hostname) {\n // Encode hostnames in urls like:\n // `http://host/`, `https://host/`, `mailto:user@host`, `//host/`\n //\n // We don't encode unknown schemas, because it's likely that we encode\n // something we shouldn't (e.g. `skype:name` treated as `skype:host`)\n //\n if (!parsed.protocol || RECODE_HOSTNAME_FOR.indexOf(parsed.protocol) >= 0) {\n try {\n parsed.hostname = punycode.toUnicode(parsed.hostname)\n } catch (er) { /**/ }\n }\n }\n\n // add '%' to exclude list because of https://github.com/markdown-it/markdown-it/issues/720\n return mdurl.decode(mdurl.format(parsed), mdurl.decode.defaultChars + '%')\n }\n\n // Expose utils & helpers for easy acces from plugins\n\n /**\n * Assorted utility functions, useful to write plugins. See details\n * [here](https://github.com/markdown-it/markdown-it/blob/master/src/common/utils.ts).\n */\n utils = utils\n\n /**\n * Link components parser functions, useful to write plugins. See details\n * [here](https://github.com/markdown-it/markdown-it/blob/master/src/helpers).\n */\n helpers = Object.assign({}, helpers)\n\n declare options: Required<MarkdownItOptions>\n\n constructor (\n ...args:\n | []\n | [options: MarkdownItOptions]\n | [presetName: MarkdownItPresetName, options?: MarkdownItOptions]\n ) {\n const [presetNameOrOptions, options] = args\n\n if (typeof presetNameOrOptions === 'string') {\n this.configure(presetNameOrOptions)\n if (options) { this.set(options) }\n } else {\n this.configure('default')\n this.set(presetNameOrOptions || {})\n }\n }\n\n /**\n * Set parser options (in the same format as in constructor). Probably, you\n * will never need it, but you can change options after constructor call.\n *\n * __Note:__ To achieve the best possible performance, don't modify a\n * `markdown-it` instance options on the fly. If you need multiple configurations\n * it's best to create multiple instances and initialize each with separate\n * config.\n *\n * @example\n * ```javascript\n * import MarkdownIt from 'markdown-it'\n *\n * const md = new MarkdownIt()\n * .set({ html: true, breaks: true })\n * .set({ typographer: true })\n * ```\n */\n set (options: MarkdownItOptions): this {\n Object.assign(this.options, options)\n return this\n }\n\n /**\n * Batch load of all options and compenent settings. This is internal method,\n * and you probably will not need it. But if you will - see available presets\n * and data structure [here](https://github.com/markdown-it/markdown-it/tree/master/src/presets)\n *\n * We strongly recommend to use presets instead of direct config loads. That\n * will give better compatibility with next versions.\n */\n configure (presets: MarkdownItPresetName | MarkdownItPreset): this {\n let p: MarkdownItPreset\n\n if (typeof presets === 'string') {\n const presetName = presets\n p = config[presetName]\n if (!p) { throw new Error(`Wrong 'markdown-it' preset \"${presetName}\", check name`) }\n } else {\n p = presets\n }\n\n if (!p) { throw new Error('Wrong `markdown-it` preset, can\\'t be empty') }\n\n if (p.options) { this.options = { ...p.options } }\n\n const components = p.components\n if (components) {\n const componentNames: MarkdownItComponentName[] = ['core', 'block', 'inline']\n componentNames.forEach((name) => {\n const rules = components[name]?.rules\n if (rules) {\n this[name].ruler.enableOnly(rules)\n }\n })\n\n const rules2 = components.inline?.rules2\n if (rules2) {\n this.inline.ruler2.enableOnly(rules2)\n }\n }\n return this\n }\n\n /**\n * Enable list or rules. It will automatically find appropriate components,\n * containing rules with given names. If rule not found, and `ignoreInvalid`\n * not set - throws exception.\n *\n * @example\n * ```javascript\n * import MarkdownIt from 'markdown-it'\n *\n * const md = new MarkdownIt()\n * .enable(['sub', 'sup'])\n * .disable('smartquotes')\n * ```\n */\n enable (list: string | string[], ignoreInvalid = false): this {\n let result: string[] = []\n\n if (!Array.isArray(list)) { list = [list] }\n\n const chains: MarkdownItComponentName[] = ['core', 'block', 'inline']\n chains.forEach((chain) => {\n result = result.concat(this[chain].ruler.enable(list, true))\n })\n\n result = result.concat(this.inline.ruler2.enable(list, true))\n\n const missed = list.filter((name) => result.indexOf(name) < 0)\n\n if (missed.length && !ignoreInvalid) {\n throw new Error(`MarkdownIt. Failed to enable unknown rule(s): ${missed}`)\n }\n\n return this\n }\n\n /**\n * The same as {@link MarkdownIt.enable}, but turn specified rules off.\n */\n disable (list: string | string[], ignoreInvalid = false): this {\n let result: string[] = []\n\n if (!Array.isArray(list)) { list = [list] }\n\n const chains: MarkdownItComponentName[] = ['core', 'block', 'inline']\n chains.forEach((chain) => {\n result = result.concat(this[chain].ruler.disable(list, true))\n })\n\n result = result.concat(this.inline.ruler2.disable(list, true))\n\n const missed = list.filter((name) => result.indexOf(name) < 0)\n\n if (missed.length && !ignoreInvalid) {\n throw new Error(`MarkdownIt. Failed to disable unknown rule(s): ${missed}`)\n }\n return this\n }\n\n /**\n * Load specified plugin with given params into current parser instance.\n * It's just a sugar to call `plugin(md, params)` with curring.\n *\n * @example\n * ```javascript\n * import MarkdownIt from 'markdown-it'\n * import iterator from 'markdown-it-for-inline'\n *\n * const md = new MarkdownIt()\n * .use(iterator, 'foo_replace', 'text', function (tokens, idx) {\n * tokens[idx].content = tokens[idx].content.replace(/foo/g, 'bar')\n * })\n * ```\n */\n use<Params extends unknown[]> (\n plugin: (md: this, ...params: Params) => void,\n ...params: Params\n ): this {\n plugin.apply(plugin, [this, ...params])\n return this\n }\n\n /**\n * Parse input string and return list of block tokens (special token type\n * \"inline\" will contain list of inline tokens). You should not call this\n * method directly, until you write custom renderer (for example, to produce\n * AST).\n *\n * `env` is used to pass data between \"distributed\" rules and return additional\n * metadata like reference info, needed for the renderer. It also can be used to\n * inject data in specific cases. Usually, you will be ok to pass `{}`,\n * and then pass updated object to renderer.\n */\n parse (src: string, env: Env): Token[] {\n if (typeof src !== 'string') {\n throw new Error('Input data should be a String')\n }\n\n const state = new this.core.State(src, this, env)\n\n this.core.process(state)\n\n return state.tokens\n }\n\n /**\n * Render markdown string into html. It does all magic for you :).\n *\n * `env` can be used to inject additional metadata (`{}` by default).\n * But you will not need it with high probability. See also comment\n * in {@link MarkdownIt.parse}.\n */\n render (src: string, env: Env = {}): string {\n return this.renderer.render(this.parse(src, env), this.options, env)\n }\n\n /**\n * The same as {@link MarkdownIt.parse} but skip all block rules. It returns\n * the block tokens list with the single `inline` element, containing parsed\n * inline tokens in `children` property. Also updates `env` object.\n */\n parseInline (src: string, env: Env): Token[] {\n const state = new this.core.State(src, this, env)\n\n state.inlineMode = true\n this.core.process(state)\n\n return state.tokens\n }\n\n /**\n * Similar to {@link MarkdownIt.render} but for single paragraph content.\n * Result will NOT be wrapped into `<p>` tags.\n */\n renderInline (src: string, env: Env = {}): string {\n return this.renderer.render(this.parseInline(src, env), this.options, env)\n }\n\n static Token = Token\n static Ruler = Ruler\n static Renderer = Renderer\n static ParserCore = ParserCore\n static StateCore = StateCore\n static ParserBlock = ParserBlock\n static StateBlock = StateBlock\n static ParserInline = ParserInline\n static StateInline = StateInline\n}\n\nexport default MarkdownIt\n","import { callable } from './common/utils.ts'\nimport MarkdownIt from './markdownit.ts'\n\n/**\n * Default package export.\n *\n * For backward compatibility, the {@link MarkdownIt} class is wrapped so\n * legacy code can call it without `new`. New code should instantiate it as a\n * regular class with `new`. The compatibility wrapper may be removed in a\n * future release.\n *\n * @category Main\n */\nconst MarkdownItCallable = callable(MarkdownIt)\n\nexport default MarkdownItCallable\n\nexport type { default as MarkdownIt, MarkdownItPreset } from './markdownit.ts'\nexport type { Delimiter, Env, MarkdownItOptions } from './types.ts'\nexport type { default as Token } from './token.ts'\nexport type { default as Ruler } from './ruler.ts'\nexport type { default as Renderer, RendererRule } from './renderer.ts'\nexport type { default as ParserCore } from './parser_core.ts'\nexport type { default as StateCore } from './rules_core/state_core.ts'\nexport type { default as ParserBlock } from './parser_block.ts'\nexport type { default as StateBlock } from './rules_block/state_block.ts'\nexport type { default as ParserInline } from './parser_inline.ts'\nexport type { default as StateInline } from './rules_inline/state_inline.ts'\n"],"x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,60,61],"mappings":"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"}