42 lines
1.4 KiB
TypeScript
42 lines
1.4 KiB
TypeScript
|
|
import { marked } from 'marked';
|
||
|
|
import DOMPurify from 'dompurify';
|
||
|
|
import hljs from 'highlight.js/lib/core';
|
||
|
|
import javascript from 'highlight.js/lib/languages/javascript';
|
||
|
|
import bash from 'highlight.js/lib/languages/bash';
|
||
|
|
import typescript from 'highlight.js/lib/languages/typescript';
|
||
|
|
import json from 'highlight.js/lib/languages/json';
|
||
|
|
|
||
|
|
hljs.registerLanguage('javascript', javascript);
|
||
|
|
hljs.registerLanguage('js', javascript);
|
||
|
|
hljs.registerLanguage('typescript', typescript);
|
||
|
|
hljs.registerLanguage('ts', typescript);
|
||
|
|
hljs.registerLanguage('bash', bash);
|
||
|
|
hljs.registerLanguage('sh', bash);
|
||
|
|
hljs.registerLanguage('json', json);
|
||
|
|
|
||
|
|
marked.use({
|
||
|
|
breaks: true,
|
||
|
|
gfm: true,
|
||
|
|
renderer: {
|
||
|
|
code({ text, lang }) {
|
||
|
|
const language = lang && hljs.getLanguage(lang) ? lang : undefined;
|
||
|
|
const highlighted = language
|
||
|
|
? hljs.highlight(text, { language }).value
|
||
|
|
: hljs.highlightAuto(text).value;
|
||
|
|
const cls = language ? ` language-${language}` : '';
|
||
|
|
return `<pre><code class="hljs${cls}">${highlighted}</code></pre>`;
|
||
|
|
},
|
||
|
|
},
|
||
|
|
});
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Rendert einen Markdown-String zu sanitized HTML.
|
||
|
|
* Einziger Export des Moduls — so bleibt Austausch der Engine lokal.
|
||
|
|
*/
|
||
|
|
export function renderMarkdown(md: string): string {
|
||
|
|
const raw = marked.parse(md, { async: false }) as string;
|
||
|
|
return DOMPurify.sanitize(raw, {
|
||
|
|
ADD_ATTR: ['target', 'rel'],
|
||
|
|
});
|
||
|
|
}
|