markdown-it vs remark vs showdown vs commonmark
Markdown Parsing Libraries Comparison
1 Year
markdown-itremarkshowdowncommonmarkSimilar Packages:
What's Markdown Parsing Libraries?

Markdown parsing libraries are essential tools in web development that convert Markdown text into HTML. They enable developers to integrate Markdown support into their applications, allowing users to write formatted text easily. Each library has its unique features, performance characteristics, and extensibility options, making them suitable for different use cases, from simple Markdown rendering to complex document processing.

Package Weekly Downloads Trend
Github Stars Ranking
Stat Detail
Package
Downloads
Stars
Size
Issues
Publish
License
markdown-it7,498,80819,039767 kB48a year agoMIT
remark2,040,8427,98815.7 kB0a year agoMIT
showdown748,98714,487801 kB222-MIT
commonmark663,2441,474673 kB525 months agoBSD-2-Clause
Feature Comparison: markdown-it vs remark vs showdown vs commonmark

Compliance with Standards

  • markdown-it:

    Markdown-it is flexible and allows for compliance with various Markdown flavors, but it does not enforce strict adherence to any single specification. This flexibility can lead to inconsistencies if not managed carefully, making it less suitable for projects that require strict compliance.

  • remark:

    Remark focuses on transforming Markdown content and does not enforce strict compliance with any specific Markdown standard. It is more about the manipulation and processing of Markdown rather than strict adherence to a specification.

  • showdown:

    Showdown offers a straightforward implementation of Markdown parsing but may not strictly adhere to all nuances of the Markdown specification. It is designed for ease of use rather than strict compliance.

  • commonmark:

    CommonMark is designed to be a highly compliant Markdown parser that adheres strictly to the CommonMark specification. This ensures that Markdown documents are rendered consistently across different platforms, making it a reliable choice for applications that require standardization.

Extensibility

  • markdown-it:

    Markdown-it excels in extensibility, offering a rich ecosystem of plugins and the ability to create custom rules. This makes it ideal for developers who need to implement specific features or enhancements in their Markdown processing.

  • remark:

    Remark is built around a plugin architecture, allowing for extensive customization and transformation of Markdown content. It is highly extensible, making it suitable for complex applications that require tailored Markdown processing.

  • showdown:

    Showdown has a simple API for customization but is less extensible compared to Markdown-it and Remark. It is suitable for projects that need basic Markdown functionality without extensive customization.

  • commonmark:

    CommonMark has limited extensibility options, as it aims to provide a consistent and standardized parsing experience. It is not designed for heavy customization or plugin support, making it less suitable for projects that require extensive modifications.

Performance

  • markdown-it:

    Markdown-it is designed for high performance and can handle large Markdown documents efficiently. Its architecture allows for quick parsing and rendering, making it a good choice for applications that require speed and responsiveness.

  • remark:

    Remark's performance can vary depending on the complexity of the transformations applied. While it can handle large documents, extensive processing may introduce overhead, so it is best suited for applications that balance performance with transformation needs.

  • showdown:

    Showdown is lightweight and fast, making it an excellent choice for applications that require quick Markdown conversion without the need for extensive features. It is particularly beneficial for simple use cases where performance is a priority.

  • commonmark:

    CommonMark is optimized for performance with a focus on parsing speed and efficiency. Its strict adherence to the specification allows for fast rendering of Markdown content, making it suitable for applications with high performance demands.

Learning Curve

  • markdown-it:

    Markdown-it has a moderate learning curve due to its flexibility and extensibility. Developers may need to invest time in understanding its plugin system and customization options, but it offers powerful capabilities once mastered.

  • remark:

    Remark has a steeper learning curve, particularly due to its plugin architecture and transformation capabilities. Developers may need to familiarize themselves with its ecosystem to fully leverage its potential for Markdown processing.

  • showdown:

    Showdown is easy to learn and implement, making it a great choice for beginners or projects that require quick integration of Markdown parsing without a steep learning curve.

  • commonmark:

    CommonMark has a straightforward API and is easy to learn, especially for developers familiar with Markdown. Its focus on compliance makes it accessible for those who want a simple solution without complex configurations.

Community and Support

  • markdown-it:

    Markdown-it boasts a strong community and a wealth of plugins and resources available online. This makes it easier for developers to find support and examples, enhancing the overall development experience.

  • remark:

    Remark has a vibrant community and a rich ecosystem of plugins, providing ample resources for developers. Its focus on transformations has garnered a dedicated user base, making support readily available.

  • showdown:

    Showdown has a smaller community compared to others but is still supported by a decent number of resources and documentation. It is suitable for projects that require straightforward Markdown parsing without extensive community reliance.

  • commonmark:

    CommonMark has a growing community and is backed by a specification that is widely accepted. However, its support ecosystem is not as extensive as some other libraries, which may limit resources for troubleshooting and enhancements.

How to Choose: markdown-it vs remark vs showdown vs commonmark
  • markdown-it:

    Select Markdown-it for its extensibility and performance. It supports a wide range of plugins and features, including syntax highlighting and custom rules, making it suitable for applications that need advanced Markdown capabilities and customization options.

  • remark:

    Opt for Remark if you are looking for a powerful toolchain that focuses on transforming Markdown into various formats. It is particularly useful for projects that require extensive manipulation of Markdown content, as it allows for a rich ecosystem of plugins and transformations.

  • showdown:

    Use Showdown if you want a lightweight and easy-to-use Markdown converter that can be integrated quickly into web applications. It is particularly beneficial for projects that prioritize simplicity and speed over extensive customization.

  • commonmark:

    Choose CommonMark if you need a strict and standardized Markdown parser that adheres closely to the CommonMark specification, ensuring consistent rendering across different platforms and implementations. It is ideal for projects that require a reliable and predictable Markdown experience.

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