资讯动态

markdownlint 列表内空白行尾随空格行为解析:MD009 默认配置与 `list_item_empty_lines` 参数实战

发布时间:2026/10/16 2:05:33 来源:尧图企业网站定制
开发工具代码质量Lint静态分析【免费下载链接】markdownlintA Node.js style checker and lint tool for Markdown/CommonMark files.项目地址https://gitcode.com/gh_mirrors/ma/markdownlint点击查看免费下载markdownlint 的MD009no-trailing-spaces规则负责检查行尾多余的空白字符。本文以仓库测试用例 test/trailing-spaces-in-lists-default.md 为骨架深入拆解该规则在有序/无序列表场景下的默认判定逻辑并结合规则文档 doc/md009.md、规则实现 lib/md009.mjs 与快照测试 test/markdownlint-test-scenarios.mjs.snapshot讲清默认行为、全部四个配置参数以及如何按需放行列表项内空白行。测试用例概览为什么专门有一份列表尾随空格用例test/trailing-spaces-in-lists-default.md是 markdownlint 场景测试由 test/markdownlint-test-scenarios.mjs 驱动中的一份标准 Markdown 样例。它的特殊之处在于内容全部由列表有序列表1.与无序列表-构成用于专门验证 MD009 规则在列表结构下的默认判定结果。该文件使用项目约定俗成的断言格式形如{MD009:9}的行表示第 9 行应当报告 MD009 违规。测试框架test/harness.mjs会解析这些标记将其与真实 lint 结果比对并进一步校验applyFixes修复后不再残留任何可修复错误。也就是说这份用例不仅验证报错位置是否准确还隐含验证了修复是否彻底。从完整断言看默认配置下该用例预期报告8 处MD009 违规第 9、16、18 行第一段有序列表第 29、36、38 行嵌套有序列表第 44、51 行有序列表内嵌无序列表MD009 规则本体四个参数与默认值规则全貌见 doc/md009.md标签为whitespace别名no-trailing-spaces属于可修复规则Fixable见 lib/constants.mjs 的fixableRuleNames列表。它检查任何以非预期空白结尾的行修复方式即删除行尾空白。其参数及默认值如下表参数类型默认值作用br_spacesinteger2允许行尾存在指定数量的空格用于产生显式换行hard break即brcode_blocksbooleanfalse是否检查缩进/围栏代码块内的行尾空格list_item_empty_linesbooleanfalse是否允许列表项内空白行上的缩进空格strictbooleanfalse是否报告虽然空格数量合法、但并未形成换行的多余空白注意br_spaces必须设置为 2才会生效设为1与设为0等价即完全禁止任何行尾空格详见 doc/md009.md。默认行为逐个拆解列表场景下到底哪些行会被报默认配置br_spaces2、code_blocksfalse、list_item_empty_linesfalse、strictfalse下lib/md009.mjs的判定流程可以概括为逐行计算trailingSpaces 行长度 - trimEnd 后长度若行尾空格数大于 0且该行不在代码块行集合、不在列表项空白行放行集合中并且满足数量不等于expectedexpected br_spaces 2 ? 0 : br_spaces默认即2或 strict 相关条件则报告违规报告内容为Expected: 0 or 2; Actual: N并附带可修复信息editColumn指向首个空格位置、deleteCount为空格数量。对照test/trailing-spaces-in-lists-default.md可以得到三条关键结论结论一列表项的续行缩进空格不属于行尾空格不会误报。例如第 35 行1. text后的text虽然行首有 3 个缩进空格但这些空格不在行尾MD009 只看行末空白因此完全放行。结论二列表项之间空白行上的缩进空格在默认配置下会被报。这是本用例的核心演示点。例如第 8 行text3 个缩进空格与第 9 行纯空白、含缩进空格——注意断言{MD009:9}报告的就是第 9 行快照test/markdownlint-test-scenarios.mjs.snapshot中该行errorDetail为Expected: 0 or 2; Actual: 3errorRange为[1, 3]。同理第 15、17 行{MD009:16}、{MD009:18}也是列表项间空白行的缩进空格被报。结论三缩进量越大报告的空格数越多。嵌套列表场景中第 26、34 行等空白行带有 6 个缩进空格对应{MD009:29}、{MD009:36}、{MD009:38}三处报告快照显示其Actual值为6而第 41、47 行的空白行5 个空格对应{MD009:44}、{MD009:51}Actual值为5。这里需要澄清一个常见误解默认配置并不放行列表项空白行只是这些空白行上的空格恰好因为缩进对齐语义容易被误认为内容的一部分。MD009 默认的放行范围只有两处——代码块内code_blocksfalse以及数量恰好等于br_spaces默认 2的行尾空格。深层原因为什么空白行缩进会被判违规要理解上面结论二、三需要看规则实现的底层数据结构。lib/md009.mjs 基于 micromark 解析器parser: micromark项目使用 lib/micromark-parse.mjs 生成 token 树MD009 使用了以下关键 token 类型codeFenced/codeIndented围栏/缩进代码块code_blocks关闭时用addRangeToSet把它们整体加入豁免集合见 helpers/micromark-helpers.cjs 的addRangeToSet该方法把[start, end]闭区间逐行加入集合listOrdered/listUnordered有序/无序列表容器用于计算列表项空白行豁免集合listItemIndent/listItemPrefix列表项缩进与标记 tokenparagraph/codeText段落与行内代码仅stricttrue时用于豁免判定。默认情况下listItemEmptyLines为falselistItemLineNumbers集合为空因此没有任何列表内空白行被豁免——行尾有任何空格就会触发报告除非空格数量恰好为 0 或 2br_spaces的取值。这正是trailing-spaces-in-lists-default.md中所有报告行Actual值都是 3、5、6 等非 0 非 2数值的原因而如果某个空白行恰好只缩进 2 个空格它反而会因为等于br_spaces而被放行。参数实战list_item_empty_lines如何放行列表空白行规则文档 doc/md009.md 明确指出使用空格缩进列表项内部的空白行通常没有必要但部分解析器要求这样做。当需要兼容这类解析器时将list_item_empty_lines设为true即可放行该场景且即使strict同时为true也仍然放行。仓库提供了两个配套用例test/trailing-spaces-in-lists-allowed.md文件末尾通过行内配置注释启用list_item_empty_lines: true此时原先trailing-spaces-in-lists-default.md中的 8 处报告全部消失从快照看 3 处为 0/2/6 的Actual不再出现说明列表项空白行被整体豁免test/trailing-spaces-in-lists-allowed-strict.md同样启用list_item_empty_lines: true并额外叠加strict: true验证了strict 下依然放行列表空白行这一组合语义。对应的配置写法两种方式等价{ MD009: { list_item_empty_lines: true } }或在 Markdown 文件内用行内配置注释!-- markdownlint-configure-file { no-trailing-spaces: { list_item_empty_lines: true } } --文档 doc/md009.md 给出的典型场景示例- list item text [2 spaces] list item text从实现上看lib/md009.mjs 在list_item_empty_lines为真时会遍历所有listOrdered/listUnorderedtoken把整个列表区间的行号加入豁免集合然后从后往前扫描listItemIndent子 token凡是后面没有实际内容content的列表项缩进行都会被从集合中删除。换句话说只放行确实没有内容、纯粹是缩进占位的空白行列表项末尾带真实内容后的缩进空白仍会被检查——这正是该参数实现仅针对空行的精确定义。其余三个参数的联动与边界虽然本用例聚焦默认配置但要完整掌握 MD009 在列表之外的判定还需要理解另外三个参数其行为均有对应测试佐证br_spaces默认 2只有 2才作为允许数量生效。test/trailing_spaces_br.md精确演示了这一点——单空格行报错Actual: 1、双空格行放行、三/四空格行报错。列表场景同理空白行缩进恰好 2 空格时被放行3 空格及以上则报错。code_blocks默认 false默认豁免围栏代码块与缩进代码块内的行尾空格某些编程语言语法需要。对比 test/trailing-spaces-in-code-false.md缩进代码块内 5 行全部放行与 test/trailing-spaces-in-code-true.md围栏与缩进代码块内的行全部被报即可验证。strict默认 false默认情况下即使行尾空格数量等于br_spaces只要没真的形成 hard break比如出现在段落末尾也不会报。开启strict后这类不必要的换行空格也会被报告。参见 test/hard-line-breaks.md启用strict: true后段落内多处双空格被报。参数之间的关系可以概括为code_blocks与list_item_empty_lines决定哪些行完全豁免br_spaces决定每行允许的精确空格数strict决定数量正确但位置不当的空格是否被追加报告。验证方式如何在本仓库复现如果希望亲手验证上述结论可在仓库根目录执行npm install npm test其中test脚本见 package.json会运行包括test/markdownlint-test-scenarios.mjs在内的全套测试对test/*.md逐文件执行 lint 并与{MD009:行号}断言、快照比对。需要单独观察某一用例的原始输出时可以使用 test/harness.mjs 直接解析 token 树并打印 lint 结果node test/harness.mjs test/trailing-spaces-in-lists-default.md该脚本会打印文件的 micromark token 结构随后输出lint({ files: [ ... ] })的完整结果对象其中包含errorDetail如Expected: 0 or 2; Actual: 3、errorRange与fixInfo可与本文前述的快照数据一一对应。小结MD009 默认在列表项之间的空白行上报告行尾空格数量 ≠ 0 且 ≠br_spaces时test/trailing-spaces-in-lists-default.md的 8 处断言{MD009:9/16/18/29/36/38/44/51}是这一行为的直接证据缩进对齐产生的行首空格不是行尾空格不会被误报真正被报的是空白行上的缩进空格需要兼容要求列表项空白行缩进的解析器时用list_item_empty_lines: true放行需要额外放行代码块时用code_blocks: true需要收紧判定时用strict: truebr_spaces决定硬换行允许的空格数 2才生效所有行为均有 lib/md009.mjs 实现与 test/markdownlint-test-scenarios.mjs.snapshot 快照双重佐证读者可沿 doc/md009.md、doc/Rules.md 继续深入。赞分享开发工具代码质量Lint静态分析【免费下载链接】markdownlintA Node.js style checker and lint tool for Markdown/CommonMark files.项目地址https://gitcode.com/gh_mirrors/ma/markdownlint点击查看免费下载相关推荐markdownlint MD009 规则实战用 list_item_empty_lines 放行列表项内空行的尾随空格markdownlint MD009 规则实战用 list_item_empty_lines 放行列表项内空行的尾随空格 本文以 markdownlint 仓开发工具代码质量Lint静态分析markdownlint MD009 代码块尾随空格豁免code_blocks 参数与内联配置实战markdownlint MD009 代码块尾随空格豁免code_blocks 参数与内联配置实战 本文围绕 markdownlint 的 MD009no开发工具代码质量Lint静态分析markdownlint MD009 尾随空格规则默认行为解析以 trailing-spaces-in-code-default 测试场景为例markdownlint MD009 尾随空格规则默认行为解析以 trailing spaces in code default 测试场景为例 markdow开发工具代码质量Lint静态分析上一篇5分钟上手clickhouse-backupCLI命令全攻略与实用示例下一篇CANN Ascend C SIMT int转bfloat16函数创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

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

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

免费获取报价 →
↑