Add rule MD055/table-missing-border (fixes #93, refs #1039, no generated files).

This commit is contained in:
Gabriel Kuznik 2023-12-01 12:33:48 +01:00 committed by David Anson
parent 4a52864b39
commit a563c082a5
11 changed files with 228 additions and 12 deletions

View file

@ -37,6 +37,7 @@ eslint-plugin-markdownlint
first-line-h1
formatter
fs
GFM
globbing
grunt-markdownlint
h1

View file

@ -134,6 +134,7 @@ playground for learning and exploring.
- **[MD052](doc/md052.md)** *reference-links-images* - Reference links and images should use a label that is defined
- **[MD053](doc/md053.md)** *link-image-reference-definitions* - Link and image reference definitions should be needed
- **[MD054](doc/md054.md)** *link-image-style* - Link and image style
- **[MD055](doc/md055.md)** *table-missing-border* - Table is missing leading or trailing pipe character
<!-- markdownlint-restore -->
@ -175,6 +176,7 @@ rules at once.
- **`ol`** - `MD029`, `MD030`, `MD032`
- **`spaces`** - `MD018`, `MD019`, `MD020`, `MD021`, `MD023`
- **`spelling`** - `MD044`
- **`table`** - `MD055`
- **`ul`** - `MD004`, `MD005`, `MD007`, `MD030`, `MD032`
- **`url`** - `MD034`
- **`whitespace`** - `MD009`, `MD010`, `MD012`, `MD027`, `MD028`, `MD030`,

34
doc-build/md055.md Normal file
View file

@ -0,0 +1,34 @@
This rule is triggered when a [GFM table][gfm-table] is missing a leading
or trailing pipe character `|`.
This table is missing pipes on both sides:
```markdown
| Heading | Heading |
|---------|---------
Cell | Cell |
```
To fix this, make sure there is a pipe character at the start and end of the
row:
```markdown
| Heading | Heading |
|---------|---------|
| Cell | Cell |
```
Note that text immediately below a table is treated as part of the table and
will trigger this rule:
```markdown
| Heading | Heading |
|---------|---------|
| Cell | Cell |
This text will trigger the rule
```
Rationale: Some parsers have difficulty with tables that are missing their
leading or trailing pipe characters.
[gfm-table]: https://github.github.com/gfm/#tables-extension-

27
lib/md055.js Normal file
View file

@ -0,0 +1,27 @@
// @ts-check
"use strict";
const { addErrorContext } = require("../helpers");
const { filterByTypes } = require("../helpers/micromark.cjs");
module.exports = {
"names": [ "MD055", "table-missing-border" ],
"description": "Table is missing leading or trailing pipe character",
"tags": [ "table" ],
"function": function MD055(params, onError) {
const tables = filterByTypes(params.parsers.micromark.tokens, [ "table" ]);
for (const table of tables) {
const rows = filterByTypes(table.children, [ "tableRow", "tableDelimiterRow" ]);
for (const row of rows) {
const { startLine, text } = row;
if (!text.startsWith("|")) {
addErrorContext(onError, startLine, text, true);
}
if (!text.endsWith("|")) {
addErrorContext(onError, startLine, text, false, true);
}
}
}
}
}

View file

@ -51,8 +51,8 @@ const rules = [
require("./md051"),
require("./md052"),
require("./md053"),
require("./md054")
// md055: See https://github.com/markdownlint/markdownlint
require("./md054"),
require("./md055")
// md056: See https://github.com/markdownlint/markdownlint
// md057: See https://github.com/markdownlint/markdownlint
];

View file

@ -105,6 +105,10 @@ Strong **with** different style {MD050}
<!-- markdownlint-disable-next-line MD053 -->
[url]: https://example.com/page
| table | header |
|--------|--------|
{MD055} | cell |
<!-- markdownlint-configure-file {
"required-headings": {
"headings": [

View file

@ -51,3 +51,7 @@
| cell | <!-- \
| cell | `{MD038} ` --> |
| cell | cell |
<!-- markdownlint-configure-file {
"table-missing-border": false
} -->

View file

@ -29,7 +29,6 @@ This is a short line.
| Content Cell | Content Cell | Content Cell | Content Cell | Content Cell | Content Cell |
| ============== | ============== | ============== | ============== | ============== | ============== |
| Footer Cell | Footer Cell | Footer Cell | Footer Cell | Footer Cell | Footer Cell |
{: rules="groups"}
This is a very very very very very very very very very very very very very very very very very very very very long line. {MD013}
@ -44,7 +43,6 @@ Another line.
| Content Cell | Content Cell | Content Cell | Content Cell | Content Cell | Content Cell |
| ============== | ============== | ============== | ============== | ============== | ============== |
| Footer Cell | Footer Cell | Footer Cell | Footer Cell | Footer Cell | Footer Cell |
{: rules="groups"}
<!-- markdownlint-configure-file {
"line-length": {

View file

@ -83,7 +83,7 @@ test("projectFiles", (t) => {
"schema/*.md"
]))
.then((files) => {
t.is(files.length, 58);
t.is(files.length, 59);
const options = {
files,
"config": require("../.markdownlint.json")
@ -476,13 +476,14 @@ test("styleAll", (t) => new Promise((resolve) => {
"MD042": [ 81 ],
"MD045": [ 85 ],
"MD046": [ 49, 73, 77 ],
"MD047": [ 126 ],
"MD047": [ 130 ],
"MD048": [ 77 ],
"MD049": [ 90 ],
"MD050": [ 94 ],
"MD051": [ 96 ],
"MD052": [ 98 ],
"MD053": [ 100 ]
"MD053": [ 100 ],
"MD055": [ 110 ]
}
};
// @ts-ignore
@ -525,13 +526,14 @@ test("styleRelaxed", (t) => new Promise((resolve) => {
"MD042": [ 81 ],
"MD045": [ 85 ],
"MD046": [ 49, 73, 77 ],
"MD047": [ 126 ],
"MD047": [ 130 ],
"MD048": [ 77 ],
"MD049": [ 90 ],
"MD050": [ 94 ],
"MD051": [ 96 ],
"MD052": [ 98 ],
"MD053": [ 100 ]
"MD053": [ 100 ],
"MD055": [ 110 ]
}
};
// @ts-ignore
@ -841,7 +843,7 @@ test("customFileSystemAsync", (t) => new Promise((resolve) => {
}));
test("readme", async(t) => {
t.plan(121);
t.plan(124);
const tagToRules = {};
for (const rule of rules) {
for (const tag of rule.tags) {
@ -916,7 +918,7 @@ test("readme", async(t) => {
});
test("validateJsonUsingConfigSchemaStrict", async(t) => {
t.plan(171);
t.plan(173);
// @ts-ignore
const ajv = new Ajv(ajvOptions);
const validateSchemaStrict = ajv.compile(configSchemaStrict);
@ -1036,7 +1038,7 @@ test("validateConfigExampleJson", async(t) => {
});
test("allBuiltInRulesHaveValidUrl", (t) => {
t.plan(144);
t.plan(147);
for (const rule of rules) {
// @ts-ignore
t.truthy(rule.information);

View file

@ -9,3 +9,7 @@ Head | Head
<br/> | {MD033}
text | text
{MD033} | <b>text</b>
<!-- markdownlint-configure-file {
"table-missing-border": false
} -->

140
test/table-missing-pipes.md Normal file
View file

@ -0,0 +1,140 @@
# Table Missing Pipes
## Bad Header Row
| Table | {MD055}
|-------|---------|
Table | {MD055} |
|-------|---------|
Table | {MD055}
|-------|---------|
## Bad Separator Row
| Table | Header |
|-------|---------
{MD055:17}
| Table | Header |
-------|--------|
{MD055:22}
| Table | Header |
-------|--------
{MD055:27}
## Missing everything
{MD055} | Header
---------|-------
{MD055} | cell
{MD055:34}
{MD055} | Header
--------:|:-----:
{MD055} | cell
{MD055:40}
## Missing trailing pipe
| Table | Header |
|--------:|:-------|
| {MD055} | cell
| Table | Header |
|---------|--------|
| {MD055} | cell
| cell | cell |
| cell | cell |
| Table | Header |
|---------|--------|
| cell | cell |
| {MD055} | cell
| cell | cell |
| Table | Header |
|---------|--------|
| cell | cell |
| cell | cell |
| {MD055} | cell
## Missing leading pipe
| Table | Header |
|-------:|:-------|
{MD055} | cell |
| Table | Header |
|--------|--------|
{MD055} | cell |
| cell | cell |
| cell | cell |
| Table | Header |
|--------|--------|
| cell | cell |
{MD055} | cell |
| cell | cell |
| Table | Header |
|--------|--------|
| cell | cell |
| cell | cell |
{MD055} | cell |
## Missing both sides
| Table | Header |
|-------:|:-------|
{MD055} | cell
| Table | Header |
|--------|--------|
{MD055} | cell
| cell | cell |
| cell | cell |
| Table | Header |
|--------|--------|
| cell | cell |
{MD055} | cell
| cell | cell |
| Table | Header |
|--------|--------|
| cell | cell |
| cell | cell |
{MD055} | cell
## No false-positive
| Table | Header |
|-------|--------|
| cell | cell |
| Table | Header |
|-------|--------|
| cell | cell |
| cell | cell |
| cell | cell |
## No trailing blank line
| Table | Header |
|-------|--------|
| cell | cell |
{MD055} Text
## Markdown Combination
> | Table | Header |
> |-------|--------|
> -{MD055}| cell |