资讯详情

markdownlint 同行列表标记深度解析:MD007/MD005 缩进规则与自动修复实战

📅 2026/10/16 6:18:27 | 华诺云谱 👁 阅读
markdownlint 同行列表标记深度解析:MD007/MD005 缩进规则与自动修复实战
开发工具代码质量Lint静态分析【免费下载链接】markdownlintA Node.js style checker and lint tool for Markdown/CommonMark files.项目地址https://gitcode.com/gh_mirrors/ma/markdownlint点击查看免费下载本篇技术指南以 markdownlint 仓库中的测试文档 lists-on-a-line.md 为核心系统讲解 Markdown 中一行内连续书写多个列表标记如* * Item、- 1. Item的嵌套列表语法以及 markdownlint 规则MD007ul-indent与MD005list-indent如何对这类同行嵌套列表逐层计算期望缩进、报告违例并自动修复。读完本文你将掌握同行列表标记的合法写法、错误触发规律、{MDxxx}行内断言标记与内联配置文件语法并能从源码层面理解缩进检查的底层实现。什么是同行列表Lists on a Line在 CommonMark 语法中一个列表标记*、-、或1.等通常独占一行以开始一个列表项。但 markdownlint 的测试体系覆盖了一种特殊形态在同一行内连续书写多个列表标记它们构成逐层嵌套的列表结构。例如* * Item表示外层无序列表项内再嵌套一层无序列表项- 1. Item则表示无序列表 → 有序列表 → 无序列表的三层混合嵌套。这种写法在 wiki、issue 讨论等紧凑场景中合法且常见但它对缩进的要求与普通多行嵌套列表完全一致每一层列表标记都必须落在该层期望的起始列上否则就会触发缩进类规则。该测试文件同时演示了正确写法Correct 段与错误写法Incorrect 段并用行内{MD007}、{MD005}标记精确断言每一处期望触发的违例是理解这两条规则行为的最佳教材。正确示例同行列表标记的合法缩进测试文档 lists-on-a-line.md 的Correct段依次给出了六种合法形态示例行列表结构各层标记起始列期望缩进* * Item无序 → 无序两层列 1缩进 0、列 3缩进 2* * * Item无序 → 无序 → 无序三层列 1、3、5缩进 0、2、4- * Item三层嵌套逐层更换标记符列 1、3、5- 1. Item无序 → 有序两层列 1、3- 1. Item无序 → 有序 → 无序三层列 1、3、5多行展开形式三层嵌套拆分为多行见下文最后一段是多行展开的对照写法* * * Item * Item * Item * Item首行* * * Item的三个标记分别在列 1、3、5它们各自开启一层列表随后三行* Item分别缩进 4、2、0 个空格使列表标记恰好落到列 5、3、1——即与首行对应的三个父级标记列对齐。这正是 MD007 默认配置每层缩进 2 个空格下的期望位置第 1 层缩进 0第 2 层缩进 2第 3 层缩进 4。值得注意正确示例中故意混用了*、-、三种无序标记符例如- * Item这是为了独立验证缩进规则避免与列表标记风格规则MD004ul-style相互干扰——该文件因此在末尾通过内联配置显式关闭了MD004详见下文。错误示例MD007 如何逐层报告缩进违例Incorrect段把所有合法示例整体前移了 2 个空格使其每一层标记的实际缩进都比期望值多 2从而让MD007对每一层分别报告一次违例行号内容MD007 报告期望 / 实际违例次数36* * Item {MD007}第 1 层 0/2第 2 层 2/4240* * * Item {MD007}0/2、2/4、4/6344- * Item {MD007}0/2、2/4、4/6348- 1. Item {MD007}0/2、2/4252- 1. Item {MD007}0/2、2/4256* * * Item {MD007}0/2、2/4、4/6357–59三层展开多缩进 1 空格见下文 MD005 部分3 3上述结果与测试快照 markdownlint-test-scenarios.mjs.snapshot 中lists-on-a-line.md的检查输出完全一致。以第 36 行* * Item为例快照记录了两条错误Expected: 0; Actual: 2外层标记与Expected: 2; Actual: 4内层标记。这说明 MD007 并不以整行为单位检查而是逐个列表标记核算所在层的期望缩进。多层展开场景中的 MD005 介入测试文档第 56–59 行是更复杂的组合* * * Item {MD007} * Item {MD005} {MD007} * Item {MD005} {MD007} * Item {MD005} {MD007}这里同时暴露了MD007与MD005两条规则的分工MD007ul-indent针对无序列表逐层计算期望缩进。第 57–59 行的* Item分别属于第 56 行第三个、第二个、第一个标记所开启的列表因此期望缩进为 4、2、0而实际缩进为 7、5、3各多出 3 个空格快照中对应记录为Expected: 4; Actual: 7、Expected: 2; Actual: 5、Expected: 0; Actual: 3。MD005list-indent针对同一层级内多个列表项缩进不一致的情况。第 57–59 行三个* Item位于同一列表的同一层级但缩进各不相同于是以该列表首行标记的起始列list.startColumn - 1为基准逐个比较快照记录为Expected: 6; Actual: 7、Expected: 4; Actual: 5、Expected: 2; Actual: 3——即三者实际缩进都比与父级标记列对齐的期望值多 1 个空格。修复思路很简单把整段多余的缩进全部删除。快照中的fixed字段证实自动修复后第 56 行变为* * * Item第 57–59 行变为* Item、* Item、* Item与Correct段的多行展开示例完全一致。行内断言标记{MDxxx}与测试机制测试文档中每个错误示例行尾的{MD007}、{MD005}并非错误信息的一部分而是 markdownlint 测试体系使用的行内断言标记它声明该行应当触发某条规则。标记的解析逻辑位于 markdownlint-test-scenarios.mjs 中const marker /\{(MD\d)(?::([-]?)(\d))?\}/g;该正则不仅支持{MD007}这种断言本行还支持带偏移量的形式例如{MD007:2}断言错误出现在本行之后第 2 行{MD007:-1}断言错误出现在本行之前第 1 行{MD007:12}直接断言错误出现在第 12 行。测试执行时harness 会把标记解析出的期望违例行号集合与实际 lint 结果逐条比对t.assert.deepEqual(actual, expected, Too few or too many issues found.)并对可修复的错误应用applyFixes生成修复后文本、写入快照最后对修复结果重新 lint断言不存在遗留的 fixable 错误。这套机制保证了测试文档中的每一个{MDxxx}标记都与真实 lint 输出严格对应读者可以放心把测试文件当作规则行为的最精确说明书。内联配置文件为何要关闭 MD004测试文件末尾有一段特殊注释!-- markdownlint-configure-file { ul-style: false } --!-- markdownlint-configure-file ... --是 markdownlint 的内联配置语法可在单个 Markdown 文件内覆盖全局规则配置。此处将MD004ul-style无序列表标记风格关闭是因为测试文档在正确示例中刻意混用了*、-、三种无序标记符如- * Item而 MD004 默认要求全文档保持一致的列表风格consistent必然会对这些行报错。关闭 MD004 后测试才能将注意力完全集中在 MD007/MD005 的缩进行为上。MD004 的完整配置参数定义见 md004.mdstyle取值可为asterisk/consistent/dash/plus/sublist默认consistent。若希望保持多标记混合写法也可以通过!-- markdownlint-configure-file { ul-style: { style: consistent } } --之外的形式按需调整。源码级原理MD007 与 MD005 的底层实现MD007逐标记核算期望缩进lib/md007.mjs 完整实现了无序列表缩进检查核心流程为通过filterByTypesCached筛选blockQuotePrefix、listItemPrefix、listUnordered三类 micromark 令牌对每个listUnordered令牌沿父链向上统计无序列表嵌套层数nesting每遇到一层listUnordered加 1若先遇到listOrdered则置为 -1 并停止这正是文档所述父列表均为无序时才适用本规则的原因对每个listItemPrefix令牌依据其父列表的nesting计算期望缩进expectedIndent baseIndent (startIndented ? startIndent : 0) (nesting * indent)其中indent每层缩进默认 2、start_indent首层缩进默认 2、start_indented首层是否缩进默认 false三个参数的定义见 md007.md 与 Rules.md。在lists-on-a-line.md场景下startIndented为 false、indent为默认 2因此每层期望缩进恰为nesting * 2——与上文逐行推导的 0 / 2 / 4 完全吻合。规则同时生成fixInfoeditColumn、deleteCount、insertText快照中可见其对第 36 行生成的修复为editColumn: 1, deleteCount: 2, insertText: 即从行首删除 2 个多余空格。这正是applyFixes能把错误示例修复成正确形态的原因。MD005同层列表项的缩进一致性lib/md005.mjs 负责检查同一层级的列表项缩进是否一致遍历每个listOrdered/listUnordered令牌取该列表首行标记的起始列作为期望缩进expectedIndent list.startColumn - 1对列表内每个listItemPrefix令牌比较actualIndent listItemPrefix.startColumn - 1与期望值不一致即报错对于有序列表还支持右对齐模式所有标记结束列一致实现于expectedEnd/endMatching逻辑。值得注意MD005 对无序列表项仅报告错误而不生成fixInfo源码注释明确写道 No fixInfo; MD007 handles this scenario better快照中第 57–59 行的 MD005 错误fixInfo均为null也印证了这一点——这类同层错位问题交由 MD007 的逐层修复统一处理。复现与验证实验仓库提供了开箱即用的验证手段运行完整测试test/markdownlint-test-scenarios.mjs会遍历test/下所有.md文件执行 lint、比对{MDxxx}标记断言、应用修复并校验快照。执行后可用 markdownlint-test-scenarios.mjs.snapshot 核对lists-on-a-line.md的错误清单与fixed修复结果。单独查看某个文件的 token 结构与 lint 输出test/harness.mjs 支持传入任意 Markdown 文件路径先打印 micromark 令牌树可以看到listUnordered、listItemPrefix的嵌套关系与起止列再打印完整 lint 结果非常适合观察同行列表标记如何被解析为逐层嵌套的令牌。node test/harness.mjs test/lists-on-a-line.md通过该命令可以直观看到* * * Item会产生三个不同起始列的listItemPrefix令牌分别归属于三层listUnordered从而解释 MD007 为何能对同一行报告多条不同期望值的错误。小结同行列表标记是合法语法其每层标记必须与期望缩进默认逐层 2对齐否则触发 MD007MD007ul-indent逐标记核算期望缩进且对无序列表生成可用的自动修复父链中出现有序列表时该规则暂停MD005list-indent负责同层缩进一致性检查其无序列表部分不提供修复交给 MD007 统一处理{MDxxx}行内标记是测试断言语言配合 markdownlint-test-scenarios.mjs 的解析逻辑测试文档本身即可当作规则的精确行为规范!-- markdownlint-configure-file ... --可在文件级覆盖配置用于隔离规则之间的干扰。实际项目中若你编写的 Markdown 出现嵌套列表缩进不齐的告警可优先依据 MD007 的期望值表格逐层修正或直接使用支持fixInfo的自动修复能力若同一层级的列表项起点错位则需对照 MD005 的基准列统一对齐。参考延伸doc/Rules.md 收录全部规则的完整参数说明doc/md007.md、doc/md005.md、doc/md004.md 分别给出各规则的独立文档与示例lib/md007.mjs、lib/md005.mjs、lib/md004.mjs 为对应实现源码。赞分享开发工具代码质量Lint静态分析【免费下载链接】markdownlintA Node.js style checker and lint tool for Markdown/CommonMark files.项目地址https://gitcode.com/gh_mirrors/ma/markdownlint点击查看免费下载相关推荐markdownlint MD007ul-indent无序列表缩进规则深度解析markdownlint MD007ul indent无序列表缩进规则深度解析 本篇指南围绕 markdownlint 内置规则 MD007别名 ul i开发工具代码质量Lint静态分析markdownlint MD007ul-indent规则深度解析无序列表缩进与列表不在行首场景markdownlint MD007ul indent规则深度解析无序列表缩进与列表不在行首场景 markdownlint 是用于 Markdown/开发工具代码质量Lint静态分析markdownlint 规则 MD005 详解同级列表项缩进一致性list-indentmarkdownlint 规则 MD005 详解同级列表项缩进一致性list indent 本篇技术指南以 markdownlint 官方规则文档 doc开发工具代码质量Lint静态分析上一篇Win11Debloat 5 分钟完成 Windows 11 预装应用清理与遥测关闭下一篇ToolJet File Picker 组件详解拖拽上传、文件校验、内容解析与 base64 变量实战创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑