import { marked, Renderer } from 'marked' import hljs from 'highlight.js/lib/core' // Import only common languages import javascript from 'highlight.js/lib/languages/javascript' import typescript from 'highlight.js/lib/languages/typescript' import bash from 'highlight.js/lib/languages/bash' import json from 'highlight.js/lib/languages/json' import yaml from 'highlight.js/lib/languages/yaml' import markdown from 'highlight.js/lib/languages/markdown' import css from 'highlight.js/lib/languages/css' import xml from 'highlight.js/lib/languages/xml' import python from 'highlight.js/lib/languages/python' import rust from 'highlight.js/lib/languages/rust' import go from 'highlight.js/lib/languages/go' 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('shell', bash) hljs.registerLanguage('json', json) hljs.registerLanguage('yaml', yaml) hljs.registerLanguage('yml', yaml) hljs.registerLanguage('markdown', markdown) hljs.registerLanguage('md', markdown) hljs.registerLanguage('css', css) hljs.registerLanguage('html', xml) hljs.registerLanguage('xml', xml) hljs.registerLanguage('python', python) hljs.registerLanguage('py', python) hljs.registerLanguage('rust', rust) hljs.registerLanguage('rs', rust) hljs.registerLanguage('go', go) // Custom renderer with syntax highlighting const renderer = new Renderer() renderer.code = function({ text, lang }: { text: string; lang?: string }) { let highlighted: string if (lang && hljs.getLanguage(lang)) { try { highlighted = hljs.highlight(text, { language: lang }).value } catch { highlighted = escapeHtml(text) } } else { // No auto-detect, just escape highlighted = escapeHtml(text) } return `
${highlighted}`
}
function escapeHtml(str: string): string {
return str
.replace(/&/g, '&')
.replace(//g, '>')
}
marked.setOptions({
breaks: true,
gfm: true,
renderer,
})
export function renderMarkdown(content: string): string {
return marked.parse(content) as string
}