/* ===================================================================== * Markdown 轻量渲染器(markdown.js) * --------------------------------------------------------------------- * 【这个文件是干什么的?】 * 博客文章正文是用 Markdown 语法写的(# 标题、**加粗**、```代码块```), * 但浏览器只认 HTML。这个文件负责把 Markdown 文本"翻译"成 HTML 字符串, * 再交给其他模块(article.js 渲染文章正文、manage.js 做编辑预览)插入页面。 * * 【整体思路:分两层处理】 * 第 1 层(安全):先把整篇文本用 escapeHtml 转义, * 把 < > & 等特殊字符变成 < > & 这样的"HTML 实体"。 * 这样用户写的内容永远不会被当成 HTML 标签执行 —— 这是防 XSS 攻击的关键。 * 第 2 层(排版):把转义后的文本按"块级元素"逐行解析 * (标题 / 段落 / 列表 / 引用 / 分隔线 / 代码块), * 每一行内部再调用 inlineMarkdown 处理"行内元素"(加粗 / 斜体 / 链接等)。 * * 【两个函数的分工】 * - inlineMarkdown(text):只管"一行文本内部"的语法替换(行内元素) * - renderMarkdown(md):入口函数,负责整篇的分行、分块、组装(块级元素) * ===================================================================== */ import { escapeHtml, safeUrl } from "./utils.js"; /** * 行内 Markdown 渲染 * 只处理"行内"语法(不跨行),比如: * **加粗** *斜体* `行内代码` [链接文字](URL) ![图片描述](URL) * 原理:用一串正则表达式依次"查找 - 替换",把 Markdown 写法换成 HTML 标签。 * * 注意:传入的 text 已经过 escapeHtml 转义(在 renderMarkdown 里完成), * 所以这里生成的内容不会携带危险标签;链接 / 图片地址还会再过一次 * safeUrl 协议白名单(只允许 http/https 等安全协议),双保险防 XSS。 */ function inlineMarkdown(text) { return text // ---- 图片:![替代文字](图片地址) -> ---- // 正则逐段拆解: // !\[([^\]]*)\] 匹配 "![" + 任意个"不是 ] 的字符"(就是替代文字,存入分组1) // \(([^)\s]+)\) 匹配 "(" + 任意个"不是 ) 和空格 的字符"(就是 URL,存入分组2) // /g 标志 = 全局替换,把整行里所有图片语法都处理掉 .replace(/!\[([^\]]*)\]\(([^)\s]+)\)/g, (match, alt, url) => { // safeUrl(url, "image"):按"图片"规则校验地址是否安全 const safe = safeUrl(url, "image"); // 安全才输出 ;不安全直接返回空字符串(丢弃这张图) // loading="lazy":图片滚动到视野内才加载,省流量 return safe ? `${alt}` : ""; }) // ---- 视频:@[说明文字](视频地址) ->