2026-06-21 16:23:14 +08:00
|
|
|
// Shared Markdown renderer — thin wrapper around marked.js
|
2026-06-19 23:29:05 +08:00
|
|
|
const Markdown = {
|
|
|
|
|
render(text) {
|
|
|
|
|
if (!text) return '';
|
2026-06-21 16:23:14 +08:00
|
|
|
// marked handles all parsing: headers, code blocks, inline code,
|
|
|
|
|
// bold/italic, lists, blockquotes, links, GFM tables, etc.
|
|
|
|
|
// It gracefully handles incomplete/unclosed markdown during streaming.
|
|
|
|
|
return marked.parse(text);
|
2026-06-19 23:29:05 +08:00
|
|
|
},
|
|
|
|
|
};
|
|
|
|
|
|
2026-06-21 16:23:14 +08:00
|
|
|
// Configure marked
|
|
|
|
|
marked.setOptions({
|
|
|
|
|
gfm: true, // GitHub Flavored Markdown (tables, task lists, strikethrough)
|
|
|
|
|
breaks: true, // Single newlines become <br>
|
|
|
|
|
});
|
|
|
|
|
|
2026-06-19 23:29:05 +08:00
|
|
|
// Expose globally
|
|
|
|
|
window.Markdown = Markdown;
|
|
|
|
|
|
|
|
|
|
// Backward-compatible alias
|
|
|
|
|
if (typeof window.renderMarkdown !== 'function') {
|
|
|
|
|
window.renderMarkdown = function(text) { return Markdown.render(text); };
|
|
|
|
|
}
|