ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Pandoc GFM 输出中的 `<div>` 引用区块:从 7965 测试用例看 `native_divs` 与 `raw_html` 扩展的取舍

Pandoc GFM 输出中的 `<div>` 引用区块:从 7965 测试用例看 `native_divs` 与 `raw_html` 扩展的取舍 文档开发工具CLI【免费下载链接】pandocUniversal markup converter项目地址https://gitcode.com/gh_mirrors/pa/pandoc点击查看免费下载导读本文以 pandoc 仓库中的命令测试用例 test/command/7965.md 为线索深入解析从 Markdown 转换为 GFMGitHub Flavored Markdown时HTMLdiv引用区块为何被保留、又如何在禁用raw_html后被剔除这一行为的完整链路。通过对照 changelog.md、Extensions.hs 与 Markdown Writer 的实现读者可以掌握 pandoc 扩展系统的运作方式以及如何在实际文档互转中精确控制 HTML 标签的输出。一、测试用例全景一份被反复转写的引用区块test/command/7965.md 是 pandoc 的 golden test黄金测试体系中的一个用例它以 shell 会话的形式记录了两次pandoc调用的输入与期望输出由 test/Tests/Command.hs 驱动比对任何输出偏差都会导致测试失败。输入文档两次调用相同是一个典型的引文citation渲染结果——一段行内引用Watson and Crick (1953)其后跟随着由 CSLCitation Style Language生成的标准参考文献区块% pandoc -f markdown -t gfm Watson and Crick (1953) div idrefs classreferences csl-bib-body hanging-indent div idref-WatsonCrick1953 classcsl-entry Watson, J. D., and F. H. C. Crick. 1953. “Molecular Structure of Nucleic Acids: A Structure for Deoxyribose Nucleic Acid.” *Nature* 171 (4356): 737–38. https://doi.org/10.1038/171737a0. /div /div ^D注意输入中的两个关键结构外层div idrefs classreferences csl-bib-body hanging-indent整个参考文献列表的容器和内层div idref-WatsonCrick1953 classcsl-entry单条文献条目。这正是 pandoc 的 citeproc 模块在生成参考文献时使用的标准包装结构仓库中 src/Text/Pandoc/Citeproc.hs 等源码中均有csl-bib-body、csl-entry类名的对应实现。用例一-t gfmdiv 被完整保留% pandoc -f markdown -t gfm Watson and Crick (1953) div idrefs classreferences csl-bib-body hanging-indent div idref-WatsonCrick1953 classcsl-entry Watson, J. D., and F. H. C. Crick. 1953. “Molecular Structure of Nucleic Acids: A Structure for Deoxyribose Nucleic Acid.” *Nature* 171 (4356): 737–38. https://doi.org/10.1038/171737a0. /div /div用例二-t gfm-raw_htmldiv 被剥离% pandoc -f markdown -t gfm-raw_html Watson and Crick (1953) Watson, J. D., and F. H. C. Crick. 1953. “Molecular Structure of Nucleic Acids: A Structure for Deoxyribose Nucleic Acid.” *Nature* 171 (4356): 737–38. https://doi.org/10.1038/171737a0.同样是 Markdown 输入、同样是 GFM 输出唯一的区别在于第二个命令通过-t gfm-raw_html显式关闭了raw_html扩展-t后的格式字符串支持用-扩展名语法禁用扩展。两个用例的输出差异精确锁定了测试意图div包装标签的去留由raw_html扩展单独决定且这一行为在 GFM 格式下是可控、可预期的。二、行为解读为什么 GFM 下 div 会听令于 raw_html要理解这两个用例必须回到 pandoc 的扩展系统。pandoc 把每种格式解析/渲染能力拆分为独立的扩展extension其中与本例直接相关的是raw_html是否允许/输出原始 HTML 标签native_divs是否把div标签的内容解析为 Pandoc 内部的Div块markdown_in_html_blocks是否允许在 HTML 块内部解析 Markdown 语法。1. GFM 的默认扩展集合在 src/Text/Pandoc/Extensions.hs 中getDefaultExtensions gfm定义的默认扩展为Ext_pipe_tables, Ext_raw_html, Ext_auto_identifiers, Ext_gfm_auto_identifiers, Ext_autolink_bare_uris, Ext_strikeout, Ext_task_lists, Ext_emoji, Ext_yaml_metadata_block, Ext_footnotes, Ext_tex_math_dollars, Ext_tex_math_gfm, Ext_alerts两个关键事实Ext_raw_html在 GFM 默认扩展列表之中——因此默认-t gfm时HTML 标签可以原样输出Ext_native_divs不在 GFM 默认扩展之中——GFM 读取器不把div解析为语义化的Div块。这里有一个容易混淆的细节-t gfm中的扩展名同时影响读取与写入。本测试是 Markdown → GFMraw_html生效的位置在写入端Markdown Writer其作用就是把输入中保留下来的 HTML 原样写出。2. Markdown Writer 中 Div 块的渲染分支当输入的div被读取器解析为 Pandoc AST 的Div块id、class属性被提取内容成为块级元素序列后如何输出由 src/Text/Pandoc/Writers/Markdown.hs 中的分支逻辑决定| isEnabled Ext_native_divs opts || (isEnabled Ext_raw_html opts (variant Commonmark || isEnabled Ext_markdown_in_html_blocks opts)) - tagWithAttrs div attrs blankline contents blankline /div blankline ... | otherwise - contents blankline这段代码的含义是只有在启用native_divs或启用raw_html且目标为 Commonmark 系格式GFM 属于 Commonmark 变体时才会重新输出div ...与/div包装标签否则只输出 div 内部的块级内容引用文字本身。对照两个用例命令raw_htmlnative_divs命中分支输出-t gfm启用未启用raw_html Commonmark 分支保留div包装-t gfm-raw_html禁用未启用otherwise分支仅输出内容剥离标签这正好解释了测试期望输出的全部差异。三、来龙去脉#7965 修复了什么这个测试用例编号对应 GitHub 议题 #7965changelog.md 中记录了这一变更的完整动机Removenative_divsfrom allowed gfm extensions (#7965). This allowsdivto be suppressed using-raw_html. Previouslynative_divswas enabled but could not be suppressed, because it was not in the list of available extensions for commonmark-based formats.翻译过来即此前native_divs被错误地加入了 GFM 可用的扩展列表。后果是即便用户显式传入-raw_html禁用原始 HTML 输出由于native_divs仍在生效且无法被关闭Markdown Writer 中isEnabled Ext_native_divs分支永远为真div包装标签照样被输出——用户想去掉 HTML 外壳、只留纯文本引用的需求无法满足。修复方案是把native_divs从 commonmark 系格式含 GFM的可用扩展集合中移除让raw_html成为控制div去留的唯一开关。7965.md这个测试用例正是为锁定修复后的行为而添加的回归测试用例一验证默认行为不变raw_html开着div 保留用例二验证修复目标达成-raw_html能干净地剥掉 div。在 src/Text/Pandoc/Extensions.hs 附近可以找到native_divs仍被允许用于哪些格式如 HTML、EPUB 等以原生 HTML 为核心的格式与 GFM 形成对照。四、实战场景从带引文的 Markdown 生成纯文本版参考文献这一修复在实际工作流中的价值非常直接。当你用 pandoc 处理含引文的文档时例如--citeproc生成参考文献输出中天然带有csl-bib-body、csl-entry这类 div 包装。在多数场景下我们希望保留它们因为 GitHub、渲染器可以据此做样式化排版但当你需要把文档转发到不支持 HTML 的渠道或希望得到干净的纯 Markdown 时就可以用# 保留 HTML 包装默认行为适合 GitHub 等平台 pandoc --citeproc input.md -t gfm -o output.md # 剥离所有 HTML 标签仅保留结构与文本 pandoc --citeproc input.md -t gfm-raw_html -o output.md注意-t gfm-raw_html的语法格式字符串gfm-raw_html表示以 GFM 为目标格式同时禁用 raw_html 扩展。pandoc 还支持反向的扩展名语法来启用扩展例如gfmraw_html与默认的gfm等效。相关扩展速查以下扩展在排查HTML 标签为何出现/消失问题时最常涉及扩展名作用GFM 默认raw_html输出/解析原始 HTML启用native_divs将div解析为语义 Div 块并原样回写禁用且不可在 GFM 下启用markdown_in_html_blocks允许在 HTML 块内解析 Markdown随格式而定fenced_divs使用:::围栏语法表示 Div 块禁用如果改用-t markdownPandoc 自家 Markdown由于fenced_divs默认启用Div 块会被写作::: {#refs .references .csl-bib-body .hanging-indent}围栏形式而非 HTML 标签——这是另一种保留结构语义、避免原生 HTML的路径。五、如何复现与验证本仓库中该测试可直接运行验证需要已构建的 pandoc 可执行文件及 cabal 测试环境cabal test --test-options-p /7965/也可以脱离测试框架手动执行用例中的两条命令对比输出printf Watson and Crick (1953)\n\ndiv idrefs classreferences csl-bib-body hanging-indent\n\ndiv idref-WatsonCrick1953 classcsl-entry\n\nWatson, J. D., and F. H. C. Crick. 1953. Molecular Structure of Nucleic Acids: A Structure for Deoxyribose Nucleic Acid. *Nature* 171 (4356): 737-38. https://doi.org/10.1038/171737a0.\n\n/div\n\n/div\n | pandoc -f markdown -t gfm printf ...同上... | pandoc -f markdown -t gfm-raw_html两次输出的差异div包装是否存在即是对 #7965 修复行为的直接印证。若在旧版本 pandoc 上执行第二个命令也会输出 div 标签正是该 issue 要解决的缺陷。六、小结test/command/7965.md 表面上是两段平淡无奇的命令输出实则精确刻画了 pandoc 扩展系统的一条关键设计原则同一块 AST 结构在输出端表现为什么形态由目标格式的扩展集合精确决定且每个开关都应当可被用户单独控制。通过-raw_html抑制div引用包装、通过-t markdown切换到围栏 Div 语法、通过fenced_divs显式开启语义化区块——掌握扩展的加减法就能让 pandoc 在不同分发渠道间自如转写而不错失任何一层结构信息。赞分享文档开发工具CLI【免费下载链接】pandocUniversal markup converter项目地址https://gitcode.com/gh_mirrors/pa/pandoc点击查看免费下载相关推荐pandoc 命令行测试解析从 -f gfm -t gfm 的 11712 号用例看任务列表的读取与输出pandoc 命令行测试解析从 f gfm t gfm 的 11712 号用例看任务列表的读取与输出 本篇技术指南以 pandoc 仓库中的命令测试文件 te文档开发工具CLIPandoc Markdown 输出中的 raw_html、superscript、subscript 与 strikeout 扩展真实测试用例驱动的行为解析Pandoc Markdown 输出中的 raw_html 、 superscript 、 subscript 与 strikeout 扩展真实测试用例驱动的文档开发工具CLIPandoc 转 Typst 输出中的引号处理从测试用例 11788 看 smart 扩展与引号规范化Pandoc 转 Typst 输出中的引号处理从测试用例 11788 看 smart 扩展与引号规范化 导读 在 Pandoc 中把 Markdown 文档转文档开发工具CLI上一篇aligo视频播放API终极指南轻松获取阿里云盘视频的播放信息下一篇如何使用gpt-repository-loader将代码仓库转换为LLM友好格式的终极指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表