2011-07-24 08:15:35 -05:00
|
|
|
# marked
|
|
|
|
|
2013-08-07 10:36:54 -05:00
|
|
|
> A full-featured markdown parser and compiler, written in javascript. Built
|
|
|
|
> for speed.
|
2013-06-28 11:54:34 -07:00
|
|
|
|
2013-08-07 10:36:54 -05:00
|
|
|
[][badge]
|
2013-06-28 11:54:34 -07:00
|
|
|
|
|
|
|
## Install
|
|
|
|
|
|
|
|
``` bash
|
|
|
|
npm install marked --save
|
|
|
|
```
|
|
|
|
|
|
|
|
## Usage
|
|
|
|
|
|
|
|
Minimal usage:
|
2013-08-07 10:36:54 -05:00
|
|
|
|
2013-06-28 11:54:34 -07:00
|
|
|
```js
|
|
|
|
console.log(marked('I am using __markdown__.'));
|
|
|
|
// Outputs: <p>I am using <i>markdown</i>.</p>
|
|
|
|
```
|
|
|
|
|
|
|
|
Example using all options:
|
2013-08-07 10:36:54 -05:00
|
|
|
|
2013-06-28 11:54:34 -07:00
|
|
|
```js
|
|
|
|
// Set default options except highlight which has no default
|
|
|
|
marked.setOptions({
|
|
|
|
gfm: true,
|
|
|
|
highlight: function (code, lang, callback) {
|
|
|
|
pygmentize({ lang: lang, format: 'html' }, code, function (err, result) {
|
2013-08-07 10:36:54 -05:00
|
|
|
if (err) return callback(err);
|
|
|
|
callback(null, result.toString());
|
2013-06-28 11:54:34 -07:00
|
|
|
});
|
|
|
|
},
|
|
|
|
tables: true,
|
|
|
|
breaks: false,
|
|
|
|
pedantic: false,
|
|
|
|
sanitize: true,
|
|
|
|
smartLists: true,
|
|
|
|
smartypants: false,
|
|
|
|
langPrefix: 'lang-'
|
|
|
|
});
|
|
|
|
|
2013-07-04 11:04:04 -07:00
|
|
|
// Using async version of marked
|
|
|
|
marked('I am using __markdown__.', function (err, content) {
|
|
|
|
if (err) throw err;
|
|
|
|
console.log(content);
|
|
|
|
});
|
2013-06-28 11:54:34 -07:00
|
|
|
```
|
|
|
|
|
|
|
|
## marked(markdownString, [options], [callback])
|
|
|
|
|
|
|
|
### markdownString
|
2013-08-07 10:36:54 -05:00
|
|
|
|
2013-06-28 11:54:34 -07:00
|
|
|
Type: `String`
|
|
|
|
|
|
|
|
String of markdown source to be compiled.
|
|
|
|
|
|
|
|
### options
|
2013-08-07 10:36:54 -05:00
|
|
|
|
2013-06-28 11:54:34 -07:00
|
|
|
Type: `Object`
|
|
|
|
|
2013-08-07 10:36:54 -05:00
|
|
|
Hash of options. Can also be set using the `marked.setOptions` method as seen
|
|
|
|
above.
|
2013-06-28 11:54:34 -07:00
|
|
|
|
|
|
|
### callback
|
2013-08-07 10:36:54 -05:00
|
|
|
|
2013-06-28 11:54:34 -07:00
|
|
|
Type: `Function`
|
|
|
|
|
2013-08-07 10:36:54 -05:00
|
|
|
Function called when the `markdownString` has been fully parsed when using
|
|
|
|
async highlighting. If the `options` argument is omitted, this can be used as
|
|
|
|
the second argument as seen above:
|
2013-07-04 11:04:04 -07:00
|
|
|
|
2013-06-28 11:54:34 -07:00
|
|
|
## Options
|
|
|
|
|
|
|
|
### gfm
|
2013-08-07 10:36:54 -05:00
|
|
|
|
2013-06-28 11:54:34 -07:00
|
|
|
Type: `Boolean`
|
|
|
|
Default: `true`
|
|
|
|
|
2013-08-07 10:36:54 -05:00
|
|
|
Enable [GitHub flavored markdown][gfm].
|
2013-06-28 11:54:34 -07:00
|
|
|
|
|
|
|
### highlight
|
2013-08-07 10:36:54 -05:00
|
|
|
|
2013-06-28 11:54:34 -07:00
|
|
|
Type: `Function`
|
|
|
|
|
2013-08-07 10:36:54 -05:00
|
|
|
A function to highlight code blocks. The function takes three arguments: code,
|
|
|
|
lang, and callback. The above example uses async highlighting with
|
|
|
|
[node-pygementize-bundled][pygmentize], and here is a synchronous example using
|
|
|
|
[highlight.js][highlight] which doesn't require the callback argument:
|
2013-06-28 11:54:34 -07:00
|
|
|
|
|
|
|
```js
|
|
|
|
marked.setOptions({
|
2013-07-06 04:13:52 -07:00
|
|
|
highlight: function (code, lang) {
|
2013-08-03 15:17:44 +01:00
|
|
|
return hljs.highlightAuto(lang, code).value;
|
2013-06-28 11:54:34 -07:00
|
|
|
}
|
|
|
|
});
|
|
|
|
```
|
|
|
|
|
|
|
|
#### highlight arguments
|
2013-08-07 10:36:54 -05:00
|
|
|
|
2013-06-28 11:54:34 -07:00
|
|
|
`code`
|
|
|
|
|
|
|
|
Type: `String`
|
|
|
|
|
|
|
|
The section of code to pass to the highlighter.
|
|
|
|
|
|
|
|
`lang`
|
|
|
|
|
|
|
|
Type: `String`
|
|
|
|
|
|
|
|
The programming language specified in the code block.
|
|
|
|
|
|
|
|
`callback`
|
|
|
|
|
|
|
|
Type: `String`
|
|
|
|
|
|
|
|
The callback function to call when using an async highlighter.
|
|
|
|
|
|
|
|
### tables
|
2013-08-07 10:36:54 -05:00
|
|
|
|
2013-06-28 11:54:34 -07:00
|
|
|
Type: `Boolean`
|
|
|
|
Default: `true`
|
|
|
|
|
2013-08-07 10:36:54 -05:00
|
|
|
Enable GFM [tables][tables].
|
|
|
|
This option requires the `gfm` option to be true.
|
2013-06-28 11:54:34 -07:00
|
|
|
|
|
|
|
### breaks
|
2013-08-07 10:36:54 -05:00
|
|
|
|
2013-06-28 11:54:34 -07:00
|
|
|
Type: `Boolean`
|
|
|
|
Default: `false`
|
|
|
|
|
2013-08-07 10:36:54 -05:00
|
|
|
Enable GFM [line breaks][breaks].
|
|
|
|
This option requires the `gfm` option to be true.
|
2013-06-28 11:54:34 -07:00
|
|
|
|
|
|
|
### pedantic
|
2013-08-07 10:36:54 -05:00
|
|
|
|
2013-06-28 11:54:34 -07:00
|
|
|
Type: `Boolean`
|
|
|
|
Default: `false`
|
|
|
|
|
2013-08-07 10:36:54 -05:00
|
|
|
Conform to obscure parts of `markdown.pl` as much as possible. Don't fix any of
|
|
|
|
the original markdown bugs or poor behavior.
|
2013-06-28 11:54:34 -07:00
|
|
|
|
|
|
|
### sanitize
|
2013-08-07 10:36:54 -05:00
|
|
|
|
2013-06-28 11:54:34 -07:00
|
|
|
Type: `Boolean`
|
2013-07-25 13:37:55 -04:00
|
|
|
Default: `false`
|
2013-06-28 11:54:34 -07:00
|
|
|
|
|
|
|
Sanitize the output. Ignore any HTML that has been input.
|
|
|
|
|
|
|
|
### smartLists
|
2013-08-07 10:36:54 -05:00
|
|
|
|
2013-06-28 11:54:34 -07:00
|
|
|
Type: `Boolean`
|
|
|
|
Default: `true`
|
|
|
|
|
2013-08-07 10:36:54 -05:00
|
|
|
Use smarter list behavior than the original markdown. May eventually be
|
|
|
|
default with the old behavior moved into `pedantic`.
|
2013-06-28 11:54:34 -07:00
|
|
|
|
|
|
|
### smartypants
|
2013-08-07 10:36:54 -05:00
|
|
|
|
2013-06-28 11:54:34 -07:00
|
|
|
Type: `Boolean`
|
|
|
|
Default: `false`
|
|
|
|
|
2013-08-07 10:36:54 -05:00
|
|
|
Use "smart" typograhic punctuation for things like quotes and dashes.
|
2013-06-28 11:54:34 -07:00
|
|
|
|
|
|
|
### langPrefix
|
2013-08-07 10:36:54 -05:00
|
|
|
|
2013-06-28 11:54:34 -07:00
|
|
|
Type: `String`
|
|
|
|
Default: `lang-`
|
|
|
|
|
|
|
|
Set the prefix for code block classes.
|
|
|
|
|
|
|
|
## Access to lexer and parser
|
2013-08-07 10:36:54 -05:00
|
|
|
|
2013-06-28 11:54:34 -07:00
|
|
|
You also have direct access to the lexer and parser if you so desire.
|
|
|
|
|
|
|
|
``` js
|
|
|
|
var tokens = marked.lexer(text, options);
|
|
|
|
console.log(marked.parser(tokens));
|
|
|
|
```
|
|
|
|
|
|
|
|
``` js
|
|
|
|
var lexer = new marked.Lexer(options);
|
|
|
|
var tokens = lexer.lex(text);
|
|
|
|
console.log(tokens);
|
|
|
|
console.log(lexer.rules);
|
|
|
|
```
|
|
|
|
|
|
|
|
## CLI
|
|
|
|
|
|
|
|
``` bash
|
|
|
|
$ marked -o hello.html
|
|
|
|
hello world
|
|
|
|
^D
|
|
|
|
$ cat hello.html
|
|
|
|
<p>hello world</p>
|
|
|
|
```
|
2011-07-24 08:15:35 -05:00
|
|
|
|
|
|
|
## Benchmarks
|
|
|
|
|
2011-12-10 15:21:01 -06:00
|
|
|
node v0.4.x
|
|
|
|
|
2011-08-10 21:52:54 -05:00
|
|
|
``` bash
|
2011-08-26 05:20:42 -05:00
|
|
|
$ node test --bench
|
2011-10-22 09:16:14 -05:00
|
|
|
marked completed in 12071ms.
|
|
|
|
showdown (reuse converter) completed in 27387ms.
|
|
|
|
showdown (new converter) completed in 75617ms.
|
|
|
|
markdown-js completed in 70069ms.
|
2011-08-10 21:52:54 -05:00
|
|
|
```
|
2011-07-24 08:15:35 -05:00
|
|
|
|
2011-12-10 15:21:01 -06:00
|
|
|
node v0.6.x
|
|
|
|
|
|
|
|
``` bash
|
|
|
|
$ node test --bench
|
2012-02-20 07:54:26 -06:00
|
|
|
marked completed in 6448ms.
|
|
|
|
marked (gfm) completed in 7357ms.
|
|
|
|
marked (pedantic) completed in 6092ms.
|
|
|
|
discount completed in 7314ms.
|
|
|
|
showdown (reuse converter) completed in 16018ms.
|
|
|
|
showdown (new converter) completed in 18234ms.
|
|
|
|
markdown-js completed in 24270ms.
|
2011-12-10 15:21:01 -06:00
|
|
|
```
|
|
|
|
|
2012-01-16 22:59:05 -06:00
|
|
|
__Marked is now faster than Discount, which is written in C.__
|
2012-01-03 02:25:47 -06:00
|
|
|
|
|
|
|
For those feeling skeptical: These benchmarks run the entire markdown test suite
|
|
|
|
1000 times. The test suite tests every feature. It doesn't cater to specific
|
|
|
|
aspects.
|
|
|
|
|
2013-03-01 17:25:28 +08:00
|
|
|
node v0.8.x
|
|
|
|
|
|
|
|
``` bash
|
|
|
|
$ node test --bench
|
|
|
|
marked completed in 3411ms.
|
|
|
|
marked (gfm) completed in 3727ms.
|
|
|
|
marked (pedantic) completed in 3201ms.
|
|
|
|
robotskirt completed in 808ms.
|
|
|
|
showdown (reuse converter) completed in 11954ms.
|
|
|
|
showdown (new converter) completed in 17774ms.
|
|
|
|
markdown-js completed in 17191ms.
|
|
|
|
```
|
|
|
|
|
2012-04-06 02:56:12 -05:00
|
|
|
## Another Javascript Markdown Parser
|
2011-08-23 00:07:50 -05:00
|
|
|
|
2011-10-22 09:16:14 -05:00
|
|
|
The point of marked was to create a markdown compiler where it was possible to
|
|
|
|
frequently parse huge chunks of markdown without having to worry about
|
2011-07-24 08:15:35 -05:00
|
|
|
caching the compiled output somehow...or blocking for an unnecesarily long time.
|
|
|
|
|
2011-12-10 15:21:01 -06:00
|
|
|
marked is very concise and still implements all markdown features. It is also
|
|
|
|
now fully compatible with the client-side.
|
2011-07-24 08:15:35 -05:00
|
|
|
|
2011-10-22 09:16:14 -05:00
|
|
|
marked more or less passes the official markdown test suite in its
|
|
|
|
entirety. This is important because a surprising number of markdown compilers
|
|
|
|
cannot pass more than a few tests. It was very difficult to get marked as
|
|
|
|
compliant as it is. It could have cut corners in several areas for the sake
|
|
|
|
of performance, but did not in order to be exactly what you expect in terms
|
|
|
|
of a markdown rendering. In fact, this is why marked could be considered at a
|
2011-08-26 05:20:42 -05:00
|
|
|
disadvantage in the benchmarks above.
|
2011-07-24 08:15:35 -05:00
|
|
|
|
2013-08-07 10:36:54 -05:00
|
|
|
Along with implementing every markdown feature, marked also implements [GFM
|
|
|
|
features][gfmf].
|
2012-01-03 11:13:36 -06:00
|
|
|
|
2011-08-26 05:20:42 -05:00
|
|
|
``` bash
|
|
|
|
$ node
|
|
|
|
> require('marked').lexer('> i am using marked.')
|
|
|
|
[ { type: 'blockquote_start' },
|
2012-04-06 02:56:12 -05:00
|
|
|
{ type: 'paragraph',
|
|
|
|
text: 'i am using marked.' },
|
2011-08-26 05:20:42 -05:00
|
|
|
{ type: 'blockquote_end' },
|
|
|
|
links: {} ]
|
|
|
|
```
|
|
|
|
|
2013-08-07 10:36:54 -05:00
|
|
|
## Running Tests & Contributing
|
|
|
|
|
|
|
|
If you want to submit a pull request, make sure your changes pass the test
|
|
|
|
suite. If you're adding a new feature, be sure to add your own test.
|
|
|
|
|
|
|
|
The marked test suite is set up slightly strangely: `test/new` is for all tests
|
|
|
|
that are not part of the original markdown.pl test suite (this is where your
|
|
|
|
test should go if you make one). `test/original` is only for the original
|
|
|
|
markdown.pl tests. `test/tests` houses both types of tests after they have been
|
|
|
|
combined and moved/generated by running `node test --fix` or `marked --test
|
|
|
|
--fix`.
|
|
|
|
|
|
|
|
In other words, if you have a test to add, add it to `test/new/` and then
|
|
|
|
regenerate the tests with `node test --fix`. Commit the result. If your test
|
|
|
|
uses a certain feature, for example, maybe it assumes GFM is *not* enabled, you
|
|
|
|
can add `.nogfm` to the filename. So, `my-test.text` becomes
|
|
|
|
`my-test.nogfm.text`. You can do this with any marked option. Say you want
|
|
|
|
line breaks and smartypants enabled, your filename should be:
|
|
|
|
`my-test.breaks.smartypants.text`.
|
|
|
|
|
|
|
|
To run the tests:
|
|
|
|
|
2013-08-07 11:57:46 -05:00
|
|
|
``` bash
|
2013-08-07 10:36:54 -05:00
|
|
|
cd marked/
|
|
|
|
node test
|
|
|
|
```
|
|
|
|
|
2013-08-12 11:09:16 -05:00
|
|
|
### Contribution and License Agreement
|
|
|
|
|
|
|
|
If you contribute code to marked, you are implicitly allowing your code to be
|
|
|
|
distributed under the MIT license. You are also implicitly verifying that all
|
|
|
|
code is your original work. `</legalese>`
|
|
|
|
|
2012-01-03 00:35:47 -06:00
|
|
|
## License
|
|
|
|
|
2013-01-04 18:26:43 -06:00
|
|
|
Copyright (c) 2011-2013, Christopher Jeffrey. (MIT License)
|
2012-01-03 00:35:47 -06:00
|
|
|
|
|
|
|
See LICENSE for more info.
|
2013-08-07 10:36:54 -05:00
|
|
|
|
|
|
|
[gfm]: https://help.github.com/articles/github-flavored-markdown
|
|
|
|
[gfmf]: http://github.github.com/github-flavored-markdown/
|
|
|
|
[pygmentize]: https://github.com/rvagg/node-pygmentize-bundled
|
|
|
|
[highlight]: https://github.com/isagalaev/highlight.js
|
|
|
|
[badge]: http://badge.fury.io/js/marked
|
|
|
|
[tables]: https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet#wiki-tables
|
|
|
|
[breaks]: https://help.github.com/articles/github-flavored-markdown#newlines
|