
Prettier 与 Markdown 块引用「中断」语义解读 interrupt-others.md 测试用例【免费下载链接】prettierPrettier is an opinionated code formatter.项目地址: https://gitcode.com/gh_mirrors/pr/prettier本文以 Prettier 仓库中 tests/format/markdown/blockquote/interrupt-others.md 这一测试用例为切入点深入解析 Markdown 块引用blockquote在格式化工序中的「中断」interrupt语义普通段落、链接与 wiki 链接如何被标记打断以及嵌套在块引用中的缩进又为何不会被误判为代码块或新引用。读者读完本文后将能准确理解 Prettier 的 Markdown 解析与打印管线如何协同处理这类边界情况并掌握proseWrap三种取值对输出结果的真实影响。测试用例的背景与定位interrupt-others.md位于 tests/format/markdown/blockquote/ 目录是该目录下 11 个 Markdown 块引用格式化测试之一。同目录还包含simple.md最简单的 123、nested.md 123嵌套引用、list.md引用与列表混排、code.md引用内的代码块、ignore-code.mdprettier-ignore行为等用例共同覆盖块引用格式化的大部分边界场景。该用例由 format.test.js 驱动runFormatTest(import.meta, [markdown], { proseWrap: always }); runFormatTest(import.meta, [markdown], { proseWrap: preserve }); runFormatTest(import.meta, [markdown], { proseWrap: never });即同一份输入分别以proseWrap的三种取值各跑一遍格式化并对比snapshots/format.test.js.snap 中的快照。这正是理解「proseWrap 如何影响块引用内部折行」的直接实验依据。输入内容四组「中断」场景测试文件全文只有 11 行却精心构造了四组互不相同的结构This paragraph is interrupted by block quote. [This link is interrupted by block quote.](http://example.com) [[This wiki link is interrupted by block quote.]] This is a block quote and this paragraph is interrupted neither by block quote nor indented code block.按 CommonMark 规范属于「能中断段落」的块级标记block quote marker 是少数可以打断进行中段落的结构之一。因此普通段落中断第 1–2 行This paragraph是一个开始中的段落第二行的直接把它打断生成独立的块引用行内链接中断第 4–5 行链接文本[This link跨行链接的目标](http://example.com)在之后闭合wiki 链接中断第 7–8 行双括号 wiki 链接[[This wiki link同样被跨行打断引用内的缩进第 10–11 行外层是块引用 This is a block quote...下一行 ...里那个缩进了 4 个空格的是外层引用内容的延续——注意它既没有被解析成嵌套块引用也没有被当成「缩进代码块」。最后一组是全文的精华它同时考验解析器对「引用内缩进字符」和「缩进代码块阈值」的区分能力。按照 CommonMark 规则缩进代码块要求行首有 4 个或以上空格而 中标记后跟随 4 个空格再跟一个这个缩进发生在引用标记之后属于引用内容的普通文本并不会触发代码块。格式化后的输出三种 proseWrap 的行为差异proseWrap: always超出 printWidth 时强制折行This paragraph is interrupted by block quote. [This link is interrupted by block quote.](http://example.com) [[This wiki link is interrupted by block quote.]] This is a block quote and this paragraph is interrupted neither by block quote nor indented code block.proseWrap: never不折行This paragraph is interrupted by block quote. [This link is interrupted by block quote.](http://example.com) [[This wiki link is interrupted by block quote.]] This is a block quote and this paragraph is interrupted neither by block quote nor indented code block.proseWrap: preserve原样保留折行输出与never完全一致见快照 586–620 行三种模式下这四组结构的整体布局相同差异只体现在第四组的引用内部长句上——always把超过 80 列默认printWidth的长行按词边界重排并加上前缀续行而never/preserve保持单行不折。三处值得深挖的输出细节1. 被中断段落与链接之间插入空行输入中This paragraph与 is interrupted...之间并没有空行输出却在二者之间补了一个空行。这是因为解析器已按「中断」语义把它们拆成两个独立块级节点段落 块引用Prettier 在打印相邻块级节点时用空行分隔防止渲染时被重新粘连成同一段落。同样的空行也被插入到[This link与之间、[[This wiki link与之间。2. 引用标记的归一化输出统一采用一个大于号加一个空格作为引用前缀且每行都有。这一行为来自打印核心 src/language-markdown/print/mdast.jscase blockquote: return [ , align( , printChildren(path, options, print))];align( , ...)保证引用内的每一行文本都对齐在之后这也是为什么always模式下折行后的续行会继续带有前缀。3. 引用内缩进与「折行后如何保住原始标记」第四组在always模式下把两行内容并成一行再折行 里的缩进空格被吸收最终表现为 This is a block quote and this paragraph is interrupted neither...。这里的关键在于块引用内的文本节点不会携带\n 之类的标记噪声。在预处理阶段 src/language-markdown/print/preprocess.js 中有一段注释明确说明Usingnode.value, we dont need to care about markers like\n inblockquotes.而当段落祖先链中存在块引用节点时Prettier 会调用 src/language-markdown/utilities/get-blockquote-raw-text.js 的getBlockquoteRawText从原始文本里剥离各级标记——该函数通过countValueLeadingGreaterThan统计本行值文本里前导的个数再用removeBlockquoteMarkers按需保留对应数量的标记从而把 is interrupted...这类「引用内缩进大于号」还原成干净的纯文本参与折行。这也是为什么第四组里的第二个在折行后依然作为普通字符保留在句子里而不是被重新解释成嵌套引用。与 CommonMark 中断规则的对照「谁可以中断段落」是 CommonMark 最容易踩坑的点之一。是少数能中断段落的块标记相比之下缩进代码块不能中断段落这也正是第四组用例的意义 中第二个前有 4 个空格但它出现在块引用标记之后实际是引用内容的一部分解析器不会因此启动缩进代码块。Prettier 的测试套件里还有对称的用例 tests/format/markdown/list/interrupt.md* Something被### Some heading中断可见「中断」是 Markdown 格式化的通用关注点块引用与标题分别验证。如何在本地复现验证读者可在仓库根目录直接验证该用例# 查看三种 proseWrap 下的格式化结果 npx prettier --parser markdown --prose-wrap always tests/format/markdown/blockquote/interrupt-others.md npx prettier --parser markdown --prose-wrap never tests/format/markdown/blockquote/interrupt-others.md npx prettier --parser markdown --prose-wrap preserve tests/format/markdown/blockquote/interrupt-others.md其中proseWrap的取值与含义在 src/common/common-options.evaluate.js 中有正式定义always超过 print width 即折行、never不折行、preserve按原样保留默认值。也可以运行整个目录的测试yarn jest tests/format/markdown/blockquote测试失败时快照对比会清楚展示输入与输出方便观察中断空行、前缀对齐以及引用内缩进的保留行为。小结interrupt-others.md虽然只有 11 行却完整覆盖了 Markdown 块引用「中断」语义的四个侧面段落中断、行内链接中断、wiki 链接中断以及引用内缩进与缩进代码块的区分。结合 mdast.js 的align打印策略、preprocess.js 的文本预处理和 get-blockquote-raw-text.js 的标记剥离逻辑可以清晰还原 Prettier 从解析到打印的完整链路。对于需要在 README、Issue 模板或文档中安全书写复杂引用结构的开发者而言理解这些边界行为能有效避免格式化后文档结构被意外改变。【免费下载链接】prettierPrettier is an opinionated code formatter.项目地址: https://gitcode.com/gh_mirrors/pr/prettier创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考