diff --git a/doc/Rules.md b/doc/Rules.md index 7ce44a6f..d77a0e38 100644 --- a/doc/Rules.md +++ b/doc/Rules.md @@ -863,11 +863,12 @@ Tags: ol Aliases: ol-prefix -Parameters: style ("one", "ordered", "one_or_ordered"; default "one_or_ordered") +Parameters: style ("one", "ordered", "one_or_ordered", "zero"; default "one_or_ordered") -This rule is triggered on ordered lists that do not either start with '1.' or +This rule is triggered for ordered lists that do not either start with '1.' or do not have a prefix that increases in numerical order (depending on the -configured style). +configured style). The less-common pattern of using '0.' for all prefixes is +also supported. Example valid list if the style is configured as 'one': @@ -887,6 +888,14 @@ Example valid list if the style is configured as 'ordered': Both examples are valid when the style is configured as 'one_or_ordered'. +Example valid list if the style is configured as 'zero': + +```markdown +0. Do this. +0. Do that. +0. Done. +``` + Example invalid list for all styles: ```markdown diff --git a/lib/md029.js b/lib/md029.js index d0f2d2f9..2042d3fb 100644 --- a/lib/md029.js +++ b/lib/md029.js @@ -4,6 +4,12 @@ const shared = require("./shared"); +const listStyleExamples = { + "one": "1/1/1", + "ordered": "1/2/3", + "zero": "0/0/0" +}; + module.exports = { "names": [ "MD029", "ol-prefix" ], "description": "Ordered list item prefix", @@ -18,12 +24,12 @@ module.exports = { shared.orderedListItemMarkerRe.exec(list.items[1].line); listStyle = (second && (second[1] !== "1")) ? "ordered" : "one"; } - let number = 1; + let number = (listStyle === "zero") ? 0 : 1; list.items.forEach(function forItem(item) { const match = shared.orderedListItemMarkerRe.exec(item.line); shared.addErrorDetailIf(onError, item.lineNumber, String(number), !match || match[1], - "Style: " + (listStyle === "one" ? "1/1/1" : "1/2/3"), + "Style: " + listStyleExamples[listStyle], shared.rangeFromRegExp(item.line, shared.listItemMarkerRe)); if (listStyle === "ordered") { number++; diff --git a/schema/build-config-schema.js b/schema/build-config-schema.js index ee3c79f3..06401d32 100644 --- a/schema/build-config-schema.js +++ b/schema/build-config-schema.js @@ -184,7 +184,8 @@ rules.forEach(function forRule(rule) { "enum": [ "one", "ordered", - "one_or_ordered" + "one_or_ordered", + "zero" ], "default": "one_or_ordered" } diff --git a/schema/markdownlint-config-schema.json b/schema/markdownlint-config-schema.json index 0b4ce336..3b5b5dbf 100644 --- a/schema/markdownlint-config-schema.json +++ b/schema/markdownlint-config-schema.json @@ -674,7 +674,8 @@ "enum": [ "one", "ordered", - "one_or_ordered" + "one_or_ordered", + "zero" ], "default": "one_or_ordered" } @@ -695,7 +696,8 @@ "enum": [ "one", "ordered", - "one_or_ordered" + "one_or_ordered", + "zero" ], "default": "one_or_ordered" } diff --git a/test/detailed-results-ordered-list-item-prefix-single.md b/test/detailed-results-ordered-list-item-prefix-single.md new file mode 100644 index 00000000..1a6959b5 --- /dev/null +++ b/test/detailed-results-ordered-list-item-prefix-single.md @@ -0,0 +1,3 @@ +# Ordered list examples + +9. Item diff --git a/test/detailed-results-ordered-list-item-prefix-single.results.json b/test/detailed-results-ordered-list-item-prefix-single.results.json new file mode 100644 index 00000000..e2c5d51c --- /dev/null +++ b/test/detailed-results-ordered-list-item-prefix-single.results.json @@ -0,0 +1,11 @@ +[ + { + "lineNumber": 3, + "ruleNames": [ "MD029", "ol-prefix" ], + "ruleDescription": "Ordered list item prefix", + "ruleInformation": "https://github.com/DavidAnson/markdownlint/blob/v0.0.0/doc/Rules.md#md029", + "errorDetail": "Expected: 1; Actual: 9; Style: 1/1/1", + "errorContext": null, + "errorRange": [1, 3] + } +] diff --git a/test/detailed-results-ordered-list-item-prefix-zero.json b/test/detailed-results-ordered-list-item-prefix-zero.json new file mode 100644 index 00000000..3e3245a7 --- /dev/null +++ b/test/detailed-results-ordered-list-item-prefix-zero.json @@ -0,0 +1,6 @@ +{ + "default": true, + "MD029": { + "style": "zero" + } +} diff --git a/test/detailed-results-ordered-list-item-prefix-zero.md b/test/detailed-results-ordered-list-item-prefix-zero.md new file mode 100644 index 00000000..f8eac253 --- /dev/null +++ b/test/detailed-results-ordered-list-item-prefix-zero.md @@ -0,0 +1,19 @@ +# Ordered list examples + +text + +0. Item +0. Item +0. Item + +text + +1. Item +1. Item +1. Item + +text + +1. Item +2. Item +3. Item diff --git a/test/detailed-results-ordered-list-item-prefix-zero.results.json b/test/detailed-results-ordered-list-item-prefix-zero.results.json new file mode 100644 index 00000000..79fafa14 --- /dev/null +++ b/test/detailed-results-ordered-list-item-prefix-zero.results.json @@ -0,0 +1,56 @@ +[ + { + "lineNumber": 11, + "ruleNames": [ "MD029", "ol-prefix" ], + "ruleDescription": "Ordered list item prefix", + "ruleInformation": "https://github.com/DavidAnson/markdownlint/blob/v0.0.0/doc/Rules.md#md029", + "errorDetail": "Expected: 0; Actual: 1; Style: 0/0/0", + "errorContext": null, + "errorRange": [1, 3] + }, + { + "lineNumber": 12, + "ruleNames": [ "MD029", "ol-prefix" ], + "ruleDescription": "Ordered list item prefix", + "ruleInformation": "https://github.com/DavidAnson/markdownlint/blob/v0.0.0/doc/Rules.md#md029", + "errorDetail": "Expected: 0; Actual: 1; Style: 0/0/0", + "errorContext": null, + "errorRange": [1, 3] + }, + { + "lineNumber": 13, + "ruleNames": [ "MD029", "ol-prefix" ], + "ruleDescription": "Ordered list item prefix", + "ruleInformation": "https://github.com/DavidAnson/markdownlint/blob/v0.0.0/doc/Rules.md#md029", + "errorDetail": "Expected: 0; Actual: 1; Style: 0/0/0", + "errorContext": null, + "errorRange": [1, 3] + }, + { + "lineNumber": 17, + "ruleNames": [ "MD029", "ol-prefix" ], + "ruleDescription": "Ordered list item prefix", + "ruleInformation": "https://github.com/DavidAnson/markdownlint/blob/v0.0.0/doc/Rules.md#md029", + "errorDetail": "Expected: 0; Actual: 1; Style: 0/0/0", + "errorContext": null, + "errorRange": [1, 3] + }, + { + "lineNumber": 18, + "ruleNames": [ "MD029", "ol-prefix" ], + "ruleDescription": "Ordered list item prefix", + "ruleInformation": "https://github.com/DavidAnson/markdownlint/blob/v0.0.0/doc/Rules.md#md029", + "errorDetail": "Expected: 0; Actual: 2; Style: 0/0/0", + "errorContext": null, + "errorRange": [1, 3] + }, + { + "lineNumber": 19, + "ruleNames": [ "MD029", "ol-prefix" ], + "ruleDescription": "Ordered list item prefix", + "ruleInformation": "https://github.com/DavidAnson/markdownlint/blob/v0.0.0/doc/Rules.md#md029", + "errorDetail": "Expected: 0; Actual: 3; Style: 0/0/0", + "errorContext": null, + "errorRange": [1, 3] + } +] diff --git a/test/ordered-list-item-prefix-zero.json b/test/ordered-list-item-prefix-zero.json new file mode 100644 index 00000000..3e3245a7 --- /dev/null +++ b/test/ordered-list-item-prefix-zero.json @@ -0,0 +1,6 @@ +{ + "default": true, + "MD029": { + "style": "zero" + } +} diff --git a/test/ordered-list-item-prefix-zero.md b/test/ordered-list-item-prefix-zero.md new file mode 100644 index 00000000..ea321753 --- /dev/null +++ b/test/ordered-list-item-prefix-zero.md @@ -0,0 +1,62 @@ +# Ordered list examples + +text + +0. Item + +text + +1. Item {MD029} + +text + +0. Item +0. Item +0. Item + +text + +1. Item {MD029} +2. Item {MD029} +3. Item {MD029} + +text + +0. Item +1. Item {MD029} +0. Item +2. Item {MD029} + +text + +0. Item +0. Item +2. Item {MD029} +0. Item + +text + +1. Item {MD029} +2. Item {MD029} +3. Item {MD029} + +text + +4. Item {MD029} +5. Item {MD029} + +text + +- Item + 0. Item + 0. Item + 0. Item +- Item + 1. Item {MD029} + 2. Item {MD029} + 3. Item {MD029} +- Item + 0. Item + 1. Item {MD029} + 2. Item {MD029} +- Item