Which is Better Markdown Parsing Libraries?
markdown-it vs remark vs showdown
1 Year
markdown-itremarkshowdownSimilar Packages:
What's Markdown Parsing Libraries?

Markdown parsing libraries are essential tools in web development that convert Markdown text into HTML. These libraries facilitate the integration of Markdown content into web applications, allowing developers to easily manage and render formatted text. They support various Markdown features and extensions, enabling a flexible and customizable approach to content rendering. By using these libraries, developers can enhance user experience through rich text formatting while maintaining simplicity in content management.

NPM Package Downloads Trend
Github Stars Ranking
Stat Detail
Package
Downloads
Stars
Size
Issues
Publish
License
markdown-it5,988,41418,119767 kB147 months agoMIT
remark1,817,0917,62615.7 kB2a year agoMIT
showdown639,71914,260801 kB215-MIT
Feature Comparison: markdown-it vs remark vs showdown

Performance

  • markdown-it: markdown-it is designed for speed and efficiency, making it one of the fastest Markdown parsers available. It uses a streaming approach, allowing for quick processing of large Markdown documents without significant performance overhead.
  • remark: remark's performance is generally good, but it may be slower than markdown-it due to its more extensive plugin architecture and processing capabilities. However, its performance can be optimized by selectively applying plugins and transformations.
  • showdown: showdown offers decent performance for basic Markdown conversion tasks. While it may not be as fast as markdown-it, it is sufficient for most simple applications where speed is not the primary concern.

Extensibility

  • markdown-it: markdown-it is highly extensible, allowing developers to create custom plugins to add new features or modify existing behavior. This makes it suitable for projects that require specific Markdown syntax or additional functionality.
  • remark: remark excels in extensibility, as it is built on a plugin architecture that allows for easy integration of various transformations and linting tools. This makes it ideal for projects that need to process Markdown in complex ways.
  • showdown: showdown has limited extensibility compared to markdown-it and remark. While it supports some basic options for customization, it does not have a robust plugin system, making it less suitable for projects requiring extensive modifications.

Learning Curve

  • markdown-it: markdown-it has a moderate learning curve, especially for developers familiar with Markdown. Its API is straightforward, but understanding how to effectively use plugins may require additional learning.
  • remark: remark has a steeper learning curve due to its plugin-based architecture and the unified ecosystem. Developers may need to familiarize themselves with various plugins and their configurations to fully leverage its capabilities.
  • showdown: showdown is easy to learn and use, making it an excellent choice for beginners. Its simple API allows developers to quickly integrate Markdown conversion into their applications without extensive setup.

Customization

  • markdown-it: markdown-it allows for extensive customization of the parsing process, including the ability to define custom rules and modify the rendering output. This flexibility is beneficial for projects with specific formatting requirements.
  • remark: remark provides a high level of customization through its plugin system, enabling developers to create tailored processing pipelines for Markdown content. This is particularly useful for projects that require specific formatting or linting rules.
  • showdown: showdown offers limited customization options, primarily focusing on basic Markdown to HTML conversion. While it allows for some configuration, it does not provide the same level of flexibility as markdown-it or remark.

Community and Support

  • markdown-it: markdown-it has a strong community and is widely used in various projects, ensuring good support and a wealth of resources for developers. Its popularity means that finding solutions to common issues is relatively easy.
  • remark: remark benefits from being part of the unified ecosystem, which has a growing community and support. However, it may not be as widely adopted as markdown-it, leading to fewer resources available for troubleshooting.
  • showdown: showdown has a smaller community compared to markdown-it and remark, but it still provides adequate support and documentation for basic use cases. Developers may find fewer resources for advanced customization.
How to Choose: markdown-it vs remark vs showdown
  • markdown-it: Choose markdown-it if you need a fast and extensible Markdown parser that supports a wide range of plugins and customizations. It is particularly suitable for projects that require high performance and flexibility in rendering Markdown with additional features.
  • remark: Select remark if you prefer a more structured and plugin-based approach to Markdown processing. Remark is built on the unified ecosystem, making it ideal for projects that require extensive transformations and analysis of Markdown content, such as linting and formatting.
  • showdown: Opt for showdown if you need a straightforward and easy-to-use Markdown to HTML converter. It is particularly useful for simple applications where you want to convert Markdown to HTML without the need for extensive customization or plugins.
README for markdown-it

markdown-it

CI NPM version Coverage Status Gitter

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

browser (CDN):

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.

markdown-it for enterprise

Available as part of the Tidelift Subscription.

The maintainers of markdown-it and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. Learn more.

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:

  • https://github.com/jgm/CommonMark - reference CommonMark implementations in C & JS, also contains latest spec & online demo.
  • http://talk.commonmark.org - CommonMark forum, good place to collaborate developers' efforts.

Ports