资讯动态

markdownlint MD022 规则深度解析:标题周围必须保留空行(blanks-around-headings)

发布时间:2026/10/18 2:19:19 来源:尧图企业网站定制
开发工具代码质量Lint静态分析【免费下载链接】markdownlintA Node.js style checker and lint tool for Markdown/CommonMark files.项目地址https://gitcode.com/gh_mirrors/ma/markdownlint点击查看免费下载本文以 markdownlint 仓库中的测试样例test/headings_surrounding_space_atx.md为骨架系统讲解 MD022blanks-around-headings规则的判定逻辑、lines_above/lines_below/include_front_matter三个参数的完整用法并结合lib/md022.mjs的底层实现与测试快照帮助读者彻底掌握「标题周围空行检查」的规则语义、可修复行为与实战配置方法。一、规则概述MD022 检查什么MD022 的完整规则名为Headings should be surrounded by blank lines标题两侧应保留空行别名blanks-around-headings标签为blank_lines、headings由 doc/md022.md 正式定义实现位于 lib/md022.mjs并通过 lib/rules.mjs 注册进规则集。该规则的触发条件是任意样式的标题ATX、闭合 ATX、Setext前方或后方缺少至少一个空行。例如# Heading 1 Some text Some more text ## Heading 2第一行标题下方紧贴正文、最后一行标题上方紧贴正文均会触发 MD022。修复方式是为标题两侧补上空行标题位于文档开头或结尾时除外# Heading 1 Some text Some more text ## Heading 2官方文档给出的 Rationale设计依据值得特别留意除了美观因素外包括kramdown在内的一些解析器不会解析前面缺少空行的标题而会将其当作普通文本处理。这也是该规则存在的核心意义——它不仅是风格约束更关乎文档能否被正确渲染。二、测试样例逐行解读ATX 标题的空行陷阱仓库中的 test/headings_surrounding_space_atx.md 是一份精心构造的回归测试文件专门用于验证 ATX 标题场景下 MD022 的判定其全文如下# Heading 1 ## Heading 2 {MD022} Some text ## Heading 3 {MD022} Some text ## Heading 4 {MD022} ## Heading 5 * This shouldnt trigger MD022, but did because of some bug where we tried to #catch headings that kramdown didnt parse correctly.文件中的{MD022}是 markdownlint 测试体系使用的预期错误标记见下文测试机制逐行分析如下行号内容判定结果原因1# Heading 1通过文档第一行前方无需空行第 2 行为空行3## Heading 2 {MD022}违规Below第 4 行Some text紧贴标题下方缺少空行5## Heading 3 {MD022}违规Above Below上方第 4 行、下方第 6 行均为正文7## Heading 4 {MD022}违规Above上方第 6 行是正文下方第 8 行为空行仅上方缺空行9## Heading 5通过上下均有空行11-12列表项通过#catch只是列表内容中的普通文本并非标题这份样例同时覆盖了四种边界下方缺空行、上方缺空行、两侧都缺空行、完全合规。末尾的列表项还记录了一个历史 bug——旧实现曾错误地把列表内以#开头的续行识别为标题从而误报 MD022该用例就是为防止该回归而保留的注释原文为 This shouldnt trigger MD022, but did because of some bug where we tried to catch headings that kramdown didnt parse correctly。与之成对的还有 Setext 标题版本 test/headings_surrounding_space_setext.md说明该规则对与---下划线式标题同样生效在该文件中还叠加了 MD025single-title的检查。2.1 快照中的错误对象与自动修复该样例在 test/markdownlint-test-scenarios.mjs.snapshot 中留有完整快照。以第 3 行为例MD022 报告的错误对象包含ruleNames:[MD022, blanks-around-headings]errorDetail:Expected: 1; Actual: 0; BelowerrorContext:## Heading 2 {MD022}fixInfo: 在第 4 行前插入\nExpected: 1; Actual: 0; Below正是该规则错误信息的标准格式——期望 1 个空行、实际 0 个、位置为标题下方。快照中fixed字段展示了应用自动修复后的完整文档违规标题的下方或上方被依次补入空行最终文档所有标题两侧均满足空行要求且修复后重新 lint 不再产生任何可修复错误。三、参数详解从源码理解三个配置项MD022 支持三个参数定义于 doc/md022.md参数类型默认值含义include_front_matterbooleanfalse是否将 YAML front matter 计入标题上方的空行检查lines_aboveinteger/integer[]1标题上方要求的空行数lines_belowinteger/integer[]1标题下方要求的空行数结合 lib/md022.mjs 的源码可以看清每个参数的实际语义。3.1lines_above/lines_below可定制空行数量getLinesFunctionlib/md022.mjs负责把参数解析为「针对每个标题返回期望空行数」的函数标量形式例如1或0所有标题统一使用该数值传0表示标题紧贴正文也允许见 test/blanks-around-headings-zero.md。数组形式如[ 1, 2, 3, -1 ]数组元素按顺序对应标题级别 1–6第 n 个元素作用于第 n 级标题数组不足 6 项时剩余级别回落到默认值1源码中new Array(6).fill(defaultLines)再逐个覆盖。-1特殊值表示允许任意数量的空行。实现中该值使检查分支被跳过if (linesAbove 0)同时下方的空行计数循环不再执行。检查逻辑lib/md022.mjs会从标题所在行向上下两个方向逐行统计实际空行数上方从startLine - 2起向上数下方从endLine 1起向下数只要某一行isBlankLine就继续累加直到满足期望值或遇到非空行。注意它统计的是至少达到期望数即可多余的空行被忽略——这与规则只要求「不少于」的语义一致但多余空行本身可能触发 MD012见第五节。3.2include_front_matterfront matter 与首标题之间的衔接默认值为false此时文档开头的 YAML front matter 被忽略因此下面这份文档不会报错--- title: Title --- ## HeadinggetLinelib/md022.mjs的实现揭示了细节当索引越界标题上方进入负行号区域且includeFrontMatter为true时会回退读取frontMatterLines数组中的对应行从而把 front matter 内容纳入空行统计。设置include_front_matter: true后上面的文档将因---与标题之间缺少空行而触发 MD022。实测文件可对照 test/blanks-around-headings-one-yaml-true.md开启后 front matter 与标题之间需空行与同目录下的blanks-around-headings-one-yaml.md/-one-yaml-false.md默认关闭时不报错等变体。3.3 空行判定的实现细节isBlankLineMD022 对「空行」的判定并非简单的空白判断而是调用 helpers/helpers.cjs 中的isBlankLinehelpers/helpers.cjs一行只要只含空白、或只含 HTML 注释允许未闭合的!--/--、或为空字符串即视为空行。注释会被移除后再判断剩余内容。这意味着「标题与注释行相邻」不会被 MD022 判为违规需要留意这一语义。四、块引用Blockquote内的标题检查MD022 不止检查普通顶层标题也会检查位于块引用内的标题。从 lib/md022.mjs 可见实现预先用filterByTypesCached收集了blockQuotePrefix与linePrefix两种 micromark token用于构造修复时的插入文本当需要向标题上方/下方插入空行时getBlockQuotePrefixText会根据标题所在的块引用层级自动补上对应的前缀保证修复结果在块引用内依然结构正确。错误对象中的fixInfo.insertText与lineNumber指向endLine 1正是为此准备的。仓库中的blockquote-headings.md、headings-with-invalid-spaces.md等测试文件均覆盖了此类场景。五、与 MD012no-multiple-blanks的联动官方文档明确提示如果lines_above或lines_below被配置为要求多于一个空行应同时自定义 MD012/no-multiple-blanks。原因在于 MD012 默认限制连续空行数maximum: 1而 MD022 只要求「至少」达到指定空行数、不限制上限——两规则并存时可能出现 MD022 要求 2 行空行、MD012 又禁止 2 行空行的冲突。实际测试文件中都成对出现例如 test/blanks-around-headings-0-2.md 配置了lines_above: 0, lines_below: 2同时显式关闭no-multiple-blanks与heading-styletest/blanks-around-headings--1-1.md 则用lines_above: -1演示「上方任意空行数、下方固定 1 行」的组合。六、配置示例与实战建议在.markdownlint.json或其他 markdownlint 支持的配置格式中MD022 有三种引用方式规则编号MD022、别名blanks-around-headings、或按标签配置。典型配置如下{ MD022: { include_front_matter: false, lines_above: 1, lines_below: 1 } }按标题级别差异化要求的数组示例取自 test/blanks-around-headings-arrays.md{ blanks-around-headings: { lines_above: [ 1, 2, 3, -1 ], lines_below: [ -1, 2, 1, 3, -1, 4, 10 ] } }数组会按级别 1–6 顺序映射超出 6 项的部分被忽略、不足部分用默认值1补齐。实战建议保持默认值1即可满足绝大多数文档规范lines_above: 0适合允许「标题紧贴段落」的紧凑风格文档开启include_front_matter: true前确认你的 front matter 与首个标题之间确实需要空行分隔若想彻底放宽某一侧用-1而非大数值避免与 MD012 冲突。七、测试机制{MD022}标记与场景快照headings_surrounding_space_atx.md中的{MD022}标记并非文档内容而是测试脚手架的一部分。test/markdownlint-test-scenarios.mjs 会读取test/下所有.md文件用正则/\{(MD\d)(?::([-]?)(\d))?\}/g解析行内标记把「哪一行、哪个规则、偏移多少」编译为预期错误列表再与lint()的实际输出做深度比对同时对每个可修复错误调用applyFixes生成修复后文档并写入 test/markdownlint-test-scenarios.mjs.snapshot。此外它还断言所有产生fixInfo的错误必须属于「可修复规则」白名单fixableRuleNames并且修复后的文档再次 lint 必须零残留可修复错误——这保证了 MD022 的自动修复是收敛且安全的。八、总结通过test/headings_surrounding_space_atx.md这一测试样例可以完整掌握 markdownlint MD022 规则的行为边界ATX/Setext/块引用内标题的上下空行检查、lines_above/lines_below的标量与按级别数组配置、-1通配语义、front matter 衔接策略以及它与 MD012 的配合要点。无论是作为 CI 门禁还是编辑器内实时提示理解该规则的判定与修复逻辑都能帮助你在统一文档风格的同时规避kramdown等解析器因标题缺少前置空行而解析失败的真实风险。赞分享开发工具代码质量Lint静态分析【免费下载链接】markdownlintA Node.js style checker and lint tool for Markdown/CommonMark files.项目地址https://gitcode.com/gh_mirrors/ma/markdownlint点击查看免费下载相关推荐markdownlint MD022 规则深度解析用 blanks-around-headings 管理标题周围空行与 front matter 边界markdownlint MD022 规则深度解析用 blanks around headings 管理标题周围空行与 front matter 边界 导读开发工具代码质量Lint静态分析markdownlint MD022 规则深度解析用 blanks-around-headings 精细控制标题四周的空白行markdownlint MD022 规则深度解析用 blanks around headings 精细控制标题四周的空白行 导读 本文围绕 markdown开发工具代码质量Lint静态分析markdownlint 规则 MD022 深度解析用 blanks-around-headings-zero 测试族理解标题周围空行的检测与修复markdownlint 规则 MD022 深度解析用 blanks around headings zero 测试族理解标题周围空行的检测与修复 本文以 m开发工具代码质量Lint静态分析上一篇OpenCloud搜索服务完全指南Bleve与OpenSearch集成实践下一篇基于分层分离树HST的可扩展差分隐私聚类hst_clustering 实现与实战指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑