fix(parser): 修复 RE_FENCE_START 匹配但被 fencedCode 拒绝时主循环死循环导致 CI Run tests 卡死
CI / test (18.x) (push) Successful in 10m3s
CI / test (20.x) (push) Successful in 10m4s
CI / test (22.x) (push) Successful in 10m0s
CI / test (24.x) (push) Successful in 10m0s

根因:输入如 \\\ \code\ \\\ 匹配 RE_FENCE_START 使 isBlockStart 返回 true,但 fencedCode handler 因 info string 含反引号拒绝处理,导致主循环既无法处理也无法跳过该行,进入无限循环。修复:段落 fallback 中当 para 为空且行匹配 RE_FENCE_START 含反引号时强制收集,并增加兜底 i++ 跳过无法处理的非空行。src/parser.ts:353-373

同时更新 README.md 和 site 站点测试数为 725(真实全量测试数)
This commit is contained in:
2026-07-28 21:48:35 +08:00
parent cf0bc45055
commit 9fe209ba88
11 changed files with 52 additions and 13 deletions
+11 -1
View File
@@ -1140,8 +1140,16 @@ const parseTokens = (md) => {
const l = lines[i];
if (RE_EMPTY.test(l))
break;
if (isBlockStart(l))
if (isBlockStart(l)) {
// 防止死循环:若该行匹配 RE_FENCE_START 但被 fencedCode handler 拒绝(info string 含反引号),
// 且 para 为空,则强制当作段落首行收集,否则主循环将无限重复处理此行
if (para.length === 0 && RE_FENCE_START.test(l) && l.includes('`')) {
para.push(l);
i++;
continue;
}
break;
}
if (i + 1 < lines.length && (RE_SETEXT_H1.test(lines[i + 1]) || RE_SETEXT_H2.test(lines[i + 1])))
break;
if (/\|/.test(l) && i + 1 < lines.length && isTableSeparator(lines[i + 1]))
@@ -1151,6 +1159,8 @@ const parseTokens = (md) => {
}
if (para.length)
tokens.push({ type: 'paragraph', text: para.join('\n') });
else if (i < lines.length && !RE_EMPTY.test(lines[i]))
i++; // 兜底:跳过无法处理的非空行
}
return { tokens, footnotes, refs };
};