关于 GitHub Docs 内容 linter
我们的内容 linter 在我们的 Markdown 内容中强制执行风格指南规则。
linter 使用 markdownlint
作为框架来执行检查、报告缺陷以及在可能的情况下自动修复内容。此框架灵活地运行特定规则,提供描述性错误消息并修复错误。GitHub Docs 内容 linter 使用几个现有的 markdownlint
规则和附加的自定义规则来检查 content
和 data
目录中的 Markdown 内容。我们的自定义规则实施了 markdownlint
框架中尚未提供或特定于 GitHub Docs 内容的检查。规则检查 Markdown 和 Liquid 的语法。
运行 GitHub Docs 内容 linter
GitHub Docs 内容 linter 将在预提交时自动运行,但你也可以手动运行它。
在预提交时自动运行 linter
当你使用命令行在本地编写内容并提交文件时,这些暂存的文件将由内容 linter 自动进行 linting。警告和错误都会被报告,但只有错误会阻止你的提交完成。
如果报告任何错误,您的提交将不会完成。您需要修复报告的错误,重新添加已更改的文件,然后再次提交您的更改。必须修复报告的任何错误,以防止在内容中引入违反 GitHub Docs 样式指南的错误。如果报告任何警告,您可以选择修复它们或不修复。
在本地编写内容时,可以使用命令行自动修复一些规则。如果您想自动修复可以修复的错误,请参阅“自动修复可以修复的错误”。
如果您正在编辑 GitHub UI 中的文件,您将无法自动修复错误或在提交中运行 linter,但如果内容违反任何严重性为error
的规则,您将收到 CI 失败。
手动运行 linter
对暂存和已更改的文件运行 linter
使用以下命令在本地对暂存和已更改的文件运行 linter。它将输出warning
和error
严重性缺陷。
npm run lint-content
对暂存和已更改的文件运行 linter,仅报告错误
使用以下命令在本地对暂存和已更改的文件运行 linter,仅报告error
严重性缺陷。
npm run lint-content -- --errors
对特定文件或目录运行 linter
使用以下命令在本地对特定文件或目录运行 linter。用空格分隔多个路径。您可以在同一命令中同时包含文件和目录。
npm run lint-content -- \ --paths content/FILENAME.md content/DIRECTORY
npm run lint-content -- \
--paths content/FILENAME.md content/DIRECTORY
自动修复可以修复的错误
如果错误在其描述中具有fixable: true
,您可以使用以下命令自动修复它们。
运行此命令仅修复暂存和已更改的文件
npm run lint-content -- --fix
运行此命令修复特定文件或目录
npm run lint-content -- \
--fix --paths content/FILENAME.md content/DIRECTORY
运行一组特定 linter 规则
使用以下命令运行一个或多个特定 linter 规则。这些示例运行heading-increment
和code-fence-line-length
规则。将heading-increment code-fence-line-length
替换为您想运行的一个或多个 linter 别名。要查看您可以传递给此选项的 linter 规则列表,请运行npm run lint-content -- --help
。您可以使用 linter 规则的简称(例如,MD001
)或全称(例如,heading-increment
)。
对所有暂存和已更改的文件运行指定的 linter 规则
npm run lint-content -- \
--rules heading-increment code-fence-line-length
在特定文件或目录上运行指定的 linter 规则
npm run lint-content -- \
--rules heading-increment code-fence-line-length \
--path content/FILENAME.md content/DIRECTORY
绕过提交挂钩
如果 linter 捕获到您未引入的错误,您可以在提交更改时使用 --no-verify
选项绕过 git 提交挂钩。
git commit -m 'MESSAGE' --no-verify
显示内容 linter 脚本的帮助菜单
npm run lint-content -- --help
Linting 规则
每个规则都在 src/content-linter/style
中的文件中配置,这是定义规则严重性的位置。
在将更改合并到 main
分支之前,必须解决错误。应解决警告,但不要阻止将更改合并到 main
分支。一旦内容不再有警告违规,大多数规则最终将提升为错误。
规则 ID | 规则名称 | 说明 | 严重性 | 标签 |
---|---|---|---|---|
MD001 | heading-increment | 标题级别一次只能增加一级 | error | headings |
MD004 | ul-style | 无序列表样式 | error | bullet, ul |
MD009 | no-trailing-spaces | 尾随空格 | error | whitespace |
MD011 | no-reversed-links | 反向链接语法 | error | links |
MD012 | no-multiple-blanks | 多个连续的空行 | error | whitespace, blank_lines |
MD014 | commands-show-output | 在不显示输出的情况下在命令前使用美元符号 | error | code |
MD018 | no-missing-space-atx | atx 样式标题的井号后没有空格 | error | headings, atx, spaces |
MD019 | no-multiple-space-atx | atx 样式标题的井号后有多个空格 | error | headings, atx, spaces |
MD022 | blanks-around-headings | 标题应由空行包围 | error | headings, blank_lines |
MD023 | heading-start-left | 标题必须从行首开始 | error | headings, spaces |
MD027 | no-multiple-space-blockquote | 块引用符号后有多个空格 | error | blockquote, whitespace, indentation |
MD029 | ol-prefix | 有序列表项前缀 | error | ol |
MD030 | 列表标记空格 | 列表标记后的空格 | error | ol、ul、空格 |
MD031 | 围栏代码块 | 围栏代码块应使用空行包围 | error | 代码、空行 |
MD037 | 强调标记内无空格 | 强调标记内的空格 | error | 空格、强调 |
MD039 | 链接文本内无空格 | 链接文本内的空格 | error | 空格、链接 |
MD040 | 围栏代码语言 | 围栏代码块应指定语言 | error | 代码、语言 |
MD042 | 无空链接 | 无空链接 | error | links |
MD047 | 单个尾随换行符 | 文件应以单个换行符结尾 | error | 空行 |
MD049 | 强调样式 | 强调样式 | error | 强调 |
MD050 | 加粗样式 | 加粗样式 | error | 强调 |
搜索替换 | todocs 占位符 | 捕获 TODOCS 占位符的出现。 | error | |
搜索替换 | 文档域 | 捕获 docs.github.com 域的出现。 | error | |
搜索替换 | 帮助域 | 捕获 help.github.com 域的出现。 | error | |
搜索替换 | 预览域 | 捕获 preview.ghdocs.com 域的出现。 | error | |
搜索替换 | 开发者域 | 捕获 developer.github.com 域的出现。 | error | |
搜索替换 | 已弃用的 liquid 语法:site.data | 捕获已弃用的 liquid 数据语法的出现。 | error | |
搜索替换 | 已弃用的 liquid 语法:octicon- | 使用的 octicon liquid 语法已弃用。请改用此格式 octicon "<octicon-name>" aria-label="<Octicon aria label>" | error | |
GH001 | 无默认替代文本 | 图像应具有有意义的替代文本(alt 文本) | error | 可访问性、图像 |
GH002 | 无通用链接文本 | 避免使用诸如 了解更多 或 点击此处 之类的通用链接文本 | error | 可访问性、链接 |
GHD030 | 代码围栏行长 | 代码围栏行不应超过最大长度 | 警告 | 代码、可访问性 |
GHD032 | 图像替代文本结束标点 | 图像的替代文本应以标点符号结尾 | error | 可访问性、图像 |
GHD004 | 图像文件名 kebab-case | 图像文件名必须使用 kebab-case | error | 图像 |
GHD033 | 替代文本长度不正确 | 图像替代文本应在 40-150 个字符之间 | 警告 | 可访问性、图像 |
GHD002 | 内部链接无语言 | 内部链接不得包含硬编码的语言代码 | error | 链接、网址 |
GHD003 | 内部链接斜杠 | 内部链接必须以 / 开头 | error | 链接、网址 |
GHD031 | 图像替代文本排除词 | 图像的替代文本不应以“图像”或“图形”等词开头 | error | 可访问性、图像 |
GHD034 | 列表首字母大写 | 列表项的首字母应大写 | 警告 | ul、ol |
GHD001 | 链接标点 | 内部链接标题不得包含标点符号 | error | 链接、网址 |
GHD008 | 早期访问引用 | 非早期访问的文件不应引用早期访问或早期访问文件 | error | 功能、早期访问 |
GHD021 | yaml 定时作业 | 包含定时工作流的 YAML 片段不得在整点运行,且必须唯一 | error | 功能、操作 |
GHD006 | 内部链接旧版本 | 内部链接不得使用旧版本语法硬编码版本 | error | 链接、URL、版本控制 |
GHD005 | 硬编码数据变量 | 包含“个人访问令牌”的字符串应使用产品变量代替 | error | 单一来源 |
GHD013 | GitHub 自有操作引用 | GitHub 自有操作引用不应硬编码 | error | 功能、操作 |
GHD016 | Liquid 带引号的条件参数 | Liquid 条件标签不应引用条件参数 | error | Liquid、格式 |
GHD014 | Liquid 数据引用已定义 | 在内容中发现了 Liquid 数据或缩进数据引用,但这些引用没有值或在数据目录中不存在 | error | Liquid |
GHD015 | Liquid 数据标签格式 | Liquid 数据或缩进数据引用标签必须格式正确,并具有正确数量的参数和间距 | error | Liquid、格式 |
GHD010 | 前端隐藏文档 | 具有前端属性 hidden 的文章只能位于特定产品中 | error | 前端、功能、早期访问 |
GHD009 | 前端早期访问引用 | 非早期访问的文件不应具有引用早期访问的前端 | error | 前端、功能、早期访问 |
GHD011 | 前端视频转录 | 视频转录必须正确配置 | error | 前端、功能、视频转录 |
GHD012 | 前端架构 | 前端必须符合架构 | error | 前端、架构 |
GHD007 | 代码注释 | Markdown 中定义的代码注释必须包含特定的布局前端属性 | error | 代码、功能、注释、前端 |
GHD017 | 前端 Liquid 语法 | 前端属性必须使用有效的 Liquid | error | Liquid、前端 |
GHD018 | Liquid 语法 | Markdown 内容必须使用有效的 Liquid | error | Liquid |
GHD019 | Liquid if 标签 | 当参数为有效版本时,应使用 Liquid ifversion 标签,而不是 if 标签 | error | Liquid、版本控制 |
GHD020 | Liquid ifversion 标签 | Liquid ifversion 标签应包含有效版本名称作为参数 | error | Liquid、版本控制 |
GHD022 | liquid-ifversion-versions | Liquid ifversion (和 elsif )不应始终为真 | 警告 | Liquid、版本控制 |
GHD035 | rai-reusable-usage | RAI 文章和可重用内容只能引用 data/reusables/rai 目录中的可重用内容 | error | feature, rai |
GHD036 | image-no-gif | 图像不得为 gif,风格指南参考:contributing/style-guide-and-content-model/style-guide.md#images | error | 图像 |
GHD038 | expired-content | 必须修复已过期的内容。 | error | expired |
GHD039 | expiring-soon | 应主动处理即将过期的内容。 | 警告 | expired |
语法用于 linting 规则
一些 linting 规则根据你可以添加到文章中的 HTML 注释返回警告或错误。
语法用于过期和已过期的内容
规则 GHD038
和 GHD039
检查手动指定了到期日期的内容。在指定日期前 14 天,内容 linter 将返回警告,表明内容即将过期。从指定日期开始,内容 linter 将返回错误并标记内容以进行修复。
你可以通过将内容包装在包含到期日期的 HTML 标签中来添加一个到期日期,格式为:<!-- expires yyyy-mm-dd --> <!-- end expires yyyy-mm-dd -->
使用
This content does not expire.
<!-- expires 2022-01-28 -->
This content expires on January 28, 2022.
<!-- end expires 2022-01-28 -->
This content also does not expire.
请注意,如果你将已过期的标签放在 HTML table
元素中,请确保标签围绕整个行,而不仅仅是单元格。例如
<!-- expires 2024-06-28 -->
<tr>
<td>
macOS
</td>
<td>
The <code>macos-11</code> label has been deprecated and will no longer be available after 28 June 2024.
</td>
</tr>
<!-- end expires 2024-06-28 -->
禁止 linter 规则
在极少数情况下,你可能需要记录违反一条或多条 linter 规则的内容。在这些情况下,你可以通过向 Markdown 文件添加注释来禁止规则。你可以禁用所有规则或特定规则。始终尝试限制尽可能少的规则。你可以禁用整个文件、Markdown 文件的部分、特定行或下一行的规则。
例如,如果你正在撰写一篇包含正则表达式 (^|/)[Cc]+odespace/
的文章,该表达式用于检查反向链接语法,它将触发检查反向链接的 MD011
规则。你可以通过添加以下注释在该特定行上禁用规则 MD011
。
(^|/)[Cc]+odespace/ <!-- markdownlint-disable-line MD011 -->
如果你要忽略的行在代码块中,你可以通过用以下注释将其包围来忽略代码块。
<!-- markdownlint-disable MD011 -->
```
(^|/)[Cc]+odespace/
```
<!-- markdownlint-enable MD011 -->
你可以使用这些注释来启用或禁用规则。
注释 | 效果 |
---|---|
<!-- markdownlint-disable --> | 禁用所有规则 |
<!-- markdownlint-enable --> | 启用所有规则 |
<!-- markdownlint-disable-line --> | 禁用当前行的所有规则 |
<!-- markdownlint-disable-next-line --> | 禁用下一行的所有规则 |
<!-- markdownlint-disable RULE-ONE RULE-TWO --> | |
<!-- markdownlint-enable RULE-ONE RULE-TWO --> | 按名称启用一个或多个规则 |
<!-- markdownlint-disable-line RULE-NAME --> | 禁用当前行的按名称指定的一个或多个规则 |
<!-- markdownlint-disable-next-line RULE-NAME --> | 禁用下一行的按名称指定的一个或多个规则 |