Pandoc AsciiDoc 写入器词内强调检测原理与 Golden Test 剖析(issue 7803)
Pandoc AsciiDoc 写入器词内强调检测原理与 Golden Test 剖析issue #7803【免费下载链接】pandocUniversal markup converter项目地址: https://gitcode.com/gh_mirrors/pa/pandoc本文以 Pandoc 仓库中的回归测试用例 test/command/7803.md 为切入点深入剖析 AsciiDoc 写入器writer在 HTML → AsciiDoc 转换中如何判断词内强调intraword emphasis并据此决定使用单下划线_还是双下划线__作为强调定界符。读完本文你将掌握 AsciiDoc 输出中强调标记的选型规则、inlineListToAsciiDoc中基于isSpacy的相邻内联元素扫描算法以及 Pandoc 命令测试golden test的编写与运行机制能够自行分析、验证乃至扩展这一类格式转换边界行为。测试用例概览一段 HTML 列表的转换test/command/7803.md 是 Pandoc 命令测试套件中的一个回归测试regression test文件整体是一个 fenced code block其内容格式由 test/Tests/Command.hs 的模块注释明确定义% pandoc -f html -t asciidoc ul lia hrefx.htmiXx/i/ai,/i ... /ul ^D * link:x.htm[_Xx_]_,_ ...解析规则为第一行%之后是待执行的 shell 命令中间若干行作为该命令的 stdin 输入以单独一行^D标记 stdin 结束之后的每一行是期望的 stdout 输出若期望出现 stderr 输出需在每行前加2前缀若期望非零退出码则末尾追加 exitcode。运行时test/Tests/Command.hs 中的execTest会通过shell调用test-pandoc --emulate见pandocToEmulate将输入喂给 pandoc 进程再把实际输出与期望输出做 golden 比对。因此7803.md本身就是一个输入 期望输出的完整规范记录了该场景下 HTML 读取器与 AsciiDoc 写入器协作后的既定行为。该测试对应的代码修复记录在 changelog.mdAsciiDoc writer: Improve detection of intraword emphasis (#7803).提交ea7458228AsciiDoc writer: improve detection of intraword emphasisCloses #7803只改动了两处一行实现代码加一个测试文件——正是本用例。待解决问题的本质单下划线与双下划线的取舍在 AsciiDocAsciidoctor 方言中_text_表示斜体强调而__text__表示词内强调intraword emphasis即当被强调的文本紧贴在普通单词字符之间、不与其他单词分隔时使用的形式。例如A__b__C中b是词内强调若写成A_b_C则不会被解析为强调而是原样输出。Pandoc 内部文档模型并不区分词内与词间强调——HTML 中i就是i。因此 AsciiDoc 写入器必须根据被强调内容在相邻内联元素序列中的位置自行推断只有当强调内容紧邻着非分隔字符比如紧跟在Xx之后时才需要升级为__...__否则使用普通的_..._。源码实现inlineListToAsciiDoc与isSpacy判定核心逻辑位于 src/Text/Pandoc/Writers/AsciiDoc.hs。写入器用WriterState中的一个intraword :: Bool字段src/Text/Pandoc/Writers/AsciiDoc.hs#L65-L77在递归过程中传递当前内联元素是否处于词内位置这一状态。inlineListToAsciiDoc对相邻内联元素y : x : xs分三种情况处理若y结尾不是分隔符isSpacy End y为 False则说明x紧跟在一个词内处理x时需要开启intraword即withIntraword $ inlineToAsciiDoc opts x否则若x开头不是分隔符isSpacy Start x为 False说明y处于词内位置处理y时开启intraword其余情况两者都不处于词内。withIntrawordsrc/Text/Pandoc/Writers/AsciiDoc.hs#L604-L605在求值前后分别setIntraword True与setIntraword False实现局部状态切换。isSpacy的判定规则src/Text/Pandoc/Writers/AsciiDoc.hs#L586-L599如下Space、LineBreak、SoftBreak一律视为分隔符Str的末尾/开头字符若是标点isPunctuation或空白isSpace则该侧视为分隔符Link、Image的结尾视为分隔符isSpacy End (Link{}) True其余情况——关键所在——在修复后一律视为非分隔符isSpacy _ _ True。修复的实质把默认值从分隔改为不分隔提交ea7458228对实现的改动只有一行src/Text/Pandoc/Writers/AsciiDoc.hs中inlineListToAsciiDoc的isSpacy函数isSpacy Start (Str xs) | Just (c, _) - T.uncons xs isPunctuation c || isSpace c - isSpacy _ _ False isSpacy _ _ True改动前未知类型的内联元素默认被当作分隔符False导致Link、Emph等复杂元素开头/结尾相邻的强调被误判为词间输出普通_..._改动后默认按非分隔符处理True只有明确命中空白、标点或链接结尾时才按分隔符处理。这使链接、图片等内联对象与强调文本相邻时能更准确地识别词内强调。逐行验证期望输出现在把测试输入与输出逐项对应验证isSpacy的推断逻辑#HTML 输入片段AsciiDoc 输出判定依据1aiXx/i/ai,/ilink:x.htm[_Xx_]_,_Link结尾为分隔Xx非词内用_Xx_,后接/li换行独立成_,_2i,,/i_,,_连续两个标点各自独立强调3i1/i_1_数字前无紧邻词字符41i1/i1__1__前置1为词字符1处于词内 →__1__5ibcd/i_bcd_独立强调6aibcd/ia__bcd__紧邻a词内 →__bcd__7aibcd/iea__bcd__e前后均紧邻词字符词内强调8aXx/a i,/ilink:x.htm[_Xx_] _,_Link结尾分隔 Space分隔i,/i前有空格9,i,/ilink:x.htm[_Xx_],_,_前一个,为标点分隔10aXx/ai,/ilink:x.htm[Xx]_,_链接文本无强调,独立强调从源码看可推断出判定机制如下Link的结尾isSpacy End (Link{}) True与Str中的标点字符、空白字符一样被视为分隔符反之字母、数字等普通字符isPunctuation与isSpace均为 False视为词字符紧邻它们的强调内容便进入intraword分支输出__...__。这正是第 4、6、7 行与第 1、5 行产生差异的原因。关联机制Emph与Strong的定界符选择isSpacy推断出的intraword状态最终由 inlineToAsciiDoc 消费inlineToAsciiDoc opts (Emph lst) do contents - inlineListToAsciiDoc opts lst isIntraword - gets intraword let marker if isIntraword then __ else _ return $ delimited marker marker contentsEmph斜体词内用__词间用_Strong加粗词内用****词间用**Underline、Strikeout、Superscript、Subscript、SmallCaps则固定使用[...]#/^...^/~...~/[smallcaps]#...#等定界符不随词内状态变化。delimited marker marker contents会确保定界符与内容之间保持正确的空白关系最终形成测试中形如1__1__、a__bcd__e的输出。延伸同系列的相邻修复#7803并非孤例changelog 显示 AsciiDoc 写入器的强调/转义处理经历过一系列迭代#8070修复链接文本中的逗号逗号会触发 AsciiDoc 属性解析需替换为#44;数字实体相关逻辑见 inlineToAsciiDoc 中的fixCommas#8525/ 后续调整链接尾迹link trail的字符范围从仅 ASCII 字母扩展为除 CJK 统一表意文字区间外的所有字母以兼容西班牙语等语言#8936asciidoc格式转向以 Asciidoctor 解析的现代方言为目标asciidoctor成为废弃同义词writeAsciiDoctor。这些修复共同塑造了当前 src/Text/Pandoc/Writers/AsciiDoc.hs 中escapeString、isSpacy等函数的复杂行为而test/command/目录下的编号测试文件则构成了保障这些行为不回归的防线。如何运行与扩展该测试命令测试统一由 test/test-pandoc.hs 中的Tests.Command.tests驱动测试分组见pandoc tests。常规执行方式# 构建并运行全部测试含 command 测试 cabal test pandoc # 或使用 Makefile 目标 make test若要单独验证本用例可用等价命令手工复现pandoc -f html -t asciidoc test/command/7803.md 的输入部分新增类似回归测试时只需在 test/command/ 下新建NNNN.md文件按% 命令 / stdin / ^D / 期望输出的格式书写即可无需改动测试框架代码——这正是 test/Tests/Command.hs 设计的可扩展性所在。小结test/command/7803.md以最小化的 HTML 列表输入完整锁定了 AsciiDoc 写入器词内强调检测的 10 种边界情形是理解isSpacy判定算法与intraword状态机的最佳样例。其背后的修复默认值由分隔改为不分隔提醒我们在格式转换器中未显式匹配即视为默认的策略选择往往正是决定输出是否符合目标格式方言语义的关键。【免费下载链接】pandocUniversal markup converter项目地址: https://gitcode.com/gh_mirrors/pa/pandoc创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Diem 开发者文档站点构建与部署完全指南:基于 Docusaurus 的本地开发、静态构建与发布

Diem 开发者文档站点构建与部署完全指南:基于 Docusaurus 的本地开发、静态构建与发布

Diem 开发者文档站点构建与部署完全指南:基于 Docusaurus 的本地开发、静态构建与发布 【免费下载链接】diem Diem’s mission is to build a trusted and innovative financial network that empowers people and businesses around the world. 项目地址: https:…

2026/9/22 23:47:42 阅读更多 →
Flink 流式概念:Table API  SQL 流批统一下的状态管理、状态 TTL 与算子级生命周期配置

Flink 流式概念:Table API SQL 流批统一下的状态管理、状态 TTL 与算子级生命周期配置

大数据流处理批处理数据工程 【免费下载链接】flink 项目地址: https://gitcode.com/gh_mirrors/fli/flink 点击查看 免费下载 Flink 的 Table API 与 SQL 是一套流批统一的声明式 API,在有限的批式输入和无限的流式输入下具备相同的语义。由于关系代数…

2026/9/22 20:34:29 阅读更多 →
LangChain工具开发实战:提升AI应用效能300%

LangChain工具开发实战:提升AI应用效能300%

1. LangChain工具生态全景认知在当今AI应用开发领域,LangChain已经成为连接大语言模型与实际业务场景的重要桥梁。作为这个生态系统的核心组件之一,Tool机制让开发者能够将各种能力模块化封装,赋予LLM调用外部功能的能力。我通过多个企业级项…

2026/9/23 1:58:20 阅读更多 →

最新新闻

Vega 可视化语法:用声明式 JSON 构建交互式可视化图表

Vega 可视化语法:用声明式 JSON 构建交互式可视化图表

Vega 可视化语法:用声明式 JSON 构建交互式可视化图表 【免费下载链接】vega A visualization grammar. 项目地址: https://gitcode.com/gh_mirrors/ve/vega Vega 是一个面向可视化领域的声明式语法(visualization grammar)&#xff1…

2026/9/23 23:43:01 阅读更多 →
从K线数据校验到量化回测:Python数据质量实战指南

从K线数据校验到量化回测:Python数据质量实战指南

用Python获取股票历史K线,门槛其实比多数人想象的低得多;但从拿到K线到真正跑通量化回测,中间隔着数据校验这道坎。我见过不止一个朋友,代码写得挺顺,策略逻辑也有模有样,结果回测收益曲线一片红&#xff0…

2026/9/23 23:43:01 阅读更多 →
番茄叶片缺陷图像分类:小样本数据集的模型选型与调参实战

番茄叶片缺陷图像分类:小样本数据集的模型选型与调参实战

简介:这份番茄叶子缺陷图像分类数据集面向从事图像分类、农业病害识别与深度学习实践的开发者与研究者,提供约3000张已标注的番茄叶片图像,覆盖细菌斑点、早疫病、健康、Septoria_spot等7个类别,可直接作为分类网络输入&#xff0…

2026/9/23 23:43:00 阅读更多 →
车牌识别完整实战:从OpenCV定位到三路CNN训练

车牌识别完整实战:从OpenCV定位到三路CNN训练

简介:本资源是一个面向高校计算机、人工智能或数字图像处理课程学生的课程设计项目,聚焦车牌识别这一经典计算机视觉任务,提供基于Python的完整实现方案。压缩包共5个文件,包含3个核心Python脚本(分别用于省份、字母、…

2026/9/23 23:43:00 阅读更多 →
基于A3C深度强化学习的网络入侵检测系统实战解析

基于A3C深度强化学习的网络入侵检测系统实战解析

简介:一套基于深度强化学习的网络入侵检测系统源码,采用A3C算法并附带KDD数据集,涵盖数据预处理、环境构建、策略监控、模型训练与测试评估等完整流程,面向信息安全、人工智能等计算机相关专业的在校学生、教师及企业开发者&#…

2026/9/23 23:43:00 阅读更多 →
支持向量机Matlab代码实战:从核函数选择到交叉验证调参

支持向量机Matlab代码实战:从核函数选择到交叉验证调参

简介:支持向量机(SVM)是机器学习中常用的监督学习模型,适用于分类与回归分析。这份压缩包配套Matlab代码和数据,面向希望掌握SVM理论及Matlab实现的学生、科研人员和算法工程师,涵盖原理讲解、示例代码与实…

2026/9/23 23:42:00 阅读更多 →

日新闻

3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A…

2026/9/23 0:00:23 阅读更多 →
2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我

2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我

2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我 刚把开发环境的显示器从1080P换到2K,跑老项目直接报错,版本升级后 API…

2026/9/23 0:01:25 阅读更多 →
3步搞定美眉图实战项目,告别官方文档抓不住重点

3步搞定美眉图实战项目,告别官方文档抓不住重点

3步搞定美眉图实战项目,告别官方文档抓不住重点 官方文档翻了三遍还是云里雾里?别急,美眉图在实战项目中常被用来做数据可视化,但它的原理比你想的简单。今天咱们直接上手,用一个完整的小项目把美眉图跑通,不再死磕那些冗长的理论说明。…

2026/9/23 0:01:25 阅读更多 →

周新闻

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

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

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

2026/9/23 4:55:02 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

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

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

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

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

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

2026/9/23 9:53:41 阅读更多 →

月新闻

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

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

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

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

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

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

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

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

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

2026/9/23 9:53:40 阅读更多 →