markdown-it

Markdown-it - modern pluggable markdown parser.

MIT 81 个版本
安装
npm install markdown-it
yarn add markdown-it
pnpm add markdown-it
bun add markdown-it
README

markdown-it

CI NPM version Coverage Status

Markdown parser done right. Fast and easy to extend.

Live demo

  • Follows the CommonMark spec + adds syntax extensions & sugar (URL autolinking, typographer).
  • Configurable syntax! You can add new rules and even replace existing ones.
  • High speed.
  • Safe by default.
  • Community-written plugins and other packages on npm.

Table of content

Install

node.js:

npm install markdown-it

[!NOTE]

For a quick look at dist/ folder contents, see https://unpkg.com/markdown-it/.

For browser you can use unpkg.com, esm.sh or any other CDN, wich mirror npm registry

Usage examples

See also:

Simple

// node.js
// can use `require('markdown-it')` for CJS
import markdownit from 'markdown-it'
const md = markdownit()
const result = md.render('# markdown-it rulezz!');

// browser with UMD build, added to "window" on script load
// Note, there is no dash in "markdownit".
const md = window.markdownit();
const result = md.render('# markdown-it rulezz!');

Single line rendering, without paragraph wrap:

import markdownit from 'markdown-it'
const md = markdownit()
const result = md.renderInline('__markdown-it__ rulezz!');

Init with presets and options

(*) presets define combinations of active rules and options. Can be "commonmark", "zero" or "default" (if skipped). See API docs for more details.

import markdownit from 'markdown-it'

// commonmark mode
const md = markdownit('commonmark')

// default mode
const md = markdownit()

// enable everything
const md = markdownit({
  html: true,
  linkify: true,
  typographer: true
})

// full options list (defaults)
const md = markdownit({
  // Enable HTML tags in source
  html:         false,

  // Use '/' to close single tags (<br />).
  // This is only for full CommonMark compatibility.
  xhtmlOut:     false,

  // Convert '\n' in paragraphs into <br>
  breaks:       false,

  // CSS language prefix for fenced blocks. Can be
  // useful for external highlighters.
  langPrefix:   'language-',

  // Autoconvert URL-like text to links
  linkify:      false,

  // Enable some language-neutral replacement + quotes beautification
  // For the full list of replacements, see https://github.com/markdown-it/markdown-it/blob/master/lib/rules_core/replacements.mjs
  typographer:  false,

  // Double + single quotes replacement pairs, when typographer enabled,
  // and smartquotes on. Could be either a String or an Array.
  //
  // For example, you can use '«»„“' for Russian, '„“‚‘' for German,
  // and ['«\xA0', '\xA0»', '‹\xA0', '\xA0›'] for French (including nbsp).
  quotes: '“”‘’',

  // Highlighter function. Should return escaped HTML,
  // or '' if the source string is not changed and should be escaped externally.
  // If result starts with <pre... internal wrapper is skipped.
  highlight: function (/*str, lang*/) { return ''; }
});

Plugins load

import markdownit from 'markdown-it'

const md = markdownit()
  .use(plugin1)
  .use(plugin2, opts, ...)
  .use(plugin3);

Syntax highlighting

Apply syntax highlighting to fenced code blocks with the highlight option:

import markdownit from 'markdown-it'
import hljs from 'highlight.js' // https://highlightjs.org

// Actual default values
const md = markdownit({
  highlight: function (str, lang) {
    if (lang && hljs.getLanguage(lang)) {
      try {
        return hljs.highlight(str, { language: lang }).value;
      } catch (__) {}
    }

    return ''; // use external default escaping
  }
});

Or with full wrapper override (if you need assign class to <pre> or <code>):

import markdownit from 'markdown-it'
import hljs from 'highlight.js' // https://highlightjs.org

// Actual default values
const md = markdownit({
  highlight: function (str, lang) {
    if (lang && hljs.getLanguage(lang)) {
      try {
        return '<pre><code class="hljs">' +
               hljs.highlight(str, { language: lang, ignoreIllegals: true }).value +
               '</code></pre>';
      } catch (__) {}
    }

    return '<pre><code class="hljs">' + md.utils.escapeHtml(str) + '</code></pre>';
  }
});

Linkify

linkify: true uses linkify-it. To configure linkify-it, access the linkify instance through md.linkify:

md.linkify.set({ fuzzyEmail: false });  // disables converting email to link

API

API documentation

If you are going to write plugins, please take a look at Development info.

Syntax extensions

Embedded (enabled by default):

Via plugins:

Manage rules

By default all rules are enabled, but can be restricted by options. On plugin load all its rules are enabled automatically.

import markdownit from 'markdown-it'

// Activate/deactivate rules, with currying
const md = markdownit()
  .disable(['link', 'image'])
  .enable(['link'])
  .enable('image');

// Enable everything
const md = markdownit({
  html: true,
  linkify: true,
  typographer: true,
});

You can find all rules in sources:

Benchmark

Here is the result of readme parse at MB Pro Retina 2013 (2.4 GHz):

npm run benchmark-deps
benchmark/benchmark.mjs readme

Selected samples: (1 of 28)
 > README

Sample: README.md (7774 bytes)
 > commonmark-reference x 1,222 ops/sec ±0.96% (97 runs sampled)
 > current x 743 ops/sec ±0.84% (97 runs sampled)
 > current-commonmark x 1,568 ops/sec ±0.84% (98 runs sampled)
 > marked x 1,587 ops/sec ±4.31% (93 runs sampled)

[!NOTE]

CommonMark version runs with simplified link normalizers for more "honest" compare. Difference is ≈1.5×.

As you can see, markdown-it doesn't pay with speed for its flexibility. Slowdown of "full" version caused by additional features not available in other implementations.

Authors

markdown-it is the result of the decision of the authors who contributed to 99% of the Remarkable code to move to a project with the same authorship but new leadership (Vitaly and Alex). It's not a fork.

References / Thanks

Big thanks to John MacFarlane for his work on the CommonMark spec and reference implementations. His work saved us a lot of time during this project's development.

Related Links:

Ports

版本列表
14.2.0 2026-05-23
14.1.1 2026-02-11
14.1.0 2024-03-18
14.0.0 2023-12-08
13.0.2 2023-09-26
13.0.1 2022-05-03
13.0.0 2022-04-22
12.3.2 2022-01-08
12.3.1 2022-01-07
12.3.0 2021-12-09
12.2.0 2021-08-02
12.1.0 2021-07-01
12.0.6 2021-04-16
12.0.5 2021-04-14
12.0.4 2020-12-20
12.0.3 2020-12-07
12.0.2 2020-10-23
12.0.1 2020-10-19
12.0.0 2020-10-14
11.0.1 2020-09-14
11.0.0 2020-05-19
10.0.0 2019-09-10
9.1.0 2019-08-11
9.0.1 2019-07-12
9.0.0 2019-07-09
8.4.2 2018-07-17
8.4.1 2018-02-15
8.4.0 2017-08-24
8.3.2 2017-08-03
8.3.1 2017-03-06
8.3.0 2017-02-16
8.2.2 2016-12-14
8.2.1 2016-12-01
8.2.0 2016-12-01
8.1.0 2016-11-03
8.0.1 2016-10-18
8.0.0 2016-09-16
7.0.1 2016-08-16
7.0.0 2016-06-22
6.1.1 2016-06-21
6.1.0 2016-06-19
6.0.5 2016-06-01
6.0.4 2016-05-30
6.0.3 2016-05-30
6.0.2 2016-05-16
6.0.1 2016-04-02
6.0.0 2016-02-10
5.1.0 2016-01-06
5.0.3 2016-01-04
5.0.2 2015-11-20
5.0.1 2015-10-30
5.0.0 2015-10-05
4.4.0 2015-07-18
4.3.1 2015-07-15
4.3.0 2015-06-29
4.2.2 2015-06-09
4.2.1 2015-05-01
4.2.0 2015-04-21
4.1.2 2015-04-19
4.1.1 2015-04-13
4.1.0 2015-03-31
4.0.3 2015-03-25
4.0.2 2015-03-22
4.0.1 2015-03-13
4.0.0 2015-03-12
3.1.0 2015-03-05
3.0.7 2015-02-22
3.0.6 2015-02-12
3.0.5 2015-02-06
3.0.4 2015-01-13
3.0.3 2015-01-11
3.0.2 2015-01-08
3.0.1 2015-01-07
3.0.0 2015-01-04
2.2.1 2014-12-29
2.2.0 2014-12-28
2.1.3 2014-12-24
2.1.2 2014-12-23
2.1.1 2014-12-22
2.1.0 2014-12-21
2.0.0 2014-12-19