All Projects → remarkjs → Remark Lint

remarkjs / Remark Lint

Licence: mit
Markdown code style linter

Programming Languages

javascript
184084 projects - #8 most used programming language

Projects that are alternatives of or similar to Remark Lint

Textlint
The pluggable natural language linter for text and markdown.
Stars: ✭ 2,158 (+200.56%)
Mutual labels:  lint, markdown
Pettier
Prettier config that randomizes options and arbitrarily switches between spaces and tabs 🙄
Stars: ✭ 149 (-79.25%)
Mutual labels:  lint, style
Hint
重构到 ---> https://github.com/hustcc/lint-md
Stars: ✭ 30 (-95.82%)
Mutual labels:  lint, markdown
Vscode Markdownlint
Markdown linting and style checking for Visual Studio Code
Stars: ✭ 444 (-38.16%)
Mutual labels:  lint, markdown
Format.cmake
💅 Stylize your code! Automatic clang-format and cmake-format targets for CMake.
Stars: ✭ 94 (-86.91%)
Mutual labels:  lint, style
Markdownlint
A Node.js style checker and lint tool for Markdown/CommonMark files.
Stars: ✭ 2,828 (+293.87%)
Mutual labels:  lint, markdown
Stylelint
A mighty, modern linter that helps you avoid errors and enforce conventions in your styles.
Stars: ✭ 9,350 (+1202.23%)
Mutual labels:  lint, markdown
prettier-check
Check that all files match prettier code style.
Stars: ✭ 54 (-92.48%)
Mutual labels:  lint, style
Snazzy
Format JavaScript Standard Style as Stylish (i.e. snazzy) output
Stars: ✭ 381 (-46.94%)
Mutual labels:  lint, style
Lint Md
📚 检查中文 markdown 编写格式规范的命令行工具,基于 AST,方便集成 ci,写博客 / 文档必备。支持 API 调用!
Stars: ✭ 662 (-7.8%)
Mutual labels:  lint, markdown
Backslide
💦 CLI tool for making HTML presentations with Remark.js using Markdown
Stars: ✭ 679 (-5.43%)
Mutual labels:  markdown
Ok Mdx
Browser-based MDX editor
Stars: ✭ 681 (-5.15%)
Mutual labels:  markdown
Ethlint
(Formerly Solium) Code quality & Security Linter for Solidity
Stars: ✭ 698 (-2.79%)
Mutual labels:  lint
Notepad
[iOS] A fully themeable markdown editor with live syntax highlighting.
Stars: ✭ 705 (-1.81%)
Mutual labels:  markdown
Rust Clippy
A bunch of lints to catch common mistakes and improve your Rust code
Stars: ✭ 6,720 (+835.93%)
Mutual labels:  lint
Recipes
Django application for managing recipes
Stars: ✭ 695 (-3.2%)
Mutual labels:  markdown
Mdmath
LaTeX Math for Markdown inside of Visual Studio Code.
Stars: ✭ 675 (-5.99%)
Mutual labels:  markdown
Bytemd
A hackable Markdown editor component built with Svelte
Stars: ✭ 656 (-8.64%)
Mutual labels:  markdown
Wysiwyg.css
A tiny CSS for generated HTML or Markdown content
Stars: ✭ 665 (-7.38%)
Mutual labels:  markdown
Embedmd
embedmd: embed code into markdown and keep everything in sync
Stars: ✭ 714 (-0.56%)
Mutual labels:  markdown

remark-lint

Build Coverage Downloads Chat Sponsors Backers

remark plugins to lint Markdown.

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).

Contents

Install

npm:

npm install remark-lint

CLI

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

npm install --save-dev 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 enabled again):

# 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, 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" field 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.

Related

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, organization, or community you agree to abide by its terms.

License

MIT © Titus Wormer

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].