markdownlint 列表内空白行尾随空格行为解析:MD009 默认配置与 `list_item_empty_lines` 参数实战
开发工具代码质量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),仅供参考

相关新闻

Firebase JS SDK 的 RemoteConfigSettings 配置接口详解:fetchTimeoutMillis 与 minimumFetchIntervalMillis 实战指南

Firebase JS SDK 的 RemoteConfigSettings 配置接口详解:fetchTimeoutMillis 与 minimumFetchIntervalMillis 实战指南

开发工具后端 【免费下载链接】firebase-js-sdk Firebase Javascript SDK 项目地址: https://gitcode.com/gh_mirrors/fi/firebase-js-sdk 点击查看 免费下载 RemoteConfigSettings 是 Firebase JS SDK 中 Remote Config 模块(firebase/remote-config&a…

2026/10/16 2:05:47 阅读更多 →
MarkItDown 完整指南:把任意格式文档转成 Markdown 喂给 LLM

MarkItDown 完整指南:把任意格式文档转成 Markdown 喂给 LLM

MarkItDown 完整指南:把任意格式文档转成 Markdown 喂给 LLM 【免费下载链接】markitdown Python tool for converting files and office documents to Markdown. 项目地址: https://gitcode.com/GitHub_Trending/ma/markitdown 把 PDF 合同、Excel 财报、PP…

2026/10/16 2:05:47 阅读更多 →
RSF模型详解:基于水平集的灰度不均匀图像分割实现与调参指南

RSF模型详解:基于水平集的灰度不均匀图像分割实现与调参指南

简介:基于Python3.6与OpenCV3实现RSF活动轮廓模型的完整示例包,面向图像分割初学者以及需要处理复杂边界、模糊边缘或目标与背景对比度较低等场景的研究者。RSF模型在经典活动轮廓基础上引入区域信息,将能量函数拆解为边缘贡献项与区域贡献项…

2026/10/16 2:04:47 阅读更多 →

最新新闻

晶圆FT测试良率漂移:区分芯片本体缺陷与测试机台引入误差

晶圆FT测试良率漂移:区分芯片本体缺陷与测试机台引入误差

FT(Final Test,最终测试)是晶圆离开Fab前最后一次电学性能检验。FT良率出现下滑的时候,工程师面临的第一道关卡往往不是"怎么解决问题",而是"问题到底出在哪里"——是芯片本身工艺有问题&#xff…

2026/10/16 2:51:57 阅读更多 →
Godot 4.7 游戏引擎入门:节点场景体系、渲染器选型与首个 2D 角色(GDScript 实测)

Godot 4.7 游戏引擎入门:节点场景体系、渲染器选型与首个 2D 角色(GDScript 实测)

Godot 4.7 游戏引擎入门:节点场景体系、渲染器选型与首个 2D 角色(GDScript 实测) 想做游戏但被 Unity/Unreal 的体量劝退?Godot 是轻量替代的最优解:引擎本体几十 MB、解压即用(MIT 协议)&…

2026/10/16 2:51:57 阅读更多 →
Bootstrap3侧边导航栏实战:手写结构+响应式折叠方案

Bootstrap3侧边导航栏实战:手写结构+响应式折叠方案

简介:本资源是一份基于Bootstrap 3框架实现的响应式侧边导航栏完整示例,面向前端初学者与Web开发人员,解决在传统网页或管理后台中快速构建结构清晰、适配多端的垂直导航结构问题。压缩包共9个文件,包含1个核心HTML页面&#xff0…

2026/10/16 2:51:57 阅读更多 →
OpenClaw 飞书发图总显示异常?filePath 与 workspace 路径差异排查与 TaoToken 配置验证

OpenClaw 飞书发图总显示异常?filePath 与 workspace 路径差异排查与 TaoToken 配置验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 2:51:57 阅读更多 →
React表单实战指南:从受控组件到表单库选型

React表单实战指南:从受控组件到表单库选型

如果你写过一段时间的 React,一定会有这种感觉:别的组件都好说,唯独表单,每次写都觉得别扭。input明明自己会记住用户输入的内容,为什么我还要用value和onChange把它“控制”起来?今天选择框选完值&#xf…

2026/10/16 2:51:57 阅读更多 →
Agent落地三要素:记忆、目标与执行力的工程闭环

Agent落地三要素:记忆、目标与执行力的工程闭环

连着做了几个Agent项目之后,我越来越确定一件事:决定Agent上限的是模型本身,但决定它下限的,是记忆、目标与执行力这三块骨架。之前在做一个内部知识库问答项目时,最开始的版本就是把大模型接上对话接口,结…

2026/10/16 2:50:57 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →