ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Biome 的 useFencedCodeLanguage 规则实战指南:从测试规格到源码原理

Biome 的 useFencedCodeLanguage 规则实战指南:从测试规格到源码原理 开发工具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 分析器中的useFencedCodeLanguage规则展开以该规则的官方测试规格allowedLanguages.md为核心骨架结合其源码实现与配套测试用例讲解如何通过allowedLanguages与languageOnly两个配置选项强制 Markdown 围栏代码块携带语言标签。读完本文你将掌握该规则的诊断行为、配置写法、边界语义大小写敏感、空白处理、元数据容忍并能对照源码理解其底层判定逻辑。规则定位让 Markdown 代码块永远带上语言标签useFencedCodeLanguage是 Biome 在 Markdown 语言上提供的 lint 规则其声明位于 crates/biome_markdown_analyze/src/lint/nursery/use_fenced_code_language.rs。规则的核心意图在源码注释中写得很清楚Enforce that fenced code blocks specify a code tag (language). Renderers can use a code tag to select syntax highlighting when they support the language.也就是说Markdown 渲染器如 GitHub、VS Code、各种文档站点依赖围栏后的语言标签来选择语法高亮没有标签的代码块不仅无法高亮还会让文档的语义信息缺失。因此该规则要求每个围栏代码块必须声明语言标签当无需高亮时建议显式使用text标签。规则元数据来自同文件declare_lint_rule!宏还说明了它的出身规则名useFencedCodeLanguage所属语言md推荐开启recommended: true规则来源Markdownlint 的MD040fenced-code-language所属分组nursery尚不稳定未来可能调整需通过linter.rules.nursery配置以测试规格为骨架allowedLanguages.md 说了什么作为官方测试规格allowedLanguages.md 用一段精心构造的 Markdown 输入一次性覆盖了allowedLanguages选项下的多种场景。文件开头以 HTML 注释!-- should generate diagnostics --声明本节全部用例都应当产生诊断!-- should generate diagnostics --no languagejs console.log(1)print(1)console.log(1)console.log(1)console.log(1)console.log(1)逐块分析这段输入并结合配套快照 [allowedLanguages.md.snap](https://link.gitcode.com/i/f9fe648b396fb8f54acf8e9db0bbf744) 中的诊断结果可以得到如下行为矩阵 | 输入片段 | 围栏后的内容 | 是否产生诊断 | 诊断原因 | | --- | --- | --- | --- | | no language | 空 | ✅ 是3:1 | 缺少语言标签Missing | | js | js | ❌ 否 | 在允许列表内 | | python | python | ✅ 是11:4 | 不在 allowedLanguages 列表NotAllowed | | JS | JS | ✅ 是15:4 | 大小写敏感JS ≠ jsNotAllowed | | js titleexample.js | js 元数据 | ❌ 否 | 语言标签正确元数据被容忍 | | js 语言前有空格 | js | ❌ 否 | 前导空白被剥离标签仍为 js | | console.log(1) | 空 | ✅ 是27:1 | 缺少语言标签Missing | ### 快照中的诊断原文 快照文件忠实记录了每条诊断的输出。以第一处为例 text allowedLanguages.md:3:1 lint/nursery/useFencedCodeLanguage ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ i This fenced code block is missing a language tag. 1 │ !-- should generate diagnostics -- 2 │ 3 │ │ ^^^ 4 │ no language 5 │ i Renderers use language tags to select syntax highlighting for supported languages. i Add one of the languages configured in allowedLanguages after the opening fence. i This rule belongs to the nursery group, which means it is not yet stable and may change in the future. Visit https://biomejs.dev/linter/#nursery for more information.而python 与JS 这两处诊断则属于 NotAllowed 类型allowedLanguages.md:11:4 lint/nursery/useFencedCodeLanguage ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ i This language tag isnt in the list of allowed languages. 9 │ 10 │ 11 │ python │ ^^^^^^ 12 │ print(1) 13 │ i The allowedLanguages option restricts fenced code blocks to a specific set of language tags. i Use one of the allowed languages: - js - ts注意诊断位置Missing 类型指向整个左围栏l_fence而 NotAllowed 类型精确指向围栏后的语言标签文本范围如第 11 行的^^^^^^恰好覆盖python六个字符。配置入口allowedLanguages 选项的完整写法这份测试规格通过linter.rules.nursery.useFencedCodeLanguage.options.allowedLanguages配置了允许的语言白名单。测试配套配置见 allowedLanguages.options.json{ $schema: ../../../../../../packages/biomejs/biome/configuration_schema.json, linter: { rules: { nursery: { useFencedCodeLanguage: { level: error, options: { allowedLanguages: [js, ts] } } } } } }把同样的结构放进项目根目录的biome.json/biome.jsonc即可在真实项目中启用该规则{ linter: { rules: { nursery: { useFencedCodeLanguage: { level: error, options: { allowedLanguages: [js, ts, json, bash, text] } } } } } }参数语义以源码为准选项的类型定义位于 crates/biome_rule_options/src/use_fenced_code_language.rs其行为要点allowedLanguages默认[]允许声明的语言标签白名单。空列表即不配置表示接受任意语言标签配置后则只接受列表内的标签且匹配是大小写敏感的——这正是JS 被判定违规、而js 通过的原因。languageOnly默认false置为true时要求围栏后的信息串info string只能包含语言标签本身不允许携带title...、startLine3之类的元数据。选项结构体通过serde的camelCase重命名与deny_unknown_fields约束并实现了Mergetrait支持配置继承时的合并语义未配置的字段不会被序列化skip_serializing_if。源码级原理规则的判定链路UseFencedCodeLanguage规则的执行逻辑见 use_fenced_code_language.rs可以分为四步提取信息串规则以AstMdFencedCodeBlock为查询类型从围栏代码块节点中取出code_list()的第一个信息串 token。若不存在直接判定为Missing。剥离空白对信息串全文执行trim()若结果为空同样判定为Missing——这就是后直接跟代码如 27 行被标记的原因。切分语言与元数据按char::is_whitespace用split_once把信息串切成「语言标签」与「其余内容」两部分语言标签是第一个空白之前的子串。因此js titleexample.js的语言标签是js元数据被忽略除非languageOnly js标签前有空格经 trim 后语言标签仍是js不产生诊断。双重校验若配置了非空allowedLanguages且当前标签不在其中则产生NotAllowed诊断并附带footer_list列出所有允许的语言若languageOnly为true且trimmed.len() language.len()说明标签之外还有额外内容产生ExtraInfo诊断This info string contains content beyond the language tag.。规则内部用FencedCodeLanguageIssue枚举统一表示三种违规形态Missing、NotAllowed(TextRange)、ExtraInfo(TextRange)诊断阶段再根据形态分别生成不同的 message 与 note。值得注意的是NotAllowed与ExtraInfo可以同时命中见下文的 combined 用例实现上是把多个 issue 放进同一个Box[State]信号列表中一次性返回。其他配套测试规格规则行为的全貌除了allowedLanguages.md同目录下的其他规格文件共同构成了规则行为的完整测试矩阵全部位于 crates/biome_markdown_analyze/tests/specs/nursery/useFencedCodeLanguage默认行为valid.md 与 invalid.mdvalid.md 以!-- should not generate diagnostics --开头验证了未配置任何选项默认allowedLanguages: []时的合法写法js console.log(1)print(1)indented code blocks are not fenced code blocks and are ignoredconsole.log(1)just plain text它揭示了三条重要语义 - 波浪线围栏 ~~~python 同样受规则管辖且语言标签合法时通过 - **缩进式代码块不是围栏代码块**规则以 MdFencedCodeBlock 为查询目标会直接忽略它们 - 任意语言标签如 python、text在默认配置下都被接受。 而 [invalid.md](https://link.gitcode.com/i/8c0f2abb996e70b7d18c40ffac0b47ff) 则覆盖了另一组违规形态空标签的波浪线围栏 ~~~、列表项内嵌的围栏代码块、引用块 内嵌的围栏代码块以及**未闭合的围栏**unterminated fence——说明该规则对嵌套在块级元素中的围栏代码块同样生效。 ### languageOnly.md元数据容忍度的开关 [languageOnly.md](https://link.gitcode.com/i/de857fe135c1bbf536c8b286c40c7604) 配合 [languageOnly.options.json](https://link.gitcode.com/i/17713c71cfe2b15df47df527ccd580e9)languageOnly: true验证了元数据校验 js titlea.js 在此配置下产生 ExtraInfo 诊断而 js 与 js 均通过——再次印证前导空白会被容忍但标签后的非空白内容不会被放过。 ### combined.md两个选项叠加 [combined.md](https://link.gitcode.com/i/d71e349e3ffd4c7a9a34761337f980b1) 只用了一段输入就同时测试两个选项 md python titleexample.py print(1)在 allowedLanguages: [js, ts] 与 languageOnly: true 同时生效时这段代码同时触发了 NotAllowedpython 不在白名单与 ExtraInfo titleexample.py 属于多余元数据两类诊断验证了规则的多信号输出能力。 ## 如何在你的项目中启用与验证 1. 在项目根目录的 biome.json或 biome.jsonc中加入上文配置片段将规则等级设为 error 或 warn 2. 运行 biome lint 或 biome check 检查文档文件*.md 3. 若只想在本地快速体验可直接对照本目录下的测试规格把 allowedLanguages.md 的内容作为输入观察诊断输出是否与 [allowedLanguages.md.snap](https://link.gitcode.com/i/f9fe648b396fb8f54acf8e9db0bbf744) 一致 4. 由于规则当前处于 nursery 分组升级 Biome 版本时需留意其行为或默认值可能发生调整建议在 CI 中固定 Biome 版本以保证诊断稳定性。 ## 小结 useFencedCodeLanguage 用两个选项覆盖了 Markdown 围栏代码块的两类常见问题标签缺失/白名单外allowedLanguages与信息串携带多余元数据languageOnly。从测试规格 allowedLanguages.md 可以看到规则的判定基于「trim → 按空白切分 → 白名单匹配 → 元数据检查」的清晰链路且语言标签匹配严格区分大小写、容忍前导空白、默认接受任意标签。通过阅读 [use_fenced_code_language.rs](https://link.gitcode.com/i/eee45f1a4d4d0d4bd2c378b74f4c9c28) 与配套测试规格你可以准确预判该规则在任意 Markdown 写法下的行为为文档工程引入可靠的语言标签规范。赞分享开发工具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 useFencedCodeLanguage 规则实战强制 Markdown 围栏代码块声明语言标签Biome useFencedCodeLanguage 规则实战强制 Markdown 围栏代码块声明语言标签 useFencedCodeLanguage 是开发工具Lint格式化静态分析代码质量前端Biome Markdown 格式化器行内链接Inline Links格式化规则全解析从测试规格到源码实现Biome Markdown 格式化器行内链接Inline Links格式化规则全解析从测试规格到源码实现 导读 行内链接inline link是 M开发工具Lint格式化静态分析代码质量前端Ice 菜单栏管理工具macOS 图标整理快速上手指南Ice 菜单栏管理工具macOS 图标整理快速上手指南 Ice 是免费开源的 macOS 菜单栏管理工具适合被右上角图标淹没的 Mac 用户把不常用的图标开发工具Lint格式化静态分析代码质量前端上一篇Rich 终端面板Panel完全指南边框、标题与布局定制下一篇domain-admin前端构建优化Webpack配置与代码分割实践创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表