main
js 2,189 lines 70.2 KB
Raw
1 /**
2 * marked v15.0.12 - a markdown parser
3 * Copyright (c) 2011-2025, Christopher Jeffrey. (MIT Licensed)
4 * https://github.com/markedjs/marked
5 */
6
7 /**
8 * DO NOT EDIT THIS FILE
9 * The code in this file is generated from files in ./src/
10 */
11
12
13 // src/defaults.ts
14 function _getDefaults() {
15 return {
16 async: false,
17 breaks: false,
18 extensions: null,
19 gfm: true,
20 hooks: null,
21 pedantic: false,
22 renderer: null,
23 silent: false,
24 tokenizer: null,
25 walkTokens: null
26 };
27 }
28 var _defaults = _getDefaults();
29 function changeDefaults(newDefaults) {
30 _defaults = newDefaults;
31 }
32
33 // src/rules.ts
34 var noopTest = { exec: () => null };
35 function edit(regex, opt = "") {
36 let source = typeof regex === "string" ? regex : regex.source;
37 const obj = {
38 replace: (name, val) => {
39 let valSource = typeof val === "string" ? val : val.source;
40 valSource = valSource.replace(other.caret, "$1");
41 source = source.replace(name, valSource);
42 return obj;
43 },
44 getRegex: () => {
45 return new RegExp(source, opt);
46 }
47 };
48 return obj;
49 }
50 var other = {
51 codeRemoveIndent: /^(?: {1,4}| {0,3}\t)/gm,
52 outputLinkReplace: /\\([\[\]])/g,
53 indentCodeCompensation: /^(\s+)(?:```)/,
54 beginningSpace: /^\s+/,
55 endingHash: /#$/,
56 startingSpaceChar: /^ /,
57 endingSpaceChar: / $/,
58 nonSpaceChar: /[^ ]/,
59 newLineCharGlobal: /\n/g,
60 tabCharGlobal: /\t/g,
61 multipleSpaceGlobal: /\s+/g,
62 blankLine: /^[ \t]*$/,
63 doubleBlankLine: /\n[ \t]*\n[ \t]*$/,
64 blockquoteStart: /^ {0,3}>/,
65 blockquoteSetextReplace: /\n {0,3}((?:=+|-+) *)(?=\n|$)/g,
66 blockquoteSetextReplace2: /^ {0,3}>[ \t]?/gm,
67 listReplaceTabs: /^\t+/,
68 listReplaceNesting: /^ {1,4}(?=( {4})*[^ ])/g,
69 listIsTask: /^\[[ xX]\] /,
70 listReplaceTask: /^\[[ xX]\] +/,
71 anyLine: /\n.*\n/,
72 hrefBrackets: /^<(.*)>$/,
73 tableDelimiter: /[:|]/,
74 tableAlignChars: /^\||\| *$/g,
75 tableRowBlankLine: /\n[ \t]*$/,
76 tableAlignRight: /^ *-+: *$/,
77 tableAlignCenter: /^ *:-+: *$/,
78 tableAlignLeft: /^ *:-+ *$/,
79 startATag: /^<a /i,
80 endATag: /^<\/a>/i,
81 startPreScriptTag: /^<(pre|code|kbd|script)(\s|>)/i,
82 endPreScriptTag: /^<\/(pre|code|kbd|script)(\s|>)/i,
83 startAngleBracket: /^</,
84 endAngleBracket: />$/,
85 pedanticHrefTitle: /^([^'"]*[^\s])\s+(['"])(.*)\2/,
86 unicodeAlphaNumeric: /[\p{L}\p{N}]/u,
87 escapeTest: /[&<>"']/,
88 escapeReplace: /[&<>"']/g,
89 escapeTestNoEncode: /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,
90 escapeReplaceNoEncode: /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g,
91 unescapeTest: /&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig,
92 caret: /(^|[^\[])\^/g,
93 percentDecode: /%25/g,
94 findPipe: /\|/g,
95 splitPipe: / \|/,
96 slashPipe: /\\\|/g,
97 carriageReturn: /\r\n|\r/g,
98 spaceLine: /^ +$/gm,
99 notSpaceStart: /^\S*/,
100 endingNewline: /\n$/,
101 listItemRegex: (bull) => new RegExp(`^( {0,3}${bull})((?:[ ][^\\n]*)?(?:\\n|$))`),
102 nextBulletRegex: (indent) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`),
103 hrRegex: (indent) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`),
104 fencesBeginRegex: (indent) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}(?:\`\`\`|~~~)`),
105 headingBeginRegex: (indent) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}#`),
106 htmlBeginRegex: (indent) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}<(?:[a-z].*>|!--)`, "i")
107 };
108 var newline = /^(?:[ \t]*(?:\n|$))+/;
109 var blockCode = /^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/;
110 var fences = /^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/;
111 var hr = /^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/;
112 var heading = /^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/;
113 var bullet = /(?:[*+-]|\d{1,9}[.)])/;
114 var lheadingCore = /^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/;
115 var lheading = edit(lheadingCore).replace(/bull/g, bullet).replace(/blockCode/g, /(?: {4}| {0,3}\t)/).replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g, / {0,3}>/).replace(/heading/g, / {0,3}#{1,6}/).replace(/html/g, / {0,3}<[^\n>]+>\n/).replace(/\|table/g, "").getRegex();
116 var lheadingGfm = edit(lheadingCore).replace(/bull/g, bullet).replace(/blockCode/g, /(?: {4}| {0,3}\t)/).replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g, / {0,3}>/).replace(/heading/g, / {0,3}#{1,6}/).replace(/html/g, / {0,3}<[^\n>]+>\n/).replace(/table/g, / {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex();
117 var _paragraph = /^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/;
118 var blockText = /^[^\n]+/;
119 var _blockLabel = /(?!\s*\])(?:\\.|[^\[\]\\])+/;
120 var def = edit(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label", _blockLabel).replace("title", /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex();
121 var list = edit(/^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g, bullet).getRegex();
122 var _tag = "address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul";
123 var _comment = /<!--(?:-?>|[\s\S]*?(?:-->|$))/;
124 var html = edit(
125 "^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|<![A-Z][\\s\\S]*?(?:>\\n*|$)|<!\\[CDATA\\[[\\s\\S]*?(?:\\]\\]>\\n*|$)|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|</(?!script|pre|style|textarea)[a-z][\\w-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))",
126 "i"
127 ).replace("comment", _comment).replace("tag", _tag).replace("attribute", / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex();
128 var paragraph = edit(_paragraph).replace("hr", hr).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("|lheading", "").replace("|table", "").replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", "</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag", _tag).getRegex();
129 var blockquote = edit(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph", paragraph).getRegex();
130 var blockNormal = {
131 blockquote,
132 code: blockCode,
133 def,
134 fences,
135 heading,
136 hr,
137 html,
138 lheading,
139 list,
140 newline,
141 paragraph,
142 table: noopTest,
143 text: blockText
144 };
145 var gfmTable = edit(
146 "^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)"
147 ).replace("hr", hr).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("blockquote", " {0,3}>").replace("code", "(?: {4}| {0,3} )[^\\n]").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", "</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag", _tag).getRegex();
148 var blockGfm = {
149 ...blockNormal,
150 lheading: lheadingGfm,
151 table: gfmTable,
152 paragraph: edit(_paragraph).replace("hr", hr).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("|lheading", "").replace("table", gfmTable).replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", "</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag", _tag).getRegex()
153 };
154 var blockPedantic = {
155 ...blockNormal,
156 html: edit(
157 `^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)|<tag(?:"[^"]*"|'[^']*'|\\s[^'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`
158 ).replace("comment", _comment).replace(/tag/g, "(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),
159 def: /^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,
160 heading: /^(#{1,6})(.*)(?:\n+|$)/,
161 fences: noopTest,
162 // fences not supported
163 lheading: /^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,
164 paragraph: edit(_paragraph).replace("hr", hr).replace("heading", " *#{1,6} *[^\n]").replace("lheading", lheading).replace("|table", "").replace("blockquote", " {0,3}>").replace("|fences", "").replace("|list", "").replace("|html", "").replace("|tag", "").getRegex()
165 };
166 var escape = /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/;
167 var inlineCode = /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/;
168 var br = /^( {2,}|\\)\n(?!\s*$)/;
169 var inlineText = /^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*_]|\b_|$)|[^ ](?= {2,}\n)))/;
170 var _punctuation = /[\p{P}\p{S}]/u;
171 var _punctuationOrSpace = /[\s\p{P}\p{S}]/u;
172 var _notPunctuationOrSpace = /[^\s\p{P}\p{S}]/u;
173 var punctuation = edit(/^((?![*_])punctSpace)/, "u").replace(/punctSpace/g, _punctuationOrSpace).getRegex();
174 var _punctuationGfmStrongEm = /(?!~)[\p{P}\p{S}]/u;
175 var _punctuationOrSpaceGfmStrongEm = /(?!~)[\s\p{P}\p{S}]/u;
176 var _notPunctuationOrSpaceGfmStrongEm = /(?:[^\s\p{P}\p{S}]|~)/u;
177 var blockSkip = /\[[^[\]]*?\]\((?:\\.|[^\\\(\)]|\((?:\\.|[^\\\(\)])*\))*\)|`[^`]*?`|<[^<>]*?>/g;
178 var emStrongLDelimCore = /^(?:\*+(?:((?!\*)punct)|[^\s*]))|^_+(?:((?!_)punct)|([^\s_]))/;
179 var emStrongLDelim = edit(emStrongLDelimCore, "u").replace(/punct/g, _punctuation).getRegex();
180 var emStrongLDelimGfm = edit(emStrongLDelimCore, "u").replace(/punct/g, _punctuationGfmStrongEm).getRegex();
181 var emStrongRDelimAstCore = "^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)";
182 var emStrongRDelimAst = edit(emStrongRDelimAstCore, "gu").replace(/notPunctSpace/g, _notPunctuationOrSpace).replace(/punctSpace/g, _punctuationOrSpace).replace(/punct/g, _punctuation).getRegex();
183 var emStrongRDelimAstGfm = edit(emStrongRDelimAstCore, "gu").replace(/notPunctSpace/g, _notPunctuationOrSpaceGfmStrongEm).replace(/punctSpace/g, _punctuationOrSpaceGfmStrongEm).replace(/punct/g, _punctuationGfmStrongEm).getRegex();
184 var emStrongRDelimUnd = edit(
185 "^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)",
186 "gu"
187 ).replace(/notPunctSpace/g, _notPunctuationOrSpace).replace(/punctSpace/g, _punctuationOrSpace).replace(/punct/g, _punctuation).getRegex();
188 var anyPunctuation = edit(/\\(punct)/, "gu").replace(/punct/g, _punctuation).getRegex();
189 var autolink = edit(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme", /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email", /[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])?)+(?![-_])/).getRegex();
190 var _inlineComment = edit(_comment).replace("(?:-->|$)", "-->").getRegex();
191 var tag = edit(
192 "^comment|^</[a-zA-Z][\\w:-]*\\s*>|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^<![a-zA-Z]+\\s[\\s\\S]*?>|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>"
193 ).replace("comment", _inlineComment).replace("attribute", /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex();
194 var _inlineLabel = /(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/;
195 var link = edit(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]*(?:\n[ \t]*)?)(title))?\s*\)/).replace("label", _inlineLabel).replace("href", /<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]*/).replace("title", /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex();
196 var reflink = edit(/^!?\[(label)\]\[(ref)\]/).replace("label", _inlineLabel).replace("ref", _blockLabel).getRegex();
197 var nolink = edit(/^!?\[(ref)\](?:\[\])?/).replace("ref", _blockLabel).getRegex();
198 var reflinkSearch = edit("reflink|nolink(?!\\()", "g").replace("reflink", reflink).replace("nolink", nolink).getRegex();
199 var inlineNormal = {
200 _backpedal: noopTest,
201 // only used for GFM url
202 anyPunctuation,
203 autolink,
204 blockSkip,
205 br,
206 code: inlineCode,
207 del: noopTest,
208 emStrongLDelim,
209 emStrongRDelimAst,
210 emStrongRDelimUnd,
211 escape,
212 link,
213 nolink,
214 punctuation,
215 reflink,
216 reflinkSearch,
217 tag,
218 text: inlineText,
219 url: noopTest
220 };
221 var inlinePedantic = {
222 ...inlineNormal,
223 link: edit(/^!?\[(label)\]\((.*?)\)/).replace("label", _inlineLabel).getRegex(),
224 reflink: edit(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label", _inlineLabel).getRegex()
225 };
226 var inlineGfm = {
227 ...inlineNormal,
228 emStrongRDelimAst: emStrongRDelimAstGfm,
229 emStrongLDelim: emStrongLDelimGfm,
230 url: edit(/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/, "i").replace("email", /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),
231 _backpedal: /(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,
232 del: /^(~~?)(?=[^\s~])((?:\\.|[^\\])*?(?:\\.|[^\s~\\]))\1(?=[^~]|$)/,
233 text: /^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\<!\[`*~_]|\b_|https?:\/\/|ftp:\/\/|www\.|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)))/
234 };
235 var inlineBreaks = {
236 ...inlineGfm,
237 br: edit(br).replace("{2,}", "*").getRegex(),
238 text: edit(inlineGfm.text).replace("\\b_", "\\b_| {2,}\\n").replace(/\{2,\}/g, "*").getRegex()
239 };
240 var block = {
241 normal: blockNormal,
242 gfm: blockGfm,
243 pedantic: blockPedantic
244 };
245 var inline = {
246 normal: inlineNormal,
247 gfm: inlineGfm,
248 breaks: inlineBreaks,
249 pedantic: inlinePedantic
250 };
251
252 // src/helpers.ts
253 var escapeReplacements = {
254 "&": "&amp;",
255 "<": "&lt;",
256 ">": "&gt;",
257 '"': "&quot;",
258 "'": "&#39;"
259 };
260 var getEscapeReplacement = (ch) => escapeReplacements[ch];
261 function escape2(html2, encode) {
262 if (encode) {
263 if (other.escapeTest.test(html2)) {
264 return html2.replace(other.escapeReplace, getEscapeReplacement);
265 }
266 } else {
267 if (other.escapeTestNoEncode.test(html2)) {
268 return html2.replace(other.escapeReplaceNoEncode, getEscapeReplacement);
269 }
270 }
271 return html2;
272 }
273 function cleanUrl(href) {
274 try {
275 href = encodeURI(href).replace(other.percentDecode, "%");
276 } catch {
277 return null;
278 }
279 return href;
280 }
281 function splitCells(tableRow, count) {
282 const row = tableRow.replace(other.findPipe, (match, offset, str) => {
283 let escaped = false;
284 let curr = offset;
285 while (--curr >= 0 && str[curr] === "\\") escaped = !escaped;
286 if (escaped) {
287 return "|";
288 } else {
289 return " |";
290 }
291 }), cells = row.split(other.splitPipe);
292 let i = 0;
293 if (!cells[0].trim()) {
294 cells.shift();
295 }
296 if (cells.length > 0 && !cells.at(-1)?.trim()) {
297 cells.pop();
298 }
299 if (count) {
300 if (cells.length > count) {
301 cells.splice(count);
302 } else {
303 while (cells.length < count) cells.push("");
304 }
305 }
306 for (; i < cells.length; i++) {
307 cells[i] = cells[i].trim().replace(other.slashPipe, "|");
308 }
309 return cells;
310 }
311 function rtrim(str, c, invert) {
312 const l = str.length;
313 if (l === 0) {
314 return "";
315 }
316 let suffLen = 0;
317 while (suffLen < l) {
318 const currChar = str.charAt(l - suffLen - 1);
319 if (currChar === c && !invert) {
320 suffLen++;
321 } else if (currChar !== c && invert) {
322 suffLen++;
323 } else {
324 break;
325 }
326 }
327 return str.slice(0, l - suffLen);
328 }
329 function findClosingBracket(str, b) {
330 if (str.indexOf(b[1]) === -1) {
331 return -1;
332 }
333 let level = 0;
334 for (let i = 0; i < str.length; i++) {
335 if (str[i] === "\\") {
336 i++;
337 } else if (str[i] === b[0]) {
338 level++;
339 } else if (str[i] === b[1]) {
340 level--;
341 if (level < 0) {
342 return i;
343 }
344 }
345 }
346 if (level > 0) {
347 return -2;
348 }
349 return -1;
350 }
351
352 // src/Tokenizer.ts
353 function outputLink(cap, link2, raw, lexer2, rules) {
354 const href = link2.href;
355 const title = link2.title || null;
356 const text = cap[1].replace(rules.other.outputLinkReplace, "$1");
357 lexer2.state.inLink = true;
358 const token = {
359 type: cap[0].charAt(0) === "!" ? "image" : "link",
360 raw,
361 href,
362 title,
363 text,
364 tokens: lexer2.inlineTokens(text)
365 };
366 lexer2.state.inLink = false;
367 return token;
368 }
369 function indentCodeCompensation(raw, text, rules) {
370 const matchIndentToCode = raw.match(rules.other.indentCodeCompensation);
371 if (matchIndentToCode === null) {
372 return text;
373 }
374 const indentToCode = matchIndentToCode[1];
375 return text.split("\n").map((node) => {
376 const matchIndentInNode = node.match(rules.other.beginningSpace);
377 if (matchIndentInNode === null) {
378 return node;
379 }
380 const [indentInNode] = matchIndentInNode;
381 if (indentInNode.length >= indentToCode.length) {
382 return node.slice(indentToCode.length);
383 }
384 return node;
385 }).join("\n");
386 }
387 var _Tokenizer = class {
388 options;
389 rules;
390 // set by the lexer
391 lexer;
392 // set by the lexer
393 constructor(options2) {
394 this.options = options2 || _defaults;
395 }
396 space(src) {
397 const cap = this.rules.block.newline.exec(src);
398 if (cap && cap[0].length > 0) {
399 return {
400 type: "space",
401 raw: cap[0]
402 };
403 }
404 }
405 code(src) {
406 const cap = this.rules.block.code.exec(src);
407 if (cap) {
408 const text = cap[0].replace(this.rules.other.codeRemoveIndent, "");
409 return {
410 type: "code",
411 raw: cap[0],
412 codeBlockStyle: "indented",
413 text: !this.options.pedantic ? rtrim(text, "\n") : text
414 };
415 }
416 }
417 fences(src) {
418 const cap = this.rules.block.fences.exec(src);
419 if (cap) {
420 const raw = cap[0];
421 const text = indentCodeCompensation(raw, cap[3] || "", this.rules);
422 return {
423 type: "code",
424 raw,
425 lang: cap[2] ? cap[2].trim().replace(this.rules.inline.anyPunctuation, "$1") : cap[2],
426 text
427 };
428 }
429 }
430 heading(src) {
431 const cap = this.rules.block.heading.exec(src);
432 if (cap) {
433 let text = cap[2].trim();
434 if (this.rules.other.endingHash.test(text)) {
435 const trimmed = rtrim(text, "#");
436 if (this.options.pedantic) {
437 text = trimmed.trim();
438 } else if (!trimmed || this.rules.other.endingSpaceChar.test(trimmed)) {
439 text = trimmed.trim();
440 }
441 }
442 return {
443 type: "heading",
444 raw: cap[0],
445 depth: cap[1].length,
446 text,
447 tokens: this.lexer.inline(text)
448 };
449 }
450 }
451 hr(src) {
452 const cap = this.rules.block.hr.exec(src);
453 if (cap) {
454 return {
455 type: "hr",
456 raw: rtrim(cap[0], "\n")
457 };
458 }
459 }
460 blockquote(src) {
461 const cap = this.rules.block.blockquote.exec(src);
462 if (cap) {
463 let lines = rtrim(cap[0], "\n").split("\n");
464 let raw = "";
465 let text = "";
466 const tokens = [];
467 while (lines.length > 0) {
468 let inBlockquote = false;
469 const currentLines = [];
470 let i;
471 for (i = 0; i < lines.length; i++) {
472 if (this.rules.other.blockquoteStart.test(lines[i])) {
473 currentLines.push(lines[i]);
474 inBlockquote = true;
475 } else if (!inBlockquote) {
476 currentLines.push(lines[i]);
477 } else {
478 break;
479 }
480 }
481 lines = lines.slice(i);
482 const currentRaw = currentLines.join("\n");
483 const currentText = currentRaw.replace(this.rules.other.blockquoteSetextReplace, "\n $1").replace(this.rules.other.blockquoteSetextReplace2, "");
484 raw = raw ? `${raw}
485 ${currentRaw}` : currentRaw;
486 text = text ? `${text}
487 ${currentText}` : currentText;
488 const top = this.lexer.state.top;
489 this.lexer.state.top = true;
490 this.lexer.blockTokens(currentText, tokens, true);
491 this.lexer.state.top = top;
492 if (lines.length === 0) {
493 break;
494 }
495 const lastToken = tokens.at(-1);
496 if (lastToken?.type === "code") {
497 break;
498 } else if (lastToken?.type === "blockquote") {
499 const oldToken = lastToken;
500 const newText = oldToken.raw + "\n" + lines.join("\n");
501 const newToken = this.blockquote(newText);
502 tokens[tokens.length - 1] = newToken;
503 raw = raw.substring(0, raw.length - oldToken.raw.length) + newToken.raw;
504 text = text.substring(0, text.length - oldToken.text.length) + newToken.text;
505 break;
506 } else if (lastToken?.type === "list") {
507 const oldToken = lastToken;
508 const newText = oldToken.raw + "\n" + lines.join("\n");
509 const newToken = this.list(newText);
510 tokens[tokens.length - 1] = newToken;
511 raw = raw.substring(0, raw.length - lastToken.raw.length) + newToken.raw;
512 text = text.substring(0, text.length - oldToken.raw.length) + newToken.raw;
513 lines = newText.substring(tokens.at(-1).raw.length).split("\n");
514 continue;
515 }
516 }
517 return {
518 type: "blockquote",
519 raw,
520 tokens,
521 text
522 };
523 }
524 }
525 list(src) {
526 let cap = this.rules.block.list.exec(src);
527 if (cap) {
528 let bull = cap[1].trim();
529 const isordered = bull.length > 1;
530 const list2 = {
531 type: "list",
532 raw: "",
533 ordered: isordered,
534 start: isordered ? +bull.slice(0, -1) : "",
535 loose: false,
536 items: []
537 };
538 bull = isordered ? `\\d{1,9}\\${bull.slice(-1)}` : `\\${bull}`;
539 if (this.options.pedantic) {
540 bull = isordered ? bull : "[*+-]";
541 }
542 const itemRegex = this.rules.other.listItemRegex(bull);
543 let endsWithBlankLine = false;
544 while (src) {
545 let endEarly = false;
546 let raw = "";
547 let itemContents = "";
548 if (!(cap = itemRegex.exec(src))) {
549 break;
550 }
551 if (this.rules.block.hr.test(src)) {
552 break;
553 }
554 raw = cap[0];
555 src = src.substring(raw.length);
556 let line = cap[2].split("\n", 1)[0].replace(this.rules.other.listReplaceTabs, (t) => " ".repeat(3 * t.length));
557 let nextLine = src.split("\n", 1)[0];
558 let blankLine = !line.trim();
559 let indent = 0;
560 if (this.options.pedantic) {
561 indent = 2;
562 itemContents = line.trimStart();
563 } else if (blankLine) {
564 indent = cap[1].length + 1;
565 } else {
566 indent = cap[2].search(this.rules.other.nonSpaceChar);
567 indent = indent > 4 ? 1 : indent;
568 itemContents = line.slice(indent);
569 indent += cap[1].length;
570 }
571 if (blankLine && this.rules.other.blankLine.test(nextLine)) {
572 raw += nextLine + "\n";
573 src = src.substring(nextLine.length + 1);
574 endEarly = true;
575 }
576 if (!endEarly) {
577 const nextBulletRegex = this.rules.other.nextBulletRegex(indent);
578 const hrRegex = this.rules.other.hrRegex(indent);
579 const fencesBeginRegex = this.rules.other.fencesBeginRegex(indent);
580 const headingBeginRegex = this.rules.other.headingBeginRegex(indent);
581 const htmlBeginRegex = this.rules.other.htmlBeginRegex(indent);
582 while (src) {
583 const rawLine = src.split("\n", 1)[0];
584 let nextLineWithoutTabs;
585 nextLine = rawLine;
586 if (this.options.pedantic) {
587 nextLine = nextLine.replace(this.rules.other.listReplaceNesting, " ");
588 nextLineWithoutTabs = nextLine;
589 } else {
590 nextLineWithoutTabs = nextLine.replace(this.rules.other.tabCharGlobal, " ");
591 }
592 if (fencesBeginRegex.test(nextLine)) {
593 break;
594 }
595 if (headingBeginRegex.test(nextLine)) {
596 break;
597 }
598 if (htmlBeginRegex.test(nextLine)) {
599 break;
600 }
601 if (nextBulletRegex.test(nextLine)) {
602 break;
603 }
604 if (hrRegex.test(nextLine)) {
605 break;
606 }
607 if (nextLineWithoutTabs.search(this.rules.other.nonSpaceChar) >= indent || !nextLine.trim()) {
608 itemContents += "\n" + nextLineWithoutTabs.slice(indent);
609 } else {
610 if (blankLine) {
611 break;
612 }
613 if (line.replace(this.rules.other.tabCharGlobal, " ").search(this.rules.other.nonSpaceChar) >= 4) {
614 break;
615 }
616 if (fencesBeginRegex.test(line)) {
617 break;
618 }
619 if (headingBeginRegex.test(line)) {
620 break;
621 }
622 if (hrRegex.test(line)) {
623 break;
624 }
625 itemContents += "\n" + nextLine;
626 }
627 if (!blankLine && !nextLine.trim()) {
628 blankLine = true;
629 }
630 raw += rawLine + "\n";
631 src = src.substring(rawLine.length + 1);
632 line = nextLineWithoutTabs.slice(indent);
633 }
634 }
635 if (!list2.loose) {
636 if (endsWithBlankLine) {
637 list2.loose = true;
638 } else if (this.rules.other.doubleBlankLine.test(raw)) {
639 endsWithBlankLine = true;
640 }
641 }
642 let istask = null;
643 let ischecked;
644 if (this.options.gfm) {
645 istask = this.rules.other.listIsTask.exec(itemContents);
646 if (istask) {
647 ischecked = istask[0] !== "[ ] ";
648 itemContents = itemContents.replace(this.rules.other.listReplaceTask, "");
649 }
650 }
651 list2.items.push({
652 type: "list_item",
653 raw,
654 task: !!istask,
655 checked: ischecked,
656 loose: false,
657 text: itemContents,
658 tokens: []
659 });
660 list2.raw += raw;
661 }
662 const lastItem = list2.items.at(-1);
663 if (lastItem) {
664 lastItem.raw = lastItem.raw.trimEnd();
665 lastItem.text = lastItem.text.trimEnd();
666 } else {
667 return;
668 }
669 list2.raw = list2.raw.trimEnd();
670 for (let i = 0; i < list2.items.length; i++) {
671 this.lexer.state.top = false;
672 list2.items[i].tokens = this.lexer.blockTokens(list2.items[i].text, []);
673 if (!list2.loose) {
674 const spacers = list2.items[i].tokens.filter((t) => t.type === "space");
675 const hasMultipleLineBreaks = spacers.length > 0 && spacers.some((t) => this.rules.other.anyLine.test(t.raw));
676 list2.loose = hasMultipleLineBreaks;
677 }
678 }
679 if (list2.loose) {
680 for (let i = 0; i < list2.items.length; i++) {
681 list2.items[i].loose = true;
682 }
683 }
684 return list2;
685 }
686 }
687 html(src) {
688 const cap = this.rules.block.html.exec(src);
689 if (cap) {
690 const token = {
691 type: "html",
692 block: true,
693 raw: cap[0],
694 pre: cap[1] === "pre" || cap[1] === "script" || cap[1] === "style",
695 text: cap[0]
696 };
697 return token;
698 }
699 }
700 def(src) {
701 const cap = this.rules.block.def.exec(src);
702 if (cap) {
703 const tag2 = cap[1].toLowerCase().replace(this.rules.other.multipleSpaceGlobal, " ");
704 const href = cap[2] ? cap[2].replace(this.rules.other.hrefBrackets, "$1").replace(this.rules.inline.anyPunctuation, "$1") : "";
705 const title = cap[3] ? cap[3].substring(1, cap[3].length - 1).replace(this.rules.inline.anyPunctuation, "$1") : cap[3];
706 return {
707 type: "def",
708 tag: tag2,
709 raw: cap[0],
710 href,
711 title
712 };
713 }
714 }
715 table(src) {
716 const cap = this.rules.block.table.exec(src);
717 if (!cap) {
718 return;
719 }
720 if (!this.rules.other.tableDelimiter.test(cap[2])) {
721 return;
722 }
723 const headers = splitCells(cap[1]);
724 const aligns = cap[2].replace(this.rules.other.tableAlignChars, "").split("|");
725 const rows = cap[3]?.trim() ? cap[3].replace(this.rules.other.tableRowBlankLine, "").split("\n") : [];
726 const item = {
727 type: "table",
728 raw: cap[0],
729 header: [],
730 align: [],
731 rows: []
732 };
733 if (headers.length !== aligns.length) {
734 return;
735 }
736 for (const align of aligns) {
737 if (this.rules.other.tableAlignRight.test(align)) {
738 item.align.push("right");
739 } else if (this.rules.other.tableAlignCenter.test(align)) {
740 item.align.push("center");
741 } else if (this.rules.other.tableAlignLeft.test(align)) {
742 item.align.push("left");
743 } else {
744 item.align.push(null);
745 }
746 }
747 for (let i = 0; i < headers.length; i++) {
748 item.header.push({
749 text: headers[i],
750 tokens: this.lexer.inline(headers[i]),
751 header: true,
752 align: item.align[i]
753 });
754 }
755 for (const row of rows) {
756 item.rows.push(splitCells(row, item.header.length).map((cell, i) => {
757 return {
758 text: cell,
759 tokens: this.lexer.inline(cell),
760 header: false,
761 align: item.align[i]
762 };
763 }));
764 }
765 return item;
766 }
767 lheading(src) {
768 const cap = this.rules.block.lheading.exec(src);
769 if (cap) {
770 return {
771 type: "heading",
772 raw: cap[0],
773 depth: cap[2].charAt(0) === "=" ? 1 : 2,
774 text: cap[1],
775 tokens: this.lexer.inline(cap[1])
776 };
777 }
778 }
779 paragraph(src) {
780 const cap = this.rules.block.paragraph.exec(src);
781 if (cap) {
782 const text = cap[1].charAt(cap[1].length - 1) === "\n" ? cap[1].slice(0, -1) : cap[1];
783 return {
784 type: "paragraph",
785 raw: cap[0],
786 text,
787 tokens: this.lexer.inline(text)
788 };
789 }
790 }
791 text(src) {
792 const cap = this.rules.block.text.exec(src);
793 if (cap) {
794 return {
795 type: "text",
796 raw: cap[0],
797 text: cap[0],
798 tokens: this.lexer.inline(cap[0])
799 };
800 }
801 }
802 escape(src) {
803 const cap = this.rules.inline.escape.exec(src);
804 if (cap) {
805 return {
806 type: "escape",
807 raw: cap[0],
808 text: cap[1]
809 };
810 }
811 }
812 tag(src) {
813 const cap = this.rules.inline.tag.exec(src);
814 if (cap) {
815 if (!this.lexer.state.inLink && this.rules.other.startATag.test(cap[0])) {
816 this.lexer.state.inLink = true;
817 } else if (this.lexer.state.inLink && this.rules.other.endATag.test(cap[0])) {
818 this.lexer.state.inLink = false;
819 }
820 if (!this.lexer.state.inRawBlock && this.rules.other.startPreScriptTag.test(cap[0])) {
821 this.lexer.state.inRawBlock = true;
822 } else if (this.lexer.state.inRawBlock && this.rules.other.endPreScriptTag.test(cap[0])) {
823 this.lexer.state.inRawBlock = false;
824 }
825 return {
826 type: "html",
827 raw: cap[0],
828 inLink: this.lexer.state.inLink,
829 inRawBlock: this.lexer.state.inRawBlock,
830 block: false,
831 text: cap[0]
832 };
833 }
834 }
835 link(src) {
836 const cap = this.rules.inline.link.exec(src);
837 if (cap) {
838 const trimmedUrl = cap[2].trim();
839 if (!this.options.pedantic && this.rules.other.startAngleBracket.test(trimmedUrl)) {
840 if (!this.rules.other.endAngleBracket.test(trimmedUrl)) {
841 return;
842 }
843 const rtrimSlash = rtrim(trimmedUrl.slice(0, -1), "\\");
844 if ((trimmedUrl.length - rtrimSlash.length) % 2 === 0) {
845 return;
846 }
847 } else {
848 const lastParenIndex = findClosingBracket(cap[2], "()");
849 if (lastParenIndex === -2) {
850 return;
851 }
852 if (lastParenIndex > -1) {
853 const start = cap[0].indexOf("!") === 0 ? 5 : 4;
854 const linkLen = start + cap[1].length + lastParenIndex;
855 cap[2] = cap[2].substring(0, lastParenIndex);
856 cap[0] = cap[0].substring(0, linkLen).trim();
857 cap[3] = "";
858 }
859 }
860 let href = cap[2];
861 let title = "";
862 if (this.options.pedantic) {
863 const link2 = this.rules.other.pedanticHrefTitle.exec(href);
864 if (link2) {
865 href = link2[1];
866 title = link2[3];
867 }
868 } else {
869 title = cap[3] ? cap[3].slice(1, -1) : "";
870 }
871 href = href.trim();
872 if (this.rules.other.startAngleBracket.test(href)) {
873 if (this.options.pedantic && !this.rules.other.endAngleBracket.test(trimmedUrl)) {
874 href = href.slice(1);
875 } else {
876 href = href.slice(1, -1);
877 }
878 }
879 return outputLink(cap, {
880 href: href ? href.replace(this.rules.inline.anyPunctuation, "$1") : href,
881 title: title ? title.replace(this.rules.inline.anyPunctuation, "$1") : title
882 }, cap[0], this.lexer, this.rules);
883 }
884 }
885 reflink(src, links) {
886 let cap;
887 if ((cap = this.rules.inline.reflink.exec(src)) || (cap = this.rules.inline.nolink.exec(src))) {
888 const linkString = (cap[2] || cap[1]).replace(this.rules.other.multipleSpaceGlobal, " ");
889 const link2 = links[linkString.toLowerCase()];
890 if (!link2) {
891 const text = cap[0].charAt(0);
892 return {
893 type: "text",
894 raw: text,
895 text
896 };
897 }
898 return outputLink(cap, link2, cap[0], this.lexer, this.rules);
899 }
900 }
901 emStrong(src, maskedSrc, prevChar = "") {
902 let match = this.rules.inline.emStrongLDelim.exec(src);
903 if (!match) return;
904 if (match[3] && prevChar.match(this.rules.other.unicodeAlphaNumeric)) return;
905 const nextChar = match[1] || match[2] || "";
906 if (!nextChar || !prevChar || this.rules.inline.punctuation.exec(prevChar)) {
907 const lLength = [...match[0]].length - 1;
908 let rDelim, rLength, delimTotal = lLength, midDelimTotal = 0;
909 const endReg = match[0][0] === "*" ? this.rules.inline.emStrongRDelimAst : this.rules.inline.emStrongRDelimUnd;
910 endReg.lastIndex = 0;
911 maskedSrc = maskedSrc.slice(-1 * src.length + lLength);
912 while ((match = endReg.exec(maskedSrc)) != null) {
913 rDelim = match[1] || match[2] || match[3] || match[4] || match[5] || match[6];
914 if (!rDelim) continue;
915 rLength = [...rDelim].length;
916 if (match[3] || match[4]) {
917 delimTotal += rLength;
918 continue;
919 } else if (match[5] || match[6]) {
920 if (lLength % 3 && !((lLength + rLength) % 3)) {
921 midDelimTotal += rLength;
922 continue;
923 }
924 }
925 delimTotal -= rLength;
926 if (delimTotal > 0) continue;
927 rLength = Math.min(rLength, rLength + delimTotal + midDelimTotal);
928 const lastCharLength = [...match[0]][0].length;
929 const raw = src.slice(0, lLength + match.index + lastCharLength + rLength);
930 if (Math.min(lLength, rLength) % 2) {
931 const text2 = raw.slice(1, -1);
932 return {
933 type: "em",
934 raw,
935 text: text2,
936 tokens: this.lexer.inlineTokens(text2)
937 };
938 }
939 const text = raw.slice(2, -2);
940 return {
941 type: "strong",
942 raw,
943 text,
944 tokens: this.lexer.inlineTokens(text)
945 };
946 }
947 }
948 }
949 codespan(src) {
950 const cap = this.rules.inline.code.exec(src);
951 if (cap) {
952 let text = cap[2].replace(this.rules.other.newLineCharGlobal, " ");
953 const hasNonSpaceChars = this.rules.other.nonSpaceChar.test(text);
954 const hasSpaceCharsOnBothEnds = this.rules.other.startingSpaceChar.test(text) && this.rules.other.endingSpaceChar.test(text);
955 if (hasNonSpaceChars && hasSpaceCharsOnBothEnds) {
956 text = text.substring(1, text.length - 1);
957 }
958 return {
959 type: "codespan",
960 raw: cap[0],
961 text
962 };
963 }
964 }
965 br(src) {
966 const cap = this.rules.inline.br.exec(src);
967 if (cap) {
968 return {
969 type: "br",
970 raw: cap[0]
971 };
972 }
973 }
974 del(src) {
975 const cap = this.rules.inline.del.exec(src);
976 if (cap) {
977 return {
978 type: "del",
979 raw: cap[0],
980 text: cap[2],
981 tokens: this.lexer.inlineTokens(cap[2])
982 };
983 }
984 }
985 autolink(src) {
986 const cap = this.rules.inline.autolink.exec(src);
987 if (cap) {
988 let text, href;
989 if (cap[2] === "@") {
990 text = cap[1];
991 href = "mailto:" + text;
992 } else {
993 text = cap[1];
994 href = text;
995 }
996 return {
997 type: "link",
998 raw: cap[0],
999 text,
1000 href,
1001 tokens: [
1002 {
1003 type: "text",
1004 raw: text,
1005 text
1006 }
1007 ]
1008 };
1009 }
1010 }
1011 url(src) {
1012 let cap;
1013 if (cap = this.rules.inline.url.exec(src)) {
1014 let text, href;
1015 if (cap[2] === "@") {
1016 text = cap[0];
1017 href = "mailto:" + text;
1018 } else {
1019 let prevCapZero;
1020 do {
1021 prevCapZero = cap[0];
1022 cap[0] = this.rules.inline._backpedal.exec(cap[0])?.[0] ?? "";
1023 } while (prevCapZero !== cap[0]);
1024 text = cap[0];
1025 if (cap[1] === "www.") {
1026 href = "http://" + cap[0];
1027 } else {
1028 href = cap[0];
1029 }
1030 }
1031 return {
1032 type: "link",
1033 raw: cap[0],
1034 text,
1035 href,
1036 tokens: [
1037 {
1038 type: "text",
1039 raw: text,
1040 text
1041 }
1042 ]
1043 };
1044 }
1045 }
1046 inlineText(src) {
1047 const cap = this.rules.inline.text.exec(src);
1048 if (cap) {
1049 const escaped = this.lexer.state.inRawBlock;
1050 return {
1051 type: "text",
1052 raw: cap[0],
1053 text: cap[0],
1054 escaped
1055 };
1056 }
1057 }
1058 };
1059
1060 // src/Lexer.ts
1061 var _Lexer = class __Lexer {
1062 tokens;
1063 options;
1064 state;
1065 tokenizer;
1066 inlineQueue;
1067 constructor(options2) {
1068 this.tokens = [];
1069 this.tokens.links = /* @__PURE__ */ Object.create(null);
1070 this.options = options2 || _defaults;
1071 this.options.tokenizer = this.options.tokenizer || new _Tokenizer();
1072 this.tokenizer = this.options.tokenizer;
1073 this.tokenizer.options = this.options;
1074 this.tokenizer.lexer = this;
1075 this.inlineQueue = [];
1076 this.state = {
1077 inLink: false,
1078 inRawBlock: false,
1079 top: true
1080 };
1081 const rules = {
1082 other,
1083 block: block.normal,
1084 inline: inline.normal
1085 };
1086 if (this.options.pedantic) {
1087 rules.block = block.pedantic;
1088 rules.inline = inline.pedantic;
1089 } else if (this.options.gfm) {
1090 rules.block = block.gfm;
1091 if (this.options.breaks) {
1092 rules.inline = inline.breaks;
1093 } else {
1094 rules.inline = inline.gfm;
1095 }
1096 }
1097 this.tokenizer.rules = rules;
1098 }
1099 /**
1100 * Expose Rules
1101 */
1102 static get rules() {
1103 return {
1104 block,
1105 inline
1106 };
1107 }
1108 /**
1109 * Static Lex Method
1110 */
1111 static lex(src, options2) {
1112 const lexer2 = new __Lexer(options2);
1113 return lexer2.lex(src);
1114 }
1115 /**
1116 * Static Lex Inline Method
1117 */
1118 static lexInline(src, options2) {
1119 const lexer2 = new __Lexer(options2);
1120 return lexer2.inlineTokens(src);
1121 }
1122 /**
1123 * Preprocessing
1124 */
1125 lex(src) {
1126 src = src.replace(other.carriageReturn, "\n");
1127 this.blockTokens(src, this.tokens);
1128 for (let i = 0; i < this.inlineQueue.length; i++) {
1129 const next = this.inlineQueue[i];
1130 this.inlineTokens(next.src, next.tokens);
1131 }
1132 this.inlineQueue = [];
1133 return this.tokens;
1134 }
1135 blockTokens(src, tokens = [], lastParagraphClipped = false) {
1136 if (this.options.pedantic) {
1137 src = src.replace(other.tabCharGlobal, " ").replace(other.spaceLine, "");
1138 }
1139 while (src) {
1140 let token;
1141 if (this.options.extensions?.block?.some((extTokenizer) => {
1142 if (token = extTokenizer.call({ lexer: this }, src, tokens)) {
1143 src = src.substring(token.raw.length);
1144 tokens.push(token);
1145 return true;
1146 }
1147 return false;
1148 })) {
1149 continue;
1150 }
1151 if (token = this.tokenizer.space(src)) {
1152 src = src.substring(token.raw.length);
1153 const lastToken = tokens.at(-1);
1154 if (token.raw.length === 1 && lastToken !== void 0) {
1155 lastToken.raw += "\n";
1156 } else {
1157 tokens.push(token);
1158 }
1159 continue;
1160 }
1161 if (token = this.tokenizer.code(src)) {
1162 src = src.substring(token.raw.length);
1163 const lastToken = tokens.at(-1);
1164 if (lastToken?.type === "paragraph" || lastToken?.type === "text") {
1165 lastToken.raw += "\n" + token.raw;
1166 lastToken.text += "\n" + token.text;
1167 this.inlineQueue.at(-1).src = lastToken.text;
1168 } else {
1169 tokens.push(token);
1170 }
1171 continue;
1172 }
1173 if (token = this.tokenizer.fences(src)) {
1174 src = src.substring(token.raw.length);
1175 tokens.push(token);
1176 continue;
1177 }
1178 if (token = this.tokenizer.heading(src)) {
1179 src = src.substring(token.raw.length);
1180 tokens.push(token);
1181 continue;
1182 }
1183 if (token = this.tokenizer.hr(src)) {
1184 src = src.substring(token.raw.length);
1185 tokens.push(token);
1186 continue;
1187 }
1188 if (token = this.tokenizer.blockquote(src)) {
1189 src = src.substring(token.raw.length);
1190 tokens.push(token);
1191 continue;
1192 }
1193 if (token = this.tokenizer.list(src)) {
1194 src = src.substring(token.raw.length);
1195 tokens.push(token);
1196 continue;
1197 }
1198 if (token = this.tokenizer.html(src)) {
1199 src = src.substring(token.raw.length);
1200 tokens.push(token);
1201 continue;
1202 }
1203 if (token = this.tokenizer.def(src)) {
1204 src = src.substring(token.raw.length);
1205 const lastToken = tokens.at(-1);
1206 if (lastToken?.type === "paragraph" || lastToken?.type === "text") {
1207 lastToken.raw += "\n" + token.raw;
1208 lastToken.text += "\n" + token.raw;
1209 this.inlineQueue.at(-1).src = lastToken.text;
1210 } else if (!this.tokens.links[token.tag]) {
1211 this.tokens.links[token.tag] = {
1212 href: token.href,
1213 title: token.title
1214 };
1215 }
1216 continue;
1217 }
1218 if (token = this.tokenizer.table(src)) {
1219 src = src.substring(token.raw.length);
1220 tokens.push(token);
1221 continue;
1222 }
1223 if (token = this.tokenizer.lheading(src)) {
1224 src = src.substring(token.raw.length);
1225 tokens.push(token);
1226 continue;
1227 }
1228 let cutSrc = src;
1229 if (this.options.extensions?.startBlock) {
1230 let startIndex = Infinity;
1231 const tempSrc = src.slice(1);
1232 let tempStart;
1233 this.options.extensions.startBlock.forEach((getStartIndex) => {
1234 tempStart = getStartIndex.call({ lexer: this }, tempSrc);
1235 if (typeof tempStart === "number" && tempStart >= 0) {
1236 startIndex = Math.min(startIndex, tempStart);
1237 }
1238 });
1239 if (startIndex < Infinity && startIndex >= 0) {
1240 cutSrc = src.substring(0, startIndex + 1);
1241 }
1242 }
1243 if (this.state.top && (token = this.tokenizer.paragraph(cutSrc))) {
1244 const lastToken = tokens.at(-1);
1245 if (lastParagraphClipped && lastToken?.type === "paragraph") {
1246 lastToken.raw += "\n" + token.raw;
1247 lastToken.text += "\n" + token.text;
1248 this.inlineQueue.pop();
1249 this.inlineQueue.at(-1).src = lastToken.text;
1250 } else {
1251 tokens.push(token);
1252 }
1253 lastParagraphClipped = cutSrc.length !== src.length;
1254 src = src.substring(token.raw.length);
1255 continue;
1256 }
1257 if (token = this.tokenizer.text(src)) {
1258 src = src.substring(token.raw.length);
1259 const lastToken = tokens.at(-1);
1260 if (lastToken?.type === "text") {
1261 lastToken.raw += "\n" + token.raw;
1262 lastToken.text += "\n" + token.text;
1263 this.inlineQueue.pop();
1264 this.inlineQueue.at(-1).src = lastToken.text;
1265 } else {
1266 tokens.push(token);
1267 }
1268 continue;
1269 }
1270 if (src) {
1271 const errMsg = "Infinite loop on byte: " + src.charCodeAt(0);
1272 if (this.options.silent) {
1273 console.error(errMsg);
1274 break;
1275 } else {
1276 throw new Error(errMsg);
1277 }
1278 }
1279 }
1280 this.state.top = true;
1281 return tokens;
1282 }
1283 inline(src, tokens = []) {
1284 this.inlineQueue.push({ src, tokens });
1285 return tokens;
1286 }
1287 /**
1288 * Lexing/Compiling
1289 */
1290 inlineTokens(src, tokens = []) {
1291 let maskedSrc = src;
1292 let match = null;
1293 if (this.tokens.links) {
1294 const links = Object.keys(this.tokens.links);
1295 if (links.length > 0) {
1296 while ((match = this.tokenizer.rules.inline.reflinkSearch.exec(maskedSrc)) != null) {
1297 if (links.includes(match[0].slice(match[0].lastIndexOf("[") + 1, -1))) {
1298 maskedSrc = maskedSrc.slice(0, match.index) + "[" + "a".repeat(match[0].length - 2) + "]" + maskedSrc.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex);
1299 }
1300 }
1301 }
1302 }
1303 while ((match = this.tokenizer.rules.inline.anyPunctuation.exec(maskedSrc)) != null) {
1304 maskedSrc = maskedSrc.slice(0, match.index) + "++" + maskedSrc.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);
1305 }
1306 while ((match = this.tokenizer.rules.inline.blockSkip.exec(maskedSrc)) != null) {
1307 maskedSrc = maskedSrc.slice(0, match.index) + "[" + "a".repeat(match[0].length - 2) + "]" + maskedSrc.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);
1308 }
1309 let keepPrevChar = false;
1310 let prevChar = "";
1311 while (src) {
1312 if (!keepPrevChar) {
1313 prevChar = "";
1314 }
1315 keepPrevChar = false;
1316 let token;
1317 if (this.options.extensions?.inline?.some((extTokenizer) => {
1318 if (token = extTokenizer.call({ lexer: this }, src, tokens)) {
1319 src = src.substring(token.raw.length);
1320 tokens.push(token);
1321 return true;
1322 }
1323 return false;
1324 })) {
1325 continue;
1326 }
1327 if (token = this.tokenizer.escape(src)) {
1328 src = src.substring(token.raw.length);
1329 tokens.push(token);
1330 continue;
1331 }
1332 if (token = this.tokenizer.tag(src)) {
1333 src = src.substring(token.raw.length);
1334 tokens.push(token);
1335 continue;
1336 }
1337 if (token = this.tokenizer.link(src)) {
1338 src = src.substring(token.raw.length);
1339 tokens.push(token);
1340 continue;
1341 }
1342 if (token = this.tokenizer.reflink(src, this.tokens.links)) {
1343 src = src.substring(token.raw.length);
1344 const lastToken = tokens.at(-1);
1345 if (token.type === "text" && lastToken?.type === "text") {
1346 lastToken.raw += token.raw;
1347 lastToken.text += token.text;
1348 } else {
1349 tokens.push(token);
1350 }
1351 continue;
1352 }
1353 if (token = this.tokenizer.emStrong(src, maskedSrc, prevChar)) {
1354 src = src.substring(token.raw.length);
1355 tokens.push(token);
1356 continue;
1357 }
1358 if (token = this.tokenizer.codespan(src)) {
1359 src = src.substring(token.raw.length);
1360 tokens.push(token);
1361 continue;
1362 }
1363 if (token = this.tokenizer.br(src)) {
1364 src = src.substring(token.raw.length);
1365 tokens.push(token);
1366 continue;
1367 }
1368 if (token = this.tokenizer.del(src)) {
1369 src = src.substring(token.raw.length);
1370 tokens.push(token);
1371 continue;
1372 }
1373 if (token = this.tokenizer.autolink(src)) {
1374 src = src.substring(token.raw.length);
1375 tokens.push(token);
1376 continue;
1377 }
1378 if (!this.state.inLink && (token = this.tokenizer.url(src))) {
1379 src = src.substring(token.raw.length);
1380 tokens.push(token);
1381 continue;
1382 }
1383 let cutSrc = src;
1384 if (this.options.extensions?.startInline) {
1385 let startIndex = Infinity;
1386 const tempSrc = src.slice(1);
1387 let tempStart;
1388 this.options.extensions.startInline.forEach((getStartIndex) => {
1389 tempStart = getStartIndex.call({ lexer: this }, tempSrc);
1390 if (typeof tempStart === "number" && tempStart >= 0) {
1391 startIndex = Math.min(startIndex, tempStart);
1392 }
1393 });
1394 if (startIndex < Infinity && startIndex >= 0) {
1395 cutSrc = src.substring(0, startIndex + 1);
1396 }
1397 }
1398 if (token = this.tokenizer.inlineText(cutSrc)) {
1399 src = src.substring(token.raw.length);
1400 if (token.raw.slice(-1) !== "_") {
1401 prevChar = token.raw.slice(-1);
1402 }
1403 keepPrevChar = true;
1404 const lastToken = tokens.at(-1);
1405 if (lastToken?.type === "text") {
1406 lastToken.raw += token.raw;
1407 lastToken.text += token.text;
1408 } else {
1409 tokens.push(token);
1410 }
1411 continue;
1412 }
1413 if (src) {
1414 const errMsg = "Infinite loop on byte: " + src.charCodeAt(0);
1415 if (this.options.silent) {
1416 console.error(errMsg);
1417 break;
1418 } else {
1419 throw new Error(errMsg);
1420 }
1421 }
1422 }
1423 return tokens;
1424 }
1425 };
1426
1427 // src/Renderer.ts
1428 var _Renderer = class {
1429 options;
1430 parser;
1431 // set by the parser
1432 constructor(options2) {
1433 this.options = options2 || _defaults;
1434 }
1435 space(token) {
1436 return "";
1437 }
1438 code({ text, lang, escaped }) {
1439 const langString = (lang || "").match(other.notSpaceStart)?.[0];
1440 const code = text.replace(other.endingNewline, "") + "\n";
1441 if (!langString) {
1442 return "<pre><code>" + (escaped ? code : escape2(code, true)) + "</code></pre>\n";
1443 }
1444 return '<pre><code class="language-' + escape2(langString) + '">' + (escaped ? code : escape2(code, true)) + "</code></pre>\n";
1445 }
1446 blockquote({ tokens }) {
1447 const body = this.parser.parse(tokens);
1448 return `<blockquote>
1449 ${body}</blockquote>
1450 `;
1451 }
1452 html({ text }) {
1453 return text;
1454 }
1455 heading({ tokens, depth }) {
1456 return `<h${depth}>${this.parser.parseInline(tokens)}</h${depth}>
1457 `;
1458 }
1459 hr(token) {
1460 return "<hr>\n";
1461 }
1462 list(token) {
1463 const ordered = token.ordered;
1464 const start = token.start;
1465 let body = "";
1466 for (let j = 0; j < token.items.length; j++) {
1467 const item = token.items[j];
1468 body += this.listitem(item);
1469 }
1470 const type = ordered ? "ol" : "ul";
1471 const startAttr = ordered && start !== 1 ? ' start="' + start + '"' : "";
1472 return "<" + type + startAttr + ">\n" + body + "</" + type + ">\n";
1473 }
1474 listitem(item) {
1475 let itemBody = "";
1476 if (item.task) {
1477 const checkbox = this.checkbox({ checked: !!item.checked });
1478 if (item.loose) {
1479 if (item.tokens[0]?.type === "paragraph") {
1480 item.tokens[0].text = checkbox + " " + item.tokens[0].text;
1481 if (item.tokens[0].tokens && item.tokens[0].tokens.length > 0 && item.tokens[0].tokens[0].type === "text") {
1482 item.tokens[0].tokens[0].text = checkbox + " " + escape2(item.tokens[0].tokens[0].text);
1483 item.tokens[0].tokens[0].escaped = true;
1484 }
1485 } else {
1486 item.tokens.unshift({
1487 type: "text",
1488 raw: checkbox + " ",
1489 text: checkbox + " ",
1490 escaped: true
1491 });
1492 }
1493 } else {
1494 itemBody += checkbox + " ";
1495 }
1496 }
1497 itemBody += this.parser.parse(item.tokens, !!item.loose);
1498 return `<li>${itemBody}</li>
1499 `;
1500 }
1501 checkbox({ checked }) {
1502 return "<input " + (checked ? 'checked="" ' : "") + 'disabled="" type="checkbox">';
1503 }
1504 paragraph({ tokens }) {
1505 return `<p>${this.parser.parseInline(tokens)}</p>
1506 `;
1507 }
1508 table(token) {
1509 let header = "";
1510 let cell = "";
1511 for (let j = 0; j < token.header.length; j++) {
1512 cell += this.tablecell(token.header[j]);
1513 }
1514 header += this.tablerow({ text: cell });
1515 let body = "";
1516 for (let j = 0; j < token.rows.length; j++) {
1517 const row = token.rows[j];
1518 cell = "";
1519 for (let k = 0; k < row.length; k++) {
1520 cell += this.tablecell(row[k]);
1521 }
1522 body += this.tablerow({ text: cell });
1523 }
1524 if (body) body = `<tbody>${body}</tbody>`;
1525 return "<table>\n<thead>\n" + header + "</thead>\n" + body + "</table>\n";
1526 }
1527 tablerow({ text }) {
1528 return `<tr>
1529 ${text}</tr>
1530 `;
1531 }
1532 tablecell(token) {
1533 const content = this.parser.parseInline(token.tokens);
1534 const type = token.header ? "th" : "td";
1535 const tag2 = token.align ? `<${type} align="${token.align}">` : `<${type}>`;
1536 return tag2 + content + `</${type}>
1537 `;
1538 }
1539 /**
1540 * span level renderer
1541 */
1542 strong({ tokens }) {
1543 return `<strong>${this.parser.parseInline(tokens)}</strong>`;
1544 }
1545 em({ tokens }) {
1546 return `<em>${this.parser.parseInline(tokens)}</em>`;
1547 }
1548 codespan({ text }) {
1549 return `<code>${escape2(text, true)}</code>`;
1550 }
1551 br(token) {
1552 return "<br>";
1553 }
1554 del({ tokens }) {
1555 return `<del>${this.parser.parseInline(tokens)}</del>`;
1556 }
1557 link({ href, title, tokens }) {
1558 const text = this.parser.parseInline(tokens);
1559 const cleanHref = cleanUrl(href);
1560 if (cleanHref === null) {
1561 return text;
1562 }
1563 href = cleanHref;
1564 let out = '<a href="' + href + '"';
1565 if (title) {
1566 out += ' title="' + escape2(title) + '"';
1567 }
1568 out += ">" + text + "</a>";
1569 return out;
1570 }
1571 image({ href, title, text, tokens }) {
1572 if (tokens) {
1573 text = this.parser.parseInline(tokens, this.parser.textRenderer);
1574 }
1575 const cleanHref = cleanUrl(href);
1576 if (cleanHref === null) {
1577 return escape2(text);
1578 }
1579 href = cleanHref;
1580 let out = `<img src="${href}" alt="${text}"`;
1581 if (title) {
1582 out += ` title="${escape2(title)}"`;
1583 }
1584 out += ">";
1585 return out;
1586 }
1587 text(token) {
1588 return "tokens" in token && token.tokens ? this.parser.parseInline(token.tokens) : "escaped" in token && token.escaped ? token.text : escape2(token.text);
1589 }
1590 };
1591
1592 // src/TextRenderer.ts
1593 var _TextRenderer = class {
1594 // no need for block level renderers
1595 strong({ text }) {
1596 return text;
1597 }
1598 em({ text }) {
1599 return text;
1600 }
1601 codespan({ text }) {
1602 return text;
1603 }
1604 del({ text }) {
1605 return text;
1606 }
1607 html({ text }) {
1608 return text;
1609 }
1610 text({ text }) {
1611 return text;
1612 }
1613 link({ text }) {
1614 return "" + text;
1615 }
1616 image({ text }) {
1617 return "" + text;
1618 }
1619 br() {
1620 return "";
1621 }
1622 };
1623
1624 // src/Parser.ts
1625 var _Parser = class __Parser {
1626 options;
1627 renderer;
1628 textRenderer;
1629 constructor(options2) {
1630 this.options = options2 || _defaults;
1631 this.options.renderer = this.options.renderer || new _Renderer();
1632 this.renderer = this.options.renderer;
1633 this.renderer.options = this.options;
1634 this.renderer.parser = this;
1635 this.textRenderer = new _TextRenderer();
1636 }
1637 /**
1638 * Static Parse Method
1639 */
1640 static parse(tokens, options2) {
1641 const parser2 = new __Parser(options2);
1642 return parser2.parse(tokens);
1643 }
1644 /**
1645 * Static Parse Inline Method
1646 */
1647 static parseInline(tokens, options2) {
1648 const parser2 = new __Parser(options2);
1649 return parser2.parseInline(tokens);
1650 }
1651 /**
1652 * Parse Loop
1653 */
1654 parse(tokens, top = true) {
1655 let out = "";
1656 for (let i = 0; i < tokens.length; i++) {
1657 const anyToken = tokens[i];
1658 if (this.options.extensions?.renderers?.[anyToken.type]) {
1659 const genericToken = anyToken;
1660 const ret = this.options.extensions.renderers[genericToken.type].call({ parser: this }, genericToken);
1661 if (ret !== false || !["space", "hr", "heading", "code", "table", "blockquote", "list", "html", "paragraph", "text"].includes(genericToken.type)) {
1662 out += ret || "";
1663 continue;
1664 }
1665 }
1666 const token = anyToken;
1667 switch (token.type) {
1668 case "space": {
1669 out += this.renderer.space(token);
1670 continue;
1671 }
1672 case "hr": {
1673 out += this.renderer.hr(token);
1674 continue;
1675 }
1676 case "heading": {
1677 out += this.renderer.heading(token);
1678 continue;
1679 }
1680 case "code": {
1681 out += this.renderer.code(token);
1682 continue;
1683 }
1684 case "table": {
1685 out += this.renderer.table(token);
1686 continue;
1687 }
1688 case "blockquote": {
1689 out += this.renderer.blockquote(token);
1690 continue;
1691 }
1692 case "list": {
1693 out += this.renderer.list(token);
1694 continue;
1695 }
1696 case "html": {
1697 out += this.renderer.html(token);
1698 continue;
1699 }
1700 case "paragraph": {
1701 out += this.renderer.paragraph(token);
1702 continue;
1703 }
1704 case "text": {
1705 let textToken = token;
1706 let body = this.renderer.text(textToken);
1707 while (i + 1 < tokens.length && tokens[i + 1].type === "text") {
1708 textToken = tokens[++i];
1709 body += "\n" + this.renderer.text(textToken);
1710 }
1711 if (top) {
1712 out += this.renderer.paragraph({
1713 type: "paragraph",
1714 raw: body,
1715 text: body,
1716 tokens: [{ type: "text", raw: body, text: body, escaped: true }]
1717 });
1718 } else {
1719 out += body;
1720 }
1721 continue;
1722 }
1723 default: {
1724 const errMsg = 'Token with "' + token.type + '" type was not found.';
1725 if (this.options.silent) {
1726 console.error(errMsg);
1727 return "";
1728 } else {
1729 throw new Error(errMsg);
1730 }
1731 }
1732 }
1733 }
1734 return out;
1735 }
1736 /**
1737 * Parse Inline Tokens
1738 */
1739 parseInline(tokens, renderer = this.renderer) {
1740 let out = "";
1741 for (let i = 0; i < tokens.length; i++) {
1742 const anyToken = tokens[i];
1743 if (this.options.extensions?.renderers?.[anyToken.type]) {
1744 const ret = this.options.extensions.renderers[anyToken.type].call({ parser: this }, anyToken);
1745 if (ret !== false || !["escape", "html", "link", "image", "strong", "em", "codespan", "br", "del", "text"].includes(anyToken.type)) {
1746 out += ret || "";
1747 continue;
1748 }
1749 }
1750 const token = anyToken;
1751 switch (token.type) {
1752 case "escape": {
1753 out += renderer.text(token);
1754 break;
1755 }
1756 case "html": {
1757 out += renderer.html(token);
1758 break;
1759 }
1760 case "link": {
1761 out += renderer.link(token);
1762 break;
1763 }
1764 case "image": {
1765 out += renderer.image(token);
1766 break;
1767 }
1768 case "strong": {
1769 out += renderer.strong(token);
1770 break;
1771 }
1772 case "em": {
1773 out += renderer.em(token);
1774 break;
1775 }
1776 case "codespan": {
1777 out += renderer.codespan(token);
1778 break;
1779 }
1780 case "br": {
1781 out += renderer.br(token);
1782 break;
1783 }
1784 case "del": {
1785 out += renderer.del(token);
1786 break;
1787 }
1788 case "text": {
1789 out += renderer.text(token);
1790 break;
1791 }
1792 default: {
1793 const errMsg = 'Token with "' + token.type + '" type was not found.';
1794 if (this.options.silent) {
1795 console.error(errMsg);
1796 return "";
1797 } else {
1798 throw new Error(errMsg);
1799 }
1800 }
1801 }
1802 }
1803 return out;
1804 }
1805 };
1806
1807 // src/Hooks.ts
1808 var _Hooks = class {
1809 options;
1810 block;
1811 constructor(options2) {
1812 this.options = options2 || _defaults;
1813 }
1814 static passThroughHooks = /* @__PURE__ */ new Set([
1815 "preprocess",
1816 "postprocess",
1817 "processAllTokens"
1818 ]);
1819 /**
1820 * Process markdown before marked
1821 */
1822 preprocess(markdown) {
1823 return markdown;
1824 }
1825 /**
1826 * Process HTML after marked is finished
1827 */
1828 postprocess(html2) {
1829 return html2;
1830 }
1831 /**
1832 * Process all tokens before walk tokens
1833 */
1834 processAllTokens(tokens) {
1835 return tokens;
1836 }
1837 /**
1838 * Provide function to tokenize markdown
1839 */
1840 provideLexer() {
1841 return this.block ? _Lexer.lex : _Lexer.lexInline;
1842 }
1843 /**
1844 * Provide function to parse tokens
1845 */
1846 provideParser() {
1847 return this.block ? _Parser.parse : _Parser.parseInline;
1848 }
1849 };
1850
1851 // src/Instance.ts
1852 var Marked = class {
1853 defaults = _getDefaults();
1854 options = this.setOptions;
1855 parse = this.parseMarkdown(true);
1856 parseInline = this.parseMarkdown(false);
1857 Parser = _Parser;
1858 Renderer = _Renderer;
1859 TextRenderer = _TextRenderer;
1860 Lexer = _Lexer;
1861 Tokenizer = _Tokenizer;
1862 Hooks = _Hooks;
1863 constructor(...args) {
1864 this.use(...args);
1865 }
1866 /**
1867 * Run callback for every token
1868 */
1869 walkTokens(tokens, callback) {
1870 let values = [];
1871 for (const token of tokens) {
1872 values = values.concat(callback.call(this, token));
1873 switch (token.type) {
1874 case "table": {
1875 const tableToken = token;
1876 for (const cell of tableToken.header) {
1877 values = values.concat(this.walkTokens(cell.tokens, callback));
1878 }
1879 for (const row of tableToken.rows) {
1880 for (const cell of row) {
1881 values = values.concat(this.walkTokens(cell.tokens, callback));
1882 }
1883 }
1884 break;
1885 }
1886 case "list": {
1887 const listToken = token;
1888 values = values.concat(this.walkTokens(listToken.items, callback));
1889 break;
1890 }
1891 default: {
1892 const genericToken = token;
1893 if (this.defaults.extensions?.childTokens?.[genericToken.type]) {
1894 this.defaults.extensions.childTokens[genericToken.type].forEach((childTokens) => {
1895 const tokens2 = genericToken[childTokens].flat(Infinity);
1896 values = values.concat(this.walkTokens(tokens2, callback));
1897 });
1898 } else if (genericToken.tokens) {
1899 values = values.concat(this.walkTokens(genericToken.tokens, callback));
1900 }
1901 }
1902 }
1903 }
1904 return values;
1905 }
1906 use(...args) {
1907 const extensions = this.defaults.extensions || { renderers: {}, childTokens: {} };
1908 args.forEach((pack) => {
1909 const opts = { ...pack };
1910 opts.async = this.defaults.async || opts.async || false;
1911 if (pack.extensions) {
1912 pack.extensions.forEach((ext) => {
1913 if (!ext.name) {
1914 throw new Error("extension name required");
1915 }
1916 if ("renderer" in ext) {
1917 const prevRenderer = extensions.renderers[ext.name];
1918 if (prevRenderer) {
1919 extensions.renderers[ext.name] = function(...args2) {
1920 let ret = ext.renderer.apply(this, args2);
1921 if (ret === false) {
1922 ret = prevRenderer.apply(this, args2);
1923 }
1924 return ret;
1925 };
1926 } else {
1927 extensions.renderers[ext.name] = ext.renderer;
1928 }
1929 }
1930 if ("tokenizer" in ext) {
1931 if (!ext.level || ext.level !== "block" && ext.level !== "inline") {
1932 throw new Error("extension level must be 'block' or 'inline'");
1933 }
1934 const extLevel = extensions[ext.level];
1935 if (extLevel) {
1936 extLevel.unshift(ext.tokenizer);
1937 } else {
1938 extensions[ext.level] = [ext.tokenizer];
1939 }
1940 if (ext.start) {
1941 if (ext.level === "block") {
1942 if (extensions.startBlock) {
1943 extensions.startBlock.push(ext.start);
1944 } else {
1945 extensions.startBlock = [ext.start];
1946 }
1947 } else if (ext.level === "inline") {
1948 if (extensions.startInline) {
1949 extensions.startInline.push(ext.start);
1950 } else {
1951 extensions.startInline = [ext.start];
1952 }
1953 }
1954 }
1955 }
1956 if ("childTokens" in ext && ext.childTokens) {
1957 extensions.childTokens[ext.name] = ext.childTokens;
1958 }
1959 });
1960 opts.extensions = extensions;
1961 }
1962 if (pack.renderer) {
1963 const renderer = this.defaults.renderer || new _Renderer(this.defaults);
1964 for (const prop in pack.renderer) {
1965 if (!(prop in renderer)) {
1966 throw new Error(`renderer '${prop}' does not exist`);
1967 }
1968 if (["options", "parser"].includes(prop)) {
1969 continue;
1970 }
1971 const rendererProp = prop;
1972 const rendererFunc = pack.renderer[rendererProp];
1973 const prevRenderer = renderer[rendererProp];
1974 renderer[rendererProp] = (...args2) => {
1975 let ret = rendererFunc.apply(renderer, args2);
1976 if (ret === false) {
1977 ret = prevRenderer.apply(renderer, args2);
1978 }
1979 return ret || "";
1980 };
1981 }
1982 opts.renderer = renderer;
1983 }
1984 if (pack.tokenizer) {
1985 const tokenizer = this.defaults.tokenizer || new _Tokenizer(this.defaults);
1986 for (const prop in pack.tokenizer) {
1987 if (!(prop in tokenizer)) {
1988 throw new Error(`tokenizer '${prop}' does not exist`);
1989 }
1990 if (["options", "rules", "lexer"].includes(prop)) {
1991 continue;
1992 }
1993 const tokenizerProp = prop;
1994 const tokenizerFunc = pack.tokenizer[tokenizerProp];
1995 const prevTokenizer = tokenizer[tokenizerProp];
1996 tokenizer[tokenizerProp] = (...args2) => {
1997 let ret = tokenizerFunc.apply(tokenizer, args2);
1998 if (ret === false) {
1999 ret = prevTokenizer.apply(tokenizer, args2);
2000 }
2001 return ret;
2002 };
2003 }
2004 opts.tokenizer = tokenizer;
2005 }
2006 if (pack.hooks) {
2007 const hooks = this.defaults.hooks || new _Hooks();
2008 for (const prop in pack.hooks) {
2009 if (!(prop in hooks)) {
2010 throw new Error(`hook '${prop}' does not exist`);
2011 }
2012 if (["options", "block"].includes(prop)) {
2013 continue;
2014 }
2015 const hooksProp = prop;
2016 const hooksFunc = pack.hooks[hooksProp];
2017 const prevHook = hooks[hooksProp];
2018 if (_Hooks.passThroughHooks.has(prop)) {
2019 hooks[hooksProp] = (arg) => {
2020 if (this.defaults.async) {
2021 return Promise.resolve(hooksFunc.call(hooks, arg)).then((ret2) => {
2022 return prevHook.call(hooks, ret2);
2023 });
2024 }
2025 const ret = hooksFunc.call(hooks, arg);
2026 return prevHook.call(hooks, ret);
2027 };
2028 } else {
2029 hooks[hooksProp] = (...args2) => {
2030 let ret = hooksFunc.apply(hooks, args2);
2031 if (ret === false) {
2032 ret = prevHook.apply(hooks, args2);
2033 }
2034 return ret;
2035 };
2036 }
2037 }
2038 opts.hooks = hooks;
2039 }
2040 if (pack.walkTokens) {
2041 const walkTokens2 = this.defaults.walkTokens;
2042 const packWalktokens = pack.walkTokens;
2043 opts.walkTokens = function(token) {
2044 let values = [];
2045 values.push(packWalktokens.call(this, token));
2046 if (walkTokens2) {
2047 values = values.concat(walkTokens2.call(this, token));
2048 }
2049 return values;
2050 };
2051 }
2052 this.defaults = { ...this.defaults, ...opts };
2053 });
2054 return this;
2055 }
2056 setOptions(opt) {
2057 this.defaults = { ...this.defaults, ...opt };
2058 return this;
2059 }
2060 lexer(src, options2) {
2061 return _Lexer.lex(src, options2 ?? this.defaults);
2062 }
2063 parser(tokens, options2) {
2064 return _Parser.parse(tokens, options2 ?? this.defaults);
2065 }
2066 parseMarkdown(blockType) {
2067 const parse2 = (src, options2) => {
2068 const origOpt = { ...options2 };
2069 const opt = { ...this.defaults, ...origOpt };
2070 const throwError = this.onError(!!opt.silent, !!opt.async);
2071 if (this.defaults.async === true && origOpt.async === false) {
2072 return throwError(new Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise."));
2073 }
2074 if (typeof src === "undefined" || src === null) {
2075 return throwError(new Error("marked(): input parameter is undefined or null"));
2076 }
2077 if (typeof src !== "string") {
2078 return throwError(new Error("marked(): input parameter is of type " + Object.prototype.toString.call(src) + ", string expected"));
2079 }
2080 if (opt.hooks) {
2081 opt.hooks.options = opt;
2082 opt.hooks.block = blockType;
2083 }
2084 const lexer2 = opt.hooks ? opt.hooks.provideLexer() : blockType ? _Lexer.lex : _Lexer.lexInline;
2085 const parser2 = opt.hooks ? opt.hooks.provideParser() : blockType ? _Parser.parse : _Parser.parseInline;
2086 if (opt.async) {
2087 return Promise.resolve(opt.hooks ? opt.hooks.preprocess(src) : src).then((src2) => lexer2(src2, opt)).then((tokens) => opt.hooks ? opt.hooks.processAllTokens(tokens) : tokens).then((tokens) => opt.walkTokens ? Promise.all(this.walkTokens(tokens, opt.walkTokens)).then(() => tokens) : tokens).then((tokens) => parser2(tokens, opt)).then((html2) => opt.hooks ? opt.hooks.postprocess(html2) : html2).catch(throwError);
2088 }
2089 try {
2090 if (opt.hooks) {
2091 src = opt.hooks.preprocess(src);
2092 }
2093 let tokens = lexer2(src, opt);
2094 if (opt.hooks) {
2095 tokens = opt.hooks.processAllTokens(tokens);
2096 }
2097 if (opt.walkTokens) {
2098 this.walkTokens(tokens, opt.walkTokens);
2099 }
2100 let html2 = parser2(tokens, opt);
2101 if (opt.hooks) {
2102 html2 = opt.hooks.postprocess(html2);
2103 }
2104 return html2;
2105 } catch (e) {
2106 return throwError(e);
2107 }
2108 };
2109 return parse2;
2110 }
2111 onError(silent, async) {
2112 return (e) => {
2113 e.message += "\nPlease report this to https://github.com/markedjs/marked.";
2114 if (silent) {
2115 const msg = "<p>An error occurred:</p><pre>" + escape2(e.message + "", true) + "</pre>";
2116 if (async) {
2117 return Promise.resolve(msg);
2118 }
2119 return msg;
2120 }
2121 if (async) {
2122 return Promise.reject(e);
2123 }
2124 throw e;
2125 };
2126 }
2127 };
2128
2129 // src/marked.ts
2130 var markedInstance = new Marked();
2131 function marked(src, opt) {
2132 return markedInstance.parse(src, opt);
2133 }
2134 marked.options = marked.setOptions = function(options2) {
2135 markedInstance.setOptions(options2);
2136 marked.defaults = markedInstance.defaults;
2137 changeDefaults(marked.defaults);
2138 return marked;
2139 };
2140 marked.getDefaults = _getDefaults;
2141 marked.defaults = _defaults;
2142 marked.use = function(...args) {
2143 markedInstance.use(...args);
2144 marked.defaults = markedInstance.defaults;
2145 changeDefaults(marked.defaults);
2146 return marked;
2147 };
2148 marked.walkTokens = function(tokens, callback) {
2149 return markedInstance.walkTokens(tokens, callback);
2150 };
2151 marked.parseInline = markedInstance.parseInline;
2152 marked.Parser = _Parser;
2153 marked.parser = _Parser.parse;
2154 marked.Renderer = _Renderer;
2155 marked.TextRenderer = _TextRenderer;
2156 marked.Lexer = _Lexer;
2157 marked.lexer = _Lexer.lex;
2158 marked.Tokenizer = _Tokenizer;
2159 marked.Hooks = _Hooks;
2160 marked.parse = marked;
2161 var options = marked.options;
2162 var setOptions = marked.setOptions;
2163 var use = marked.use;
2164 var walkTokens = marked.walkTokens;
2165 var parseInline = marked.parseInline;
2166 var parse = marked;
2167 var parser = _Parser.parse;
2168 var lexer = _Lexer.lex;
2169 export {
2170 _Hooks as Hooks,
2171 _Lexer as Lexer,
2172 Marked,
2173 _Parser as Parser,
2174 _Renderer as Renderer,
2175 _TextRenderer as TextRenderer,
2176 _Tokenizer as Tokenizer,
2177 _defaults as defaults,
2178 _getDefaults as getDefaults,
2179 lexer,
2180 marked,
2181 options,
2182 parse,
2183 parseInline,
2184 parser,
2185 setOptions,
2186 use,
2187 walkTokens
2188 };
2189 //# sourceMappingURL=marked.esm.js.map