提问背景 Question:
你刚才强烈推荐给我用的 github.com/yuin/goldmark 还不够规范吗?哪还有什么更好的
Markdown解析器选型与合规性分析
Goldmark 是目前 Go 语言生态中最遵循 CommonMark 标准的库,它确实比市面上大多数库要规范得多。但你遇到的问题(如 **词组**黄金 导致粗体识别失效),通常是因为以下几个原因导致:
- 标点与字符的邻接规则:CommonMark 标准中有明确的
left-flanking和right-flanking分隔符规则。如果**紧邻某些中文字符、数学符号或特定标点,标准解析器为了防止误触发,会将其视为普通字符而非加粗标识。 - 智能引号干扰:AI 输出有时会在引号前后包含全角字符或零宽空格,如果解析器在处理前未对文本进行 Unicode 标准化(Normalization),会导致 AST(抽象语法树)无法正确闭合。
- 混合匹配冲突:当 Markdown 内部包含嵌套链接或高亮字符时,解析器的词法分析阶段可能会出现优先级回溯问题。
建议的解决方案:
- 预处理归一化:在传入 Goldmark 前,统一将全角标点替换为半角,并去除不可见字符(如零宽空格
)。 - 使用 AST 修改器:不要只依赖默认渲染,通过实现
ast.Transformer,在解析树构建完成后,强制修复某些未闭合的强调标签。 - 前端后端对齐:前端如果使用
marked.js等 JS 库,请确保启用了与 Go 端一致的 GFM (GitHub Flavored Markdown) 扩展,并关闭“智能引号”自动转换功能。
如果 Goldmark 依然无法满足需求,可以考虑 Blackfriday (虽然已不再更新) 或基于 tree-sitter 构建你自己的解析流水线,后者能实现更精确的语法分析。