295 lines
8.9 KiB
Markdown
295 lines
8.9 KiB
Markdown
|
# markdown-it
|
|||
|
|
|||
|
[![Build Status](https://img.shields.io/travis/markdown-it/markdown-it/master.svg?style=flat)](https://travis-ci.org/markdown-it/markdown-it)
|
|||
|
[![NPM version](https://img.shields.io/npm/v/markdown-it.svg?style=flat)](https://www.npmjs.org/package/markdown-it)
|
|||
|
[![Coverage Status](https://coveralls.io/repos/markdown-it/markdown-it/badge.svg?branch=master&service=github)](https://coveralls.io/github/markdown-it/markdown-it?branch=master)
|
|||
|
[![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/markdown-it/markdown-it)
|
|||
|
|
|||
|
> Markdown parser done right. Fast and easy to extend.
|
|||
|
|
|||
|
__[Live demo](https://markdown-it.github.io)__
|
|||
|
|
|||
|
- Follows the __[CommonMark spec](http://spec.commonmark.org/)__ + adds syntax extensions & sugar (URL autolinking, typographer).
|
|||
|
- Configurable syntax! You can add new rules and even replace existing ones.
|
|||
|
- High speed.
|
|||
|
- [Safe](https://github.com/markdown-it/markdown-it/tree/master/docs/security.md) by default.
|
|||
|
- Community-written __[plugins](https://www.npmjs.org/browse/keyword/markdown-it-plugin)__ and [other packages](https://www.npmjs.org/browse/keyword/markdown-it) on npm.
|
|||
|
|
|||
|
__Table of content__
|
|||
|
|
|||
|
- [Install](#install)
|
|||
|
- [Usage examples](#usage-examples)
|
|||
|
- [API](#api)
|
|||
|
- [Syntax extensions](#syntax-extensions)
|
|||
|
- [Benchmark](#benchmark)
|
|||
|
- [Authors](#authors)
|
|||
|
- [References / Thanks](#references--thanks)
|
|||
|
- [License](#license)
|
|||
|
|
|||
|
## Install
|
|||
|
|
|||
|
**node.js** & **bower**:
|
|||
|
|
|||
|
```bash
|
|||
|
npm install markdown-it --save
|
|||
|
bower install markdown-it --save
|
|||
|
```
|
|||
|
|
|||
|
**browser (CDN):**
|
|||
|
|
|||
|
- [jsDeliver CDN](http://www.jsdelivr.com/#!markdown-it "jsDelivr CDN")
|
|||
|
- [cdnjs.com CDN](https://cdnjs.com/libraries/markdown-it "cdnjs.com")
|
|||
|
|
|||
|
|
|||
|
## Usage examples
|
|||
|
|
|||
|
See also:
|
|||
|
|
|||
|
- __[API documentation](https://markdown-it.github.io/markdown-it/)__ - for more
|
|||
|
info and examples.
|
|||
|
- [Development info](https://github.com/markdown-it/markdown-it/tree/master/docs) -
|
|||
|
for plugins writers.
|
|||
|
|
|||
|
|
|||
|
### Simple
|
|||
|
|
|||
|
```js
|
|||
|
// node.js, "classic" way:
|
|||
|
var MarkdownIt = require('markdown-it'),
|
|||
|
md = new MarkdownIt();
|
|||
|
var result = md.render('# markdown-it rulezz!');
|
|||
|
|
|||
|
// node.js, the same, but with sugar:
|
|||
|
var md = require('markdown-it')();
|
|||
|
var result = md.render('# markdown-it rulezz!');
|
|||
|
|
|||
|
// browser without AMD, added to "window" on script load
|
|||
|
// Note, there is no dash in "markdownit".
|
|||
|
var md = window.markdownit();
|
|||
|
var result = md.render('# markdown-it rulezz!');
|
|||
|
```
|
|||
|
|
|||
|
Single line rendering, without paragraph wrap:
|
|||
|
|
|||
|
```js
|
|||
|
var md = require('markdown-it')();
|
|||
|
var 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](https://markdown-it.github.io/markdown-it/#MarkdownIt.new) for more details.
|
|||
|
|
|||
|
```js
|
|||
|
// commonmark mode
|
|||
|
var md = require('markdown-it')('commonmark');
|
|||
|
|
|||
|
// default mode
|
|||
|
var md = require('markdown-it')();
|
|||
|
|
|||
|
// enable everything
|
|||
|
var md = require('markdown-it')({
|
|||
|
html: true,
|
|||
|
linkify: true,
|
|||
|
typographer: true
|
|||
|
});
|
|||
|
|
|||
|
// full options list (defaults)
|
|||
|
var md = require('markdown-it')({
|
|||
|
html: false, // Enable HTML tags in source
|
|||
|
xhtmlOut: false, // Use '/' to close single tags (<br />).
|
|||
|
// This is only for full CommonMark compatibility.
|
|||
|
breaks: false, // Convert '\n' in paragraphs into <br>
|
|||
|
langPrefix: 'language-', // CSS language prefix for fenced blocks. Can be
|
|||
|
// useful for external highlighters.
|
|||
|
linkify: false, // Autoconvert URL-like text to links
|
|||
|
|
|||
|
// Enable some language-neutral replacement + quotes beautification
|
|||
|
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
|
|||
|
|
|||
|
```js
|
|||
|
var md = require('markdown-it')()
|
|||
|
.use(plugin1)
|
|||
|
.use(plugin2, opts, ...)
|
|||
|
.use(plugin3);
|
|||
|
```
|
|||
|
|
|||
|
|
|||
|
### Syntax highlighting
|
|||
|
|
|||
|
Apply syntax highlighting to fenced code blocks with the `highlight` option:
|
|||
|
|
|||
|
```js
|
|||
|
var hljs = require('highlight.js'); // https://highlightjs.org/
|
|||
|
|
|||
|
// Actual default values
|
|||
|
var md = require('markdown-it')({
|
|||
|
highlight: function (str, lang) {
|
|||
|
if (lang && hljs.getLanguage(lang)) {
|
|||
|
try {
|
|||
|
return hljs.highlight(lang, str).value;
|
|||
|
} catch (__) {}
|
|||
|
}
|
|||
|
|
|||
|
return ''; // use external default escaping
|
|||
|
}
|
|||
|
});
|
|||
|
```
|
|||
|
|
|||
|
Or with full wrapper override (if you need assign class to `<pre>`):
|
|||
|
|
|||
|
```js
|
|||
|
var hljs = require('highlight.js'); // https://highlightjs.org/
|
|||
|
|
|||
|
// Actual default values
|
|||
|
var md = require('markdown-it')({
|
|||
|
highlight: function (str, lang) {
|
|||
|
if (lang && hljs.getLanguage(lang)) {
|
|||
|
try {
|
|||
|
return '<pre class="hljs"><code>' +
|
|||
|
hljs.highlight(lang, str, true).value +
|
|||
|
'</code></pre>';
|
|||
|
} catch (__) {}
|
|||
|
}
|
|||
|
|
|||
|
return '<pre class="hljs"><code>' + md.utils.escapeHtml(str) + '</code></pre>';
|
|||
|
}
|
|||
|
});
|
|||
|
```
|
|||
|
|
|||
|
### Linkify
|
|||
|
|
|||
|
`linkify: true` uses [linkify-it](https://github.com/markdown-it/linkify-it). To
|
|||
|
configure linkify-it, access the linkify instance through `md.linkify`:
|
|||
|
|
|||
|
```js
|
|||
|
md.linkify.tlds('.py', false); // disables .py as top level domain
|
|||
|
```
|
|||
|
|
|||
|
|
|||
|
## API
|
|||
|
|
|||
|
__[API documentation](https://markdown-it.github.io/markdown-it/)__
|
|||
|
|
|||
|
If you are going to write plugins - take a look at
|
|||
|
[Development info](https://github.com/markdown-it/markdown-it/tree/master/docs).
|
|||
|
|
|||
|
|
|||
|
## Syntax extensions
|
|||
|
|
|||
|
Embedded (enabled by default):
|
|||
|
|
|||
|
- [Tables](https://help.github.com/articles/organizing-information-with-tables/) (GFM)
|
|||
|
- [Strikethrough](https://help.github.com/articles/basic-writing-and-formatting-syntax/#styling-text) (GFM)
|
|||
|
|
|||
|
Via plugins:
|
|||
|
|
|||
|
- [subscript](https://github.com/markdown-it/markdown-it-sub)
|
|||
|
- [superscript](https://github.com/markdown-it/markdown-it-sup)
|
|||
|
- [footnote](https://github.com/markdown-it/markdown-it-footnote)
|
|||
|
- [definition list](https://github.com/markdown-it/markdown-it-deflist)
|
|||
|
- [abbreviation](https://github.com/markdown-it/markdown-it-abbr)
|
|||
|
- [emoji](https://github.com/markdown-it/markdown-it-emoji)
|
|||
|
- [custom container](https://github.com/markdown-it/markdown-it-container)
|
|||
|
- [insert](https://github.com/markdown-it/markdown-it-ins)
|
|||
|
- [mark](https://github.com/markdown-it/markdown-it-mark)
|
|||
|
- ... and [others](https://www.npmjs.org/browse/keyword/markdown-it-plugin)
|
|||
|
|
|||
|
|
|||
|
### Manage rules
|
|||
|
|
|||
|
By default all rules are enabled, but can be restricted by options. On plugin
|
|||
|
load all its rules are enabled automatically.
|
|||
|
|
|||
|
```js
|
|||
|
// Activate/deactivate rules, with curring
|
|||
|
var md = require('markdown-it')()
|
|||
|
.disable([ 'link', 'image' ])
|
|||
|
.enable([ 'link' ])
|
|||
|
.enable('image');
|
|||
|
|
|||
|
// Enable everything
|
|||
|
md = require('markdown-it')({
|
|||
|
html: true,
|
|||
|
linkify: true,
|
|||
|
typographer: true,
|
|||
|
});
|
|||
|
```
|
|||
|
|
|||
|
|
|||
|
## Benchmark
|
|||
|
|
|||
|
Here is the result of readme parse at MB Pro Retina 2013 (2.4 GHz):
|
|||
|
|
|||
|
```bash
|
|||
|
make benchmark-deps
|
|||
|
benchmark/benchmark.js 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](https://github.com/markdown-it/markdown-it/blob/master/benchmark/implementations/current-commonmark/index.js)
|
|||
|
for more "honest" compare. Difference is ~ 1.5x.
|
|||
|
|
|||
|
As you can see, `markdown-it` doesn't pay with speed for it's flexibility.
|
|||
|
Slowdown of "full" version caused by additional features not available in
|
|||
|
other implementations.
|
|||
|
|
|||
|
|
|||
|
## Authors
|
|||
|
|
|||
|
- Alex Kocharin [github/rlidwka](https://github.com/rlidwka)
|
|||
|
- Vitaly Puzrin [github/puzrin](https://github.com/puzrin)
|
|||
|
|
|||
|
_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](https://github.com/jgm) 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**
|
|||
|
|
|||
|
- [motion-markdown-it](https://github.com/digitalmoksha/motion-markdown-it) - Ruby/RubyMotion
|
|||
|
|
|||
|
|
|||
|
## License
|
|||
|
|
|||
|
[MIT](https://github.com/markdown-it/markdown-it/blob/master/LICENSE)
|