remark-lint

Markdown code style linter

Github stars Tracking Chart

remark-lint

Build
Coverage
Downloads
Chat
Sponsors
Backers

remark plugins to lint Markdown.

Another linter?
Yes.
Ensuring the Markdown you (and contributors) write is of great quality will
provide better rendering in all the different markdown parsers, and makes sure
less refactoring is needed afterwards.

What is quality?
That’s up to you, but there are sensible presets.

remark-lint is built on remark, a powerful Markdown processor
powered by plugins (such as these).

Table of Contents

Install

npm:

npm install remark-lint

CLI

Example of how remark-lint looks on screen

Use remark-lint with remark-cli through a
preset.

npm install --save remark-cli remark-preset-lint-recommended

Then, configure remark in your package.json:

  // ...
  "scripts": {
    "lint-md": "remark ."
  },
  // ...
  "remarkConfig": {
    "plugins": ["remark-preset-lint-recommended"]
  }
  // ...

Let’s say there’s an example.md that looks as follows:

* Hello

[World][]

Now, running our lint-md script with npm run lint-md yields:

example.md
       1:3  warning  Incorrect list-item indent: add 2 spaces  list-item-indent
  3:1-3:10  warning  Found reference to undefined definition   no-undefined-references
⚠ 2 warnings

See doc/rules.md for what those warnings are (and how to turn them
off).

API

Use remark-lint together with remark:

npm install remark remark-preset-lint-markdown-style-guide

Let’s say example.js looks as follows:

var report = require('vfile-reporter')
var remark = require('remark')
var styleGuide = require('remark-preset-lint-markdown-style-guide')

var file = remark()
  .use(styleGuide)
  .processSync('_Hello world_')

console.log(report(file))

Now, running node example.js yields:

  1:1-1:14  warning  Emphasis should use `*` as a marker  emphasis-marker  remark-lint

⚠ 1 warning

Configuring remark-lint

remark-lint is a remark plugin and when used on the CLI supports
configuration through its configuration files.

An example .remarkrc file could look as follows:

{
  "plugins": [
    "remark-preset-lint-recommended",
    ["remark-lint-list-item-indent", false]
  ]
}

The preset turns on remark-lint-list-item-indent, but setting a plugin to
false later turns it off again.

Using our example.md from before:

* Hello

[World][]

Now, running npm run lint-md yields:

example.md
   3:1-3:10  warning  Found reference to undefined definition   no-undefined-references  remark-lint

⚠ 2 warnings

You can also provide configuration comments to turn a rule on or off inside a
file.
Note that you cannot change a setting, such as maximum-line-length, just
whether messages are shown or not.
Read more about configuration comments in
remark-message-controls documentation.

The following file will warn twice for the duplicate headings:

# Hello

## Hello

### Hello

The following file will warn once (the second heading is ignored, but the third
is re-enabled):

# Hello

<!--lint disable no-duplicate-headings-->

## Hello

<!--lint enable no-duplicate-headings-->

### Hello

Note: You’ll need the blank lines between comments and other nodes!

Using remark to fix your Markdown

remark-stringify can format markdown syntax.
It ensures a single style is used: list items use one type of bullet (*, -,
+), emphasis (* or _) and importance (__ or **) use a standard marker,
table fences are aligned, and more.

Example

If you require('remark'), remark-stringify is included
unless an output format other than markdown (such as HTML) is defined.

Say we have the following file, example.js, showing how formatting rules can
be used:

var report = require('vfile-reporter');
var remark = require('remark');
var emphasisMarker = require('remark-lint-emphasis-marker');
var strongMarker = require('remark-lint-strong-marker');

remark()
  .use(emphasisMarker, '*')
  .use(strongMarker, '*')
  // ^ two `remark-lint` rules.
  .use({
    settings: {emphasis: '*', strong: '*'}
    // ^ `remark-stringify` settings.
  })
  .process('_Hello_, __world__!', function (err, file) {
    console.error(report(err, file));
    console.log(String(file));
  });

Now, running node example yields warnings and a formatted file:

    1:1-1:8  warning  Emphasis should use `*` as a marker  emphasis-marker  remark-lint
  1:10-1:19  warning  Strong should use `*` as a marker    strong-marker    remark-lint

⚠ 2 warnings
*Hello*, **world**!
Example

If you’re using remark-stringify explicitly, you can pass
options like any other plugin, like so:

var report = require('vfile-reporter');
var unified = require('unified');
var parse = require('remark-parse');
var stringify = require('remark-stringify');
var emphasisMarker = require('remark-lint-emphasis-marker');
var strongMarker = require('remark-lint-strong-marker');

unified()
  .use(parse)
  .use(emphasisMarker, '*')
  .use(strongMarker, '*')
  // ^ two `remark-lint` rules.
  .use(stringify, {emphasis: '*', strong: '*'})
  // ^ `remark-stringify` with settings.
  .process('_Hello_, __world__!', function (err, file) {
    console.error(report(err, file));
    console.log(String(file));
  });

Now, when running node example, this results in the same output as the
previous example.

Example

If you’re using remark-cli, remark-stringify is
included unless an output format other than markdown (such as HTML) is defined.
In this case you can configure remark-stringify settings using the -s, --settings flag or a "settings" property in remark
configuration files
.

Say we have the following file, example.md:

_Hello_, __world__!

And our package.json looks as follows:

  // ...
  "remarkConfig": {
    "settings": {
      "emphasis": "*",
      "strong": "*"
    },
    "plugins": [
      "remark-lint-emphasis-marker",
      "remark-lint-strong-marker"
    ]
  }
  // ...

Now, running remark example.md yields warnings and a formatted file:

*Hello*, **world**!
example.md
    1:1-1:8  warning  Emphasis should use `*` as a marker  emphasis-marker  remark-lint
  1:10-1:19  warning  Strong should use `*` as a marker    strong-marker    remark-lint

⚠ 2 warnings

Note: running remark example.md -o or remark example.md --output
overwrites example.md and formats it.
So, if you’d run that twice (the first pass lints and fixes the Markdown, the
second pass checks it again), you’d see the output example.md: written as
all warnings are now fixed.

Integrations

We’re interested in more integrations.
Let us know if we can help.

Rules

doc/rules.md lists all available official rules.

List of Presets

Presets can be loaded just like other plugins.

List of External Rules

External rules can be loaded just like normal rules.

Security

Use of remark-lint does not mutate the tree so there are no openings for
cross-site scripting (XSS) attacks.
Messages from linting rules may be hidden from user content though, causing
builds to fail or pass, or changing a report.

Contribute

See contributing.md in remarkjs/.github for ways
to get started.
See support.md for ways to get help.

This project has a Code of Conduct.
By interacting with this repository, organisation, or community you agree to
abide by its terms.

License

MIT © Titus Wormer

Main metrics

Overview
Name With Ownerremarkjs/remark-lint
Primary LanguageJavaScript
Program languageJavaScript (Language Count: 1)
Platform
License:MIT License
所有者活动
Created At2015-05-05 19:38:58
Pushed At2025-04-10 09:46:00
Last Commit At
Release Count117
Last Release Nameremark-lint-no-unused-definitions@4.0.2 (Posted on )
First Release Name0.1.0 (Posted on )
用户参与
Stargazers Count1k
Watchers Count18
Fork Count135
Commits Count629
Has Issues Enabled
Issues Count222
Issue Open Count3
Pull Requests Count54
Pull Requests Open Count0
Pull Requests Close Count52
项目设置
Has Wiki Enabled
Is Archived
Is Fork
Is Locked
Is Mirror
Is Private