markdown-it vs marked vs remark vs showdown
Markdown Parsing Libraries
markdown-itmarkedremarkshowdownSimilar Packages:

Markdown Parsing Libraries

Markdown parsing libraries are essential tools in web development that convert Markdown text into HTML. They allow developers to easily integrate Markdown support in applications, enabling users to write content in a simple, readable format that can be rendered as structured HTML. These libraries vary in features, performance, and extensibility, catering to different use cases and developer preferences.

Npm Package Weekly Downloads Trend

3 Years

Github Stars Ranking

Stat Detail

Package
Downloads
Stars
Size
Issues
Publish
License
markdown-it021,591777 kB23a month agoMIT
marked036,908450 kB1114 days agoMIT
remark08,91415.7 kB93 years agoMIT
showdown014,863801 kB234-MIT

Feature Comparison: markdown-it vs marked vs remark vs showdown

Customization and Extensibility

  • markdown-it:

    markdown-it provides a rich plugin architecture that allows developers to extend its functionality easily. You can create custom rules, add new syntax, or modify existing behavior, making it highly adaptable to specific needs.

  • marked:

    marked is designed to be minimal and does not offer extensive customization options. It focuses on speed and simplicity, which may limit its extensibility compared to other libraries.

  • remark:

    remark is built around a plugin system that enables developers to create custom transformations and linting rules. This modular approach allows for extensive customization and integration of various Markdown processing tasks.

  • showdown:

    showdown offers basic customization through options but lacks a robust plugin system. It allows some configuration of the conversion process, but it is not as extensible as markdown-it or remark.

Performance

  • markdown-it:

    markdown-it is optimized for performance, providing a fast parsing engine that can handle large documents efficiently. Its architecture is designed for speed, making it suitable for high-performance applications.

  • marked:

    marked is known for its speed and lightweight nature, making it one of the fastest Markdown parsers available. It is ideal for applications where performance is a top priority.

  • remark:

    remark's performance can vary depending on the complexity of the transformations applied. While it is efficient for basic parsing, extensive transformations may impact speed, especially with large documents.

  • showdown:

    showdown is relatively fast for simple conversions but may not match the performance of markdown-it or marked in more complex scenarios. It is suitable for straightforward use cases.

Learning Curve

  • markdown-it:

    markdown-it has a moderate learning curve due to its extensive features and plugin system. Developers may need some time to fully understand its capabilities and how to leverage them effectively.

  • marked:

    marked is easy to learn and use, making it an excellent choice for beginners. Its simple API allows developers to get started quickly without a steep learning curve.

  • remark:

    remark has a steeper learning curve due to its modular architecture and the need to understand its plugin system. However, once familiar, developers can leverage its full potential for complex Markdown processing.

  • showdown:

    showdown is straightforward and easy to pick up, making it accessible for developers of all skill levels. Its simple API allows for quick implementation with minimal overhead.

Output Quality

  • markdown-it:

    markdown-it produces high-quality HTML output that closely adheres to the Markdown specification. It supports a wide range of Markdown features, ensuring that the rendered output is accurate and consistent.

  • marked:

    marked generates clean and valid HTML output, but it may not support all Markdown features as comprehensively as markdown-it. It is suitable for most standard use cases.

  • remark:

    remark focuses on producing high-quality output and allows for extensive transformations, ensuring that the final HTML meets specific requirements. Its flexibility is a significant advantage for complex projects.

  • showdown:

    showdown provides decent HTML output that is generally reliable. However, it may not handle all edge cases as effectively as other libraries, which could be a consideration for more complex Markdown.

Community and Support

  • markdown-it:

    markdown-it has a strong community and is actively maintained, with a wealth of plugins and resources available. This support makes it easier for developers to find help and extend functionality.

  • marked:

    marked is widely used and has a large community, ensuring good support and resources. Its popularity means that developers can easily find solutions to common issues.

  • remark:

    remark has a growing community with a focus on modular Markdown processing. While it may not be as large as some other libraries, it has dedicated contributors and resources available.

  • showdown:

    showdown has a decent community and is well-documented, but it may not have as many resources or plugins compared to more popular libraries like markdown-it or marked.

How to Choose: markdown-it vs marked vs remark vs showdown

  • markdown-it:

    Choose markdown-it if you need a highly customizable and extensible Markdown parser that supports plugins and offers a fast rendering engine. It is ideal for projects that require advanced features like custom syntax or additional functionality through plugins.

  • marked:

    Select marked if you are looking for a lightweight and fast Markdown parser with a straightforward API. It is suitable for projects where performance is critical and you need a simple solution without extensive customization.

  • remark:

    Opt for remark if you want a comprehensive ecosystem for Markdown processing that includes parsing, transforming, and linting. It is perfect for projects that require a modular approach and want to leverage the power of plugins for various transformations and checks.

  • showdown:

    Use showdown if you need a straightforward and easy-to-use Markdown to HTML converter that works well in both Node.js and browser environments. It is great for projects that prioritize simplicity and ease of integration.

README for markdown-it

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