Example 1 (compact list with code block)
Example 1 (compact list with code block)【免费下载链接】prettierPrettier is an opinionated code formatter.项目地址: https://gitcode.com/gh_mirrors/pr/prettierSibling item beforeA bullet point with bare text (not in ap), followed by a code block that includes an empty lineconst foo bar; console.log(foo);Sibling item after要点 - 列表为“紧凑列表”compact list即列表项之间没有空行分隔 - 第二项中文字后面直接跟一个缩进 2 个空格的围栏代码块fenced code block - 代码块内部包含一个空行且代码块结尾的 之后没有多余空行 - 第三项是“Sibling item after”用于验证前置列表项的处理不影响后续兄弟项。 **Example 2嵌套紧凑列表 含空行的围栏代码块** markdown # Example 2 (compact nested list with code block) - Parent bullet point which is not wrapped in p - Sibling item before - Item containing a code block that includes an empty line javascript const foo bar; console.log(foo); - Sibling item after要点代码块位于二级嵌套列表项内缩进 4 个空格-前缀加 2 格缩进后再对齐代码块同样包含空行。Example 3对照用例不触发 bug 的形态# Example 3 (like example 2, but doesnt trigger the bug) - It works as expected - If the code block - Does not have a line break javascript const foo bar; console.log(foo); - It doesnt affect other items要点结构上与 Example 2 几乎一致唯一区别是代码块内部没有空行。它作为对照组用来证明只有“列表项内代码块包含空行”这一特定形态才是历史 bug 的触发条件。期望输出快照断言揭示了什么快照文件 format.test.js.snap 中记录了本用例输入与输出的完整对照。输出结果可归纳为以下几点列表项文字被按 80 列折行因proseWrap: always输入中的长句A bullet point with bare text (not in a \), followed by a code block that includes an empty line 被输出为- A bullet point with bare text (not in a \p\), followed by a code block that includes an empty line代码块整体结构与缩进保持不变三个示例中的围栏代码块其语言标记javascript、缩进级别、内部空行均原样保留没有被“压平”或重新排版。空行被保留代码块内部的空行Example 1、Example 2 中的空行在输出中依然存在Example 3 中代码块本无空行输出也保持无空行。兄弟列表项不受影响每个示例中“before/after”兄弟项的输出与输入一致说明代码块的处理没有污染同一列表中的其他项。也就是说该用例期望的格式结果是除段落文字按 proseWrap 折行外列表与代码块的结构、缩进和空行全部原样输出。这验证了 Prettier 对 Markdown 的格式化策略——代码块是“格式化边界”内部内容属于原样保留区域。源码佐证Prettier 如何实现这一行为1. 代码块走独立的打印路径在 src/language-markdown/print/code.js 中printCode()区分两种代码块function printCode(path, options) { const { node } path; if (node.isIndented) { // 缩进代码块固定 4 空格对齐内容原样输出 const alignment .repeat(4); return align(alignment, [ alignment, replaceEndOfLine(node.value, hardline), ]); } return printFencedCodeBlock(path, options); }围栏代码块fenced code block走printFencedCodeBlock()function printFencedCodeBlock(path, options) { const { node } path; const value ...node.value; const style printCodeFences(value, options); return [ style, node.lang || , node.meta ? node.meta : , hardline, replaceEndOfLine(value, hardline), hardline, style, ]; }关键点在于replaceEndOfLine(value, hardline)代码块的原始文本内容被原样输出其中原有的空行会转换成 doc 结构中的hardline从而在最终渲染时得到保留。这就是快照中“代码块内空行原样保留”的底层机制。而printCodeFences()则负责根据代码内容中连续反引号的个数动态决定围栏需要多少个反引号Math.max(3, 连续个数 1)避免围栏与内容冲突。2. 列表打印中的对齐与缩进处理在 src/language-markdown/print/list.js 的printListItem()中对列表项子节点的缩进处理是“分情况讨论”的processor({ node, isFirst }) { if ((isFirst node.type ! list) || node.type html) { return align( .repeat(prefix.length), print()); } if (node.type code node.isIndented) { return print(); } const alignment .repeat( clamp(options.tabWidth - listPrefix.length, 0, 3), // 4 will cause indented code block ); return [alignment, align(alignment, print())]; }这里有一处贯穿 Markdown 打印器的核心约束注释反复出现“4 will cause indented code block”缩进超过 4 个空格会让内容被解析成缩进代码块。因此 Prettier 在列表项内做对齐时额外缩进被clamp(..., 0, 3)限制在 3 个空格以内防止子内容被 CommonMark 解析器误判为代码块。对围栏代码块而言它并不是isIndented的缩进代码块因此走print()原样打印其结构代码块自身的缩进由外层align/doc 结构负责这与快照中代码块保持原缩进的表现一致。3. 代码块列表前缀的“安全间距”处理printList()中的getPrefix()和requiredIndent()还处理了另一种边界当列表项后跟缩进代码块时列表前缀必须有足够的缩进保证。requiredIndent()的计算逻辑为return ( 4 // base indent of the code block [...leadingSpaces].reduce( (count, char) count (char \t ? 4 : 1), 0, ) 1 // at least one space more than the code block );即列表前缀的缩进必须比后续缩进代码块至少多 1 个空格否则代码块会被错误地并入列表项。虽然 issue-10063 使用的是围栏代码块而非缩进代码块但这段代码展示了 Prettier 对“列表 代码块”组合的整体防御性设计。4. 更多相关测试列表与代码块的其他组合tests/format/markdown/list/codeblock.md验证带空行的围栏代码块位于列表项内的通用场景有序/无序列表、代码块内含多个空行tests/format/markdown/list/followed-by-indented-things.md覆盖列表后跟缩进代码块、引用的各种对齐形态同目录 parser-regression 下的其他用例则覆盖了有序列表超大编号issue-17778.md、tab 与空格混用issue-19146.md、issue-19152.md等解析器边界问题。这些测试共同构成了 Markdown 列表打印器的回归防线。如何运行与验证该用例在仓库根目录执行 Jest 即可运行全部 Markdown 格式测试并针对本用例进行验证# 运行 parser-regression 目录下的全部用例含 issue-10063 yarn jest tests/format/markdown/list/parser-regression # 更精确地只跑本用例对应的快照 yarn jest tests/format/markdown/list/parser-regression/format.test.js -t issue-10063若测试通过说明当前解析与打印逻辑与快照一致若失败可在 CI 中通过更新快照文件定位解析行为的变化。命令行方式亦可直接观察格式化结果# 用 proseWrap: always 格式化该用例文件并打印到终端 yarn prettier --parser markdown --prose-wrap always tests/format/markdown/list/parser-regression/issue-10063.md【免费下载链接】prettierPrettier is an opinionated code formatter.项目地址: https://gitcode.com/gh_mirrors/pr/prettier创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

微信支付回调验签总失败?让 Codex 走 TaoToken 对照 SHA256withRSA

微信支付回调验签总失败?让 Codex 走 TaoToken 对照 SHA256withRSA

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/19 22:20:02 阅读更多 →
MCP 智能体多模型切换,TaoToken 通道的 Base URL 填什么?

MCP 智能体多模型切换,TaoToken 通道的 Base URL 填什么?

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/21 0:47:22 阅读更多 →
微信红包随机算法原理与PHP实现

微信红包随机算法原理与PHP实现

简介:本资源是一份面向PHP后端开发者与算法学习者的微信红包金额随机生成方案详解文档,聚焦社交支付场景中红包分配的公平性与趣味性平衡问题。文档深入剖析了“预先生成所有红包”这一更可控的实现思路,通过“膨胀—收缩”概率调整策略&…

2026/9/19 22:20:02 阅读更多 →

最新新闻

SpringBoot三层架构实战:从零实现用户管理系统

SpringBoot三层架构实战:从零实现用户管理系统

1. 项目概述:SpringBoot三层架构实战刚入行Java开发时,总听前辈们念叨"三层架构",但真正自己动手实现一个完整的用户管理系统才发现,理论到实践之间藏着不少门道。这次就用SpringBoot从零实现带三层架构的用户增删改查&…

2026/9/21 2:01:05 阅读更多 →
AI基础知识核心框架:从机器学习到大模型的应用与学习路径

AI基础知识核心框架:从机器学习到大模型的应用与学习路径

简介:这是一份面向人工智能初学者的入门级PPT讲义,共61页,系统梳理AI的核心概念与基础知识。内容从人工智能的定义、关键点、智能维度出发,清晰介绍符号主义、联结主义、行为主义等主要学派,并依据智能水平区分弱人工智…

2026/9/21 2:01:05 阅读更多 →
二进制与十进制互转全解析:整数、小数、负数及精度处理

二进制与十进制互转全解析:整数、小数、负数及精度处理

1. 为什么二进制和十进制互转值得单独拿出来讲很多人第一次接触进制转换,是在计算机基础课上。老师写一个除2取余的竖式,再写一个按权展开的多项式,然后说“记住就行”。结果到了实际用的时候,比如看内存地址、分析协议报文、处理…

2026/9/21 2:01:05 阅读更多 →
Si3N4与SiNx有什么区别?芯片制造中两种氮化硅的工艺差异详解

Si3N4与SiNx有什么区别?芯片制造中两种氮化硅的工艺差异详解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/21 2:01:05 阅读更多 →
大型汽车集团数智化战略规划:145页PPT框架拆解与实操落地

大型汽车集团数智化战略规划:145页PPT框架拆解与实操落地

简介:某大型汽车集团数字化转型数智化战略规划设计方案PPT,聚焦“互联网1354”顶层战略框架,面向企业数字化战略规划人员、咨询顾问、汽车行业管理者及对转型顶层设计感兴趣的从业者。压缩包内含单个145页PPT文件,约26.35MB&#…

2026/9/21 2:01:05 阅读更多 →
美团数据分析手册拆解:指标体系、SQL与归因实战

美团数据分析手册拆解:指标体系、SQL与归因实战

简介:这份《美团数据分析手册》是一份面向数据分析初级与进阶学习者的业务实战指南,聚焦外卖、到店、酒旅、出行、金融、闪购等核心业务线,系统讲解如何构建指标体系、应用数据分析方法论并支撑业务决策。资源为单个PDF文件,仅1.1…

2026/9/21 2:00:05 阅读更多 →

日新闻

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/20 0:00:46 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

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

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

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

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

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

2026/9/20 0:00:46 阅读更多 →

月新闻

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

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

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

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

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

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

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

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

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

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