import PrismJS from 'prismjs'; import 'prismjs/components/prism-bash.js'; import 'prismjs/components/prism-diff.js'; import 'prismjs/components/prism-typescript.js'; import 'prism-svelte'; import { marked } from 'marked'; const escape_test = /[&<>"']/; const escape_replace = /[&<>"']/g; const escape_test_no_encode = /[<>"']|&(?!#?\w+;)/; const escape_replace_no_encode = /[<>"']|&(?!#?\w+;)/g; const escape_replacements = { '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }; const get_escape_replacement = (ch) => escape_replacements[ch]; /** * @param {string} html * @param {boolean} encode */ export function escape(html, encode) { if (encode) { if (escape_test.test(html)) { return html.replace(escape_replace, get_escape_replacement); } } else { if (escape_test_no_encode.test(html)) { return html.replace(escape_replace_no_encode, get_escape_replacement); } } return html; } const prism_languages = { bash: 'bash', env: 'bash', html: 'markup', svelte: 'svelte', js: 'javascript', css: 'css', diff: 'diff', ts: 'typescript', '': '' }; /** @type {Partial} */ const default_renderer = { code(code, infostring, escaped) { const lang = (infostring || '').match(/\S*/)[0]; const prism_language = prism_languages[lang]; if (prism_language) { const highlighted = PrismJS.highlight(code, PrismJS.languages[prism_language], lang); return `
${highlighted}
`; } return ( '
' +
			(escaped ? code : escape(code, true)) +
			'
' ); }, blockquote(quote) { return '
\n' + quote + '
\n'; }, html(html) { return html; }, heading(text, level) { return '' + text + '\n'; }, hr() { return '
\n'; }, list(body, ordered, start) { const type = ordered ? 'ol' : 'ul', startatt = ordered && start !== 1 ? ' start="' + start + '"' : ''; return '<' + type + startatt + '>\n' + body + '\n'; }, listitem(text) { return '
  • ' + text + '
  • \n'; }, checkbox(checked) { return ' '; }, paragraph(text) { return '

    ' + text + '

    \n'; }, table(header, body) { if (body) body = '' + body + ''; return '\n' + '\n' + header + '\n' + body + '
    \n'; }, tablerow(content) { return '\n' + content + '\n'; }, tablecell(content, flags) { const type = flags.header ? 'th' : 'td'; const tag = flags.align ? '<' + type + ' align="' + flags.align + '">' : '<' + type + '>'; return tag + content + '\n'; }, // span level renderer strong(text) { return '' + text + ''; }, em(text) { return '' + text + ''; }, codespan(text) { return '' + text + ''; }, br() { return '
    '; }, del(text) { return '' + text + ''; }, link(href, title, text) { if (href === null) { return text; } let out = ''; return out; }, image(href, title, text) { if (href === null) { return text; } let out = '' + text + '} renderer */ export function transform(markdown, renderer = {}) { marked.use({ renderer: { // we have to jump through these hoops because of marked's API design choices — // options are global, and merged in confusing ways. You can't do e.g. // `new Marked(options).parse(markdown)` ...default_renderer, ...renderer } }); return marked(markdown); }