资讯详情

资讯详情

markdownlint MD043(required-headings)规则实战:用 “?“ 通配符校验“可变标题“并捕获缺失

开发工具代码质量Lint静态分析【免费下载链接】markdownlintA Node.js style checker and lint tool for Markdown/CommonMark files.项目地址https://gitcode.com/gh_mirrors/ma/markdownlint点击查看免费下载导读本文围绕 markdownlint 仓库中的 MD043「Required heading structure必需标题结构」规则展开重点讲解其headings参数中*、、?三种特殊通配符的语义并以仓库测试用例test/required-headings-question-missing.md为主线演示当恰好一个可变标题缺失时规则如何定位与报错。读完本文你将能为一组结构相似的 Markdown 文档强制统一标题骨架并能根据源码读懂 MD043 的匹配状态机与行号报告逻辑。MD043 规则总览MD043 是 markdownlint 内置的标题结构校验规则定义于 lib/md043.mjs名称/编号MD043别名Aliasesrequired-headings标签Tagsheadings解析器micromark基于 micromark 的 token 流解析见 lib/micromark-parse.mjs说明文档doc/md043.md规则参数定义在 doc/md043.md参数类型默认值含义headingsstring[][]期望的标题结构列表支持*、、?三种特殊值match_casebooleanfalse是否要求文档标题与期望列表严格区分大小写该规则用于强制一组文件遵循统一的标题结构例如同批次发布的文档、教程目录、项目模板等。当文档中的标题序列与headings列表不匹配时触发MD043错误。三种通配符*、、?除了字面标题如## Item外headings列表支持三个特殊值语义完全不同见 doc/md043.md 的权威说明*零个或多个未指定的标题可跳过、可省略一个或多个未指定的标题至少出现一个?恰好一个未指定的标题必须存在且只能是一个下面逐一给出原文档中的标准示例。精确结构仅字面标题要强制文档精确呈现如下结构# Heading ## Item ### Detail将headings参数设置为[ # Heading, ## Item, ### Detail ]此时任何多余或缺失的标题都会触发 MD043。对应测试用例见 test/required-headings-all-present.md全部命中、无报错与 test/required-headings-missing-middle.md中间缺失## Two报错。可选区间*与允许部分区间可有可无时使用*。例如如下结构# Heading ## Item ### Detail (optional) ## Foot ### Notes (optional)配置为[ # Heading, ## Item, *, ## Foot, * ]两个*分别覆盖### Detail与### Notes两个可选区段。若希望至少有一个内容则改用。单点可变?当某一处标题需要恰好一个、但内容可变时例如项目名在不同文件中各不相同# Project Name ## Description ## Examples配置为[ ?, ## Description, ## Examples ]?匹配一个任意内容的标题如这里的# Project Name同时要求该位置必须有且只有一个标题。这就是本文主角测试用例所用的通配符。测试用例精读required-headings-question-missing.md仓库中的 test/required-headings-question-missing.md 是?通配符的缺失场景回归测试全文如下# Project Name ## Examples !-- markdownlint-configure-file { required-headings: { headings: [ # Project Name, ?, ## Examples ] } } -- {MD043:1}用例设计解读文档正文只有两个标题# Project Name与## Examples。而headings期望的序列是# Project Name字面匹配第一个标题成功?期望此处再出现一个任意标题## Examples字面匹配第三个位置由于正文中?位置空缺规则判定结构不完整。{MD043:1}标记的含义文件末尾的{MD043:1}是 markdownlint 测试体系的自检标记{MD###}声明此处应有一个 MD043 错误可选的:N/:-N表示错误行号相对该标记行的偏移1即错误位于标记下一行。该标记由测试驱动脚本解析见 test/markdownlint-test-scenarios.mjs 中的/\{(MD\d)(?::([-]?)(\d))?\}/g正则与行号换算逻辑。快照中的权威输出测试的运行结果被固化在快照 test/markdownlint-test-scenarios.mjs.snapshot 中MD043 输出的错误对象为{ lineNumber: 16, ruleNames: [MD043, required-headings], ruleDescription: Required heading structure, errorContext: ## Examples, fixInfo: null, severity: error }关键信息lineNumber: 16错误定位在配置注释块之后第 14 行空行、第 15 行标记行之后与{MD043:1}完全吻合errorContext: ## Examples上下文是期望列表中的下一个标题——即?本应匹配、但因缺失而无法继续推进时规则把指针停留在期望序列中尚未匹配到的## Examples上fixInfo: nullMD043 无自动修复能力错误只能人工修正该错误不可自动修复因此在快照的fixed结果中标记文本原样保留。源码实现MD043 的匹配状态机lib/md043.mjs 实现了完整的匹配逻辑可逐段拆解1. 配置读取与兜底const requiredHeadings params.config.headings; if (!Array.isArray(requiredHeadings)) { return; // Nothing to check; avoid doing any work }headings不是数组时直接返回、不做任何检查match_case默认false见 lib/md043.mjs。2. 标题序列化规则通过filterByTypesCached([ atxHeading, setextHeading ])见 lib/cache.mjs遍历文档中全部 ATX 与 Setext 标题再用getHeadingText/getHeadingLevel定义于 helpers/micromark-helpers.cjs把每个标题归一化为# 文本形式的字符串与期望值逐项比对。3. 通配符分支if (expected *) { // 零个或多个读取下一个期望值不匹配则回退指针并进入 matchAny } else if (expected ) { // 一个或多个直接进入 matchAny } else if (expected ?) { // 恰好一个允许当前标题继续匹配下一个 }关键设计是matchAny标志与指针i的回退i--当处于*/区间时规则吞掉未指定的标题一旦后续期望值命中matchAny复位继续严格匹配。4. 精确标题比对与大小写const handleCase (str) (matchCase ? str : str.toLowerCase());match_case: false时所有比对统一转小写大小写不敏感true时严格区分。对应测试test/required-headings-match-case.md全部匹配与 test/required-headings-wrong-match-case.md## SECOND HEADING在match_case: true下报错错误详情为Expected: ## Second Heading; Actual: ## SECOND HEADING见快照 test/markdownlint-test-scenarios.mjs.snapshot。5. 结构不完整时的收尾判定匹配循环结束后若extraHeadings 1或剩余恰好 1 个且不是*则判定期望结构未被满足在文件最后一行报错。这正是?缺失场景的行为## Examples始终未被消费属于剩余 1 个且非*于是报错。报错定位规则第一处问题标题 vs 文件末行doc/md043.md 明确了 MD043 的报错策略当检测到错误时规则输出第一个问题标题所在的行号否则结构不完整、标题缺失输出文件的最后一行行号。两种场景均有测试佐证第一个问题标题的行号如 test/required-headings-wrong-match-case.md 中{MD043:5}指向第 5 行## SECOND HEADING文件末行如 test/required-headings-missing-last.md期望第三个标题### Three缺失与 test/required-headings-none-one-or-more.md{MD043:15}指向 15 行文件末尾。四个?场景的测试矩阵仓库用一组用例完整覆盖了?通配符的各个位置与缺失行为可对照阅读测试文件场景结果快照确认test/required-headings-question-first.md?位于列表首位[ ?, ## Description, ## Examples ]匹配# Project Name无错误test/required-headings-question-middle.md?位于中间[ # Project Name, ?, ## Examples ]匹配## Description无错误test/required-headings-question-last.md?位于末尾[ # Project Name, ## Description, ? ]匹配## Examples无错误test/required-headings-question-missing.md期望序列为# Project Name, ?, ## Examples但文档缺少中间标题MD043错误errorContext: ## Examples行号 16其中 test/required-headings-question-extra.md 是另一个方向的过剩场景配置[ # Project Name, ## Description, ? ]时文档只有两个标题同样因?位置空缺而在末行报错errorContext: ?。完整的*/组合场景可继续参看 test/required-headings-one-or-more.md、test/required-headings-zero-or-more.md、test/required-headings-optional-first.md 与 test/required-headings-optional-last.md 等用例。在项目中的配置方式方式一配置文件在.markdownlint.json或其他 markdownlint 支持的配置源中{ MD043: { headings: [ # Project Name, ?, ## Examples ], match_case: false } }方式二行内配置注释测试用例使用的!-- markdownlint-configure-file { ... } --注释可在单个文件内就地覆盖规则配置无需改动全局配置适合为个别特殊文件如模板文件定制结构# Project Name ## Examples !-- markdownlint-configure-file { required-headings: { headings: [ # Project Name, ?, ## Examples ] } } --实战提示headings用## 文本形式的 ATX 风格书写仅为表达便利文档实际可使用 ATX、ATX 闭合### xxx ###或 Setext 任意标题风格规则只关心层级与文本见 doc/md043.md 与 test/required-headings-missing-last.mdSetext 标题的佐证大小写默认宽松需要严格区分时显式设置match_case: true空列表[]表示不允许任何标题见 test/required-headings-none.md与 MD041 的关系MD043 只校验标题结构不要求首行必须是顶层标题若同时希望强制 H1 打头可结合first-line-headingMD041规则使用见 test/required-headings-missing-first.md 中first-line-heading: false的联动写法不可自动修复MD043 的fixInfo恒为null任何缺失/多余/顺序错乱都必须人工调整标题结构。小结MD043required-headings通过一个简单的字符串数组即可为整组文档建立可校验的标题骨架其中?通配符为内容可变但数量固定的标题位提供了精确约束。本文从 test/required-headings-question-missing.md 出发结合 doc/md043.md 的参数说明、lib/md043.mjs 的匹配状态机与快照 test/markdownlint-test-scenarios.mjs.snapshot 的权威输出完整还原了规则从配置到报错的闭环。需要深入调试或扩展时可借助 test/harness.mjs 对单个测试文件执行 lint 并查看结构化结果。赞分享开发工具代码质量Lint静态分析【免费下载链接】markdownlintA Node.js style checker and lint tool for Markdown/CommonMark files.项目地址https://gitcode.com/gh_mirrors/ma/markdownlint点击查看免费下载相关推荐DeepLabCut-live-GUI Basler 相机后端指南pypylon 接入、稳定身份绑定与高级采集配置DeepLabCut live GUI Basler 相机后端指南pypylon 接入、稳定身份绑定与高级采集配置 DeepLabCut live GUI开发工具代码质量Lint静态分析markdownlint MD043 required-headings 规则实战用 * / / ? 通配符约束文档标题结构markdownlint MD043 required headings 规则实战用 / / ? 通配符约束文档标题结构 markdownlint 的 M开发工具代码质量Lint静态分析markdownlint MD043 required-headings 规则实战用 match_case 严格校验标题大小写markdownlint MD043 required headings 规则实战用 match_case 严格校验标题大小写 导读 本文围绕 markdow开发工具代码质量Lint静态分析上一篇构建自动化内容生态系统MoneyPrinterV2扩展策略深度解析下一篇终极QuickLook神器QLStephen让无扩展名文本文件瞬间预览创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →