Update MD040/fenced-code-language to add language_only parameter to reject extra data in info string.

This commit is contained in:
Sébastien Règne 2022-11-11 07:07:04 +01:00 committed by GitHub
parent 718de432f3
commit 72439f42c6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
13 changed files with 176 additions and 1 deletions

View file

@ -4176,6 +4176,7 @@ module.exports = {
"function": function MD040(params, onError) { "function": function MD040(params, onError) {
let allowed = params.config.allowed_languages; let allowed = params.config.allowed_languages;
allowed = Array.isArray(allowed) ? allowed : []; allowed = Array.isArray(allowed) ? allowed : [];
const languageOnly = !!params.config.language_only;
filterTokens(params, "fence", function forToken(token) { filterTokens(params, "fence", function forToken(token) {
const lang = token.info.trim().split(/\s+/u).shift(); const lang = token.info.trim().split(/\s+/u).shift();
if (lang === "") { if (lang === "") {
@ -4184,6 +4185,9 @@ module.exports = {
else if ((allowed.length > 0) && !allowed.includes(lang)) { else if ((allowed.length > 0) && !allowed.includes(lang)) {
addError(onError, token.lineNumber, `"${lang}" is not allowed`); addError(onError, token.lineNumber, `"${lang}" is not allowed`);
} }
if (languageOnly && (token.info !== lang)) {
addError(onError, token.lineNumber, `Info string contains more than language: "${token.info}"`);
}
}); });
} }
}; };

View file

@ -29,6 +29,13 @@ You can configure the `allowed_languages` parameter to specify a list of
languages code blocks could use. Languages are case sensitive. The default value languages code blocks could use. Languages are case sensitive. The default value
is `[]` which means any language specifier is valid. is `[]` which means any language specifier is valid.
You can prevent extra data from being present in the info string of fenced code
blocks. To do so, set the `language_only` parameter to `true`.
<!-- markdownlint-disable-next-line no-space-in-code -->
Info strings with leading/trailing whitespace (ex: `js `) or other content (ex:
`ruby startline=3`) will trigger this rule.
Rationale: Specifying a language improves content rendering by using the Rationale: Specifying a language improves content rendering by using the
correct syntax highlighting for code. More information: correct syntax highlighting for code. More information:
<https://cirosantilli.com/markdown-style-guide#option-code-fenced>. <https://cirosantilli.com/markdown-style-guide#option-code-fenced>.

View file

@ -1623,6 +1623,7 @@ Aliases: `fenced-code-language`
Parameters: Parameters:
* `allowed_languages`: List of languages (`string[]`, default `[]`) * `allowed_languages`: List of languages (`string[]`, default `[]`)
* `language_only`: Require language only (`boolean`, default `false`)
This rule is triggered when fenced code blocks are used, but a language isn't This rule is triggered when fenced code blocks are used, but a language isn't
specified: specified:
@ -1655,6 +1656,13 @@ You can configure the `allowed_languages` parameter to specify a list of
languages code blocks could use. Languages are case sensitive. The default value languages code blocks could use. Languages are case sensitive. The default value
is `[]` which means any language specifier is valid. is `[]` which means any language specifier is valid.
You can prevent extra data from being present in the info string of fenced code
blocks. To do so, set the `language_only` parameter to `true`.
<!-- markdownlint-disable-next-line no-space-in-code -->
Info strings with leading/trailing whitespace (ex: `js `) or other content (ex:
`ruby startline=3`) will trigger this rule.
Rationale: Specifying a language improves content rendering by using the Rationale: Specifying a language improves content rendering by using the
correct syntax highlighting for code. More information: correct syntax highlighting for code. More information:
<https://cirosantilli.com/markdown-style-guide#option-code-fenced>. <https://cirosantilli.com/markdown-style-guide#option-code-fenced>.

View file

@ -7,6 +7,7 @@ Aliases: `fenced-code-language`
Parameters: Parameters:
* `allowed_languages`: List of languages (`string[]`, default `[]`) * `allowed_languages`: List of languages (`string[]`, default `[]`)
* `language_only`: Require language only (`boolean`, default `false`)
This rule is triggered when fenced code blocks are used, but a language isn't This rule is triggered when fenced code blocks are used, but a language isn't
specified: specified:
@ -39,6 +40,13 @@ You can configure the `allowed_languages` parameter to specify a list of
languages code blocks could use. Languages are case sensitive. The default value languages code blocks could use. Languages are case sensitive. The default value
is `[]` which means any language specifier is valid. is `[]` which means any language specifier is valid.
You can prevent extra data from being present in the info string of fenced code
blocks. To do so, set the `language_only` parameter to `true`.
<!-- markdownlint-disable-next-line no-space-in-code -->
Info strings with leading/trailing whitespace (ex: `js `) or other content (ex:
`ruby startline=3`) will trigger this rule.
Rationale: Specifying a language improves content rendering by using the Rationale: Specifying a language improves content rendering by using the
correct syntax highlighting for code. More information: correct syntax highlighting for code. More information:
<https://cirosantilli.com/markdown-style-guide#option-code-fenced>. <https://cirosantilli.com/markdown-style-guide#option-code-fenced>.

View file

@ -11,6 +11,8 @@ module.exports = {
"function": function MD040(params, onError) { "function": function MD040(params, onError) {
let allowed = params.config.allowed_languages; let allowed = params.config.allowed_languages;
allowed = Array.isArray(allowed) ? allowed : []; allowed = Array.isArray(allowed) ? allowed : [];
const languageOnly = !!params.config.language_only;
filterTokens(params, "fence", function forToken(token) { filterTokens(params, "fence", function forToken(token) {
const lang = token.info.trim().split(/\s+/u).shift(); const lang = token.info.trim().split(/\s+/u).shift();
if (lang === "") { if (lang === "") {
@ -22,6 +24,14 @@ module.exports = {
`"${lang}" is not allowed` `"${lang}" is not allowed`
); );
} }
if (languageOnly && (token.info !== lang)) {
addError(
onError,
token.lineNumber,
`Info string contains more than language: "${token.info}"`
);
}
}); });
} }
}; };

View file

@ -209,7 +209,9 @@
// MD040/fenced-code-language - Fenced code blocks should have a language specified // MD040/fenced-code-language - Fenced code blocks should have a language specified
"MD040": { "MD040": {
// List of languages // List of languages
"allowed_languages": [] "allowed_languages": [],
// Require language only
"language_only": false
}, },
// MD041/first-line-heading/first-line-h1 - First line in a file should be a top-level heading // MD041/first-line-heading/first-line-h1 - First line in a file should be a top-level heading

View file

@ -191,6 +191,8 @@ MD039: true
MD040: MD040:
# List of languages # List of languages
allowed_languages: [] allowed_languages: []
# Require language only
language_only: false
# MD041/first-line-heading/first-line-h1 - First line in a file should be a top-level heading # MD041/first-line-heading/first-line-h1 - First line in a file should be a top-level heading
MD041: MD041:

View file

@ -356,6 +356,11 @@ for (const rule of rules) {
"type": "string" "type": "string"
}, },
"default": [] "default": []
},
"language_only": {
"description": "Require language only",
"type": "boolean",
"default": false
} }
}; };
break; break;

View file

@ -682,6 +682,11 @@
"type": "string" "type": "string"
}, },
"default": [] "default": []
},
"language_only": {
"description": "Require language only",
"type": "boolean",
"default": false
} }
}, },
"additionalProperties": false "additionalProperties": false

View file

@ -0,0 +1,6 @@
{
"MD040": {
"allowed_languages": ["html", "css"],
"language_only": true
}
}

View file

@ -0,0 +1,25 @@
# md040-language_only.md
Fence code block information with leading whitespace:
``` html
<h1>markdownlint</h1> {MD040:5}
```
Fence code block information with trailing whitespace:
```css
body {} {MD040:11} {MD009:11}
```
Fence code block information with extra data:
```html version=5
<title>MarkdownLint</title> {MD040:17}
```
Fence code block information without whitespaces and extra data:
```css
a {}
```

View file

@ -29553,6 +29553,99 @@ Generated by [AVA](https://avajs.dev).
`, `,
} }
## md040-language_only.md
> Snapshot 1
{
errors: [
{
errorContext: null,
errorDetail: 'Expected: 0 or 2; Actual: 1',
errorRange: [
7,
1,
],
fixInfo: {
deleteCount: 1,
editColumn: 7,
},
lineNumber: 11,
ruleDescription: 'Trailing spaces',
ruleInformation: 'https://github.com/DavidAnson/markdownlint/blob/v0.0.0/doc/md009.md',
ruleNames: [
'MD009',
'no-trailing-spaces',
],
},
{
errorContext: null,
errorDetail: 'Info string contains more than language: " html"',
errorRange: null,
fixInfo: null,
lineNumber: 5,
ruleDescription: 'Fenced code blocks should have a language specified',
ruleInformation: 'https://github.com/DavidAnson/markdownlint/blob/v0.0.0/doc/md040.md',
ruleNames: [
'MD040',
'fenced-code-language',
],
},
{
errorContext: null,
errorDetail: 'Info string contains more than language: "css "',
errorRange: null,
fixInfo: null,
lineNumber: 11,
ruleDescription: 'Fenced code blocks should have a language specified',
ruleInformation: 'https://github.com/DavidAnson/markdownlint/blob/v0.0.0/doc/md040.md',
ruleNames: [
'MD040',
'fenced-code-language',
],
},
{
errorContext: null,
errorDetail: 'Info string contains more than language: "html version=5"',
errorRange: null,
fixInfo: null,
lineNumber: 17,
ruleDescription: 'Fenced code blocks should have a language specified',
ruleInformation: 'https://github.com/DavidAnson/markdownlint/blob/v0.0.0/doc/md040.md',
ruleNames: [
'MD040',
'fenced-code-language',
],
},
],
fixed: `# md040-language_only.md␊
Fence code block information with leading whitespace:␊
\`\`\` html␊
<h1>markdownlint</h1> {MD040:5}␊
\`\`\`␊
Fence code block information with trailing whitespace:␊
\`\`\`css␊
body {} {MD040:11} {MD009:11}␊
\`\`\`␊
Fence code block information with extra data:␊
\`\`\`html version=5␊
<title>MarkdownLint</title> {MD040:17}␊
\`\`\`␊
Fence code block information without whitespaces and extra data:␊
\`\`\`css␊
a {}␊
\`\`\`␊
`,
}
## md041-ignore-leading-comments-combined.md ## md041-ignore-leading-comments-combined.md
> Snapshot 1 > Snapshot 1