72 lines
2.2 KiB
TypeScript
72 lines
2.2 KiB
TypeScript
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 `<pre><code class="hljs">${highlighted}</code></pre>`
|
|
}
|
|
|
|
function escapeHtml(str: string): string {
|
|
return str
|
|
.replace(/&/g, '&')
|
|
.replace(/</g, '<')
|
|
.replace(/>/g, '>')
|
|
}
|
|
|
|
marked.setOptions({
|
|
breaks: true,
|
|
gfm: true,
|
|
renderer,
|
|
})
|
|
|
|
export function renderMarkdown(content: string): string {
|
|
return marked.parse(content) as string
|
|
}
|