markdownlint 0.24.0 → 0.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/md010.js CHANGED
@@ -2,8 +2,8 @@
2
2
 
3
3
  "use strict";
4
4
 
5
- const { addError, forEachLine } = require("../helpers");
6
- const { lineMetadata } = require("./cache");
5
+ const { addError, forEachLine, overlapsAnyRange } = require("../helpers");
6
+ const { codeBlockAndSpanRanges, lineMetadata } = require("./cache");
7
7
 
8
8
  const tabRe = /\t+/g;
9
9
 
@@ -13,28 +13,33 @@ module.exports = {
13
13
  "tags": [ "whitespace", "hard_tab" ],
14
14
  "function": function MD010(params, onError) {
15
15
  const codeBlocks = params.config.code_blocks;
16
- const includeCodeBlocks = (codeBlocks === undefined) ? true : !!codeBlocks;
16
+ const includeCode = (codeBlocks === undefined) ? true : !!codeBlocks;
17
17
  const spacesPerTab = params.config.spaces_per_tab;
18
18
  const spaceMultiplier = (spacesPerTab === undefined) ?
19
19
  1 :
20
20
  Math.max(0, Number(spacesPerTab));
21
+ const exclusions = includeCode ? [] : codeBlockAndSpanRanges();
21
22
  forEachLine(lineMetadata(), (line, lineIndex, inCode) => {
22
- if (!inCode || includeCodeBlocks) {
23
+ if (includeCode || !inCode) {
23
24
  let match = null;
24
25
  while ((match = tabRe.exec(line)) !== null) {
25
- const column = match.index + 1;
26
+ const { index } = match;
27
+ const column = index + 1;
26
28
  const length = match[0].length;
27
- addError(
28
- onError,
29
- lineIndex + 1,
30
- "Column: " + column,
31
- null,
32
- [ column, length ],
33
- {
34
- "editColumn": column,
35
- "deleteCount": length,
36
- "insertText": "".padEnd(length * spaceMultiplier)
37
- });
29
+ if (!overlapsAnyRange(exclusions, lineIndex, index, length)) {
30
+ addError(
31
+ onError,
32
+ lineIndex + 1,
33
+ "Column: " + column,
34
+ null,
35
+ [ column, length ],
36
+ {
37
+ "editColumn": column,
38
+ "deleteCount": length,
39
+ "insertText": "".padEnd(length * spaceMultiplier)
40
+ }
41
+ );
42
+ }
38
43
  }
39
44
  }
40
45
  });
package/lib/md011.js CHANGED
@@ -3,7 +3,7 @@
3
3
  "use strict";
4
4
 
5
5
  const { addError, forEachLine, overlapsAnyRange } = require("../helpers");
6
- const { inlineCodeSpanRanges, lineMetadata } = require("./cache");
6
+ const { codeBlockAndSpanRanges, lineMetadata } = require("./cache");
7
7
 
8
8
  const reversedLinkRe =
9
9
  /(^|[^\\])\(([^)]+)\)\[([^\]^][^\]]*)](?!\()/g;
@@ -13,7 +13,7 @@ module.exports = {
13
13
  "description": "Reversed link syntax",
14
14
  "tags": [ "links" ],
15
15
  "function": function MD011(params, onError) {
16
- const exclusions = inlineCodeSpanRanges();
16
+ const exclusions = codeBlockAndSpanRanges();
17
17
  forEachLine(lineMetadata(), (line, lineIndex, inCode, onFence) => {
18
18
  if (!inCode && !onFence) {
19
19
  let match = null;
package/lib/md033.js CHANGED
@@ -2,12 +2,13 @@
2
2
 
3
3
  "use strict";
4
4
 
5
- const { addError, forEachLine, unescapeMarkdown } = require("../helpers");
6
- const { lineMetadata } = require("./cache");
5
+ const {
6
+ addError, forEachLine, overlapsAnyRange, unescapeMarkdown
7
+ } = require("../helpers");
8
+ const { codeBlockAndSpanRanges, lineMetadata } = require("./cache");
7
9
 
8
10
  const htmlElementRe = /<(([A-Za-z][A-Za-z0-9-]*)(?:\s[^>]*)?)\/?>/g;
9
11
  const linkDestinationRe = /]\(\s*$/;
10
- const inlineCodeRe = /^[^`]*(`+[^`]+`+[^`]+)*`+[^`]*$/;
11
12
  // See https://spec.commonmark.org/0.29/#autolinks
12
13
  const emailAddressRe =
13
14
  // eslint-disable-next-line max-len
@@ -21,19 +22,22 @@ module.exports = {
21
22
  let allowedElements = params.config.allowed_elements;
22
23
  allowedElements = Array.isArray(allowedElements) ? allowedElements : [];
23
24
  allowedElements = allowedElements.map((element) => element.toLowerCase());
25
+ const exclusions = codeBlockAndSpanRanges();
24
26
  forEachLine(lineMetadata(), (line, lineIndex, inCode) => {
25
27
  let match = null;
26
28
  // eslint-disable-next-line no-unmodified-loop-condition
27
29
  while (!inCode && ((match = htmlElementRe.exec(line)) !== null)) {
28
30
  const [ tag, content, element ] = match;
29
- if (!allowedElements.includes(element.toLowerCase()) &&
31
+ if (
32
+ !allowedElements.includes(element.toLowerCase()) &&
30
33
  !tag.endsWith("\\>") &&
31
- !emailAddressRe.test(content)) {
34
+ !emailAddressRe.test(content) &&
35
+ !overlapsAnyRange(exclusions, lineIndex, match.index, match[0].length)
36
+ ) {
32
37
  const prefix = line.substring(0, match.index);
33
- if (!linkDestinationRe.test(prefix) && !inlineCodeRe.test(prefix)) {
38
+ if (!linkDestinationRe.test(prefix)) {
34
39
  const unescaped = unescapeMarkdown(prefix + "<", "_");
35
- if (!unescaped.endsWith("_") &&
36
- ((unescaped + "`").match(/`/g).length % 2)) {
40
+ if (!unescaped.endsWith("_")) {
37
41
  addError(onError, lineIndex + 1, "Element: " + element,
38
42
  null, [ match.index + 1, tag.length ]);
39
43
  }
package/lib/md035.js CHANGED
@@ -10,12 +10,12 @@ module.exports = {
10
10
  "tags": [ "hr" ],
11
11
  "function": function MD035(params, onError) {
12
12
  let style = String(params.config.style || "consistent");
13
- filterTokens(params, "hr", function forToken(token) {
14
- const lineTrim = token.line.trim();
13
+ filterTokens(params, "hr", (token) => {
14
+ const { lineNumber, markup } = token;
15
15
  if (style === "consistent") {
16
- style = lineTrim;
16
+ style = markup;
17
17
  }
18
- addErrorDetailIf(onError, token.lineNumber, style, lineTrim);
18
+ addErrorDetailIf(onError, lineNumber, style, markup);
19
19
  });
20
20
  }
21
21
  };
package/lib/md037.js CHANGED
@@ -7,6 +7,7 @@ const { addErrorContext, emphasisMarkersInContent, forEachLine, isBlankLine } =
7
7
  const { lineMetadata } = require("./cache");
8
8
 
9
9
  const emphasisRe = /(^|[^\\]|\\\\)(?:(\*\*?\*?)|(__?_?))/g;
10
+ const embeddedUnderscoreRe = /([A-Za-z0-9])_([A-Za-z0-9])/g;
10
11
  const asteriskListItemMarkerRe = /^([\s>]*)\*(\s+)/;
11
12
  const leftSpaceRe = /^\s+/;
12
13
  const rightSpaceRe = /\s+$/;
@@ -98,14 +99,15 @@ module.exports = {
98
99
  // Emphasis has no meaning here
99
100
  return;
100
101
  }
102
+ let patchedLine = line.replace(embeddedUnderscoreRe, "$1 $2");
101
103
  if (onItemStart) {
102
104
  // Trim overlapping '*' list item marker
103
- line = line.replace(asteriskListItemMarkerRe, "$1 $2");
105
+ patchedLine = patchedLine.replace(asteriskListItemMarkerRe, "$1 $2");
104
106
  }
105
107
  let match = null;
106
108
  // Match all emphasis-looking runs in the line...
107
- while ((match = emphasisRe.exec(line))) {
108
- const ignoreMarkersForLine = ignoreMarkersByLine[lineIndex] || [];
109
+ while ((match = emphasisRe.exec(patchedLine))) {
110
+ const ignoreMarkersForLine = ignoreMarkersByLine[lineIndex];
109
111
  const matchIndex = match.index + match[1].length;
110
112
  if (ignoreMarkersForLine.includes(matchIndex)) {
111
113
  // Ignore emphasis markers inside code spans and links
package/lib/md039.js CHANGED
@@ -4,7 +4,8 @@
4
4
 
5
5
  const { addErrorContext, filterTokens } = require("../helpers");
6
6
 
7
- const spaceInLinkRe = /\[(?:\s+(?:[^\]]*?)\s*|(?:[^\]]*?)\s+)](?=\(\S*\))/;
7
+ const spaceInLinkRe =
8
+ /\[(?:\s+(?:[^\]]*?)\s*|(?:[^\]]*?)\s+)](?=((?:\([^)]*\))|(?:\[[^\]]*\])))/;
8
9
 
9
10
  module.exports = {
10
11
  "names": [ "MD039", "no-space-in-links" ],
package/lib/md043.js CHANGED
@@ -20,7 +20,6 @@ module.exports = {
20
20
  let matchAny = false;
21
21
  let hasError = false;
22
22
  let anyHeadings = false;
23
- // eslint-disable-next-line func-style
24
23
  const getExpected = () => requiredHeadings[i++] || "[None]";
25
24
  forEachHeading(params, (heading, content) => {
26
25
  if (!hasError) {
package/lib/md044.js CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  const { addErrorDetailIf, bareUrlRe, escapeForRegExp, forEachLine,
6
6
  overlapsAnyRange, linkRe, linkReferenceRe } = require("../helpers");
7
- const { inlineCodeSpanRanges, lineMetadata } = require("./cache");
7
+ const { codeBlockAndSpanRanges, lineMetadata } = require("./cache");
8
8
 
9
9
  module.exports = {
10
10
  "names": [ "MD044", "proper-names" ],
@@ -36,7 +36,7 @@ module.exports = {
36
36
  }
37
37
  });
38
38
  if (!includeCodeBlocks) {
39
- exclusions.push(...inlineCodeSpanRanges());
39
+ exclusions.push(...codeBlockAndSpanRanges());
40
40
  }
41
41
  for (const name of names) {
42
42
  const escapedName = escapeForRegExp(name);
package/lib/md049.js ADDED
@@ -0,0 +1,45 @@
1
+ // @ts-check
2
+
3
+ "use strict";
4
+
5
+ const { addError, emphasisOrStrongStyleFor, forEachInlineChild,
6
+ getNextChildToken, getRangeAndFixInfoIfFound } = require("../helpers");
7
+
8
+ module.exports = {
9
+ "names": [ "MD049", "emphasis-style" ],
10
+ "description": "Emphasis style should be consistent",
11
+ "tags": [ "emphasis" ],
12
+ "function": function MD049(params, onError) {
13
+ let expectedStyle = String(params.config.style || "consistent");
14
+ forEachInlineChild(params, "em_open", (token, parent) => {
15
+ const { lineNumber, markup } = token;
16
+ const markupStyle = emphasisOrStrongStyleFor(markup);
17
+ if (expectedStyle === "consistent") {
18
+ expectedStyle = markupStyle;
19
+ }
20
+ if (expectedStyle !== markupStyle) {
21
+ let rangeAndFixInfo = {};
22
+ const contentToken = getNextChildToken(
23
+ parent, token, "text", "em_close"
24
+ );
25
+ if (contentToken) {
26
+ const { content } = contentToken;
27
+ const actual = `${markup}${content}${markup}`;
28
+ const expectedMarkup = (expectedStyle === "asterisk") ? "*" : "_";
29
+ const expected = `${expectedMarkup}${content}${expectedMarkup}`;
30
+ rangeAndFixInfo = getRangeAndFixInfoIfFound(
31
+ params.lines, lineNumber - 1, actual, expected
32
+ );
33
+ }
34
+ addError(
35
+ onError,
36
+ lineNumber,
37
+ `Expected: ${expectedStyle}; Actual: ${markupStyle}`,
38
+ null,
39
+ rangeAndFixInfo.range,
40
+ rangeAndFixInfo.fixInfo
41
+ );
42
+ }
43
+ });
44
+ }
45
+ };
package/lib/md050.js ADDED
@@ -0,0 +1,45 @@
1
+ // @ts-check
2
+
3
+ "use strict";
4
+
5
+ const { addError, emphasisOrStrongStyleFor, forEachInlineChild,
6
+ getNextChildToken, getRangeAndFixInfoIfFound } = require("../helpers");
7
+
8
+ module.exports = {
9
+ "names": [ "MD050", "strong-style" ],
10
+ "description": "Strong style should be consistent",
11
+ "tags": [ "emphasis" ],
12
+ "function": function MD050(params, onError) {
13
+ let expectedStyle = String(params.config.style || "consistent");
14
+ forEachInlineChild(params, "strong_open", (token, parent) => {
15
+ const { lineNumber, markup } = token;
16
+ const markupStyle = emphasisOrStrongStyleFor(markup);
17
+ if (expectedStyle === "consistent") {
18
+ expectedStyle = markupStyle;
19
+ }
20
+ if (expectedStyle !== markupStyle) {
21
+ let rangeAndFixInfo = {};
22
+ const contentToken = getNextChildToken(
23
+ parent, token, "text", "strong_close"
24
+ );
25
+ if (contentToken) {
26
+ const { content } = contentToken;
27
+ const actual = `${markup}${content}${markup}`;
28
+ const expectedMarkup = (expectedStyle === "asterisk") ? "**" : "__";
29
+ const expected = `${expectedMarkup}${content}${expectedMarkup}`;
30
+ rangeAndFixInfo = getRangeAndFixInfoIfFound(
31
+ params.lines, lineNumber - 1, actual, expected
32
+ );
33
+ }
34
+ addError(
35
+ onError,
36
+ lineNumber,
37
+ `Expected: ${expectedStyle}; Actual: ${markupStyle}`,
38
+ null,
39
+ rangeAndFixInfo.range,
40
+ rangeAndFixInfo.fixInfo
41
+ );
42
+ }
43
+ });
44
+ }
45
+ };
package/lib/rules.js CHANGED
@@ -2,9 +2,7 @@
2
2
 
3
3
  "use strict";
4
4
 
5
- const packageJson = require("../package.json");
6
- const homepage = packageJson.homepage;
7
- const version = packageJson.version;
5
+ const { homepage, version } = require("./constants");
8
6
 
9
7
  const rules = [
10
8
  require("./md001"),
@@ -50,7 +48,9 @@ const rules = [
50
48
  require("./md045"),
51
49
  require("./md046"),
52
50
  require("./md047"),
53
- require("./md048")
51
+ require("./md048"),
52
+ require("./md049"),
53
+ require("./md050")
54
54
  ];
55
55
  rules.forEach((rule) => {
56
56
  const name = rule.names[0].toLowerCase();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "markdownlint",
3
- "version": "0.24.0",
3
+ "version": "0.25.0",
4
4
  "description": "A Node.js style checker and lint tool for Markdown/CommonMark files.",
5
5
  "main": "lib/markdownlint.js",
6
6
  "types": "lib/markdownlint.d.ts",
@@ -16,11 +16,10 @@
16
16
  "build-config": "npm run build-config-schema && npm run build-config-example",
17
17
  "build-config-example": "node schema/build-config-example.js",
18
18
  "build-config-schema": "node schema/build-config-schema.js",
19
- "build-declaration": "tsc --allowJs --declaration --emitDeclarationOnly --resolveJsonModule lib/markdownlint.js && rimraf 'lib/{c,md,r}*.d.ts' 'helpers/*.d.ts'",
20
- "build-demo": "cpy node_modules/markdown-it/dist/markdown-it.min.js demo && cd demo && rimraf markdownlint-browser.* && webpack --no-stats",
19
+ "build-declaration": "tsc --allowJs --declaration --emitDeclarationOnly --resolveJsonModule lib/markdownlint.js && node scripts delete 'lib/{c,md,r}*.d.ts' 'helpers/*.d.ts'",
20
+ "build-demo": "node scripts copy node_modules/markdown-it/dist/markdown-it.min.js demo/markdown-it.min.js && cd demo && webpack --no-stats",
21
21
  "build-example": "npm install --no-save --ignore-scripts grunt grunt-cli gulp through2",
22
- "ci": "npm-run-all --continue-on-error --parallel test-cover lint declaration build-config build-demo && git diff --exit-code",
23
- "clean-test-repos": "rimraf test-repos",
22
+ "ci": "npm-run-all --continue-on-error --parallel build-config lint serial-declaration-demo test-cover && git diff --exit-code",
24
23
  "clone-test-repos-dotnet-docs": "cd test-repos && git clone https://github.com/dotnet/docs dotnet-docs --depth 1 --no-tags --quiet",
25
24
  "clone-test-repos-eslint-eslint": "cd test-repos && git clone https://github.com/eslint/eslint eslint-eslint --depth 1 --no-tags --quiet",
26
25
  "clone-test-repos-mkdocs-mkdocs": "cd test-repos && git clone https://github.com/mkdocs/mkdocs mkdocs-mkdocs --depth 1 --no-tags --quiet",
@@ -33,43 +32,46 @@
33
32
  "clone-test-repos-large": "npm run clone-test-repos && cd test-repos && npm run clone-test-repos-dotnet-docs && npm run clone-test-repos-v8-v8-dev",
34
33
  "declaration": "npm run build-declaration && npm run test-declaration",
35
34
  "example": "cd example && node standalone.js && grunt markdownlint --force && gulp markdownlint",
35
+ "docker-npm-install": "docker run --rm --tty --name npm-install --volume $PWD:/home/workdir --workdir /home/workdir --user node node:16 npm install",
36
+ "docker-npm-run-upgrade": "docker run --rm --tty --name npm-run-upgrade --volume $PWD:/home/workdir --workdir /home/workdir --user node node:16 npm run upgrade",
36
37
  "lint": "eslint --max-warnings 0 .",
37
38
  "lint-test-repos": "ava --timeout=5m test/markdownlint-test-repos.js",
38
- "test": "ava test/markdownlint-test.js test/markdownlint-test-custom-rules.js test/markdownlint-test-helpers.js test/markdownlint-test-result-object.js test/markdownlint-test-scenarios.js",
39
+ "serial-declaration-demo": "npm run build-declaration && npm-run-all --continue-on-error --parallel build-demo test-declaration",
40
+ "test": "ava test/markdownlint-test.js test/markdownlint-test-config.js test/markdownlint-test-custom-rules.js test/markdownlint-test-helpers.js test/markdownlint-test-result-object.js test/markdownlint-test-scenarios.js",
39
41
  "test-cover": "c8 --check-coverage --branches 100 --functions 100 --lines 100 --statements 100 npm test",
40
42
  "test-declaration": "cd example/typescript && tsc && node type-check.js",
41
- "test-extra": "ava --timeout=5m test/markdownlint-test-extra.js"
43
+ "test-extra": "ava --timeout=5m test/markdownlint-test-extra-parse.js test/markdownlint-test-extra-type.js",
44
+ "upgrade": "npx npm-check-updates --upgrade"
42
45
  },
43
46
  "engines": {
44
- "node": ">=10"
47
+ "node": ">=12"
45
48
  },
46
49
  "dependencies": {
47
- "markdown-it": "12.2.0"
50
+ "markdown-it": "12.3.0"
48
51
  },
49
52
  "devDependencies": {
50
53
  "ava": "~3.15.0",
51
- "c8": "~7.8.0",
52
- "cpy-cli": "~3.1.1",
53
- "eslint": "~7.32.0",
54
- "eslint-plugin-jsdoc": "~36.0.7",
54
+ "c8": "~7.10.0",
55
+ "eslint": "~8.5.0",
56
+ "eslint-plugin-jsdoc": "~37.4.0",
55
57
  "eslint-plugin-node": "~11.1.0",
56
- "eslint-plugin-unicorn": "~35.0.0",
57
- "globby": "~11.0.4",
58
+ "eslint-plugin-unicorn": "~39.0.0",
59
+ "globby": "~12.0.2",
58
60
  "js-yaml": "~4.1.0",
59
61
  "markdown-it-for-inline": "~0.1.1",
60
62
  "markdown-it-sub": "~1.0.0",
61
63
  "markdown-it-sup": "~1.0.0",
62
- "markdown-it-texmath": "~0.9.1",
63
- "markdownlint-rule-helpers": "~0.14.0",
64
+ "markdown-it-texmath": "~0.9.7",
65
+ "markdownlint-rule-github-internal-links": "~0.1.0",
66
+ "markdownlint-rule-helpers": "~0.15.0",
64
67
  "npm-run-all": "~4.1.5",
65
- "rimraf": "~3.0.2",
66
- "strip-json-comments": "~3.1.1",
68
+ "strip-json-comments": "~4.0.0",
67
69
  "toml": "~3.0.0",
68
- "ts-loader": "~9.2.5",
70
+ "ts-loader": "~9.2.6",
69
71
  "tv4": "~1.3.0",
70
- "typescript": "~4.3.5",
71
- "webpack": "~5.51.1",
72
- "webpack-cli": "~4.8.0"
72
+ "typescript": "~4.5.4",
73
+ "webpack": "~5.65.0",
74
+ "webpack-cli": "~4.9.1"
73
75
  },
74
76
  "keywords": [
75
77
  "markdown",
@@ -39,7 +39,9 @@
39
39
  // Spaces for indent
40
40
  "indent": 2,
41
41
  // Whether to indent the first level of the list
42
- "start_indented": false
42
+ "start_indented": false,
43
+ // Spaces for first level indent (when start_indented is set)
44
+ "start_indent": 2
43
45
  },
44
46
 
45
47
  // MD009/no-trailing-spaces - Trailing spaces
@@ -248,5 +250,17 @@
248
250
  "MD048": {
249
251
  // Code fence style
250
252
  "style": "consistent"
253
+ },
254
+
255
+ // MD049/emphasis-style - Emphasis style should be consistent
256
+ "MD049": {
257
+ // Emphasis style should be consistent
258
+ "style": "consistent"
259
+ },
260
+
261
+ // MD050/strong-style - Strong style should be consistent
262
+ "MD050": {
263
+ // Strong style should be consistent
264
+ "style": "consistent"
251
265
  }
252
266
  }
@@ -36,6 +36,8 @@ MD007:
36
36
  indent: 2
37
37
  # Whether to indent the first level of the list
38
38
  start_indented: false
39
+ # Spaces for first level indent (when start_indented is set)
40
+ start_indent: 2
39
41
 
40
42
  # MD009/no-trailing-spaces - Trailing spaces
41
43
  MD009:
@@ -224,4 +226,14 @@ MD047: true
224
226
  # MD048/code-fence-style - Code fence style
225
227
  MD048:
226
228
  # Code fence style
229
+ style: "consistent"
230
+
231
+ # MD049/emphasis-style - Emphasis style should be consistent
232
+ MD049:
233
+ # Emphasis style should be consistent
234
+ style: "consistent"
235
+
236
+ # MD050/strong-style - Strong style should be consistent
237
+ MD050:
238
+ # Strong style should be consistent
227
239
  style: "consistent"
@@ -238,6 +238,11 @@
238
238
  "description": "Whether to indent the first level of the list",
239
239
  "type": "boolean",
240
240
  "default": false
241
+ },
242
+ "start_indent": {
243
+ "description": "Spaces for first level indent (when start_indented is set)",
244
+ "type": "integer",
245
+ "default": 2
241
246
  }
242
247
  },
243
248
  "additionalProperties": false
@@ -259,6 +264,11 @@
259
264
  "description": "Whether to indent the first level of the list",
260
265
  "type": "boolean",
261
266
  "default": false
267
+ },
268
+ "start_indent": {
269
+ "description": "Spaces for first level indent (when start_indented is set)",
270
+ "type": "integer",
271
+ "default": 2
262
272
  }
263
273
  },
264
274
  "additionalProperties": false
@@ -1439,6 +1449,90 @@
1439
1449
  },
1440
1450
  "additionalProperties": false
1441
1451
  },
1452
+ "MD049": {
1453
+ "description": "MD049/emphasis-style - Emphasis style should be consistent",
1454
+ "type": [
1455
+ "boolean",
1456
+ "object"
1457
+ ],
1458
+ "default": true,
1459
+ "properties": {
1460
+ "style": {
1461
+ "description": "Emphasis style should be consistent",
1462
+ "type": "string",
1463
+ "enum": [
1464
+ "consistent",
1465
+ "asterisk",
1466
+ "underscore"
1467
+ ],
1468
+ "default": "consistent"
1469
+ }
1470
+ },
1471
+ "additionalProperties": false
1472
+ },
1473
+ "emphasis-style": {
1474
+ "description": "MD049/emphasis-style - Emphasis style should be consistent",
1475
+ "type": [
1476
+ "boolean",
1477
+ "object"
1478
+ ],
1479
+ "default": true,
1480
+ "properties": {
1481
+ "style": {
1482
+ "description": "Emphasis style should be consistent",
1483
+ "type": "string",
1484
+ "enum": [
1485
+ "consistent",
1486
+ "asterisk",
1487
+ "underscore"
1488
+ ],
1489
+ "default": "consistent"
1490
+ }
1491
+ },
1492
+ "additionalProperties": false
1493
+ },
1494
+ "MD050": {
1495
+ "description": "MD050/strong-style - Strong style should be consistent",
1496
+ "type": [
1497
+ "boolean",
1498
+ "object"
1499
+ ],
1500
+ "default": true,
1501
+ "properties": {
1502
+ "style": {
1503
+ "description": "Strong style should be consistent",
1504
+ "type": "string",
1505
+ "enum": [
1506
+ "consistent",
1507
+ "asterisk",
1508
+ "underscore"
1509
+ ],
1510
+ "default": "consistent"
1511
+ }
1512
+ },
1513
+ "additionalProperties": false
1514
+ },
1515
+ "strong-style": {
1516
+ "description": "MD050/strong-style - Strong style should be consistent",
1517
+ "type": [
1518
+ "boolean",
1519
+ "object"
1520
+ ],
1521
+ "default": true,
1522
+ "properties": {
1523
+ "style": {
1524
+ "description": "Strong style should be consistent",
1525
+ "type": "string",
1526
+ "enum": [
1527
+ "consistent",
1528
+ "asterisk",
1529
+ "underscore"
1530
+ ],
1531
+ "default": "consistent"
1532
+ }
1533
+ },
1534
+ "additionalProperties": false
1535
+ },
1442
1536
  "headings": {
1443
1537
  "description": "headings - MD001, MD002, MD003, MD018, MD019, MD020, MD021, MD022, MD023, MD024, MD025, MD026, MD036, MD041, MD043",
1444
1538
  "type": "boolean",
@@ -1535,7 +1629,7 @@
1535
1629
  "default": true
1536
1630
  },
1537
1631
  "emphasis": {
1538
- "description": "emphasis - MD036, MD037",
1632
+ "description": "emphasis - MD036, MD037, MD049, MD050",
1539
1633
  "type": "boolean",
1540
1634
  "default": true
1541
1635
  },