mirror of https://github.com/nodejs/node.git
tools: update marked dependency
Update module marked. Customize renderer to remove id from heading. PR-URL: https://github.com/nodejs/node/pull/6396 Reviewed-By: Roman Reiss <me@silverwind.io> Reviewed-By: Anna Henningsen <anna@addaleax.net>
This commit is contained in:
parent
4d4cfb27ca
commit
3f69ea53fd
|
@ -81,7 +81,7 @@ var testData = [
|
||||||
'added': ['v1.0.0']
|
'added': ['v1.0.0']
|
||||||
},
|
},
|
||||||
'desc': '<p>Describe <code>Foobar</code> in more detail ' +
|
'desc': '<p>Describe <code>Foobar</code> in more detail ' +
|
||||||
'here.\n\n</p>\n',
|
'here.</p>\n',
|
||||||
'type': 'module',
|
'type': 'module',
|
||||||
'displayName': 'Foobar'
|
'displayName': 'Foobar'
|
||||||
},
|
},
|
||||||
|
@ -92,7 +92,7 @@ var testData = [
|
||||||
'added': ['v5.3.0', 'v4.2.0']
|
'added': ['v5.3.0', 'v4.2.0']
|
||||||
},
|
},
|
||||||
'desc': '<p>Describe <code>Foobar II</code> in more detail ' +
|
'desc': '<p>Describe <code>Foobar II</code> in more detail ' +
|
||||||
'here.\n\n</p>\n',
|
'here.</p>\n',
|
||||||
'type': 'module',
|
'type': 'module',
|
||||||
'displayName': 'Foobar II'
|
'displayName': 'Foobar II'
|
||||||
},
|
},
|
||||||
|
@ -104,15 +104,15 @@ var testData = [
|
||||||
'deprecated': ['v2.0.0']
|
'deprecated': ['v2.0.0']
|
||||||
},
|
},
|
||||||
'desc': '<p>Describe <code>Deprecated thingy</code> in more ' +
|
'desc': '<p>Describe <code>Deprecated thingy</code> in more ' +
|
||||||
'detail here.\n\n</p>\n',
|
'detail here.</p>\n',
|
||||||
'type': 'module',
|
'type': 'module',
|
||||||
'displayName': 'Deprecated thingy'
|
'displayName': 'Deprecated thingy'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
'textRaw': 'Something',
|
'textRaw': 'Something',
|
||||||
'name': 'something',
|
'name': 'something',
|
||||||
'desc': '<!-- This is not a metadata comment -->\n\n<p>' +
|
'desc': '<!-- This is not a metadata comment -->\n<p>' +
|
||||||
'Describe <code>Something</code> in more detail here.\n</p>\n',
|
'Describe <code>Something</code> in more detail here.</p>\n',
|
||||||
'type': 'module',
|
'type': 'module',
|
||||||
'displayName': 'Something'
|
'displayName': 'Something'
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,6 +9,15 @@ const typeParser = require('./type-parser.js');
|
||||||
|
|
||||||
module.exports = toHTML;
|
module.exports = toHTML;
|
||||||
|
|
||||||
|
// customized heading without id attribute
|
||||||
|
var renderer = new marked.Renderer();
|
||||||
|
renderer.heading = function(text, level) {
|
||||||
|
return '<h' + level + '>' + text + '</h' + level + '>\n';
|
||||||
|
};
|
||||||
|
marked.setOptions({
|
||||||
|
renderer: renderer
|
||||||
|
});
|
||||||
|
|
||||||
// TODO(chrisdickinson): never stop vomitting / fix this.
|
// TODO(chrisdickinson): never stop vomitting / fix this.
|
||||||
var gtocPath = path.resolve(path.join(
|
var gtocPath = path.resolve(path.join(
|
||||||
__dirname,
|
__dirname,
|
||||||
|
|
|
@ -8,6 +8,15 @@ module.exports = doJSON;
|
||||||
const common = require('./common.js');
|
const common = require('./common.js');
|
||||||
const marked = require('marked');
|
const marked = require('marked');
|
||||||
|
|
||||||
|
// customized heading without id attribute
|
||||||
|
var renderer = new marked.Renderer();
|
||||||
|
renderer.heading = function(text, level) {
|
||||||
|
return '<h' + level + '>' + text + '</h' + level + '>\n';
|
||||||
|
};
|
||||||
|
marked.setOptions({
|
||||||
|
renderer: renderer
|
||||||
|
});
|
||||||
|
|
||||||
function doJSON(input, filename, cb) {
|
function doJSON(input, filename, cb) {
|
||||||
var root = {source: filename};
|
var root = {source: filename};
|
||||||
var stack = [root];
|
var stack = [root];
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
language: node_js
|
||||||
|
node_js:
|
||||||
|
- "0.10"
|
||||||
|
- "0.8"
|
||||||
|
- "0.6"
|
|
@ -0,0 +1,22 @@
|
||||||
|
var gulp = require('gulp');
|
||||||
|
var uglify = require('gulp-uglify');
|
||||||
|
var concat = require('gulp-concat');
|
||||||
|
|
||||||
|
var preserveFirstComment = function() {
|
||||||
|
var set = false;
|
||||||
|
|
||||||
|
return function() {
|
||||||
|
if (set) return false;
|
||||||
|
set = true;
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
gulp.task('uglify', function() {
|
||||||
|
gulp.src('lib/marked.js')
|
||||||
|
.pipe(uglify({preserveComments: preserveFirstComment()}))
|
||||||
|
.pipe(concat('marked.min.js'))
|
||||||
|
.pipe(gulp.dest('.'));
|
||||||
|
});
|
||||||
|
|
||||||
|
gulp.task('default', ['uglify']);
|
|
@ -1,4 +1,4 @@
|
||||||
Copyright (c) 2011-2012, Christopher Jeffrey (https://github.com/chjj/)
|
Copyright (c) 2011-2014, Christopher Jeffrey (https://github.com/chjj/)
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
|
|
@ -1,9 +1,12 @@
|
||||||
all:
|
all:
|
||||||
@cp lib/marked.js marked.js
|
@cp lib/marked.js marked.js
|
||||||
@uglifyjs -o marked.min.js marked.js
|
@uglifyjs --comments '/\*[^\0]+?Copyright[^\0]+?\*/' -o marked.min.js lib/marked.js
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
@rm marked.js
|
@rm marked.js
|
||||||
@rm marked.min.js
|
@rm marked.min.js
|
||||||
|
|
||||||
|
bench:
|
||||||
|
@node test --bench
|
||||||
|
|
||||||
.PHONY: clean all
|
.PHONY: clean all
|
||||||
|
|
|
@ -1,47 +1,299 @@
|
||||||
# marked
|
# marked
|
||||||
|
|
||||||
A full-featured markdown parser and compiler.
|
> A full-featured markdown parser and compiler, written in JavaScript. Built
|
||||||
Built for speed.
|
> for speed.
|
||||||
|
|
||||||
## Benchmarks
|
[][badge]
|
||||||
|
|
||||||
node v0.4.x
|
|
||||||
|
|
||||||
``` bash
|
|
||||||
$ node test --bench
|
|
||||||
marked completed in 12071ms.
|
|
||||||
showdown (reuse converter) completed in 27387ms.
|
|
||||||
showdown (new converter) completed in 75617ms.
|
|
||||||
markdown-js completed in 70069ms.
|
|
||||||
```
|
|
||||||
|
|
||||||
node v0.6.x
|
|
||||||
|
|
||||||
``` bash
|
|
||||||
$ node test --bench
|
|
||||||
marked completed in 6485ms.
|
|
||||||
marked (with gfm) completed in 7466ms.
|
|
||||||
discount completed in 7169ms.
|
|
||||||
showdown (reuse converter) completed in 15937ms.
|
|
||||||
showdown (new converter) completed in 18279ms.
|
|
||||||
markdown-js completed in 23572ms.
|
|
||||||
```
|
|
||||||
|
|
||||||
__Marked is now faster than Discount, which is written in C.__
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
Benchmarks for other engines to come (?).
|
|
||||||
|
|
||||||
## Install
|
## Install
|
||||||
|
|
||||||
``` bash
|
``` bash
|
||||||
$ npm install marked
|
npm install marked --save
|
||||||
```
|
```
|
||||||
|
|
||||||
## Another javascript markdown parser
|
## Usage
|
||||||
|
|
||||||
|
Minimal usage:
|
||||||
|
|
||||||
|
```js
|
||||||
|
var marked = require('marked');
|
||||||
|
console.log(marked('I am using __markdown__.'));
|
||||||
|
// Outputs: <p>I am using <strong>markdown</strong>.</p>
|
||||||
|
```
|
||||||
|
|
||||||
|
Example setting options with default values:
|
||||||
|
|
||||||
|
```js
|
||||||
|
var marked = require('marked');
|
||||||
|
marked.setOptions({
|
||||||
|
renderer: new marked.Renderer(),
|
||||||
|
gfm: true,
|
||||||
|
tables: true,
|
||||||
|
breaks: false,
|
||||||
|
pedantic: false,
|
||||||
|
sanitize: true,
|
||||||
|
smartLists: true,
|
||||||
|
smartypants: false
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log(marked('I am using __markdown__.'));
|
||||||
|
```
|
||||||
|
|
||||||
|
### Browser
|
||||||
|
|
||||||
|
```html
|
||||||
|
<!doctype html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8"/>
|
||||||
|
<title>Marked in the browser</title>
|
||||||
|
<script src="lib/marked.js"></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="content"></div>
|
||||||
|
<script>
|
||||||
|
document.getElementById('content').innerHTML =
|
||||||
|
marked('# Marked in browser\n\nRendered by **marked**.');
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
```
|
||||||
|
|
||||||
|
## marked(markdownString [,options] [,callback])
|
||||||
|
|
||||||
|
### markdownString
|
||||||
|
|
||||||
|
Type: `string`
|
||||||
|
|
||||||
|
String of markdown source to be compiled.
|
||||||
|
|
||||||
|
### options
|
||||||
|
|
||||||
|
Type: `object`
|
||||||
|
|
||||||
|
Hash of options. Can also be set using the `marked.setOptions` method as seen
|
||||||
|
above.
|
||||||
|
|
||||||
|
### callback
|
||||||
|
|
||||||
|
Type: `function`
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
## Options
|
||||||
|
|
||||||
|
### highlight
|
||||||
|
|
||||||
|
Type: `function`
|
||||||
|
|
||||||
|
A function to highlight code blocks. The first example below uses async highlighting with
|
||||||
|
[node-pygmentize-bundled][pygmentize], and the second is a synchronous example using
|
||||||
|
[highlight.js][highlight]:
|
||||||
|
|
||||||
|
```js
|
||||||
|
var marked = require('marked');
|
||||||
|
|
||||||
|
var markdownString = '```js\n console.log("hello"); \n```';
|
||||||
|
|
||||||
|
// Async highlighting with pygmentize-bundled
|
||||||
|
marked.setOptions({
|
||||||
|
highlight: function (code, lang, callback) {
|
||||||
|
require('pygmentize-bundled')({ lang: lang, format: 'html' }, code, function (err, result) {
|
||||||
|
callback(err, result.toString());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Using async version of marked
|
||||||
|
marked(markdownString, function (err, content) {
|
||||||
|
if (err) throw err;
|
||||||
|
console.log(content);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Synchronous highlighting with highlight.js
|
||||||
|
marked.setOptions({
|
||||||
|
highlight: function (code) {
|
||||||
|
return require('highlight.js').highlightAuto(code).value;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log(marked(markdownString));
|
||||||
|
```
|
||||||
|
|
||||||
|
#### highlight arguments
|
||||||
|
|
||||||
|
`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: `function`
|
||||||
|
|
||||||
|
The callback function to call when using an async highlighter.
|
||||||
|
|
||||||
|
### renderer
|
||||||
|
|
||||||
|
Type: `object`
|
||||||
|
Default: `new Renderer()`
|
||||||
|
|
||||||
|
An object containing functions to render tokens to HTML.
|
||||||
|
|
||||||
|
#### Overriding renderer methods
|
||||||
|
|
||||||
|
The renderer option allows you to render tokens in a custom manner. Here is an
|
||||||
|
example of overriding the default heading token rendering by adding an embedded anchor tag like on GitHub:
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
var marked = require('marked');
|
||||||
|
var renderer = new marked.Renderer();
|
||||||
|
|
||||||
|
renderer.heading = function (text, level) {
|
||||||
|
var escapedText = text.toLowerCase().replace(/[^\w]+/g, '-');
|
||||||
|
|
||||||
|
return '<h' + level + '><a name="' +
|
||||||
|
escapedText +
|
||||||
|
'" class="anchor" href="#' +
|
||||||
|
escapedText +
|
||||||
|
'"><span class="header-link"></span></a>' +
|
||||||
|
text + '</h' + level + '>';
|
||||||
|
},
|
||||||
|
|
||||||
|
console.log(marked('# heading+', { renderer: renderer }));
|
||||||
|
```
|
||||||
|
This code will output the following HTML:
|
||||||
|
```html
|
||||||
|
<h1>
|
||||||
|
<a name="heading-" class="anchor" href="#heading-">
|
||||||
|
<span class="header-link"></span>
|
||||||
|
</a>
|
||||||
|
heading+
|
||||||
|
</h1>
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Block level renderer methods
|
||||||
|
|
||||||
|
- code(*string* code, *string* language)
|
||||||
|
- blockquote(*string* quote)
|
||||||
|
- html(*string* html)
|
||||||
|
- heading(*string* text, *number* level)
|
||||||
|
- hr()
|
||||||
|
- list(*string* body, *boolean* ordered)
|
||||||
|
- listitem(*string* text)
|
||||||
|
- paragraph(*string* text)
|
||||||
|
- table(*string* header, *string* body)
|
||||||
|
- tablerow(*string* content)
|
||||||
|
- tablecell(*string* content, *object* flags)
|
||||||
|
|
||||||
|
`flags` has the following properties:
|
||||||
|
|
||||||
|
```js
|
||||||
|
{
|
||||||
|
header: true || false,
|
||||||
|
align: 'center' || 'left' || 'right'
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Inline level renderer methods
|
||||||
|
|
||||||
|
- strong(*string* text)
|
||||||
|
- em(*string* text)
|
||||||
|
- codespan(*string* code)
|
||||||
|
- br()
|
||||||
|
- del(*string* text)
|
||||||
|
- link(*string* href, *string* title, *string* text)
|
||||||
|
- image(*string* href, *string* title, *string* text)
|
||||||
|
|
||||||
|
### gfm
|
||||||
|
|
||||||
|
Type: `boolean`
|
||||||
|
Default: `true`
|
||||||
|
|
||||||
|
Enable [GitHub flavored markdown][gfm].
|
||||||
|
|
||||||
|
### tables
|
||||||
|
|
||||||
|
Type: `boolean`
|
||||||
|
Default: `true`
|
||||||
|
|
||||||
|
Enable GFM [tables][tables].
|
||||||
|
This option requires the `gfm` option to be true.
|
||||||
|
|
||||||
|
### breaks
|
||||||
|
|
||||||
|
Type: `boolean`
|
||||||
|
Default: `false`
|
||||||
|
|
||||||
|
Enable GFM [line breaks][breaks].
|
||||||
|
This option requires the `gfm` option to be true.
|
||||||
|
|
||||||
|
### pedantic
|
||||||
|
|
||||||
|
Type: `boolean`
|
||||||
|
Default: `false`
|
||||||
|
|
||||||
|
Conform to obscure parts of `markdown.pl` as much as possible. Don't fix any of
|
||||||
|
the original markdown bugs or poor behavior.
|
||||||
|
|
||||||
|
### sanitize
|
||||||
|
|
||||||
|
Type: `boolean`
|
||||||
|
Default: `false`
|
||||||
|
|
||||||
|
Sanitize the output. Ignore any HTML that has been input.
|
||||||
|
|
||||||
|
### smartLists
|
||||||
|
|
||||||
|
Type: `boolean`
|
||||||
|
Default: `true`
|
||||||
|
|
||||||
|
Use smarter list behavior than the original markdown. May eventually be
|
||||||
|
default with the old behavior moved into `pedantic`.
|
||||||
|
|
||||||
|
### smartypants
|
||||||
|
|
||||||
|
Type: `boolean`
|
||||||
|
Default: `false`
|
||||||
|
|
||||||
|
Use "smart" typograhic punctuation for things like quotes and dashes.
|
||||||
|
|
||||||
|
## Access to lexer and parser
|
||||||
|
|
||||||
|
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>
|
||||||
|
```
|
||||||
|
|
||||||
|
## Philosophy behind marked
|
||||||
|
|
||||||
The point of marked was to create a markdown compiler where it was possible to
|
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
|
frequently parse huge chunks of markdown without having to worry about
|
||||||
|
@ -58,78 +310,97 @@ 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
|
of a markdown rendering. In fact, this is why marked could be considered at a
|
||||||
disadvantage in the benchmarks above.
|
disadvantage in the benchmarks above.
|
||||||
|
|
||||||
Along with implementing every markdown feature, marked also implements
|
Along with implementing every markdown feature, marked also implements [GFM
|
||||||
[GFM features](http://github.github.com/github-flavored-markdown/).
|
features][gfmf].
|
||||||
|
|
||||||
## Usage
|
## Benchmarks
|
||||||
|
|
||||||
``` js
|
node v0.8.x
|
||||||
var marked = require('marked');
|
|
||||||
console.log(marked('i am using __markdown__.'));
|
``` 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.
|
||||||
```
|
```
|
||||||
|
|
||||||
|
__Marked is now faster than Discount, which is written in C.__
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
### Pro level
|
||||||
|
|
||||||
You also have direct access to the lexer and parser if you so desire.
|
You also have direct access to the lexer and parser if you so desire.
|
||||||
|
|
||||||
``` js
|
``` js
|
||||||
var tokens = marked.lexer(str);
|
var tokens = marked.lexer(text, options);
|
||||||
console.log(marked.parser(tokens));
|
console.log(marked.parser(tokens));
|
||||||
```
|
```
|
||||||
|
|
||||||
|
``` js
|
||||||
|
var lexer = new marked.Lexer(options);
|
||||||
|
var tokens = lexer.lex(text);
|
||||||
|
console.log(tokens);
|
||||||
|
console.log(lexer.rules);
|
||||||
|
```
|
||||||
|
|
||||||
``` bash
|
``` bash
|
||||||
$ node
|
$ node
|
||||||
> require('marked').lexer('> i am using marked.')
|
> require('marked').lexer('> i am using marked.')
|
||||||
[ { type: 'blockquote_start' },
|
[ { type: 'blockquote_start' },
|
||||||
{ type: 'text', text: ' i am using marked.' },
|
{ type: 'paragraph',
|
||||||
|
text: 'i am using marked.' },
|
||||||
{ type: 'blockquote_end' },
|
{ type: 'blockquote_end' },
|
||||||
links: {} ]
|
links: {} ]
|
||||||
```
|
```
|
||||||
|
|
||||||
## CLI
|
## 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:
|
||||||
|
|
||||||
``` bash
|
``` bash
|
||||||
$ marked -o hello.html
|
cd marked/
|
||||||
hello world
|
node test
|
||||||
^D
|
|
||||||
$ cat hello.html
|
|
||||||
<p>hello world</p>
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## Syntax Highlighting
|
### Contribution and License Agreement
|
||||||
|
|
||||||
Marked has an interface that allows for a syntax highlighter to highlight code
|
If you contribute code to this project, you are implicitly allowing your code
|
||||||
blocks before they're output.
|
to be distributed under the MIT license. You are also implicitly verifying that
|
||||||
|
all code is your original work. `</legalese>`
|
||||||
Example implementation:
|
|
||||||
|
|
||||||
``` js
|
|
||||||
var highlight = require('my-syntax-highlighter')
|
|
||||||
, marked_ = require('marked');
|
|
||||||
|
|
||||||
var marked = function(text) {
|
|
||||||
var tokens = marked_.lexer(text)
|
|
||||||
, l = tokens.length
|
|
||||||
, i = 0
|
|
||||||
, token;
|
|
||||||
|
|
||||||
for (; i < l; i++) {
|
|
||||||
token = tokens[i];
|
|
||||||
if (token.type === 'code') {
|
|
||||||
token.text = highlight(token.text, token.lang);
|
|
||||||
// marked should not escape this
|
|
||||||
token.escaped = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
text = marked_.parser(tokens);
|
|
||||||
|
|
||||||
return text;
|
|
||||||
};
|
|
||||||
|
|
||||||
module.exports = marked;
|
|
||||||
```
|
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
Copyright (c) 2011-2012, Christopher Jeffrey. (MIT License)
|
Copyright (c) 2011-2014, Christopher Jeffrey. (MIT License)
|
||||||
|
|
||||||
See LICENSE for more info.
|
See LICENSE for more info.
|
||||||
|
|
||||||
|
[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
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Marked CLI
|
* Marked CLI
|
||||||
* Copyright (c) 2011-2012, Christopher Jeffrey (MIT License)
|
* Copyright (c) 2011-2013, Christopher Jeffrey (MIT License)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var fs = require('fs')
|
var fs = require('fs')
|
||||||
|
@ -13,7 +13,7 @@ var fs = require('fs')
|
||||||
* Man Page
|
* Man Page
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var help = function() {
|
function help() {
|
||||||
var spawn = require('child_process').spawn;
|
var spawn = require('child_process').spawn;
|
||||||
|
|
||||||
var options = {
|
var options = {
|
||||||
|
@ -26,32 +26,54 @@ var help = function() {
|
||||||
spawn('man',
|
spawn('man',
|
||||||
[__dirname + '/../man/marked.1'],
|
[__dirname + '/../man/marked.1'],
|
||||||
options);
|
options);
|
||||||
};
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Main
|
* Main
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var main = function(argv) {
|
function main(argv, callback) {
|
||||||
var files = []
|
var files = []
|
||||||
, data = ''
|
, options = {}
|
||||||
, input
|
, input
|
||||||
, output
|
, output
|
||||||
, arg
|
, arg
|
||||||
, tokens;
|
, tokens
|
||||||
|
, opt;
|
||||||
|
|
||||||
var getarg = function() {
|
function getarg() {
|
||||||
var arg = argv.shift();
|
var arg = argv.shift();
|
||||||
arg = arg.split('=');
|
|
||||||
if (arg.length > 1) {
|
if (arg.indexOf('--') === 0) {
|
||||||
argv.unshift(arg.slice(1).join('='));
|
// e.g. --opt
|
||||||
|
arg = arg.split('=');
|
||||||
|
if (arg.length > 1) {
|
||||||
|
// e.g. --opt=val
|
||||||
|
argv.unshift(arg.slice(1).join('='));
|
||||||
|
}
|
||||||
|
arg = arg[0];
|
||||||
|
} else if (arg[0] === '-') {
|
||||||
|
if (arg.length > 2) {
|
||||||
|
// e.g. -abc
|
||||||
|
argv = arg.substring(1).split('').map(function(ch) {
|
||||||
|
return '-' + ch;
|
||||||
|
}).concat(argv);
|
||||||
|
arg = argv.shift();
|
||||||
|
} else {
|
||||||
|
// e.g. -a
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// e.g. foo
|
||||||
}
|
}
|
||||||
return arg[0];
|
|
||||||
};
|
return arg;
|
||||||
|
}
|
||||||
|
|
||||||
while (argv.length) {
|
while (argv.length) {
|
||||||
arg = getarg();
|
arg = getarg();
|
||||||
switch (arg) {
|
switch (arg) {
|
||||||
|
case '--test':
|
||||||
|
return require('../test').main(process.argv.slice());
|
||||||
case '-o':
|
case '-o':
|
||||||
case '--output':
|
case '--output':
|
||||||
output = argv.shift();
|
output = argv.shift();
|
||||||
|
@ -68,48 +90,98 @@ var main = function(argv) {
|
||||||
case '--help':
|
case '--help':
|
||||||
return help();
|
return help();
|
||||||
default:
|
default:
|
||||||
files.push(arg);
|
if (arg.indexOf('--') === 0) {
|
||||||
|
opt = camelize(arg.replace(/^--(no-)?/, ''));
|
||||||
|
if (!marked.defaults.hasOwnProperty(opt)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (arg.indexOf('--no-') === 0) {
|
||||||
|
options[opt] = typeof marked.defaults[opt] !== 'boolean'
|
||||||
|
? null
|
||||||
|
: false;
|
||||||
|
} else {
|
||||||
|
options[opt] = typeof marked.defaults[opt] !== 'boolean'
|
||||||
|
? argv.shift()
|
||||||
|
: true;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
files.push(arg);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!input) {
|
function getData(callback) {
|
||||||
if (files.length <= 2) {
|
if (!input) {
|
||||||
var stdin = process.stdin;
|
if (files.length <= 2) {
|
||||||
|
return getStdin(callback);
|
||||||
stdin.setEncoding('utf8');
|
}
|
||||||
stdin.resume();
|
input = files.pop();
|
||||||
|
|
||||||
stdin.on('data', function(text) {
|
|
||||||
data += text;
|
|
||||||
});
|
|
||||||
|
|
||||||
stdin.on('end', write);
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
input = files.pop();
|
return fs.readFile(input, 'utf8', callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
data = fs.readFileSync(input, 'utf8');
|
return getData(function(err, data) {
|
||||||
write();
|
if (err) return callback(err);
|
||||||
|
|
||||||
function write() {
|
|
||||||
data = tokens
|
data = tokens
|
||||||
? JSON.stringify(marked.lexer(data), null, 2)
|
? JSON.stringify(marked.lexer(data, options), null, 2)
|
||||||
: marked(data);
|
: marked(data, options);
|
||||||
|
|
||||||
if (!output) {
|
if (!output) {
|
||||||
process.stdout.write(data + '\n');
|
process.stdout.write(data + '\n');
|
||||||
} else {
|
return callback();
|
||||||
fs.writeFileSync(output, data);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return fs.writeFile(output, data, callback);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helpers
|
||||||
|
*/
|
||||||
|
|
||||||
|
function getStdin(callback) {
|
||||||
|
var stdin = process.stdin
|
||||||
|
, buff = '';
|
||||||
|
|
||||||
|
stdin.setEncoding('utf8');
|
||||||
|
|
||||||
|
stdin.on('data', function(data) {
|
||||||
|
buff += data;
|
||||||
|
});
|
||||||
|
|
||||||
|
stdin.on('error', function(err) {
|
||||||
|
return callback(err);
|
||||||
|
});
|
||||||
|
|
||||||
|
stdin.on('end', function() {
|
||||||
|
return callback(null, buff);
|
||||||
|
});
|
||||||
|
|
||||||
|
try {
|
||||||
|
stdin.resume();
|
||||||
|
} catch (e) {
|
||||||
|
callback(e);
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
|
function camelize(text) {
|
||||||
|
return text.replace(/(\w)-(\w)/g, function(_, a, b) {
|
||||||
|
return a + b.toUpperCase();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Expose / Entry Point
|
||||||
|
*/
|
||||||
|
|
||||||
if (!module.parent) {
|
if (!module.parent) {
|
||||||
process.title = 'marked';
|
process.title = 'marked';
|
||||||
main(process.argv.slice());
|
main(process.argv.slice(), function(err, code) {
|
||||||
|
if (err) throw err;
|
||||||
|
return process.exit(code || 0);
|
||||||
|
});
|
||||||
} else {
|
} else {
|
||||||
module.exports = main;
|
module.exports = main;
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,24 @@
|
||||||
|
{
|
||||||
|
"name": "marked",
|
||||||
|
"version": "0.3.4",
|
||||||
|
"homepage": "https://github.com/chjj/marked",
|
||||||
|
"authors": [
|
||||||
|
"Christopher Jeffrey <chjjeffrey@gmail.com>"
|
||||||
|
],
|
||||||
|
"description": "A markdown parser built for speed",
|
||||||
|
"keywords": [
|
||||||
|
"markdown",
|
||||||
|
"markup",
|
||||||
|
"html"
|
||||||
|
],
|
||||||
|
"main": "lib/marked.js",
|
||||||
|
"license": "MIT",
|
||||||
|
"ignore": [
|
||||||
|
"**/.*",
|
||||||
|
"node_modules",
|
||||||
|
"bower_components",
|
||||||
|
"app/bower_components",
|
||||||
|
"test",
|
||||||
|
"tests"
|
||||||
|
]
|
||||||
|
}
|
|
@ -0,0 +1,10 @@
|
||||||
|
{
|
||||||
|
"name": "marked",
|
||||||
|
"version": "0.3.4",
|
||||||
|
"repo": "chjj/marked",
|
||||||
|
"description": "A markdown parser built for speed",
|
||||||
|
"keywords": ["markdown", "markup", "html"],
|
||||||
|
"scripts": ["lib/marked.js"],
|
||||||
|
"main": "lib/marked.js",
|
||||||
|
"license": "MIT"
|
||||||
|
}
|
|
@ -0,0 +1,426 @@
|
||||||
|
# Markdown is broken
|
||||||
|
|
||||||
|
I have a lot of scraps of markdown engine oddities that I've collected over the
|
||||||
|
years. What you see below is slightly messy, but it's what I've managed to
|
||||||
|
cobble together to illustrate the differences between markdown engines, and
|
||||||
|
why, if there ever is a markdown specification, it has to be absolutely
|
||||||
|
thorough. There are a lot more of these little differences I have documented
|
||||||
|
elsewhere. I know I will find them lingering on my disk one day, but until
|
||||||
|
then, I'll continue to add whatever strange nonsensical things I find.
|
||||||
|
|
||||||
|
Some of these examples may only mention a particular engine compared to marked.
|
||||||
|
However, the examples with markdown.pl could easily be swapped out for
|
||||||
|
discount, upskirt, or markdown.js, and you would very easily see even more
|
||||||
|
inconsistencies.
|
||||||
|
|
||||||
|
A lot of this was written when I was very unsatisfied with the inconsistencies
|
||||||
|
between markdown engines. Please excuse the frustration noticeable in my
|
||||||
|
writing.
|
||||||
|
|
||||||
|
## Examples of markdown's "stupid" list parsing
|
||||||
|
|
||||||
|
```
|
||||||
|
$ markdown.pl
|
||||||
|
|
||||||
|
* item1
|
||||||
|
|
||||||
|
* item2
|
||||||
|
|
||||||
|
text
|
||||||
|
^D
|
||||||
|
<ul>
|
||||||
|
<li><p>item1</p>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>item2</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p><p>text</p></li>
|
||||||
|
</ul></p>
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
```
|
||||||
|
$ marked
|
||||||
|
* item1
|
||||||
|
|
||||||
|
* item2
|
||||||
|
|
||||||
|
text
|
||||||
|
^D
|
||||||
|
<ul>
|
||||||
|
<li><p>item1</p>
|
||||||
|
<ul>
|
||||||
|
<li>item2</li>
|
||||||
|
</ul>
|
||||||
|
<p>text</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
```
|
||||||
|
|
||||||
|
Which looks correct to you?
|
||||||
|
|
||||||
|
- - -
|
||||||
|
|
||||||
|
```
|
||||||
|
$ markdown.pl
|
||||||
|
* hello
|
||||||
|
> world
|
||||||
|
^D
|
||||||
|
<p><ul>
|
||||||
|
<li>hello</p>
|
||||||
|
|
||||||
|
<blockquote>
|
||||||
|
<p>world</li>
|
||||||
|
</ul></p>
|
||||||
|
</blockquote>
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
$ marked
|
||||||
|
* hello
|
||||||
|
> world
|
||||||
|
^D
|
||||||
|
<ul>
|
||||||
|
<li>hello<blockquote>
|
||||||
|
<p>world</p>
|
||||||
|
</blockquote>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
```
|
||||||
|
|
||||||
|
Again, which looks correct to you?
|
||||||
|
|
||||||
|
- - -
|
||||||
|
|
||||||
|
EXAMPLE:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ markdown.pl
|
||||||
|
* hello
|
||||||
|
* world
|
||||||
|
* hi
|
||||||
|
code
|
||||||
|
^D
|
||||||
|
<ul>
|
||||||
|
<li>hello
|
||||||
|
<ul>
|
||||||
|
<li>world</li>
|
||||||
|
<li>hi
|
||||||
|
code</li>
|
||||||
|
</ul></li>
|
||||||
|
</ul>
|
||||||
|
```
|
||||||
|
|
||||||
|
The code isn't a code block even though it's after the bullet margin. I know,
|
||||||
|
lets give it two more spaces, effectively making it 8 spaces past the bullet.
|
||||||
|
|
||||||
|
```
|
||||||
|
$ markdown.pl
|
||||||
|
* hello
|
||||||
|
* world
|
||||||
|
* hi
|
||||||
|
code
|
||||||
|
^D
|
||||||
|
<ul>
|
||||||
|
<li>hello
|
||||||
|
<ul>
|
||||||
|
<li>world</li>
|
||||||
|
<li>hi
|
||||||
|
code</li>
|
||||||
|
</ul></li>
|
||||||
|
</ul>
|
||||||
|
```
|
||||||
|
|
||||||
|
And, it's still not a code block. Did you also notice that the 3rd item isn't
|
||||||
|
even its own list? Markdown screws that up too because of its indentation
|
||||||
|
unaware parsing.
|
||||||
|
|
||||||
|
- - -
|
||||||
|
|
||||||
|
Let's look at some more examples of markdown's list parsing:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ markdown.pl
|
||||||
|
|
||||||
|
* item1
|
||||||
|
|
||||||
|
* item2
|
||||||
|
|
||||||
|
text
|
||||||
|
^D
|
||||||
|
<ul>
|
||||||
|
<li><p>item1</p>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>item2</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p><p>text</p></li>
|
||||||
|
</ul></p>
|
||||||
|
```
|
||||||
|
|
||||||
|
Misnested tags.
|
||||||
|
|
||||||
|
|
||||||
|
```
|
||||||
|
$ marked
|
||||||
|
* item1
|
||||||
|
|
||||||
|
* item2
|
||||||
|
|
||||||
|
text
|
||||||
|
^D
|
||||||
|
<ul>
|
||||||
|
<li><p>item1</p>
|
||||||
|
<ul>
|
||||||
|
<li>item2</li>
|
||||||
|
</ul>
|
||||||
|
<p>text</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
```
|
||||||
|
|
||||||
|
Which looks correct to you?
|
||||||
|
|
||||||
|
- - -
|
||||||
|
|
||||||
|
```
|
||||||
|
$ markdown.pl
|
||||||
|
* hello
|
||||||
|
> world
|
||||||
|
^D
|
||||||
|
<p><ul>
|
||||||
|
<li>hello</p>
|
||||||
|
|
||||||
|
<blockquote>
|
||||||
|
<p>world</li>
|
||||||
|
</ul></p>
|
||||||
|
</blockquote>
|
||||||
|
```
|
||||||
|
|
||||||
|
More misnested tags.
|
||||||
|
|
||||||
|
|
||||||
|
```
|
||||||
|
$ marked
|
||||||
|
* hello
|
||||||
|
> world
|
||||||
|
^D
|
||||||
|
<ul>
|
||||||
|
<li>hello<blockquote>
|
||||||
|
<p>world</p>
|
||||||
|
</blockquote>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
```
|
||||||
|
|
||||||
|
Again, which looks correct to you?
|
||||||
|
|
||||||
|
- - -
|
||||||
|
|
||||||
|
# Why quality matters - Part 2
|
||||||
|
|
||||||
|
``` bash
|
||||||
|
$ markdown.pl
|
||||||
|
* hello
|
||||||
|
> world
|
||||||
|
^D
|
||||||
|
<p><ul>
|
||||||
|
<li>hello</p>
|
||||||
|
|
||||||
|
<blockquote>
|
||||||
|
<p>world</li>
|
||||||
|
</ul></p>
|
||||||
|
</blockquote>
|
||||||
|
```
|
||||||
|
|
||||||
|
``` bash
|
||||||
|
$ sundown # upskirt
|
||||||
|
* hello
|
||||||
|
> world
|
||||||
|
^D
|
||||||
|
<ul>
|
||||||
|
<li>hello
|
||||||
|
> world</li>
|
||||||
|
</ul>
|
||||||
|
```
|
||||||
|
|
||||||
|
``` bash
|
||||||
|
$ marked
|
||||||
|
* hello
|
||||||
|
> world
|
||||||
|
^D
|
||||||
|
<ul><li>hello <blockquote><p>world</p></blockquote></li></ul>
|
||||||
|
```
|
||||||
|
|
||||||
|
Which looks correct to you?
|
||||||
|
|
||||||
|
- - -
|
||||||
|
|
||||||
|
See: https://github.com/evilstreak/markdown-js/issues/23
|
||||||
|
|
||||||
|
``` bash
|
||||||
|
$ markdown.pl # upskirt/markdown.js/discount
|
||||||
|
* hello
|
||||||
|
var a = 1;
|
||||||
|
* world
|
||||||
|
^D
|
||||||
|
<ul>
|
||||||
|
<li>hello
|
||||||
|
var a = 1;</li>
|
||||||
|
<li>world</li>
|
||||||
|
</ul>
|
||||||
|
```
|
||||||
|
|
||||||
|
``` bash
|
||||||
|
$ marked
|
||||||
|
* hello
|
||||||
|
var a = 1;
|
||||||
|
* world
|
||||||
|
^D
|
||||||
|
<ul><li>hello
|
||||||
|
<pre>code>var a = 1;</code></pre></li>
|
||||||
|
<li>world</li></ul>
|
||||||
|
```
|
||||||
|
|
||||||
|
Which looks more reasonable? Why shouldn't code blocks be able to appear in
|
||||||
|
list items in a sane way?
|
||||||
|
|
||||||
|
- - -
|
||||||
|
|
||||||
|
``` bash
|
||||||
|
$ markdown.js
|
||||||
|
<div>hello</div>
|
||||||
|
|
||||||
|
<span>hello</span>
|
||||||
|
^D
|
||||||
|
<p><div>hello</div></p>
|
||||||
|
|
||||||
|
<p><span>hello</span></p>
|
||||||
|
```
|
||||||
|
|
||||||
|
``` bash
|
||||||
|
$ marked
|
||||||
|
<div>hello</div>
|
||||||
|
|
||||||
|
<span>hello</span>
|
||||||
|
^D
|
||||||
|
<div>hello</div>
|
||||||
|
|
||||||
|
|
||||||
|
<p><span>hello</span>
|
||||||
|
</p>
|
||||||
|
```
|
||||||
|
|
||||||
|
- - -
|
||||||
|
|
||||||
|
See: https://github.com/evilstreak/markdown-js/issues/27
|
||||||
|
|
||||||
|
``` bash
|
||||||
|
$ markdown.js
|
||||||
|
[](/link)
|
||||||
|
^D
|
||||||
|
<p><a href="/image)](/link">](/link)
|
||||||
|
^D
|
||||||
|
<p><a href="/link"><img src="/image" alt="an image"></a>
|
||||||
|
</p>
|
||||||
|
```
|
||||||
|
|
||||||
|
- - -
|
||||||
|
|
||||||
|
See: https://github.com/evilstreak/markdown-js/issues/24
|
||||||
|
|
||||||
|
``` bash
|
||||||
|
$ markdown.js
|
||||||
|
> a
|
||||||
|
|
||||||
|
> b
|
||||||
|
|
||||||
|
> c
|
||||||
|
^D
|
||||||
|
<blockquote><p>a</p><p>bundefined> c</p></blockquote>
|
||||||
|
```
|
||||||
|
|
||||||
|
``` bash
|
||||||
|
$ marked
|
||||||
|
> a
|
||||||
|
|
||||||
|
> b
|
||||||
|
|
||||||
|
> c
|
||||||
|
^D
|
||||||
|
<blockquote><p>a
|
||||||
|
|
||||||
|
</p></blockquote>
|
||||||
|
<blockquote><p>b
|
||||||
|
|
||||||
|
</p></blockquote>
|
||||||
|
<blockquote><p>c
|
||||||
|
</p></blockquote>
|
||||||
|
```
|
||||||
|
|
||||||
|
- - -
|
||||||
|
|
||||||
|
``` bash
|
||||||
|
$ markdown.pl
|
||||||
|
* hello
|
||||||
|
* world
|
||||||
|
how
|
||||||
|
|
||||||
|
are
|
||||||
|
you
|
||||||
|
|
||||||
|
* today
|
||||||
|
* hi
|
||||||
|
^D
|
||||||
|
<ul>
|
||||||
|
<li><p>hello</p>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>world
|
||||||
|
how</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>are
|
||||||
|
you</p>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>today</li>
|
||||||
|
</ul></li>
|
||||||
|
<li>hi</li>
|
||||||
|
</ul>
|
||||||
|
```
|
||||||
|
|
||||||
|
``` bash
|
||||||
|
$ marked
|
||||||
|
* hello
|
||||||
|
* world
|
||||||
|
how
|
||||||
|
|
||||||
|
are
|
||||||
|
you
|
||||||
|
|
||||||
|
* today
|
||||||
|
* hi
|
||||||
|
^D
|
||||||
|
<ul>
|
||||||
|
<li><p>hello</p>
|
||||||
|
<ul>
|
||||||
|
<li><p>world
|
||||||
|
how</p>
|
||||||
|
<p>are
|
||||||
|
you</p>
|
||||||
|
</li>
|
||||||
|
<li><p>today</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li>hi</li>
|
||||||
|
</ul>
|
||||||
|
```
|
|
@ -0,0 +1,2 @@
|
||||||
|
# Todo
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,39 +1,91 @@
|
||||||
.ds q \N'34'
|
.ds q \N'34'
|
||||||
.TH marked 1
|
.TH marked 1 "2014-01-31" "v0.3.1" "marked.js"
|
||||||
|
|
||||||
.SH NAME
|
.SH NAME
|
||||||
marked \- a javascript markdown parser
|
marked \- a javascript markdown parser
|
||||||
|
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
.nf
|
.B marked
|
||||||
.B marked [\-o output] [\-i input] [\-th]
|
[\-o \fI<output>\fP] [\-i \fI<input>\fP] [\-\-help]
|
||||||
.fi
|
[\-\-tokens] [\-\-pedantic] [\-\-gfm]
|
||||||
|
[\-\-breaks] [\-\-tables] [\-\-sanitize]
|
||||||
|
[\-\-smart\-lists] [\-\-lang\-prefix \fI<prefix>\fP]
|
||||||
|
[\-\-no\-etc...] [\-\-silent] [\fIfilename\fP]
|
||||||
|
|
||||||
.SH DESCRIPTION
|
.SH DESCRIPTION
|
||||||
.B marked
|
.B marked
|
||||||
is a full-featured javascript markdown parser, built for speed. It also includes
|
is a full-featured javascript markdown parser, built for speed. It also includes
|
||||||
multiple GFM features.
|
multiple GFM features.
|
||||||
.SH OPTIONS
|
|
||||||
.TP
|
|
||||||
.BI \-o,\ \-\-output\ [output]
|
|
||||||
Specify file output. If none is specified, write to stdout.
|
|
||||||
.TP
|
|
||||||
.BI \-i,\ \-\-input\ [input]
|
|
||||||
Specify file input, otherwise use last argument as input file. If no input file
|
|
||||||
is specified, read from stdin.
|
|
||||||
.TP
|
|
||||||
.BI \-t,\ \-\-tokens
|
|
||||||
Output a token stream instead of html.
|
|
||||||
.TP
|
|
||||||
.BI \-h,\ \-\-help
|
|
||||||
Display help information.
|
|
||||||
.SH EXAMPLES
|
.SH EXAMPLES
|
||||||
.TP
|
.TP
|
||||||
cat in.md | marked > out.html
|
cat in.md | marked > out.html
|
||||||
.TP
|
.TP
|
||||||
echo "hello *world*" | marked
|
echo "hello *world*" | marked
|
||||||
.TP
|
.TP
|
||||||
marked -o out.html in.md
|
marked \-o out.html in.md \-\-gfm
|
||||||
.TP
|
.TP
|
||||||
marked --output="hello world.html" -i in.md
|
marked \-\-output="hello world.html" \-i in.md \-\-no-breaks
|
||||||
|
|
||||||
|
.SH OPTIONS
|
||||||
|
.TP
|
||||||
|
.BI \-o,\ \-\-output\ [\fIoutput\fP]
|
||||||
|
Specify file output. If none is specified, write to stdout.
|
||||||
|
.TP
|
||||||
|
.BI \-i,\ \-\-input\ [\fIinput\fP]
|
||||||
|
Specify file input, otherwise use last argument as input file. If no input file
|
||||||
|
is specified, read from stdin.
|
||||||
|
.TP
|
||||||
|
.BI \-t,\ \-\-tokens
|
||||||
|
Output a token stream instead of html.
|
||||||
|
.TP
|
||||||
|
.BI \-\-pedantic
|
||||||
|
Conform to obscure parts of markdown.pl as much as possible. Don't fix original
|
||||||
|
markdown bugs.
|
||||||
|
.TP
|
||||||
|
.BI \-\-gfm
|
||||||
|
Enable github flavored markdown.
|
||||||
|
.TP
|
||||||
|
.BI \-\-breaks
|
||||||
|
Enable GFM line breaks. Only works with the gfm option.
|
||||||
|
.TP
|
||||||
|
.BI \-\-tables
|
||||||
|
Enable GFM tables. Only works with the gfm option.
|
||||||
|
.TP
|
||||||
|
.BI \-\-sanitize
|
||||||
|
Sanitize output. Ignore any HTML input.
|
||||||
|
.TP
|
||||||
|
.BI \-\-smart\-lists
|
||||||
|
Use smarter list behavior than the original markdown.
|
||||||
|
.TP
|
||||||
|
.BI \-\-lang\-prefix\ [\fIprefix\fP]
|
||||||
|
Set the prefix for code block classes.
|
||||||
|
.TP
|
||||||
|
.BI \-\-mangle
|
||||||
|
Mangle email addresses.
|
||||||
|
.TP
|
||||||
|
.BI \-\-no\-sanitize,\ \-no-etc...
|
||||||
|
The inverse of any of the marked options above.
|
||||||
|
.TP
|
||||||
|
.BI \-\-silent
|
||||||
|
Silence error output.
|
||||||
|
.TP
|
||||||
|
.BI \-h,\ \-\-help
|
||||||
|
Display help information.
|
||||||
|
|
||||||
|
.SH CONFIGURATION
|
||||||
|
For configuring and running programmatically.
|
||||||
|
|
||||||
|
.B Example
|
||||||
|
|
||||||
|
require('marked')('*foo*', { gfm: true });
|
||||||
|
|
||||||
.SH BUGS
|
.SH BUGS
|
||||||
Please report any bugs to https://github.com/chjj/marked.
|
Please report any bugs to https://github.com/chjj/marked.
|
||||||
|
|
||||||
.SH LICENSE
|
.SH LICENSE
|
||||||
Copyright (c) 2011-2012, Christopher Jeffrey (MIT License)
|
Copyright (c) 2011-2014, Christopher Jeffrey (MIT License).
|
||||||
|
|
||||||
|
.SH "SEE ALSO"
|
||||||
|
.BR markdown(1),
|
||||||
|
.BR node.js(1)
|
||||||
|
|
File diff suppressed because one or more lines are too long
|
@ -1,15 +1,95 @@
|
||||||
{
|
{
|
||||||
"name": "marked",
|
"_args": [
|
||||||
|
[
|
||||||
|
"marked",
|
||||||
|
"/Users/firedfox/git/node/tools/doc"
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"_from": "marked@latest",
|
||||||
|
"_id": "marked@0.3.5",
|
||||||
|
"_inCache": true,
|
||||||
|
"_installable": true,
|
||||||
|
"_location": "/marked",
|
||||||
|
"_nodeVersion": "0.12.7",
|
||||||
|
"_npmUser": {
|
||||||
|
"email": "chjjeffrey@gmail.com",
|
||||||
|
"name": "chjj"
|
||||||
|
},
|
||||||
|
"_npmVersion": "2.13.2",
|
||||||
|
"_phantomChildren": {},
|
||||||
|
"_requested": {
|
||||||
|
"name": "marked",
|
||||||
|
"raw": "marked",
|
||||||
|
"rawSpec": "",
|
||||||
|
"scope": null,
|
||||||
|
"spec": "latest",
|
||||||
|
"type": "tag"
|
||||||
|
},
|
||||||
|
"_requiredBy": [
|
||||||
|
"/"
|
||||||
|
],
|
||||||
|
"_resolved": "https://registry.npmjs.org/marked/-/marked-0.3.5.tgz",
|
||||||
|
"_shasum": "4113a15ac5d7bca158a5aae07224587b9fa15b94",
|
||||||
|
"_shrinkwrap": null,
|
||||||
|
"_spec": "marked",
|
||||||
|
"_where": "/Users/firedfox/git/node/tools/doc",
|
||||||
|
"author": {
|
||||||
|
"name": "Christopher Jeffrey"
|
||||||
|
},
|
||||||
|
"bin": {
|
||||||
|
"marked": "./bin/marked"
|
||||||
|
},
|
||||||
|
"bugs": {
|
||||||
|
"url": "http://github.com/chjj/marked/issues"
|
||||||
|
},
|
||||||
|
"dependencies": {},
|
||||||
"description": "A markdown parser built for speed",
|
"description": "A markdown parser built for speed",
|
||||||
"author": "Christopher Jeffrey",
|
"devDependencies": {
|
||||||
"version": "0.1.9",
|
"gulp": "^3.8.11",
|
||||||
"main": "./lib/marked.js",
|
"gulp-concat": "^2.5.2",
|
||||||
"bin": "./bin/marked",
|
"gulp-uglify": "^1.1.0",
|
||||||
"man": "./man/marked.1",
|
"markdown": "*",
|
||||||
"preferGlobal": false,
|
"showdown": "*"
|
||||||
"repository": "git://github.com/chjj/marked.git",
|
},
|
||||||
|
"directories": {},
|
||||||
|
"dist": {
|
||||||
|
"shasum": "4113a15ac5d7bca158a5aae07224587b9fa15b94",
|
||||||
|
"tarball": "https://registry.npmjs.org/marked/-/marked-0.3.5.tgz"
|
||||||
|
},
|
||||||
|
"gitHead": "88ce4df47c4d994dc1b1df1477a21fb893e11ddc",
|
||||||
"homepage": "https://github.com/chjj/marked",
|
"homepage": "https://github.com/chjj/marked",
|
||||||
"bugs": "http://github.com/chjj/marked/issues",
|
"keywords": [
|
||||||
"keywords": [ "markdown", "markup", "html" ],
|
"markdown",
|
||||||
"tags": [ "markdown", "markup", "html" ]
|
"markup",
|
||||||
|
"html"
|
||||||
|
],
|
||||||
|
"license": "MIT",
|
||||||
|
"main": "./lib/marked.js",
|
||||||
|
"maintainers": [
|
||||||
|
{
|
||||||
|
"email": "chjjeffrey@gmail.com",
|
||||||
|
"name": "chjj"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"man": [
|
||||||
|
"./man/marked.1"
|
||||||
|
],
|
||||||
|
"name": "marked",
|
||||||
|
"optionalDependencies": {},
|
||||||
|
"preferGlobal": true,
|
||||||
|
"readme": "ERROR: No README data found!",
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git://github.com/chjj/marked.git"
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"bench": "node test --bench",
|
||||||
|
"test": "node test"
|
||||||
|
},
|
||||||
|
"tags": [
|
||||||
|
"markdown",
|
||||||
|
"markup",
|
||||||
|
"html"
|
||||||
|
],
|
||||||
|
"version": "0.3.5"
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
"node": ">=0.6.10"
|
"node": ">=0.6.10"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"marked": "~0.1.9",
|
"marked": "^0.3.5",
|
||||||
"js-yaml": "^3.5.2"
|
"js-yaml": "^3.5.2"
|
||||||
},
|
},
|
||||||
"devDependencies": {},
|
"devDependencies": {},
|
||||||
|
|
Loading…
Reference in New Issue