bpmn-js-markdown-documentation-panel
Version:
A comprehensive documentation management plugin for Camunda Modeler with markdown support, element linking, and coverage tracking
1,439 lines (1,435 loc) • 132 kB
JavaScript
//#region ../../node_modules/.pnpm/camunda-modeler-plugin-helpers@5.1.0/node_modules/camunda-modeler-plugin-helpers/index.js
/**
* Validate and register a client plugin.
*
* @param {Object} plugin
* @param {String} type
*/
function registerClientPlugin(plugin, type) {
var plugins = window.plugins || [];
window.plugins = plugins;
if (!plugin) throw new Error("plugin not specified");
if (!type) throw new Error("type not specified");
plugins.push({
plugin,
type
});
}
/**
* Validate and register a bpmn-js plugin.
*
* @param {Object} module
*
* @example
*
* import {
* registerBpmnJSPlugin
* } from 'camunda-modeler-plugin-helpers';
*
* const BpmnJSModule = {
* __init__: [ 'myService' ],
* myService: [ 'type', ... ]
* };
*
* registerBpmnJSPlugin(BpmnJSModule);
*/
function registerBpmnJSPlugin(module$1) {
registerClientPlugin(module$1, "bpmn.modeler.additionalModules");
}
//#endregion
//#region ../../node_modules/.pnpm/bpmn-js@13.2.2/node_modules/bpmn-js/lib/util/ModelUtil.js
/**
* @typedef { import('../model/Types').Element } Element
* @typedef { import('../model/Types').ModdleElement } ModdleElement
*/
/**
* Is an element of the given BPMN type?
*
* @param {Element|ModdleElement} element
* @param {string} type
*
* @return {boolean}
*/
function is(element, type) {
var bo = getBusinessObject(element);
return bo && typeof bo.$instanceOf === "function" && bo.$instanceOf(type);
}
/**
* Return the business object for a given element.
*
* @param {Element|ModdleElement} element
*
* @return {ModdleElement}
*/
function getBusinessObject(element) {
return element && element.businessObject || element;
}
//#endregion
//#region src/extension/managers/AutocompleteManager.ts
var AutocompleteManager = class {
_callbacks;
_selectedIndex = -1;
constructor(options) {
this._callbacks = options.callbacks;
}
setupAutocompleteEventListeners() {
setTimeout(() => {
const textarea = document.getElementById("doc-textarea");
if (!textarea) return;
textarea.addEventListener("input", () => {
this.handleAutocomplete();
});
textarea.addEventListener("keydown", (event) => {
this._handleAutocompleteKeydown(event);
});
document.addEventListener("click", (event) => {
const dropdown = document.getElementById("autocomplete-dropdown");
const textarea$1 = document.getElementById("doc-textarea");
if (dropdown && !(event.target instanceof Node && dropdown.contains(event.target)) && event.target !== textarea$1) this.hideAutocomplete();
});
}, 100);
}
handleAutocomplete() {
const textarea = document.getElementById("doc-textarea");
if (!textarea) return;
const cursorPos = textarea.selectionStart;
const text = textarea.value;
let hashPos = -1;
for (let i = cursorPos - 1; i >= 0; i--) {
if (text[i] === "#") {
hashPos = i;
break;
}
if (text[i] === " " || text[i] === "\n" || text[i] === " ") break;
}
if (hashPos >= 0) {
if (hashPos > 0 && text[hashPos - 1] === "(") {
let foundClosingBracket = false;
for (let i = hashPos - 2; i >= 0; i--) {
if (text[i] === "]") {
foundClosingBracket = true;
break;
}
if (text[i] === "\n" || text[i] === "\r") break;
}
if (foundClosingBracket) {
const searchText = text.substring(hashPos + 1, cursorPos);
if (!searchText.includes(" ") && !searchText.includes("\n")) {
this._showAutocomplete(searchText, hashPos);
return;
}
}
}
}
this.hideAutocomplete();
}
hideAutocomplete() {
const dropdown = document.getElementById("autocomplete-dropdown");
if (!dropdown) return;
dropdown.classList.remove("visible");
this._selectedIndex = -1;
}
destroy() {
this.hideAutocomplete();
}
_showAutocomplete(searchText, hashPos) {
const dropdown = document.getElementById("autocomplete-dropdown");
const autocompleteList = document.getElementById("autocomplete-list");
const textarea = document.getElementById("doc-textarea");
if (!dropdown || !autocompleteList || !textarea) return;
const allElements = this._getAllElements();
const filteredElements = allElements.filter((element) => element.id.toLowerCase().includes(searchText.toLowerCase()) || element.name.toLowerCase().includes(searchText.toLowerCase()));
if (filteredElements.length === 0) {
this.hideAutocomplete();
return;
}
autocompleteList.innerHTML = "";
filteredElements.slice(0, 10).forEach((element) => {
const item = document.createElement("div");
item.className = "autocomplete-item";
item.innerHTML = `
<div class="autocomplete-item-id">${element.id}</div>
<div class="autocomplete-item-name">${element.name}</div>
<div class="autocomplete-item-type">${element.type}</div>
`;
item.addEventListener("click", () => {
this._selectAutocompleteItem(element.id, hashPos);
});
autocompleteList.appendChild(item);
});
this._positionAutocomplete(textarea, hashPos);
dropdown.classList.add("visible");
this._selectedIndex = 0;
this._updateAutocompleteSelection(Array.from(autocompleteList.children));
}
_positionAutocomplete(textarea, hashPos) {
const dropdown = document.getElementById("autocomplete-dropdown");
if (!dropdown) return;
const textareaRect = textarea.getBoundingClientRect();
const style = window.getComputedStyle(textarea);
const tempSpan = document.createElement("span");
tempSpan.style.visibility = "hidden";
tempSpan.style.position = "absolute";
tempSpan.style.top = "-9999px";
tempSpan.style.fontFamily = style.fontFamily;
tempSpan.style.fontSize = style.fontSize;
tempSpan.style.fontWeight = style.fontWeight;
tempSpan.style.letterSpacing = style.letterSpacing;
tempSpan.style.whiteSpace = "pre";
const textUpToHash = textarea.value.substring(0, hashPos);
const linesUpToHash = textUpToHash.split("\n");
const currentLine = linesUpToHash[linesUpToHash.length - 1];
tempSpan.textContent = currentLine;
this._callbacks.getCanvasContainer().appendChild(tempSpan);
this._callbacks.getCanvasContainer().removeChild(tempSpan);
const left = textareaRect.left + 10;
const top = textareaRect.top + 100;
dropdown.style.setProperty("left", `${left}px`, "important");
dropdown.style.setProperty("top", `${top}px`, "important");
dropdown.style.setProperty("position", "fixed", "important");
dropdown.style.setProperty("z-index", "10001", "important");
}
_getAllElements() {
const elements = [];
const seenIds = /* @__PURE__ */ new Set();
const allElements = this._callbacks.getAllElements();
allElements.forEach((element) => {
if (element.businessObject?.id) {
const bo = element.businessObject;
const elementId = bo.id;
if (seenIds.has(elementId)) return;
seenIds.add(elementId);
elements.push({
id: elementId,
name: bo.name || "Unnamed",
type: this._callbacks.getElementTypeName(element)
});
}
});
return elements.sort((a, b$1) => a.id.localeCompare(b$1.id));
}
_handleAutocompleteKeydown(event) {
const dropdown = document.getElementById("autocomplete-dropdown");
if (!dropdown || !dropdown.classList.contains("visible")) return;
const items = Array.from(dropdown.querySelectorAll(".autocomplete-item"));
if (event.key === "ArrowDown") {
event.preventDefault();
this._selectedIndex = Math.min(this._selectedIndex + 1, items.length - 1);
this._updateAutocompleteSelection(items);
} else if (event.key === "ArrowUp") {
event.preventDefault();
this._selectedIndex = Math.max(this._selectedIndex - 1, 0);
this._updateAutocompleteSelection(items);
} else if (event.key === "Enter") {
event.preventDefault();
if (this._selectedIndex >= 0 && items[this._selectedIndex]) {
const selectedId = items[this._selectedIndex].querySelector(".autocomplete-item-id")?.textContent;
const textarea = document.getElementById("doc-textarea");
if (!textarea) return;
const cursorPos = textarea.selectionStart;
const text = textarea.value;
let hashPos = -1;
for (let i = cursorPos - 1; i >= 0; i--) if (text[i] === "#") {
hashPos = i;
break;
}
if (hashPos >= 0 && selectedId) this._selectAutocompleteItem(selectedId, hashPos);
}
} else if (event.key === "Escape") {
event.preventDefault();
this.hideAutocomplete();
}
}
_updateAutocompleteSelection(items) {
const dropdown = document.getElementById("autocomplete-dropdown");
const autocompleteList = document.getElementById("autocomplete-list");
if (!dropdown || !autocompleteList) return;
Array.from(items).forEach((item, index) => {
if (index === this._selectedIndex) {
item.classList.add("selected");
const itemTop = item.offsetTop;
const itemBottom = itemTop + item.offsetHeight;
const dropdownTop = dropdown.scrollTop;
const dropdownBottom = dropdownTop + dropdown.clientHeight;
if (itemTop < dropdownTop) dropdown.scrollTop = itemTop;
else if (itemBottom > dropdownBottom) dropdown.scrollTop = itemBottom - dropdown.clientHeight;
} else item.classList.remove("selected");
});
}
_selectAutocompleteItem(elementId, hashPos) {
const textarea = document.getElementById("doc-textarea");
if (!textarea) return;
const text = textarea.value;
const cursorPos = textarea.selectionStart;
const beforeHash = text.substring(0, hashPos + 1);
const afterCursor = text.substring(cursorPos);
const newText = beforeHash + elementId + afterCursor;
textarea.value = newText;
const newCursorPos = hashPos + 1 + elementId.length;
textarea.setSelectionRange(newCursorPos, newCursorPos);
this.hideAutocomplete();
this._callbacks.updatePreview();
this._callbacks.saveDocumentationLive();
textarea.focus();
}
};
//#endregion
//#region ../../node_modules/.pnpm/marked@16.0.0/node_modules/marked/lib/marked.esm.js
/**
* marked v16.0.0 - a markdown parser
* Copyright (c) 2011-2025, Christopher Jeffrey. (MIT Licensed)
* https://github.com/markedjs/marked
*/
/**
* DO NOT EDIT THIS FILE
* The code in this file is generated from files in ./src/
*/
function M() {
return {
async: !1,
breaks: !1,
extensions: null,
gfm: !0,
hooks: null,
pedantic: !1,
renderer: null,
silent: !1,
tokenizer: null,
walkTokens: null
};
}
var w = M();
function H(a) {
w = a;
}
var C = { exec: () => null };
function h(a, e = "") {
let t = typeof a == "string" ? a : a.source, n = {
replace: (s, i) => {
let r = typeof i == "string" ? i : i.source;
return r = r.replace(m.caret, "$1"), t = t.replace(s, r), n;
},
getRegex: () => new RegExp(t, e)
};
return n;
}
var m = {
codeRemoveIndent: /^(?: {1,4}| {0,3}\t)/gm,
outputLinkReplace: /\\([\[\]])/g,
indentCodeCompensation: /^(\s+)(?:```)/,
beginningSpace: /^\s+/,
endingHash: /#$/,
startingSpaceChar: /^ /,
endingSpaceChar: / $/,
nonSpaceChar: /[^ ]/,
newLineCharGlobal: /\n/g,
tabCharGlobal: /\t/g,
multipleSpaceGlobal: /\s+/g,
blankLine: /^[ \t]*$/,
doubleBlankLine: /\n[ \t]*\n[ \t]*$/,
blockquoteStart: /^ {0,3}>/,
blockquoteSetextReplace: /\n {0,3}((?:=+|-+) *)(?=\n|$)/g,
blockquoteSetextReplace2: /^ {0,3}>[ \t]?/gm,
listReplaceTabs: /^\t+/,
listReplaceNesting: /^ {1,4}(?=( {4})*[^ ])/g,
listIsTask: /^\[[ xX]\] /,
listReplaceTask: /^\[[ xX]\] +/,
anyLine: /\n.*\n/,
hrefBrackets: /^<(.*)>$/,
tableDelimiter: /[:|]/,
tableAlignChars: /^\||\| *$/g,
tableRowBlankLine: /\n[ \t]*$/,
tableAlignRight: /^ *-+: *$/,
tableAlignCenter: /^ *:-+: *$/,
tableAlignLeft: /^ *:-+ *$/,
startATag: /^<a /i,
endATag: /^<\/a>/i,
startPreScriptTag: /^<(pre|code|kbd|script)(\s|>)/i,
endPreScriptTag: /^<\/(pre|code|kbd|script)(\s|>)/i,
startAngleBracket: /^</,
endAngleBracket: />$/,
pedanticHrefTitle: /^([^'"]*[^\s])\s+(['"])(.*)\2/,
unicodeAlphaNumeric: /[\p{L}\p{N}]/u,
escapeTest: /[&<>"']/,
escapeReplace: /[&<>"']/g,
escapeTestNoEncode: /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,
escapeReplaceNoEncode: /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g,
unescapeTest: /&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/gi,
caret: /(^|[^\[])\^/g,
percentDecode: /%25/g,
findPipe: /\|/g,
splitPipe: / \|/,
slashPipe: /\\\|/g,
carriageReturn: /\r\n|\r/g,
spaceLine: /^ +$/gm,
notSpaceStart: /^\S*/,
endingNewline: /\n$/,
listItemRegex: (a) => /* @__PURE__ */ new RegExp(`^( {0,3}${a})((?:[ ][^\\n]*)?(?:\\n|$))`),
nextBulletRegex: (a) => /* @__PURE__ */ new RegExp(`^ {0,${Math.min(3, a - 1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`),
hrRegex: (a) => /* @__PURE__ */ new RegExp(`^ {0,${Math.min(3, a - 1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`),
fencesBeginRegex: (a) => /* @__PURE__ */ new RegExp(`^ {0,${Math.min(3, a - 1)}}(?:\`\`\`|~~~)`),
headingBeginRegex: (a) => /* @__PURE__ */ new RegExp(`^ {0,${Math.min(3, a - 1)}}#`),
htmlBeginRegex: (a) => new RegExp(`^ {0,${Math.min(3, a - 1)}}<(?:[a-z].*>|!--)`, "i")
}, xe = /^(?:[ \t]*(?:\n|$))+/, be = /^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/, Te = /^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/, I = /^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/, we = /^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/, j = /(?:[*+-]|\d{1,9}[.)])/, re = /^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/, ie = h(re).replace(/bull/g, j).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(), ye = h(re).replace(/bull/g, j).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(), F = /^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/, Re = /^[^\n]+/, Q = /(?!\s*\])(?:\\.|[^\[\]\\])+/, Se = h(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label", Q).replace("title", /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(), $e = h(/^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g, j).getRegex(), v = "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", U = /<!--(?:-?>|[\s\S]*?(?:-->|$))/, _e = h("^ {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|$))", "i").replace("comment", U).replace("tag", v).replace("attribute", / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(), oe = h(F).replace("hr", I).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", v).getRegex(), Le = h(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph", oe).getRegex(), K = {
blockquote: Le,
code: be,
def: Se,
fences: Te,
heading: we,
hr: I,
html: _e,
lheading: ie,
list: $e,
newline: xe,
paragraph: oe,
table: C,
text: Re
}, se = h("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr", I).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", v).getRegex(), ze = {
...K,
lheading: ye,
table: se,
paragraph: h(F).replace("hr", I).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("|lheading", "").replace("table", se).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", v).getRegex()
}, Me = {
...K,
html: h(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)|<tag(?:"[^"]*"|'[^']*'|\\s[^'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment", U).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(),
def: /^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,
heading: /^(#{1,6})(.*)(?:\n+|$)/,
fences: C,
lheading: /^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,
paragraph: h(F).replace("hr", I).replace("heading", ` *#{1,6} *[^
]`).replace("lheading", ie).replace("|table", "").replace("blockquote", " {0,3}>").replace("|fences", "").replace("|list", "").replace("|html", "").replace("|tag", "").getRegex()
}, Pe = /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/, Ae = /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/, le = /^( {2,}|\\)\n(?!\s*$)/, Ee = /^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*_]|\b_|$)|[^ ](?= {2,}\n)))/, D = /[\p{P}\p{S}]/u, X = /[\s\p{P}\p{S}]/u, ae = /[^\s\p{P}\p{S}]/u, Ce = h(/^((?![*_])punctSpace)/, "u").replace(/punctSpace/g, X).getRegex(), ce = /(?!~)[\p{P}\p{S}]/u, Ie = /(?!~)[\s\p{P}\p{S}]/u, Oe = /(?:[^\s\p{P}\p{S}]|~)/u, Be = /\[[^[\]]*?\]\((?:\\.|[^\\\(\)]|\((?:\\.|[^\\\(\)])*\))*\)|`[^`]*?`|<[^<>]*?>/g, pe = /^(?:\*+(?:((?!\*)punct)|[^\s*]))|^_+(?:((?!_)punct)|([^\s_]))/, qe = h(pe, "u").replace(/punct/g, D).getRegex(), ve = h(pe, "u").replace(/punct/g, ce).getRegex(), ue = "^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)", De = h(ue, "gu").replace(/notPunctSpace/g, ae).replace(/punctSpace/g, X).replace(/punct/g, D).getRegex(), Ze = h(ue, "gu").replace(/notPunctSpace/g, Oe).replace(/punctSpace/g, Ie).replace(/punct/g, ce).getRegex(), Ge = h("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)", "gu").replace(/notPunctSpace/g, ae).replace(/punctSpace/g, X).replace(/punct/g, D).getRegex(), He = h(/\\(punct)/, "gu").replace(/punct/g, D).getRegex(), Ne = h(/^<(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(), je = h(U).replace("(?:-->|$)", "-->").getRegex(), Fe = h("^comment|^</[a-zA-Z][\\w:-]*\\s*>|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^<![a-zA-Z]+\\s[\\s\\S]*?>|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>").replace("comment", je).replace("attribute", /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(), q = /(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/, Qe = h(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]*(?:\n[ \t]*)?)(title))?\s*\)/).replace("label", q).replace("href", /<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]*/).replace("title", /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(), he = h(/^!?\[(label)\]\[(ref)\]/).replace("label", q).replace("ref", Q).getRegex(), ke = h(/^!?\[(ref)\](?:\[\])?/).replace("ref", Q).getRegex(), Ue = h("reflink|nolink(?!\\()", "g").replace("reflink", he).replace("nolink", ke).getRegex(), W = {
_backpedal: C,
anyPunctuation: He,
autolink: Ne,
blockSkip: Be,
br: le,
code: Ae,
del: C,
emStrongLDelim: qe,
emStrongRDelimAst: De,
emStrongRDelimUnd: Ge,
escape: Pe,
link: Qe,
nolink: ke,
punctuation: Ce,
reflink: he,
reflinkSearch: Ue,
tag: Fe,
text: Ee,
url: C
}, Ke = {
...W,
link: h(/^!?\[(label)\]\((.*?)\)/).replace("label", q).getRegex(),
reflink: h(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label", q).getRegex()
}, N = {
...W,
emStrongRDelimAst: Ze,
emStrongLDelim: ve,
url: h(/^((?: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(),
_backpedal: /(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,
del: /^(~~?)(?=[^\s~])((?:\\.|[^\\])*?(?:\\.|[^\s~\\]))\1(?=[^~]|$)/,
text: /^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\<!\[`*~_]|\b_|https?:\/\/|ftp:\/\/|www\.|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)))/
}, Xe = {
...N,
br: h(le).replace("{2,}", "*").getRegex(),
text: h(N.text).replace("\\b_", "\\b_| {2,}\\n").replace(/\{2,\}/g, "*").getRegex()
}, O = {
normal: K,
gfm: ze,
pedantic: Me
}, P = {
normal: W,
gfm: N,
breaks: Xe,
pedantic: Ke
};
var We = {
"&": "&",
"<": "<",
">": ">",
"\"": """,
"'": "'"
}, ge = (a) => We[a];
function R(a, e) {
if (e) {
if (m.escapeTest.test(a)) return a.replace(m.escapeReplace, ge);
} else if (m.escapeTestNoEncode.test(a)) return a.replace(m.escapeReplaceNoEncode, ge);
return a;
}
function J(a) {
try {
a = encodeURI(a).replace(m.percentDecode, "%");
} catch {
return null;
}
return a;
}
function V(a, e) {
let t = a.replace(m.findPipe, (i, r, o) => {
let l = !1, c = r;
for (; --c >= 0 && o[c] === "\\";) l = !l;
return l ? "|" : " |";
}), n = t.split(m.splitPipe), s = 0;
if (n[0].trim() || n.shift(), n.length > 0 && !n.at(-1)?.trim() && n.pop(), e) if (n.length > e) n.splice(e);
else for (; n.length < e;) n.push("");
for (; s < n.length; s++) n[s] = n[s].trim().replace(m.slashPipe, "|");
return n;
}
function A(a, e, t) {
let n = a.length;
if (n === 0) return "";
let s = 0;
for (; s < n;) {
let i = a.charAt(n - s - 1);
if (i === e && !t) s++;
else if (i !== e && t) s++;
else break;
}
return a.slice(0, n - s);
}
function fe(a, e) {
if (a.indexOf(e[1]) === -1) return -1;
let t = 0;
for (let n = 0; n < a.length; n++) if (a[n] === "\\") n++;
else if (a[n] === e[0]) t++;
else if (a[n] === e[1] && (t--, t < 0)) return n;
return t > 0 ? -2 : -1;
}
function de(a, e, t, n, s) {
let i = e.href, r = e.title || null, o = a[1].replace(s.other.outputLinkReplace, "$1");
n.state.inLink = !0;
let l = {
type: a[0].charAt(0) === "!" ? "image" : "link",
raw: t,
href: i,
title: r,
text: o,
tokens: n.inlineTokens(o)
};
return n.state.inLink = !1, l;
}
function Je(a, e, t) {
let n = a.match(t.other.indentCodeCompensation);
if (n === null) return e;
let s = n[1];
return e.split(`
`).map((i) => {
let r = i.match(t.other.beginningSpace);
if (r === null) return i;
let [o] = r;
return o.length >= s.length ? i.slice(s.length) : i;
}).join(`
`);
}
var S = class {
options;
rules;
lexer;
constructor(e) {
this.options = e || w;
}
space(e) {
let t = this.rules.block.newline.exec(e);
if (t && t[0].length > 0) return {
type: "space",
raw: t[0]
};
}
code(e) {
let t = this.rules.block.code.exec(e);
if (t) {
let n = t[0].replace(this.rules.other.codeRemoveIndent, "");
return {
type: "code",
raw: t[0],
codeBlockStyle: "indented",
text: this.options.pedantic ? n : A(n, `
`)
};
}
}
fences(e) {
let t = this.rules.block.fences.exec(e);
if (t) {
let n = t[0], s = Je(n, t[3] || "", this.rules);
return {
type: "code",
raw: n,
lang: t[2] ? t[2].trim().replace(this.rules.inline.anyPunctuation, "$1") : t[2],
text: s
};
}
}
heading(e) {
let t = this.rules.block.heading.exec(e);
if (t) {
let n = t[2].trim();
if (this.rules.other.endingHash.test(n)) {
let s = A(n, "#");
(this.options.pedantic || !s || this.rules.other.endingSpaceChar.test(s)) && (n = s.trim());
}
return {
type: "heading",
raw: t[0],
depth: t[1].length,
text: n,
tokens: this.lexer.inline(n)
};
}
}
hr(e) {
let t = this.rules.block.hr.exec(e);
if (t) return {
type: "hr",
raw: A(t[0], `
`)
};
}
blockquote(e) {
let t = this.rules.block.blockquote.exec(e);
if (t) {
let n = A(t[0], `
`).split(`
`), s = "", i = "", r = [];
for (; n.length > 0;) {
let o = !1, l = [], c;
for (c = 0; c < n.length; c++) if (this.rules.other.blockquoteStart.test(n[c])) l.push(n[c]), o = !0;
else if (!o) l.push(n[c]);
else break;
n = n.slice(c);
let p = l.join(`
`), u = p.replace(this.rules.other.blockquoteSetextReplace, `
$1`).replace(this.rules.other.blockquoteSetextReplace2, "");
s = s ? `${s}
${p}` : p, i = i ? `${i}
${u}` : u;
let d = this.lexer.state.top;
if (this.lexer.state.top = !0, this.lexer.blockTokens(u, r, !0), this.lexer.state.top = d, n.length === 0) break;
let g = r.at(-1);
if (g?.type === "code") break;
if (g?.type === "blockquote") {
let x = g, f = x.raw + `
` + n.join(`
`), y = this.blockquote(f);
r[r.length - 1] = y, s = s.substring(0, s.length - x.raw.length) + y.raw, i = i.substring(0, i.length - x.text.length) + y.text;
break;
} else if (g?.type === "list") {
let x = g, f = x.raw + `
` + n.join(`
`), y = this.list(f);
r[r.length - 1] = y, s = s.substring(0, s.length - g.raw.length) + y.raw, i = i.substring(0, i.length - x.raw.length) + y.raw, n = f.substring(r.at(-1).raw.length).split(`
`);
continue;
}
}
return {
type: "blockquote",
raw: s,
tokens: r,
text: i
};
}
}
list(e) {
let t = this.rules.block.list.exec(e);
if (t) {
let n = t[1].trim(), s = n.length > 1, i = {
type: "list",
raw: "",
ordered: s,
start: s ? +n.slice(0, -1) : "",
loose: !1,
items: []
};
n = s ? `\\d{1,9}\\${n.slice(-1)}` : `\\${n}`, this.options.pedantic && (n = s ? n : "[*+-]");
let r = this.rules.other.listItemRegex(n), o = !1;
for (; e;) {
let c = !1, p = "", u = "";
if (!(t = r.exec(e)) || this.rules.block.hr.test(e)) break;
p = t[0], e = e.substring(p.length);
let d = t[2].split(`
`, 1)[0].replace(this.rules.other.listReplaceTabs, (Z) => " ".repeat(3 * Z.length)), g = e.split(`
`, 1)[0], x = !d.trim(), f = 0;
if (this.options.pedantic ? (f = 2, u = d.trimStart()) : x ? f = t[1].length + 1 : (f = t[2].search(this.rules.other.nonSpaceChar), f = f > 4 ? 1 : f, u = d.slice(f), f += t[1].length), x && this.rules.other.blankLine.test(g) && (p += g + `
`, e = e.substring(g.length + 1), c = !0), !c) {
let Z = this.rules.other.nextBulletRegex(f), ee = this.rules.other.hrRegex(f), te = this.rules.other.fencesBeginRegex(f), ne = this.rules.other.headingBeginRegex(f), me = this.rules.other.htmlBeginRegex(f);
for (; e;) {
let G = e.split(`
`, 1)[0], E;
if (g = G, this.options.pedantic ? (g = g.replace(this.rules.other.listReplaceNesting, " "), E = g) : E = g.replace(this.rules.other.tabCharGlobal, " "), te.test(g) || ne.test(g) || me.test(g) || Z.test(g) || ee.test(g)) break;
if (E.search(this.rules.other.nonSpaceChar) >= f || !g.trim()) u += `
` + E.slice(f);
else {
if (x || d.replace(this.rules.other.tabCharGlobal, " ").search(this.rules.other.nonSpaceChar) >= 4 || te.test(d) || ne.test(d) || ee.test(d)) break;
u += `
` + g;
}
!x && !g.trim() && (x = !0), p += G + `
`, e = e.substring(G.length + 1), d = E.slice(f);
}
}
i.loose || (o ? i.loose = !0 : this.rules.other.doubleBlankLine.test(p) && (o = !0));
let y = null, Y;
this.options.gfm && (y = this.rules.other.listIsTask.exec(u), y && (Y = y[0] !== "[ ] ", u = u.replace(this.rules.other.listReplaceTask, ""))), i.items.push({
type: "list_item",
raw: p,
task: !!y,
checked: Y,
loose: !1,
text: u,
tokens: []
}), i.raw += p;
}
let l = i.items.at(-1);
if (l) l.raw = l.raw.trimEnd(), l.text = l.text.trimEnd();
else return;
i.raw = i.raw.trimEnd();
for (let c = 0; c < i.items.length; c++) if (this.lexer.state.top = !1, i.items[c].tokens = this.lexer.blockTokens(i.items[c].text, []), !i.loose) {
let p = i.items[c].tokens.filter((d) => d.type === "space"), u = p.length > 0 && p.some((d) => this.rules.other.anyLine.test(d.raw));
i.loose = u;
}
if (i.loose) for (let c = 0; c < i.items.length; c++) i.items[c].loose = !0;
return i;
}
}
html(e) {
let t = this.rules.block.html.exec(e);
if (t) return {
type: "html",
block: !0,
raw: t[0],
pre: t[1] === "pre" || t[1] === "script" || t[1] === "style",
text: t[0]
};
}
def(e) {
let t = this.rules.block.def.exec(e);
if (t) {
let n = t[1].toLowerCase().replace(this.rules.other.multipleSpaceGlobal, " "), s = t[2] ? t[2].replace(this.rules.other.hrefBrackets, "$1").replace(this.rules.inline.anyPunctuation, "$1") : "", i = t[3] ? t[3].substring(1, t[3].length - 1).replace(this.rules.inline.anyPunctuation, "$1") : t[3];
return {
type: "def",
tag: n,
raw: t[0],
href: s,
title: i
};
}
}
table(e) {
let t = this.rules.block.table.exec(e);
if (!t || !this.rules.other.tableDelimiter.test(t[2])) return;
let n = V(t[1]), s = t[2].replace(this.rules.other.tableAlignChars, "").split("|"), i = t[3]?.trim() ? t[3].replace(this.rules.other.tableRowBlankLine, "").split(`
`) : [], r = {
type: "table",
raw: t[0],
header: [],
align: [],
rows: []
};
if (n.length === s.length) {
for (let o of s) this.rules.other.tableAlignRight.test(o) ? r.align.push("right") : this.rules.other.tableAlignCenter.test(o) ? r.align.push("center") : this.rules.other.tableAlignLeft.test(o) ? r.align.push("left") : r.align.push(null);
for (let o = 0; o < n.length; o++) r.header.push({
text: n[o],
tokens: this.lexer.inline(n[o]),
header: !0,
align: r.align[o]
});
for (let o of i) r.rows.push(V(o, r.header.length).map((l, c) => ({
text: l,
tokens: this.lexer.inline(l),
header: !1,
align: r.align[c]
})));
return r;
}
}
lheading(e) {
let t = this.rules.block.lheading.exec(e);
if (t) return {
type: "heading",
raw: t[0],
depth: t[2].charAt(0) === "=" ? 1 : 2,
text: t[1],
tokens: this.lexer.inline(t[1])
};
}
paragraph(e) {
let t = this.rules.block.paragraph.exec(e);
if (t) {
let n = t[1].charAt(t[1].length - 1) === `
` ? t[1].slice(0, -1) : t[1];
return {
type: "paragraph",
raw: t[0],
text: n,
tokens: this.lexer.inline(n)
};
}
}
text(e) {
let t = this.rules.block.text.exec(e);
if (t) return {
type: "text",
raw: t[0],
text: t[0],
tokens: this.lexer.inline(t[0])
};
}
escape(e) {
let t = this.rules.inline.escape.exec(e);
if (t) return {
type: "escape",
raw: t[0],
text: t[1]
};
}
tag(e) {
let t = this.rules.inline.tag.exec(e);
if (t) return !this.lexer.state.inLink && this.rules.other.startATag.test(t[0]) ? this.lexer.state.inLink = !0 : this.lexer.state.inLink && this.rules.other.endATag.test(t[0]) && (this.lexer.state.inLink = !1), !this.lexer.state.inRawBlock && this.rules.other.startPreScriptTag.test(t[0]) ? this.lexer.state.inRawBlock = !0 : this.lexer.state.inRawBlock && this.rules.other.endPreScriptTag.test(t[0]) && (this.lexer.state.inRawBlock = !1), {
type: "html",
raw: t[0],
inLink: this.lexer.state.inLink,
inRawBlock: this.lexer.state.inRawBlock,
block: !1,
text: t[0]
};
}
link(e) {
let t = this.rules.inline.link.exec(e);
if (t) {
let n = t[2].trim();
if (!this.options.pedantic && this.rules.other.startAngleBracket.test(n)) {
if (!this.rules.other.endAngleBracket.test(n)) return;
let r = A(n.slice(0, -1), "\\");
if ((n.length - r.length) % 2 === 0) return;
} else {
let r = fe(t[2], "()");
if (r === -2) return;
if (r > -1) {
let l = (t[0].indexOf("!") === 0 ? 5 : 4) + t[1].length + r;
t[2] = t[2].substring(0, r), t[0] = t[0].substring(0, l).trim(), t[3] = "";
}
}
let s = t[2], i = "";
if (this.options.pedantic) {
let r = this.rules.other.pedanticHrefTitle.exec(s);
r && (s = r[1], i = r[3]);
} else i = t[3] ? t[3].slice(1, -1) : "";
return s = s.trim(), this.rules.other.startAngleBracket.test(s) && (this.options.pedantic && !this.rules.other.endAngleBracket.test(n) ? s = s.slice(1) : s = s.slice(1, -1)), de(t, {
href: s && s.replace(this.rules.inline.anyPunctuation, "$1"),
title: i && i.replace(this.rules.inline.anyPunctuation, "$1")
}, t[0], this.lexer, this.rules);
}
}
reflink(e, t) {
let n;
if ((n = this.rules.inline.reflink.exec(e)) || (n = this.rules.inline.nolink.exec(e))) {
let s = (n[2] || n[1]).replace(this.rules.other.multipleSpaceGlobal, " "), i = t[s.toLowerCase()];
if (!i) {
let r = n[0].charAt(0);
return {
type: "text",
raw: r,
text: r
};
}
return de(n, i, n[0], this.lexer, this.rules);
}
}
emStrong(e, t, n = "") {
let s = this.rules.inline.emStrongLDelim.exec(e);
if (!s || s[3] && n.match(this.rules.other.unicodeAlphaNumeric)) return;
if (!(s[1] || s[2] || "") || !n || this.rules.inline.punctuation.exec(n)) {
let r = [...s[0]].length - 1, o, l, c = r, p = 0, u = s[0][0] === "*" ? this.rules.inline.emStrongRDelimAst : this.rules.inline.emStrongRDelimUnd;
for (u.lastIndex = 0, t = t.slice(-1 * e.length + r); (s = u.exec(t)) != null;) {
if (o = s[1] || s[2] || s[3] || s[4] || s[5] || s[6], !o) continue;
if (l = [...o].length, s[3] || s[4]) {
c += l;
continue;
} else if ((s[5] || s[6]) && r % 3 && !((r + l) % 3)) {
p += l;
continue;
}
if (c -= l, c > 0) continue;
l = Math.min(l, l + c + p);
let d = [...s[0]][0].length, g = e.slice(0, r + s.index + d + l);
if (Math.min(r, l) % 2) {
let f = g.slice(1, -1);
return {
type: "em",
raw: g,
text: f,
tokens: this.lexer.inlineTokens(f)
};
}
let x = g.slice(2, -2);
return {
type: "strong",
raw: g,
text: x,
tokens: this.lexer.inlineTokens(x)
};
}
}
}
codespan(e) {
let t = this.rules.inline.code.exec(e);
if (t) {
let n = t[2].replace(this.rules.other.newLineCharGlobal, " "), s = this.rules.other.nonSpaceChar.test(n), i = this.rules.other.startingSpaceChar.test(n) && this.rules.other.endingSpaceChar.test(n);
return s && i && (n = n.substring(1, n.length - 1)), {
type: "codespan",
raw: t[0],
text: n
};
}
}
br(e) {
let t = this.rules.inline.br.exec(e);
if (t) return {
type: "br",
raw: t[0]
};
}
del(e) {
let t = this.rules.inline.del.exec(e);
if (t) return {
type: "del",
raw: t[0],
text: t[2],
tokens: this.lexer.inlineTokens(t[2])
};
}
autolink(e) {
let t = this.rules.inline.autolink.exec(e);
if (t) {
let n, s;
return t[2] === "@" ? (n = t[1], s = "mailto:" + n) : (n = t[1], s = n), {
type: "link",
raw: t[0],
text: n,
href: s,
tokens: [{
type: "text",
raw: n,
text: n
}]
};
}
}
url(e) {
let t;
if (t = this.rules.inline.url.exec(e)) {
let n, s;
if (t[2] === "@") n = t[0], s = "mailto:" + n;
else {
let i;
do
i = t[0], t[0] = this.rules.inline._backpedal.exec(t[0])?.[0] ?? "";
while (i !== t[0]);
n = t[0], t[1] === "www." ? s = "http://" + t[0] : s = t[0];
}
return {
type: "link",
raw: t[0],
text: n,
href: s,
tokens: [{
type: "text",
raw: n,
text: n
}]
};
}
}
inlineText(e) {
let t = this.rules.inline.text.exec(e);
if (t) {
let n = this.lexer.state.inRawBlock;
return {
type: "text",
raw: t[0],
text: t[0],
escaped: n
};
}
}
};
var b = class a {
tokens;
options;
state;
tokenizer;
inlineQueue;
constructor(e) {
this.tokens = [], this.tokens.links = Object.create(null), this.options = e || w, this.options.tokenizer = this.options.tokenizer || new S(), this.tokenizer = this.options.tokenizer, this.tokenizer.options = this.options, this.tokenizer.lexer = this, this.inlineQueue = [], this.state = {
inLink: !1,
inRawBlock: !1,
top: !0
};
let t = {
other: m,
block: O.normal,
inline: P.normal
};
this.options.pedantic ? (t.block = O.pedantic, t.inline = P.pedantic) : this.options.gfm && (t.block = O.gfm, this.options.breaks ? t.inline = P.breaks : t.inline = P.gfm), this.tokenizer.rules = t;
}
static get rules() {
return {
block: O,
inline: P
};
}
static lex(e, t) {
return new a(t).lex(e);
}
static lexInline(e, t) {
return new a(t).inlineTokens(e);
}
lex(e) {
e = e.replace(m.carriageReturn, `
`), this.blockTokens(e, this.tokens);
for (let t = 0; t < this.inlineQueue.length; t++) {
let n = this.inlineQueue[t];
this.inlineTokens(n.src, n.tokens);
}
return this.inlineQueue = [], this.tokens;
}
blockTokens(e, t = [], n = !1) {
for (this.options.pedantic && (e = e.replace(m.tabCharGlobal, " ").replace(m.spaceLine, "")); e;) {
let s;
if (this.options.extensions?.block?.some((r) => (s = r.call({ lexer: this }, e, t)) ? (e = e.substring(s.raw.length), t.push(s), !0) : !1)) continue;
if (s = this.tokenizer.space(e)) {
e = e.substring(s.raw.length);
let r = t.at(-1);
s.raw.length === 1 && r !== void 0 ? r.raw += `
` : t.push(s);
continue;
}
if (s = this.tokenizer.code(e)) {
e = e.substring(s.raw.length);
let r = t.at(-1);
r?.type === "paragraph" || r?.type === "text" ? (r.raw += `
` + s.raw, r.text += `
` + s.text, this.inlineQueue.at(-1).src = r.text) : t.push(s);
continue;
}
if (s = this.tokenizer.fences(e)) {
e = e.substring(s.raw.length), t.push(s);
continue;
}
if (s = this.tokenizer.heading(e)) {
e = e.substring(s.raw.length), t.push(s);
continue;
}
if (s = this.tokenizer.hr(e)) {
e = e.substring(s.raw.length), t.push(s);
continue;
}
if (s = this.tokenizer.blockquote(e)) {
e = e.substring(s.raw.length), t.push(s);
continue;
}
if (s = this.tokenizer.list(e)) {
e = e.substring(s.raw.length), t.push(s);
continue;
}
if (s = this.tokenizer.html(e)) {
e = e.substring(s.raw.length), t.push(s);
continue;
}
if (s = this.tokenizer.def(e)) {
e = e.substring(s.raw.length);
let r = t.at(-1);
r?.type === "paragraph" || r?.type === "text" ? (r.raw += `
` + s.raw, r.text += `
` + s.raw, this.inlineQueue.at(-1).src = r.text) : this.tokens.links[s.tag] || (this.tokens.links[s.tag] = {
href: s.href,
title: s.title
});
continue;
}
if (s = this.tokenizer.table(e)) {
e = e.substring(s.raw.length), t.push(s);
continue;
}
if (s = this.tokenizer.lheading(e)) {
e = e.substring(s.raw.length), t.push(s);
continue;
}
let i = e;
if (this.options.extensions?.startBlock) {
let r = Infinity, o = e.slice(1), l;
this.options.extensions.startBlock.forEach((c) => {
l = c.call({ lexer: this }, o), typeof l == "number" && l >= 0 && (r = Math.min(r, l));
}), r < Infinity && r >= 0 && (i = e.substring(0, r + 1));
}
if (this.state.top && (s = this.tokenizer.paragraph(i))) {
let r = t.at(-1);
n && r?.type === "paragraph" ? (r.raw += `
` + s.raw, r.text += `
` + s.text, this.inlineQueue.pop(), this.inlineQueue.at(-1).src = r.text) : t.push(s), n = i.length !== e.length, e = e.substring(s.raw.length);
continue;
}
if (s = this.tokenizer.text(e)) {
e = e.substring(s.raw.length);
let r = t.at(-1);
r?.type === "text" ? (r.raw += `
` + s.raw, r.text += `
` + s.text, this.inlineQueue.pop(), this.inlineQueue.at(-1).src = r.text) : t.push(s);
continue;
}
if (e) {
let r = "Infinite loop on byte: " + e.charCodeAt(0);
if (this.options.silent) {
console.error(r);
break;
} else throw new Error(r);
}
}
return this.state.top = !0, t;
}
inline(e, t = []) {
return this.inlineQueue.push({
src: e,
tokens: t
}), t;
}
inlineTokens(e, t = []) {
let n = e, s = null;
if (this.tokens.links) {
let o = Object.keys(this.tokens.links);
if (o.length > 0) for (; (s = this.tokenizer.rules.inline.reflinkSearch.exec(n)) != null;) o.includes(s[0].slice(s[0].lastIndexOf("[") + 1, -1)) && (n = n.slice(0, s.index) + "[" + "a".repeat(s[0].length - 2) + "]" + n.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex));
}
for (; (s = this.tokenizer.rules.inline.anyPunctuation.exec(n)) != null;) n = n.slice(0, s.index) + "++" + n.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);
for (; (s = this.tokenizer.rules.inline.blockSkip.exec(n)) != null;) n = n.slice(0, s.index) + "[" + "a".repeat(s[0].length - 2) + "]" + n.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);
let i = !1, r = "";
for (; e;) {
i || (r = ""), i = !1;
let o;
if (this.options.extensions?.inline?.some((c) => (o = c.call({ lexer: this }, e, t)) ? (e = e.substring(o.raw.length), t.push(o), !0) : !1)) continue;
if (o = this.tokenizer.escape(e)) {
e = e.substring(o.raw.length), t.push(o);
continue;
}
if (o = this.tokenizer.tag(e)) {
e = e.substring(o.raw.length), t.push(o);
continue;
}
if (o = this.tokenizer.link(e)) {
e = e.substring(o.raw.length), t.push(o);
continue;
}
if (o = this.tokenizer.reflink(e, this.tokens.links)) {
e = e.substring(o.raw.length);
let c = t.at(-1);
o.type === "text" && c?.type === "text" ? (c.raw += o.raw, c.text += o.text) : t.push(o);
continue;
}
if (o = this.tokenizer.emStrong(e, n, r)) {
e = e.substring(o.raw.length), t.push(o);
continue;
}
if (o = this.tokenizer.codespan(e)) {
e = e.substring(o.raw.length), t.push(o);
continue;
}
if (o = this.tokenizer.br(e)) {
e = e.substring(o.raw.length), t.push(o);
continue;
}
if (o = this.tokenizer.del(e)) {
e = e.substring(o.raw.length), t.push(o);
continue;
}
if (o = this.tokenizer.autolink(e)) {
e = e.substring(o.raw.length), t.push(o);
continue;
}
if (!this.state.inLink && (o = this.tokenizer.url(e))) {
e = e.substring(o.raw.length), t.push(o);
continue;
}
let l = e;
if (this.options.extensions?.startInline) {
let c = Infinity, p = e.slice(1), u;
this.options.extensions.startInline.forEach((d) => {
u = d.call({ lexer: this }, p), typeof u == "number" && u >= 0 && (c = Math.min(c, u));
}), c < Infinity && c >= 0 && (l = e.substring(0, c + 1));
}
if (o = this.tokenizer.inlineText(l)) {
e = e.substring(o.raw.length), o.raw.slice(-1) !== "_" && (r = o.raw.slice(-1)), i = !0;
let c = t.at(-1);
c?.type === "text" ? (c.raw += o.raw, c.text += o.text) : t.push(o);
continue;
}
if (e) {
let c = "Infinite loop on byte: " + e.charCodeAt(0);
if (this.options.silent) {
console.error(c);
break;
} else throw new Error(c);
}
}
return t;
}
};
var $ = class {
options;
parser;
constructor(e) {
this.options = e || w;
}
space(e) {
return "";
}
code({ text: e, lang: t, escaped: n }) {
let s = (t || "").match(m.notSpaceStart)?.[0], i = e.replace(m.endingNewline, "") + `
`;
return s ? "<pre><code class=\"language-" + R(s) + "\">" + (n ? i : R(i, !0)) + `</code></pre>
` : "<pre><code>" + (n ? i : R(i, !0)) + `</code></pre>
`;
}
blockquote({ tokens: e }) {
return `<blockquote>
${this.parser.parse(e)}</blockquote>
`;
}
html({ text: e }) {
return e;
}
heading({ tokens: e, depth: t }) {
return `<h${t}>${this.parser.parseInline(e)}</h${t}>
`;
}
hr(e) {
return `<hr>
`;
}
list(e) {
let t = e.ordered, n = e.start, s = "";
for (let o = 0; o < e.items.length; o++) {
let l = e.items[o];
s += this.listitem(l);
}
let i = t ? "ol" : "ul", r = t && n !== 1 ? " start=\"" + n + "\"" : "";
return "<" + i + r + `>
` + s + "</" + i + `>
`;
}
listitem(e) {
let t = "";
if (e.task) {
let n = this.checkbox({ checked: !!e.checked });
e.loose ? e.tokens[0]?.type === "paragraph" ? (e.tokens[0].text = n + " " + e.tokens[0].text, e.tokens[0].tokens && e.tokens[0].tokens.length > 0 && e.tokens[0].tokens[0].type === "text" && (e.tokens[0].tokens[0].text = n + " " + R(e.tokens[0].tokens[0].text), e.tokens[0].tokens[0].escaped = !0)) : e.tokens.unshift({
type: "text",
raw: n + " ",
text: n + " ",
escaped: !0
}) : t += n + " ";
}
return t += this.parser.parse(e.tokens, !!e.loose), `<li>${t}</li>
`;
}
checkbox({ checked: e }) {
return "<input " + (e ? "checked=\"\" " : "") + "disabled=\"\" type=\"checkbox\">";
}
paragraph({ tokens: e }) {
return `<p>${this.parser.parseInline(e)}</p>
`;
}
table(e) {
let t = "", n = "";
for (let i = 0; i < e.header.length; i++) n += this.tablecell(e.header[i]);
t += this.tablerow({ text: n });
let s = "";
for (let i = 0; i < e.rows.length; i++) {
let r = e.rows[i];
n = "";
for (let o = 0; o < r.length; o++) n += this.tablecell(r[o]);
s += this.tablerow({ text: n });
}
return s && (s = `<tbody>${s}</tbody>`), `<table>
<thead>
` + t + `</thead>
` + s + `</table>
`;
}
tablerow({ text: e }) {
return `<tr>
${e}</tr>
`;
}
tablecell(e) {
let t = this.parser.parseInline(e.tokens), n = e.header ? "th" : "td";
return (e.align ? `<${n} align="${e.align}">` : `<${n}>`) + t + `</${n}>
`;
}
strong({ tokens: e }) {
return `<strong>${this.parser.parseInline(e)}</strong>`;
}
em({ tokens: e }) {
return `<em>${this.parser.parseInline(e)}</em>`;
}
codespan({ text: e }) {
return `<code>${R(e, !0)}</code>`;
}
br(e) {
return "<br>";
}
del({ tokens: e }) {
return `<del>${this.parser.parseInline(e)}</del>`;
}
link({ href: e, title: t, tokens: n }) {
let s = this.parser.parseInline(n), i = J(e);
if (i === null) return s;
e = i;
let r = "<a href=\"" + e + "\"";
return t && (r += " title=\"" + R(t) + "\""), r += ">" + s + "</a>", r;
}
image({ href: e, title: t, text: n, tokens: s }) {
s && (n = this.parser.parseInline(s, this.parser.textRenderer));
let i = J(e);
if (i === null) return R(n);
e = i;
let r = `<img src="${e}" alt="${n}"`;
return t && (r += ` title="${R(t)}"`), r += ">", r;
}
text(e) {
return "tokens" in e && e.tokens ? this.parser.parseInline(e.tokens) : "escaped" in e && e.escaped ? e.text : R(e.text);
}
};
var _ = class {
strong({ text: e }) {
return e;
}
em({ text: e }) {
return e;
}
codespan({ text: e }) {
return e;
}
del({ text: e }) {
return e;
}
html({ text: e }) {
return e;
}
text({ text: e }) {
return e;
}
link({ text: e }) {
return "" + e;
}
image({ text: e }) {
return "" + e;
}
br() {
return "";
}
};
var T = class a {
options;
renderer;
textRenderer;
constructor(e) {
this.options = e || w, this.options.renderer = this.options.renderer || new $(), this.renderer = this.options.renderer, this.renderer.options = this.options, this.renderer.parser = this, this.textRenderer = new _();
}
static parse(e, t) {
return new a(t).parse(e);
}
static parseInline(e, t) {
return new a(t).parseInline(e);
}
parse(e, t = !0) {
let n = "";
for (let s = 0; s < e.length; s++) {
let i = e[s];
if (this.options.extensions?.renderers?.[i.type]) {
let o = i, l = this.options.extensions.renderers[o.type].call({ parser: this }, o);
if (l !== !1 || ![
"space",
"hr",
"heading",
"code",
"table",
"blockquote",
"list",
"html",
"paragraph",
"text"
].includes(o.type)) {
n += l || "";
continue;
}
}
let r = i;
switch (r.type) {
case "space": {
n += this.renderer.space(r);
continue;
}
case "hr": {
n += this.renderer.hr(r);
continue;
}
case "heading": {
n += this.renderer.heading(r);
continue;
}
case "code": {
n += this.renderer.code(r);
continue;
}
case "table": {
n += this.renderer.table(r);
continue;
}
case "blockquote": {
n += this.renderer.blockquote(r);
continue;
}
case "list": {
n += this.renderer.list(r);
continue;
}
case "html": {
n += this.renderer.html(r);
continue;
}
case "paragraph": {
n += this.renderer.paragraph(r);
continue;
}
case "text": {
let o = r, l = this.renderer.text(o);
for (; s + 1 < e.length && e[s + 1].type === "text";) o = e[++s], l += `
` + this.renderer.text(o);
t ? n += this.renderer.paragraph({
type: "paragraph",
raw: l,
text: l,
tokens: [{
type: "text",
raw: l,
text: l,
escaped: !0
}]
}) : n += l;
continue;
}
default: {
let o = "Token with \"" + r.type + "\" type was not found.";
if (this.options.silent) return console.error(o), "";
throw new Error(o);
}
}
}
return n;
}
parseInline(e, t = this.renderer) {
let n = "";
for (let s = 0; s < e.length; s++) {
let i = e[s];
if (this.options.extensions?.renderers?.[i.type]) {
let o = this.options.extensions.renderers[i.type].call({ parser: thi