43 lines
792 B
TypeScript
43 lines
792 B
TypeScript
import { marked } from 'marked';
|
|
import sanitizeHtml from 'sanitize-html';
|
|
|
|
export function renderMarkdown(markdown: string): string {
|
|
const rendered = marked.parse(markdown, {
|
|
async: false,
|
|
breaks: true,
|
|
gfm: true
|
|
}) as string;
|
|
return sanitizeHtml(rendered, {
|
|
allowedTags: [
|
|
'p',
|
|
'br',
|
|
'strong',
|
|
'em',
|
|
'del',
|
|
'blockquote',
|
|
'ul',
|
|
'ol',
|
|
'li',
|
|
'h2',
|
|
'h3',
|
|
'h4',
|
|
'code',
|
|
'pre',
|
|
'a',
|
|
'hr'
|
|
],
|
|
allowedAttributes: {
|
|
a: ['href', 'title', 'target', 'rel']
|
|
},
|
|
allowedSchemes: ['http', 'https', 'mailto'],
|
|
allowProtocolRelative: false,
|
|
enforceHtmlBoundary: true,
|
|
transformTags: {
|
|
a: (_tagName, attributes) => ({
|
|
tagName: 'a',
|
|
attribs: { ...attributes, target: '_blank', rel: 'noopener noreferrer' }
|
|
})
|
|
}
|
|
});
|
|
}
|