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(/```([\s\S]*?)```/g, (_, code) => { return `
${escapeHtml(code)}
`; }); 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;