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),仅供参考

相关新闻

react-admin useAuthState 详解:按认证状态渲染不同内容的 Hook 指南

react-admin useAuthState 详解:按认证状态渲染不同内容的 Hook 指南

前端UI组件 【免费下载链接】react-admin A frontend Framework for single-page applications on top of REST/GraphQL APIs, using TypeScript, React and Material Design 项目地址: https://gitcode.com/gh_mirrors/re/react-admin 点击查看 免费下载 useAuthS…

2026/9/21 15:59:04 阅读更多 →
跨声速飞行器抖振载荷动态辨识技术研究

跨声速飞行器抖振载荷动态辨识技术研究

1. 项目背景与核心挑战跨声速飞行器在接近音速飞行时,机翼表面会出现复杂的激波现象。当激波位置与机翼结构振动模态耦合时,就会引发危险的抖振问题。这种现象轻则影响飞行品质,重则导致结构疲劳甚至解体。西北工业大学马启悦、高传强团队的最…

2026/9/21 15:58:03 阅读更多 →
构建 Chrome 应用版代码编辑器:mini-code-edit 示例深度解析(CodeMirror + chrome.fileSystem)

构建 Chrome 应用版代码编辑器:mini-code-edit 示例深度解析(CodeMirror + chrome.fileSystem)

构建 Chrome 应用版代码编辑器:mini-code-edit 示例深度解析(CodeMirror chrome.fileSystem) 【免费下载链接】chrome-extensions-samples Chrome Extensions Samples 项目地址: https://gitcode.com/gh_mirrors/ch/chrome-extensions-sam…

2026/9/21 15:58:03 阅读更多 →

最新新闻

OpenIM 架构与集成指南:基于 Go 的即时通讯服务端平台、OpenIMSDK 与 Webhook 扩展机制

OpenIM 架构与集成指南:基于 Go 的即时通讯服务端平台、OpenIMSDK 与 Webhook 扩展机制

即时通讯后端微服务WebSocket 【免费下载链接】open-im-server IM Chat OpenClaw 项目地址: https://gitcode.com/gh_mirrors/op/open-im-server 点击查看 免费下载 本文基于当前仓库中的希腊语版项目文档(docs/readme/README_el.md)整理而成…

2026/9/21 16:37:35 阅读更多 →
Handsontable 9.0 升级到 10.0 迁移指南:钩子重命名、HyperFormula 升级与默认值变更全解析

Handsontable 9.0 升级到 10.0 迁移指南:钩子重命名、HyperFormula 升级与默认值变更全解析

前端UI组件 【免费下载链接】handsontable JavaScript Data Grid / Data Table with a Spreadsheet Look & Feel. Works with React, Angular, and Vue. Supported by the Handsontable team ⚡ 项目地址: https://gitcode.com/gh_mirrors/ha/handsontable 点击…

2026/9/21 16:37:35 阅读更多 →
Caffeine 节点代码生成机制解析:从 Add* 生成器到 Node 类的完整链路

Caffeine 节点代码生成机制解析:从 Add* 生成器到 Node 类的完整链路

后端缓存抽象 【免费下载链接】caffeine A high performance caching library for Java 项目地址: https://gitcode.com/gh_mirrors/ca/caffeine 点击查看 免费下载 本指南聚焦 Caffeine(caffeine/)高性能缓存库中的代码生成体系&#xff1a…

2026/9/21 16:37:35 阅读更多 →
MicroPython 嵌入指南:在 C 应用中集成 MicroPython(embed port 实战)

MicroPython 嵌入指南:在 C 应用中集成 MicroPython(embed port 实战)

MicroPython 嵌入指南:在 C 应用中集成 MicroPython(embed port 实战) 【免费下载链接】micropython MicroPython - a lean and efficient Python implementation for microcontrollers and constrained systems 项目地址: https://gitcode…

2026/9/21 16:37:35 阅读更多 →
如何搭建自己的文件传输服务?一条Docker命令部署transfer.sh完整教程

如何搭建自己的文件传输服务?一条Docker命令部署transfer.sh完整教程

如何搭建自己的文件传输服务?一条Docker命令部署transfer.sh完整教程 【免费下载链接】transfer.sh Easy and fast file sharing from the command-line. 项目地址: https://gitcode.com/gh_mirrors/tr/transfer.sh transfer.sh 是一款用 Go 语言编写的轻量级…

2026/9/21 16:37:35 阅读更多 →
Handsontable 数据绑定实战指南:六大数据结构、数据装载 API 与空值语义全解析

Handsontable 数据绑定实战指南:六大数据结构、数据装载 API 与空值语义全解析

Handsontable 数据绑定实战指南:六大数据结构、数据装载 API 与空值语义全解析 【免费下载链接】handsontable JavaScript Data Grid / Data Table with a Spreadsheet Look & Feel. Works with React, Angular, and Vue. Supported by the Handsontable team ⚡…

2026/9/21 16:36:34 阅读更多 →

日新闻

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程 【免费下载链接】agentic-awesome-skills AAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and …

2026/9/21 0:00:01 阅读更多 →
gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析 【免费下载链接】gin-vue-admin 🚀ViteVue3Gin拥有AI辅助的基础开发平台,企业级业务AI开发解决方案,内置mcp辅助服务,内置skills管理,…

2026/9/21 0:00:01 阅读更多 →
Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

桌面应用AI 应用插件系统 【免费下载链接】Wox A cross-platform launcher that simply works 项目地址: https://gitcode.com/gh_mirrors/wo/Wox 点击查看 免费下载 全功能插件(Full-featured Plugin)是 Wox 三类插件实现方式中能力最完整的…

2026/9/21 0:00:01 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/21 3:13:20 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/21 2:19:36 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/21 4:51:05 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/21 15:36:51 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/21 15:36:51 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/19 23:35:34 阅读更多 →