const marked = { parse: function (md) { if (!md) return ""; let toc = []; md = md.replace(/^(#{1,3})\s+(.*)$/gim, (m, hashes, title) => { const level = hashes.length; const id = title .toLowerCase() .trim() .replace(/[^\wäöüß]+/g, "-") .replace(/-+/g, "-") .replace(/^-|-$/g, ""); toc.push({ level, title, id }); return ` ${title} `; }); md = md.replace(/```(\w*)\n?([\s\S]*?)```/g, (_, lang, code) => { const langClass = lang ? ` language-${lang}` : ""; return `
${escapeHtml(code.trim())}
`; }); md = md.replace(/!\[(.*?)\]\((.*?)\)/gim, `$1` ); md = md.replace(/\[(.*?)\]\((.*?)\)/gim, `$1` ); md = md.replace(/`(.*?)`/gim, `$1` ); md = md.replace(/\*\*(.*?)\*\*/gim, "$1"); md = md.replace(/\*(.*?)\*/gim, "$1"); md = md.replace(/^\s*-\s(.+)$/gim, "
  • $1
  • "); md = wrapLists(md); md = md .replace(/\n{2,}/g, "

    ") .replace(/^(?!$1

    "); return buildToc(toc) + md; } }; function buildToc(items) { if (!items.length) return ""; let html = `
    `; items.forEach(i => { html += `
    ${i.title}
    `; }); html += `
    `; return html; } function wrapLists(html) { return html.replace(/(
  • .*?<\/li>)/gs, ""); } function escapeHtml(text) { return text .replace(/&/g, "&") .replace(//g, ">"); } window.marked = marked;