Biome Markdown 格式化器如何逐字保留代码块内容:mdn-background-9 测试用例源码级解析 📅 发布时间:2026/9/20 18:19:57 👁 浏览次数: 开发工具Lint格式化静态分析代码质量前端【免费下载链接】biomeA toolchain for web projects, aimed to provide functionalities to maintain them. Biome offers formatter and linter, usable via CLI and LSP.项目地址https://gitcode.com/gh_mirrors/bi/biome点击查看免费下载导读本文围绕 Biome 仓库中 Markdown 格式化器的真实测试用例mdn-background-9.md展开深入讲解 Biome 在处理 Markdown 围栏代码块fenced code block时内容逐字保留的设计与实现。该用例直接取自 MDN 文档中的 CSS 示例其输入与格式化输出完全一致是验证 Biome 与 Prettier 格式化行为兼容性的关键回归测试。读完本文你将理解 Biome 如何保证代码块内部排版不被 Markdown 格式化器破坏、围栏长度如何被智能归一化以及如何在本仓库中运行这类测试并配置 Markdown 格式化选项。测试用例全貌一份输出等于输入的回归样本关联文档位于 crates/biome_markdown_formatter/tests/specs/prettier/markdown/code/mdn-background-9.md全文仅一个css围栏代码块css div { background: conic-gradient( #fff 0.25turn, #000 0.25turn 0.5turn, #fff 0.5turn 0.75turn, #000 0.75turn ) top left / 25% 25% repeat; border: 1px solid; } 同目录下的预期快照文件 mdn-background-9.md.prettier-snap 与输入逐字节一致。这并非测试用例偷懒而是刻意为之该片段来自 MDN 的conic-gradient示例其内部刻意包含了不规整的缩进、多个连续空格、跨行函数调用——这些恰恰是格式化器最容易越权改动的内容。测试的目标是确认Markdown 层的格式化绝不重排代码块内部的 CSS包括代码块首行css之后紧跟着的两个空行位于代码块内部属于代码内容而非 Markdown 空行conic-gradient(参数列表的参差缩进#fff 0.25turn中#fff与值之间夹着多个空格声明值中top left / 25% 25% repeat的连续空格#000行完全不缩进、#fff行缩进 4 空格、#000行缩进 8 空格的不一致布局。任何好心的 Markdown 格式化器若尝试整理这段 CSS都会改变代码块的实际内容。Biome 对此采取的策略是围栏代码块的内容原样输出。该用例同属一个系列的兄弟样本mdn-background-1.md至mdn-background-8.md位于同一 code 目录覆盖了linear-gradient、多图层background简写、rgb()空格分隔语法等 MDN 素材共同构成外部文档代码片段不被破坏的回归防线。测试如何被驱动Prettier 兼容性快照机制这份用例不是手工维护的文档而是由测试宏自动发现并驱动的。在 crates/biome_markdown_formatter/tests/prettier_tests.rs 中tests_macros::gen_tests! {tests/specs/prettier/markdown/**/*.{md}, crate::test_snapshot, }宏会遍历tests/specs/prettier/markdown/下所有.md文件为每个文件生成一个测试函数。test_snapshot内部以MdFormatOptions::default()为基础显式指定空格缩进与默认缩进宽度IndentStyle::SpaceIndentWidth::default()并以 GFMGitHub Flavored Markdown方言构造格式化语言最终通过PrettierSnapshot::new(...).test()执行快照比对let options MdFormatOptions::default() .with_indent_style(IndentStyle::Space) .with_indent_width(IndentWidth::default()); let language language::MarkdownTestFormatLanguage::gfm(); let snapshot PrettierSnapshot::new(test_file, language, MdFormatLanguage::new(options)); snapshot.test()注意tests/specs/prettier/与tests/specs/markdown/是两套并行的规格体系后者由 spec_tests.rs 中的gen_tests!收集经 spec_test.rs 以启用markdown.formatter.enabled的Configuration运行产出.snap快照而mdn-background-9.md所属的 prettier 体系产出.prettier-snap快照专门用于对齐 Prettier 的行为。两者互为补充构成 Markdown 格式化器的完整回归网络。在仓库根目录执行以下命令即可单独运行本用例也可不带mdn-background-9过滤词运行全部 prettier 用例cargo test -p biome_markdown_formatter --test prettier_tests mdn_background_9测试通过的条件是格式化后的输出与.prettier-snap完全一致。若未来某次改动导致格式化器开始重排代码块内容此用例会立即失败从而拦住回归。核心机制一代码块内容走逐字输出通道为什么格式化器不会去重排 CSS因为 Biome 的 Markdown 格式化器在遇到代码块内容时走的是一条逐字verbatim通道而不是常规的 AST 字段格式化通道。在 crates/biome_markdown_formatter/src/verbatim.rs 中FormatMarkdownVerbatimNode的实现说明了一切它取出节点的原始文本text_with_trivia或text_trimmed唯一的处理是调用normalize_newlines将各种行结束符CRLF / CR统一为逻辑上的 LF随后用text(...)原样写回输出缓冲text( normalize_newlines(source.to_string(), LINE_TERMINATORS), Some(source_range.start()), ) .fmt(f)?;也就是说换行符风格之外的任何字符都不会被改动。同时该实现还会把节点内部的所有 token 标记为已消费track_token并校验所有 suppression 注释确保与 formatter 框架的token 必须全部打印不变量保持一致。围栏代码块正是通过这一通道输出的在 fenced_code_block.rs 的fmt_fields中代码块内容content/code_list字段要么直接逐字打印要么逐行交给FormatMdCodeContent。因此mdn-background-9.md中那段缩进混乱、空格成串的 CSS 得以毫发无损地穿过格式化管线。核心机制二围栏长度按 CommonMark 规则归一化内容逐字并不代表整个代码块都原封不动。Biome 会对围栏本身做一处有意义的规范化根据内容中最长的反引号连续序列动态决定外层围栏的最小长度。CommonMark 规范§4.5要求代码块内容中若出现与围栏相同长度的反引号序列会被解析为闭合围栏。因此 fenced_code_block.rs 先扫描内容再按最长内部序列 1且不少于 3生成新围栏let max_inner longest_fence_char_sequence(node, ); let fence_len (max_inner 1).max(3); let normalized_fence: String std::iter::repeat_n(, fence_len).collect();扫描逻辑由longest_fence_char_sequence同文件 L177-L205实现遍历代码块内容中的MdTextual/MdCodeContenttoken统计每个字符位置上反引号的连续长度并取最大值。仓库中 backtick.md 及其快照就演示了这一行为内容中的内层js要求外层围栏从 10 个反引号归一化为恰好 4 个。对于mdn-background-9.md其 CSS 内容不含反引号max_inner 0故围栏长度保持为 3归一化结果就是输入本身。核心机制三代码内容的按行保留与开围栏缩进裁剪围栏内部的内容在 code_content.rs 中被逐行处理。这里有一个容易被忽略的细节代码块文字 token 以开围栏行尾的换行符开头且开围栏的可选缩进可能被解析为内容行的前缀。该实现会跳过开围栏行尾的换行符兼容\r\n与\n对每一行裁剪掉不超过开围栏缩进宽度的前导空格opening_fence_indent其余字符按原始字节顺序逐个切片打印保留行内所有空白。opening_fence_indent来自 fenced_code_block.rs 中对indent字段各缩进 token 长度的累加。这套逻辑保证了即便代码块嵌套在列表或引用内开围栏带缩进内容也能以相对开围栏的原始缩进被完整保留——对mdn-background-9.md这类顶层代码块开围栏无缩进内容行原样通过。配置与实战如何在本仓库中复现与使用启用 Markdown 格式化Biome 的 Markdown 格式化默认关闭见 crates/biome_configuration/src/markdown.rs 的类型别名pub type MarkdownFormatterEnabled Boolfalse; // Keep it disabled by default while experimental.。要开启在biome.json中配置{ formatter: { enabled: true, indentStyle: space, indentWidth: 2, lineWidth: 80 }, markdown: { formatter: { enabled: true } } }Markdown 专属格式化参数MarkdownFormatterConfiguration 提供以下可选项均为可选字段缺省时回落到顶层 formatter 配置配置项默认值说明enabledfalse实验性阶段默认关闭是否对 Markdown及其超集语言文件启用格式化indentStyle继承顶层配置Markdown 文件的缩进风格space / tabindentWidth2Markdown 文件的缩进宽度lineWidth80单行最大宽度trailingNewlinetrue文件末尾是否保留换行符源码注释明确提示设为false可能引发与 Git、cat 等工具链的兼容问题风险自负lineEndingauto换行符类型auto在 Windows 使用 CRLF、其他平台使用 LFproseWrap继承顶层配置控制 Markdown 段落的换行手动换行行尾两个空格或反斜杠总是被保留该选项决定 Biome 是否新增或移除段落内的换行与之配套的解析器选项见 MarkdownParserConfigurationfrontmatter默认false是否解析文件开头的 frontmatter与gfm默认true是否启用 GitHub Flavored Markdown 扩展。命令行格式化配置完成后即可用 CLI 对 Markdown 文件执行格式化注意实验性功能请核对当前版本输出与biome --help# 格式化并写入文件 biome format --write path/to/README.md # 仅检查是否已格式化 biome format path/to/README.md本地运行测试仓库提供两条测试路径详见 justfile 中的test-markdown-*系列任务# Prettier 兼容性快照本文用例所属体系 cargo test -p biome_markdown_formatter --test prettier_tests # 通用规格快照tests/specs/markdown 体系 cargo test -p biome_markdown_formatter --test spec_tests若格式化行为发生变化导致.prettier-snap过期测试会给出差异经人工确认属于预期变更后可更新快照仓库文档中描述的快照更新流程同样适用于此用例。小结mdn-background-9.md虽只有 13 行却是 Biome Markdown 格式化器内容安全承诺的最小化验证FormatMdFencedCodeBlock负责围栏长度归一化与结构输出FormatMdCodeContent逐行裁剪开围栏缩进并保留行内空白FormatMarkdownVerbatimNode最终以逐字通道落盘三者协同保证 MDN 这类外部素材中的 CSS 代码块不被格式化器改写。理解这条链路你就能预判 Biome 对 Markdown 代码块的任何输入会做什么、不会做什么也就能放心地把biome format接入含大量内嵌代码示例的文档工作流。赞分享开发工具Lint格式化静态分析代码质量前端【免费下载链接】biomeA toolchain for web projects, aimed to provide functionalities to maintain them. Biome offers formatter and linter, usable via CLI and LSP.项目地址https://gitcode.com/gh_mirrors/bi/biome点击查看免费下载相关推荐Biome Markdown 格式化器测试用例解析mdn-background-7.md 与围栏代码块原样保留策略Biome Markdown 格式化器测试用例解析mdn background 7.md 与围栏代码块原样保留策略 本文围绕 Biome 仓库中 crates开发工具Lint格式化静态分析代码质量前端Biome Markdown 格式化器对围栏代码块的原样保留策略以 mdn-background-3 测试用例深度解析Biome Markdown 格式化器对围栏代码块的原样保留策略以 mdn background 3 测试用例深度解析 本篇技术指南以 Biome 仓库中 M开发工具Lint格式化静态分析代码质量前端Biome Markdown 格式化器如何原样保留 fenced code block以 mdn-background-4 测试用例为例Biome Markdown 格式化器如何原样保留 fenced code block以 mdn background 4 测试用例为例 本篇文章以 Biom开发工具Lint格式化静态分析代码质量前端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考