/** * Markdown 渲染器配置 * 封装 marked.js,配置自定义渲染器和安全策略 */ import { marked } from './lib/marked.esm.js'; import { SAFE_URI_SCHEMES } from './sanitizer.js'; // 配置 marked marked.setOptions({ breaks: true, // 换行转
gfm: true, // GitHub 风格 Markdown }); // 自定义渲染器:链接新窗口打开 + 安全属性 const renderer = new marked.Renderer(); renderer.link = function ({ href, title, text }) { const safe = SAFE_URI_SCHEMES.has(new URL(href, 'https://placeholder').protocol); const t = title ? ` title="${title}"` : ''; if (!safe) { return `${text}`; } return `${text}`; }; renderer.image = function ({ href, title, text }) { const safe = SAFE_URI_SCHEMES.has(new URL(href, 'https://placeholder').protocol); if (!safe && !/^data:image\//i.test(href)) { return `[已阻止不安全图片: ${text}]`; } const t = title ? ` title="${title}"` : ''; return `${text}`; }; marked.use({ renderer }); export { marked };