From 238781506a44826b8825771fd4864f2c8aeddb3a Mon Sep 17 00:00:00 2001 From: David Anson Date: Thu, 21 Jan 2021 19:50:57 -0800 Subject: [PATCH] Generate example YAML configuration with all properties set to their default value. --- README.md | 5 +- schema/.markdownlint.yaml | 225 +++++++++++++++++++++++++++++++++ schema/build-config-example.js | 20 ++- test/markdownlint-test.js | 25 +++- 4 files changed, 266 insertions(+), 9 deletions(-) create mode 100644 schema/.markdownlint.yaml diff --git a/README.md b/README.md index 08505193..4db7818c 100644 --- a/README.md +++ b/README.md @@ -380,8 +380,9 @@ Example: } ``` -See [.markdownlint.jsonc](schema/.markdownlint.jsonc) for an example -configuration object with all properties set to their default value. +See [.markdownlint.jsonc](schema/.markdownlint.jsonc) and/or +[.markdownlint.yaml](schema/.markdownlint.yaml) for an example +configuration object with all properties set to the default value. Sets of rules (known as a "style") can be stored separately and loaded as [JSON](https://en.wikipedia.org/wiki/JSON). diff --git a/schema/.markdownlint.yaml b/schema/.markdownlint.yaml new file mode 100644 index 00000000..5aaa9e46 --- /dev/null +++ b/schema/.markdownlint.yaml @@ -0,0 +1,225 @@ +# Example markdownlint YAML configuration with all properties set to their default value + +# Default state for all rules +default: true + +# Path to configuration file to extend +extends: null + +# MD001/heading-increment/header-increment - Heading levels should only increment by one level at a time +MD001: true + +# MD002/first-heading-h1/first-header-h1 - First heading should be a top-level heading +MD002: + # Heading level + level: 1 + +# MD003/heading-style/header-style - Heading style +MD003: + # Heading style + style: "consistent" + +# MD004/ul-style - Unordered list style +MD004: + # List style + style: "consistent" + +# MD005/list-indent - Inconsistent indentation for list items at the same level +MD005: true + +# MD006/ul-start-left - Consider starting bulleted lists at the beginning of the line +MD006: true + +# MD007/ul-indent - Unordered list indentation +MD007: + # Spaces for indent + indent: 2 + # Whether to indent the first level of the list + start_indented: false + +# MD009/no-trailing-spaces - Trailing spaces +MD009: + # Spaces for line break + br_spaces: 2 + # Allow spaces for empty lines in list items + list_item_empty_lines: false + # Include unnecessary breaks + strict: false + +# MD010/no-hard-tabs - Hard tabs +MD010: + # Include code blocks + code_blocks: true + +# MD011/no-reversed-links - Reversed link syntax +MD011: true + +# MD012/no-multiple-blanks - Multiple consecutive blank lines +MD012: + # Consecutive blank lines + maximum: 1 + +# MD013/line-length - Line length +MD013: + # Number of characters + line_length: 80 + # Number of characters for headings + heading_line_length: 80 + # Number of characters for code blocks + code_block_line_length: 80 + # Include code blocks + code_blocks: true + # Include tables + tables: true + # Include headings + headings: true + # Include headings + headers: true + # Strict length checking + strict: false + # Stern length checking + stern: false + +# MD014/commands-show-output - Dollar signs used before commands without showing output +MD014: true + +# MD018/no-missing-space-atx - No space after hash on atx style heading +MD018: true + +# MD019/no-multiple-space-atx - Multiple spaces after hash on atx style heading +MD019: true + +# MD020/no-missing-space-closed-atx - No space inside hashes on closed atx style heading +MD020: true + +# MD021/no-multiple-space-closed-atx - Multiple spaces inside hashes on closed atx style heading +MD021: true + +# MD022/blanks-around-headings/blanks-around-headers - Headings should be surrounded by blank lines +MD022: + # Blank lines above heading + lines_above: 1 + # Blank lines below heading + lines_below: 1 + +# MD023/heading-start-left/header-start-left - Headings must start at the beginning of the line +MD023: true + +# MD024/no-duplicate-heading/no-duplicate-header - Multiple headings with the same content +MD024: + # Only check sibling headings + allow_different_nesting: false + # Only check sibling headings + siblings_only: false + +# MD025/single-title/single-h1 - Multiple top-level headings in the same document +MD025: + # Heading level + level: 1 + # RegExp for matching title in front matter + front_matter_title: "^\\s*title\\s*[:=]" + +# MD026/no-trailing-punctuation - Trailing punctuation in heading +MD026: + # Punctuation characters + punctuation: ".,;:!。,;:!" + +# MD027/no-multiple-space-blockquote - Multiple spaces after blockquote symbol +MD027: true + +# MD028/no-blanks-blockquote - Blank line inside blockquote +MD028: true + +# MD029/ol-prefix - Ordered list item prefix +MD029: + # List style + style: "one_or_ordered" + +# MD030/list-marker-space - Spaces after list markers +MD030: + # Spaces for single-line unordered list items + ul_single: 1 + # Spaces for single-line ordered list items + ol_single: 1 + # Spaces for multi-line unordered list items + ul_multi: 1 + # Spaces for multi-line ordered list items + ol_multi: 1 + +# MD031/blanks-around-fences - Fenced code blocks should be surrounded by blank lines +MD031: + # Include list items + list_items: true + +# MD032/blanks-around-lists - Lists should be surrounded by blank lines +MD032: true + +# MD033/no-inline-html - Inline HTML +MD033: + # Allowed elements + allowed_elements: [] + +# MD034/no-bare-urls - Bare URL used +MD034: true + +# MD035/hr-style - Horizontal rule style +MD035: + # Horizontal rule style + style: "consistent" + +# MD036/no-emphasis-as-heading/no-emphasis-as-header - Emphasis used instead of a heading +MD036: + # Punctuation characters + punctuation: ".,;:!?。,;:!?" + +# MD037/no-space-in-emphasis - Spaces inside emphasis markers +MD037: true + +# MD038/no-space-in-code - Spaces inside code span elements +MD038: true + +# MD039/no-space-in-links - Spaces inside link text +MD039: true + +# MD040/fenced-code-language - Fenced code blocks should have a language specified +MD040: true + +# MD041/first-line-heading/first-line-h1 - First line in a file should be a top-level heading +MD041: + # Heading level + level: 1 + # RegExp for matching title in front matter + front_matter_title: "^\\s*title\\s*[:=]" + +# MD042/no-empty-links - No empty links +MD042: true + +# MD043/required-headings/required-headers - Required heading structure +MD043: + # List of headings + headings: [] + # List of headings + headers: [] + +# MD044/proper-names - Proper names should have the correct capitalization +MD044: + # List of proper names + names: [] + # Include code blocks + code_blocks: true + +# MD045/no-alt-text - Images should have alternate text (alt text) +MD045: true + +# MD046/code-block-style - Code block style +MD046: + # Block style + style: "consistent" + +# MD047/single-trailing-newline - Files should end with a single newline character +MD047: true + +# MD048/code-fence-style - Code fence style +MD048: + # Code fence syle + style: "consistent" \ No newline at end of file diff --git a/schema/build-config-example.js b/schema/build-config-example.js index 58ac5bed..6425f379 100644 --- a/schema/build-config-example.js +++ b/schema/build-config-example.js @@ -25,13 +25,29 @@ for (const rule in configSchema.properties) { } } -const configString = JSON.stringify(configExample, null, 2) +const configStringJson = JSON.stringify(configExample, null, 2) // eslint-disable-next-line max-len .replace(/^\{/, "{\n // Example markdownlint JSON(C) configuration with all properties set to their default value") .replace(/(\s+)"[^-"]+-description": "(.+)",/g, "\n$1// $2") .replace(/"[^-"]+-sub-description": "(.+)",/g, "// $1"); fs.writeFileSync( path.join(__dirname, ".markdownlint.jsonc"), - configString, + configStringJson, + "utf8" +); + +const configStringYaml = configStringJson + .replace(/JSON\(C\)/, "YAML") + .replace(/\n {2}/g, "\n") + .replace(/\/\/ /g, "# ") + .replace(/(\s*)"([^"]+)":/g, "$1$2:") + .replace(/: \{/g, ":") + .replace(/\n\}/g, "") + .replace(/,\n/g, "\n") + .replace(/^\{\n/, "") + .replace(/\}$/, ""); +fs.writeFileSync( + path.join(__dirname, ".markdownlint.yaml"), + configStringYaml, "utf8" ); diff --git a/test/markdownlint-test.js b/test/markdownlint-test.js index e5fee10e..a0c0b005 100644 --- a/test/markdownlint-test.js +++ b/test/markdownlint-test.js @@ -4,6 +4,7 @@ const fs = require("fs"); const path = require("path"); +const jsYaml = require("js-yaml"); const md = require("markdown-it")(); const pluginInline = require("markdown-it-for-inline"); const pluginSub = require("markdown-it-sub"); @@ -1008,15 +1009,29 @@ test("validateConfigSchemaAllowsUnknownProperties", (t) => { }); test("validateConfigExampleJson", (t) => { - const file = ".markdownlint.jsonc"; - const data = fs.readFileSync( - path.join(__dirname, "../schema", file), + t.plan(2); + + // Validate JSONC + const fileJson = ".markdownlint.jsonc"; + const dataJson = fs.readFileSync( + path.join(__dirname, "../schema", fileJson), "utf8" ); + const jsonObject = JSON.parse(stripJsonComments(dataJson)); t.true( // @ts-ignore - tv4.validate(JSON.parse(stripJsonComments(data)), configSchemaStrict), - file + "\n" + JSON.stringify(tv4.error, null, 2)); + tv4.validate(jsonObject, configSchemaStrict), + fileJson + "\n" + JSON.stringify(tv4.error, null, 2)); + + // Validate YAML + const fileYaml = ".markdownlint.yaml"; + const dataYaml = fs.readFileSync( + path.join(__dirname, "../schema", fileYaml), + "utf8" + ); + const yamlObject = jsYaml.safeLoad(dataYaml); + t.deepEqual(yamlObject, jsonObject, + "YAML example does not match JSON example."); }); test.cb("configSingle", (t) => {