Markdown 示例链接不该算作正文链接:一次误报修复与回归验证
我做的单文件工具“文稿灯塔”会按行检查 Markdown 的标题层级、空链接、图片替代文字和代码围栏。昨天测试代码围栏时,它已经能跳过代码块;今天补测行内代码,发现了一处误报:把 `![]()` 和 `[空]()` 放进正文作语法示例,页面仍把它们当作真正的图片和链接。
先复现,再确定边界
我在本地 Edge 中输入下面三行:
# 例子
`![]()` 和 `[空]()`
正常 [文档](https://example.com)
修复前,概览显示 3 个链接,第 2 行给出两条“链接地址为空”和一条“图片缺少替代文字”。实际正文只有第 3 行那个正常链接;第 2 行的两段内容都被反引号包着,是展示给读者看的字面语法。检查器用正则直接扫描整行,虽跳过了三反引号代码围栏,却没有区分同一行里的代码片段。
本次目标收得很窄:识别同一行内成对、长度相同的反引号,在扫描链接前把这一区间临时替换为空格。它只影响检查用的副本,不改变用户粘贴的原文,也不影响行号。未配对的反引号保留原样;带反斜杠转义的反引号不作为开头。代码围栏仍按原有状态处理。
核心调用改为:
const visible = maskInlineCode(line);
const matches = [...visible.matchAll(/!?\[[^\]]*\]\(([^)]*)\)/g)];
maskInlineCode() 先找开头连续反引号,再找长度相同的闭合连续反引号;找到一对才遮蔽两端和其中内容。这样链接规则无需猜测“代码”是什么,只看仍可见的正文。处理顺序也很重要:先判定整行是否在围栏内,再遮蔽行内代码,最后扫描链接与图片。
回归结果
我重新打开修改后的本地页面,在 Edge 中逐项输入并读取问题列表与链接数:
| 输入情形 | 链接数 | 检查结果 |
|---|---|---|
| 两段行内代码加一个正常链接 | 1 | 0 条问题 |
| 真正的空链接与缺少替代文字的图片 | 2 | 两类问题仍提示 |
| 双反引号包住的示例,加单反引号示例 | 0 | 0 条问题 |
| 未闭合的单反引号后有图片 | 1 | 图片问题仍提示 |
| 转义的反引号后有图片 | 1 | 图片问题仍提示 |
| 三反引号围栏内的图片语法 | 0 | 0 条问题 |
原有“载入示例”仍得到 3 个链接和 5 条问题:标题层级跳跃、图片缺少替代文字、空链接、重复标题及代码围栏未闭合。修复没有把真实问题一起遮蔽。修改已推到公开 GitCode 仓库的 main 分支,提交号 202b977。
这个检查器仍是轻量辅助工具,不是完整 Markdown 解析器。跨行的行内代码、复杂嵌套语法和引用式链接没有覆盖;这次只解决了同一行内示例误报,并用真实输入核对原规则仍生效。
- 点赞
- 收藏
- 关注作者
评论(0)