关于 GitHub Docs 内容代码检查器
我们的内容代码检查器会在我们的 Markdown 内容中强制执行样式指南规则。
代码检查器使用 markdownlint
作为执行检查、报告缺陷并在可能的情况下自动修复内容的框架。此框架可以灵活地运行特定规则,提供描述性错误消息并修复错误。GitHub Docs 内容代码检查器使用一些现有的 markdownlint
规则和一些额外的自定义规则来检查我们 content
和 data
目录中的 Markdown 内容。我们的自定义规则实现了尚未在 markdownlint
框架中提供的检查,或者特定于 GitHub Docs 内容的检查。规则会检查 Markdown 和 Liquid 的语法。
运行 GitHub Docs 内容代码检查器
GitHub Docs 内容代码检查器将在预提交时自动运行,但您也可以手动运行它。
在预提交时自动运行代码检查器
当您在本地编写内容并使用命令行提交文件时,这些暂存的文件将由内容代码检查器自动进行代码检查。将报告警告和错误,但只有错误才会阻止您的提交完成。
如果报告了任何错误,您的提交将无法完成。您需要修复报告的错误,重新添加已更改的文件,然后再次提交更改。必须修复报告的任何错误,以防止在内容中引入违反 GitHub Docs 样式指南的错误。如果报告了任何警告,您可以选择修复或不修复它们。
当您在本地编写内容时,您可以使用命令行自动修复一些规则。如果您想自动修复可以修复的错误,请参阅“自动修复可以修复的错误”。
如果您在 GitHub UI 中编辑文件,则无法自动修复错误或在提交时运行代码检查器,但如果内容违反了任何严重性为 error
的规则,则会收到 CI 失败。
手动运行代码检查器
在暂存和已更改的文件上运行代码检查器
使用以下命令在本地对暂存和已更改的文件运行代码检查器。它将输出 warning
和 error
严重性缺陷。
npm run lint-content
在暂存和已更改的文件上运行代码检查器,仅报告错误
使用以下命令在本地对暂存和已更改的文件运行代码检查器,并仅报告 error
严重性缺陷。
npm run lint-content -- --errors
在特定文件或目录上运行代码检查器
使用以下命令在本地对特定文件或目录运行代码检查器。用空格分隔多个路径。您可以在同一命令中包含文件和目录。
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
运行一组特定的代码检查规则
使用以下命令运行一个或多个特定的代码检查规则。这些示例运行 heading-increment
和 code-fence-line-length
规则。将 heading-increment code-fence-line-length
替换为您想要运行的一个或多个代码检查器别名。若要查看可以传递给此选项的代码检查规则列表,请运行 npm run lint-content -- --help
。您可以使用代码检查规则的短名称(例如,MD001
)或长名称(例如,heading-increment
)。
在所有暂存和已更改的文件上运行指定的代码检查规则
npm run lint-content -- \
--rules heading-increment code-fence-line-length
在特定文件或目录上运行指定的代码检查规则
npm run lint-content -- \
--rules heading-increment code-fence-line-length \
--path content/FILENAME.md content/DIRECTORY
绕过提交钩子
如果代码检查器捕获了您未引入的错误,则可以在提交更改时使用 --no-verify
选项绕过 git 提交钩子。
git commit -m 'MESSAGE' --no-verify
显示内容代码检查器脚本的帮助菜单
npm run lint-content -- --help
代码检查规则
每个规则都配置在 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 | list-marker-space | 列表标记后的空格 | error | ol, ul, whitespace |
MD031 | blanks-around-fences | 带围栏的代码块应由空行包围 | error | code, blank_lines |
MD037 | no-space-in-emphasis | 强调标记内的空格 | error | whitespace, emphasis |
MD039 | no-space-in-links | 链接文本内的空格 | error | whitespace, links |
MD040 | fenced-code-language | 带围栏的代码块应指定语言 | error | code, language |
MD042 | no-empty-links | 没有空链接 | error | links |
MD047 | single-trailing-newline | 文件应以单个换行符结尾 | error | blank_lines |
MD049 | emphasis-style | 强调样式 | error | emphasis |
MD050 | strong-style | 强样式 | error | emphasis |
search-replace | todocs-placeholder | 捕获 TODOCS 占位符的出现。 | error | |
search-replace | docs-domain | 捕获 docs.github.com 域名的出现。 | error | |
search-replace | 帮助域 | 捕获 help.github.com 域名的出现。 | error | |
search-replace | 预览域 | 捕获 preview.ghdocs.com 域名的出现。 | error | |
search-replace | 开发者域 | 捕获 developer.github.com 域名的出现。 | error | |
search-replace | 已弃用的 Liquid 语法:site.data | 捕获已弃用的 Liquid 数据语法的出现。 | error | |
search-replace | 已弃用的 Liquid 语法:octicon- | 使用的 octicon Liquid 语法已弃用。请改用以下格式 octicon "<octicon-name>" aria-label="<Octicon aria label>" | error | |
GH001 | 无默认替代文本 | 图像应具有有意义的替代文本(alt 文本)。 | error | 辅助功能,图像 |
GH002 | 无通用链接文本 | 避免使用诸如 了解更多 或 点击此处 之类的通用链接文本。 | error | 辅助功能,链接 |
GHD030 | 代码围栏行长度 | 代码围栏行不得超过最大长度。 | 警告 | 代码,辅助功能 |
GHD032 | 图像替代文本末尾标点 | 图像的替代文本应以标点结尾。 | error | 辅助功能,图像 |
GHD004 | 图像文件使用连字符命名法 | 图像文件名必须使用连字符命名法。 | error | 图像 |
GHD033 | 不正确的替代文本长度 | 图像的替代文本应在 40 到 150 个字符之间。 | 警告 | 辅助功能,图像 |
GHD002 | 内部链接无语言代码 | 内部链接不得包含硬编码的语言代码。 | error | 链接,URL |
GHD003 | 内部链接斜杠 | 内部链接必须以 / 开头。 | error | 链接,URL |
GHD031 | 图像替代文本排除词语 | 图像的替代文本不得以“图像”或“图形”等词语开头。 | error | 辅助功能,图像 |
GHD034 | 列表首字母大写 | 列表项的首字母应大写。 | 警告 | ul,ol |
GHD001 | 链接标点 | 内部链接标题不得包含标点符号。 | error | 链接,URL |
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 | 前置 matter 隐藏文档 | 具有前置 matter 属性 hidden 的文章只能位于特定产品中。 | error | 前置 matter,功能,抢先体验 |
GHD009 | 前置 matter 抢先体验引用 | 非抢先体验的文件不得具有引用抢先体验的前置 matter。 | error | 前置 matter,功能,抢先体验 |
GHD011 | 前置 matter 视频抄本 | 视频抄本必须正确配置。 | error | 前置 matter,功能,视频抄本 |
GHD012 | 前置 matter 架构 | 前置 matter 必须符合架构。 | error | 前置 matter,架构 |
GHD007 | 代码注释 | 在 Markdown 中定义的代码注释必须包含特定的布局前置 matter 属性。 | error | 代码,功能,注释,前置 matter |
GHD017 | 前置 matter Liquid 语法 | 前置 matter 属性必须使用有效的 Liquid。 | error | Liquid,前置 matter |
GHD018 | Liquid 语法 | Markdown 内容必须使用有效的 Liquid。 | error | Liquid |
GHD019 | Liquid if 标签 | 当参数为有效版本时,应使用 Liquid ifversion 标签代替 if 标签。 | error | Liquid,版本控制 |
GHD020 | Liquid ifversion 标签 | Liquid ifversion 标签应包含有效的版本名称作为参数。 | error | Liquid,版本控制 |
GHD022 | Liquid ifversion 版本 | Liquid ifversion (和 elsif )不应始终为真。 | 警告 | Liquid,版本控制 |
GHD035 | RAI 可复用内容的使用 | RAI 文章和可复用内容只能引用 data/reusables/rai 目录中的可复用内容。 | error | 功能,RAI |
GHD036 | 图像不得为 GIF | 图像不得为 GIF,样式指南参考:contributing/style-guide-and-content-model/style-guide.md#images。 | error | 图像 |
GHD038 | 内容已过期 | 必须修复已过期的内容。 | error | 过期 |
GHD039 | 即将过期 | 应主动解决即将过期的内容。 | 警告 | 过期 |
GHD040 | 表格 Liquid 版本控制 | 表格必须使用正确的 Liquid 版本控制格式。 | error | 表格 |
GHD041 | 第三方操作固定 | 使用第三方操作的代码示例必须始终固定到完整的提交 SHA。 | error | 功能,操作 |
GHD042 | Liquid 标签空格 | Liquid 标签应以一个空格开头和结尾。Liquid 标签参数之间应只用一个空格隔开。 | error | Liquid,格式 |
Lint 规则的语法
某些 Lint 规则会根据您可以添加到文章中的 HTML 注释返回警告或错误。
即将过期和已过期内容的语法
规则 GHD038
和 GHD039
检查手动指定过期日期的内容。在指定日期之前的十四天,内容 Lint 程序将返回一条警告,提示内容即将过期。从指定日期开始,内容 Lint 程序将返回错误并标记内容以进行修复。
您可以通过将其包装在包含以下格式的过期日期的 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 is closing down and will no longer be available after 28 June 2024.
</td>
</tr>
<!-- end expires 2024-06-28 -->
禁用 Lint 规则
在极少数情况下,您可能需要记录违反一个或多个 Lint 规则的内容。在这些情况下,您可以通过向 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 --> | 禁用下一行的一个或多个规则(按名称) |