Comparing version 0.3.16 to 0.3.17
@@ -7,3 +7,3 @@ /** | ||
;(function() { | ||
;(function(root) { | ||
'use strict'; | ||
@@ -34,18 +34,18 @@ | ||
block._title = /(?:"(?:\\"|[^"]|"[^"\n]*")*"|'\n?(?:[^'\n]+\n?)*'|\([^()]*\))/; | ||
block.def = replace(block.def) | ||
('label', block._label) | ||
('title', block._title) | ||
(); | ||
block.def = edit(block.def) | ||
.replace('label', block._label) | ||
.replace('title', block._title) | ||
.getRegex(); | ||
block.bullet = /(?:[*+-]|\d+\.)/; | ||
block.item = /^( *)(bull) [^\n]*(?:\n(?!\1bull )[^\n]*)*/; | ||
block.item = replace(block.item, 'gm') | ||
(/bull/g, block.bullet) | ||
(); | ||
block.item = edit(block.item, 'gm') | ||
.replace(/bull/g, block.bullet) | ||
.getRegex(); | ||
block.list = replace(block.list) | ||
(/bull/g, block.bullet) | ||
('hr', '\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))') | ||
('def', '\\n+(?=' + block.def.source + ')') | ||
(); | ||
block.list = edit(block.list) | ||
.replace(/bull/g, block.bullet) | ||
.replace('hr', '\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))') | ||
.replace('def', '\\n+(?=' + block.def.source + ')') | ||
.getRegex(); | ||
@@ -57,19 +57,19 @@ block._tag = '(?!(?:' | ||
block.html = replace(block.html) | ||
('comment', /<!--[\s\S]*?-->/) | ||
('closed', /<(tag)[\s\S]+?<\/\1>/) | ||
('closing', /<tag(?:"[^"]*"|'[^']*'|\s[^'"\/>]*)*?\/?>/) | ||
(/tag/g, block._tag) | ||
(); | ||
block.html = edit(block.html) | ||
.replace('comment', /<!--[\s\S]*?-->/) | ||
.replace('closed', /<(tag)[\s\S]+?<\/\1>/) | ||
.replace('closing', /<tag(?:"[^"]*"|'[^']*'|\s[^'"\/>\s]*)*?\/?>/) | ||
.replace(/tag/g, block._tag) | ||
.getRegex(); | ||
block.paragraph = replace(block.paragraph) | ||
('hr', block.hr) | ||
('heading', block.heading) | ||
('lheading', block.lheading) | ||
('tag', '<' + block._tag) | ||
(); | ||
block.paragraph = edit(block.paragraph) | ||
.replace('hr', block.hr) | ||
.replace('heading', block.heading) | ||
.replace('lheading', block.lheading) | ||
.replace('tag', '<' + block._tag) | ||
.getRegex(); | ||
block.blockquote = replace(block.blockquote) | ||
('paragraph', block.paragraph) | ||
(); | ||
block.blockquote = edit(block.blockquote) | ||
.replace('paragraph', block.paragraph) | ||
.getRegex(); | ||
@@ -92,7 +92,7 @@ /** | ||
block.gfm.paragraph = replace(block.paragraph) | ||
('(?!', '(?!' | ||
block.gfm.paragraph = edit(block.paragraph) | ||
.replace('(?!', '(?!' | ||
+ block.gfm.fences.source.replace('\\1', '\\2') + '|' | ||
+ block.list.source.replace('\\1', '\\3') + '|') | ||
(); | ||
.getRegex(); | ||
@@ -161,13 +161,13 @@ /** | ||
Lexer.prototype.token = function(src, top) { | ||
var src = src.replace(/^ +$/gm, '') | ||
, next | ||
, loose | ||
, cap | ||
, bull | ||
, b | ||
, item | ||
, space | ||
, i | ||
, tag | ||
, l; | ||
src = src.replace(/^ +$/gm, ''); | ||
var next, | ||
loose, | ||
cap, | ||
bull, | ||
b, | ||
item, | ||
space, | ||
i, | ||
tag, | ||
l; | ||
@@ -374,3 +374,3 @@ while (src) { | ||
src = src.substring(cap[0].length); | ||
if (cap[3]) cap[3] = cap[3].substring(1,cap[3].length-1); | ||
if (cap[3]) cap[3] = cap[3].substring(1, cap[3].length - 1); | ||
tag = cap[1].toLowerCase(); | ||
@@ -455,4 +455,3 @@ if (!this.tokens.links[tag]) { | ||
if (src) { | ||
throw new | ||
Error('Infinite loop on byte: ' + src.charCodeAt(0)); | ||
throw new Error('Infinite loop on byte: ' + src.charCodeAt(0)); | ||
} | ||
@@ -472,6 +471,6 @@ } | ||
url: noop, | ||
tag: /^<!--[\s\S]*?-->|^<\/?[a-zA-Z0-9\-]+(?:"[^"]*"|'[^']*'|\s[^<'">\/]*)*?\/?>/, | ||
tag: /^<!--[\s\S]*?-->|^<\/?[a-zA-Z0-9\-]+(?:"[^"]*"|'[^']*'|\s[^<'">\/\s]*)*?\/?>/, | ||
link: /^!?\[(inside)\]\(href\)/, | ||
reflink: /^!?\[(inside)\]\s*\[([^\]]*)\]/, | ||
nolink: /^!?\[((?:\[[^\]]*\]|\\[\[\]]|[^\[\]])*)\]/, | ||
nolink: /^!?\[((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\]/, | ||
strong: /^__([\s\S]+?)__(?!_)|^\*\*([\s\S]+?)\*\*(?!\*)/, | ||
@@ -488,18 +487,18 @@ em: /^_([^\s_](?:[^_]|__)+?[^\s_])_\b|^\*((?:\*\*|[^*])+?)\*(?!\*)/, | ||
inline.autolink = replace(inline.autolink) | ||
('scheme', inline._scheme) | ||
('email', inline._email) | ||
() | ||
inline.autolink = edit(inline.autolink) | ||
.replace('scheme', inline._scheme) | ||
.replace('email', inline._email) | ||
.getRegex() | ||
inline._inside = /(?:\[[^\]]*\]|\\[\[\]]|[^\[\]]|\](?=[^\[]*\]))*/; | ||
inline._inside = /(?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]]|\](?=[^\[]*\]))*/; | ||
inline._href = /\s*<?([\s\S]*?)>?(?:\s+['"]([\s\S]*?)['"])?\s*/; | ||
inline.link = replace(inline.link) | ||
('inside', inline._inside) | ||
('href', inline._href) | ||
(); | ||
inline.link = edit(inline.link) | ||
.replace('inside', inline._inside) | ||
.replace('href', inline._href) | ||
.getRegex(); | ||
inline.reflink = replace(inline.reflink) | ||
('inside', inline._inside) | ||
(); | ||
inline.reflink = edit(inline.reflink) | ||
.replace('inside', inline._inside) | ||
.getRegex(); | ||
@@ -526,12 +525,12 @@ /** | ||
inline.gfm = merge({}, inline.normal, { | ||
escape: replace(inline.escape)('])', '~|])')(), | ||
url: replace(/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/) | ||
('email', inline._email) | ||
(), | ||
escape: edit(inline.escape).replace('])', '~|])').getRegex(), | ||
url: edit(/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/) | ||
.replace('email', inline._email) | ||
.getRegex(), | ||
_backpedal: /(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/, | ||
del: /^~~(?=\S)([\s\S]*?\S)~~/, | ||
text: replace(inline.text) | ||
(']|', '~]|') | ||
('|', '|https?://|ftp://|www\\.|[a-zA-Z0-9.!#$%&\'*+/=?^_`{\\|}~-]+@|') | ||
() | ||
text: edit(inline.text) | ||
.replace(']|', '~]|') | ||
.replace('|', '|https?://|ftp://|www\\.|[a-zA-Z0-9.!#$%&\'*+/=?^_`{\\|}~-]+@|') | ||
.getRegex() | ||
}); | ||
@@ -544,4 +543,4 @@ | ||
inline.breaks = merge({}, inline.gfm, { | ||
br: replace(inline.br)('{2,}', '*')(), | ||
text: replace(inline.gfm.text)('{2,}', '*')() | ||
br: edit(inline.br).replace('{2,}', '*').getRegex(), | ||
text: edit(inline.gfm.text).replace('{2,}', '*').getRegex() | ||
}); | ||
@@ -557,8 +556,7 @@ | ||
this.rules = inline.normal; | ||
this.renderer = this.options.renderer || new Renderer; | ||
this.renderer = this.options.renderer || new Renderer(); | ||
this.renderer.options = this.options; | ||
if (!this.links) { | ||
throw new | ||
Error('Tokens array requires a `links` property.'); | ||
throw new Error('Tokens array requires a `links` property.'); | ||
} | ||
@@ -597,7 +595,7 @@ | ||
InlineLexer.prototype.output = function(src) { | ||
var out = '' | ||
, link | ||
, text | ||
, href | ||
, cap; | ||
var out = '', | ||
link, | ||
text, | ||
href, | ||
cap; | ||
@@ -733,4 +731,3 @@ while (src) { | ||
if (src) { | ||
throw new | ||
Error('Infinite loop on byte: ' + src.charCodeAt(0)); | ||
throw new Error('Infinite loop on byte: ' + src.charCodeAt(0)); | ||
} | ||
@@ -747,4 +744,4 @@ } | ||
InlineLexer.prototype.outputLink = function(cap, link) { | ||
var href = escape(link.href) | ||
, title = link.title ? escape(link.title) : null; | ||
var href = escape(link.href), | ||
title = link.title ? escape(link.title) : null; | ||
@@ -785,6 +782,6 @@ return cap[0].charAt(0) !== '!' | ||
if (!this.options.mangle) return text; | ||
var out = '' | ||
, l = text.length | ||
, i = 0 | ||
, ch; | ||
var out = '', | ||
l = text.length, | ||
i = 0, | ||
ch; | ||
@@ -989,3 +986,3 @@ for (; i < l; i++) { | ||
this.options = options || marked.defaults; | ||
this.options.renderer = this.options.renderer || new Renderer; | ||
this.options.renderer = this.options.renderer || new Renderer(); | ||
this.renderer = this.options.renderer; | ||
@@ -1011,3 +1008,6 @@ this.renderer.options = this.options; | ||
// use an InlineLexer with a TextRenderer to extract pure text | ||
this.inlineText = new InlineLexer(src.links, merge({}, this.options, {renderer: new TextRenderer})); | ||
this.inlineText = new InlineLexer( | ||
src.links, | ||
merge({}, this.options, {renderer: new TextRenderer()}) | ||
); | ||
this.tokens = src.reverse(); | ||
@@ -1077,8 +1077,8 @@ | ||
case 'table': { | ||
var header = '' | ||
, body = '' | ||
, i | ||
, row | ||
, cell | ||
, j; | ||
var header = '', | ||
body = '', | ||
i, | ||
row, | ||
cell, | ||
j; | ||
@@ -1111,3 +1111,3 @@ // header | ||
case 'blockquote_start': { | ||
var body = ''; | ||
body = ''; | ||
@@ -1121,4 +1121,4 @@ while (this.next().type !== 'blockquote_end') { | ||
case 'list_start': { | ||
var body = '' | ||
, ordered = this.token.ordered; | ||
body = ''; | ||
var ordered = this.token.ordered; | ||
@@ -1132,3 +1132,3 @@ while (this.next().type !== 'list_end') { | ||
case 'list_item_start': { | ||
var body = ''; | ||
body = ''; | ||
@@ -1144,3 +1144,3 @@ while (this.next().type !== 'list_item_end') { | ||
case 'loose_item_start': { | ||
var body = ''; | ||
body = ''; | ||
@@ -1182,3 +1182,3 @@ while (this.next().type !== 'list_item_end') { | ||
function unescape(html) { | ||
// explicitly match decimal, hex, and named HTML entities | ||
// explicitly match decimal, hex, and named HTML entities | ||
return html.replace(/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig, function(_, n) { | ||
@@ -1196,11 +1196,15 @@ n = n.toLowerCase(); | ||
function replace(regex, opt) { | ||
function edit(regex, opt) { | ||
regex = regex.source; | ||
opt = opt || ''; | ||
return function self(name, val) { | ||
if (!name) return new RegExp(regex, opt); | ||
val = val.source || val; | ||
val = val.replace(/(^|[^\[])\^/g, '$1'); | ||
regex = regex.replace(name, val); | ||
return self; | ||
return { | ||
replace: function(name, val) { | ||
val = val.source || val; | ||
val = val.replace(/(^|[^\[])\^/g, '$1'); | ||
regex = regex.replace(name, val); | ||
return this; | ||
}, | ||
getRegex: function() { | ||
return new RegExp(regex, opt); | ||
} | ||
}; | ||
@@ -1237,5 +1241,5 @@ } | ||
function merge(obj) { | ||
var i = 1 | ||
, target | ||
, key; | ||
var i = 1, | ||
target, | ||
key; | ||
@@ -1254,3 +1258,2 @@ for (; i < arguments.length; i++) { | ||
/** | ||
@@ -1262,9 +1265,10 @@ * Marked | ||
// throw error in case of non string input | ||
if (typeof src == 'undefined' || src === null) | ||
if (typeof src === 'undefined' || src === null) { | ||
throw new Error('marked(): input parameter is undefined or null'); | ||
if (typeof src != 'string') | ||
throw new Error('marked(): input parameter is of type ' + | ||
Object.prototype.toString.call(src) + ', string expected'); | ||
} | ||
if (typeof src !== 'string') { | ||
throw new Error('marked(): input parameter is of type ' | ||
+ Object.prototype.toString.call(src) + ', string expected'); | ||
} | ||
if (callback || typeof opt === 'function') { | ||
@@ -1278,6 +1282,6 @@ if (!callback) { | ||
var highlight = opt.highlight | ||
, tokens | ||
, pending | ||
, i = 0; | ||
var highlight = opt.highlight, | ||
tokens, | ||
pending, | ||
i = 0; | ||
@@ -1378,3 +1382,3 @@ try { | ||
headerPrefix: '', | ||
renderer: new Renderer, | ||
renderer: new Renderer(), | ||
xhtml: false, | ||
@@ -1407,7 +1411,4 @@ baseUrl: null | ||
} else { | ||
this.marked = marked; | ||
root.marked = marked; | ||
} | ||
}).call(function() { | ||
return this || (typeof window !== 'undefined' ? window : global); | ||
}()); | ||
})(this || (typeof window !== 'undefined' ? window : global)); |
@@ -6,2 +6,2 @@ /** | ||
*/ | ||
(function(){"use strict";var e={newline:/^\n+/,code:/^( {4}[^\n]+\n*)+/,fences:g,hr:/^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/,heading:/^ *(#{1,6}) *([^\n]+?) *#* *(?:\n+|$)/,nptable:g,blockquote:/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,list:/^( *)(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,html:/^ *(?:comment *(?:\n|\s*$)|closed *(?:\n{2,}|\s*$)|closing *(?:\n{2,}|\s*$))/,def:/^ {0,3}\[(label)\]: *\n? *<?([^\s>]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/,table:g,lheading:/^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/,paragraph:/^([^\n]+(?:\n?(?!hr|heading|lheading| {0,3}>|tag)[^\n]+)+)/,text:/^[^\n]+/};function t(t){this.tokens=[],this.tokens.links={},this.options=t||d.defaults,this.rules=e.normal,this.options.gfm&&(this.options.tables?this.rules=e.tables:this.rules=e.gfm)}e._label=/(?:\\[\[\]]|[^\[\]])+/,e._title=/(?:"(?:\\"|[^"]|"[^"\n]*")*"|'\n?(?:[^'\n]+\n?)*'|\([^()]*\))/,e.def=a(e.def)("label",e._label)("title",e._title)(),e.bullet=/(?:[*+-]|\d+\.)/,e.item=/^( *)(bull) [^\n]*(?:\n(?!\1bull )[^\n]*)*/,e.item=a(e.item,"gm")(/bull/g,e.bullet)(),e.list=a(e.list)(/bull/g,e.bullet)("hr","\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))")("def","\\n+(?="+e.def.source+")")(),e._tag="(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b",e.html=a(e.html)("comment",/<!--[\s\S]*?-->/)("closed",/<(tag)[\s\S]+?<\/\1>/)("closing",/<tag(?:"[^"]*"|'[^']*'|\s[^'"\/>]*)*?\/?>/)(/tag/g,e._tag)(),e.paragraph=a(e.paragraph)("hr",e.hr)("heading",e.heading)("lheading",e.lheading)("tag","<"+e._tag)(),e.blockquote=a(e.blockquote)("paragraph",e.paragraph)(),e.normal=f({},e),e.gfm=f({},e.normal,{fences:/^ *(`{3,}|~{3,})[ \.]*(\S+)? *\n([\s\S]*?)\n? *\1 *(?:\n+|$)/,paragraph:/^/,heading:/^ *(#{1,6}) +([^\n]+?) *#* *(?:\n+|$)/}),e.gfm.paragraph=a(e.paragraph)("(?!","(?!"+e.gfm.fences.source.replace("\\1","\\2")+"|"+e.list.source.replace("\\1","\\3")+"|")(),e.tables=f({},e.gfm,{nptable:/^ *(\S.*\|.*)\n *([-:]+ *\|[-| :]*)\n((?:.*\|.*(?:\n|$))*)\n*/,table:/^ *\|(.+)\n *\|( *[-:]+[-| :]*)\n((?: *\|.*(?:\n|$))*)\n*/}),t.rules=e,t.lex=function(e,n){return new t(n).lex(e)},t.prototype.lex=function(e){return e=e.replace(/\r\n|\r/g,"\n").replace(/\t/g," ").replace(/\u00a0/g," ").replace(/\u2424/g,"\n"),this.token(e,!0)},t.prototype.token=function(t,n){var r,s,i,l,o,h,a,p,u,c;for(t=t.replace(/^ +$/gm,"");t;)if((i=this.rules.newline.exec(t))&&(t=t.substring(i[0].length),i[0].length>1&&this.tokens.push({type:"space"})),i=this.rules.code.exec(t))t=t.substring(i[0].length),i=i[0].replace(/^ {4}/gm,""),this.tokens.push({type:"code",text:this.options.pedantic?i:i.replace(/\n+$/,"")});else if(i=this.rules.fences.exec(t))t=t.substring(i[0].length),this.tokens.push({type:"code",lang:i[2],text:i[3]||""});else if(i=this.rules.heading.exec(t))t=t.substring(i[0].length),this.tokens.push({type:"heading",depth:i[1].length,text:i[2]});else if(n&&(i=this.rules.nptable.exec(t))){for(t=t.substring(i[0].length),h={type:"table",header:i[1].replace(/^ *| *\| *$/g,"").split(/ *\| */),align:i[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:i[3].replace(/\n$/,"").split("\n")},p=0;p<h.align.length;p++)/^ *-+: *$/.test(h.align[p])?h.align[p]="right":/^ *:-+: *$/.test(h.align[p])?h.align[p]="center":/^ *:-+ *$/.test(h.align[p])?h.align[p]="left":h.align[p]=null;for(p=0;p<h.cells.length;p++)h.cells[p]=h.cells[p].split(/ *\| */);this.tokens.push(h)}else if(i=this.rules.hr.exec(t))t=t.substring(i[0].length),this.tokens.push({type:"hr"});else if(i=this.rules.blockquote.exec(t))t=t.substring(i[0].length),this.tokens.push({type:"blockquote_start"}),i=i[0].replace(/^ *> ?/gm,""),this.token(i,n),this.tokens.push({type:"blockquote_end"});else if(i=this.rules.list.exec(t)){for(t=t.substring(i[0].length),l=i[2],this.tokens.push({type:"list_start",ordered:l.length>1}),r=!1,c=(i=i[0].match(this.rules.item)).length,p=0;p<c;p++)a=(h=i[p]).length,~(h=h.replace(/^ *([*+-]|\d+\.) +/,"")).indexOf("\n ")&&(a-=h.length,h=this.options.pedantic?h.replace(/^ {1,4}/gm,""):h.replace(new RegExp("^ {1,"+a+"}","gm"),"")),this.options.smartLists&&p!==c-1&&(l===(o=e.bullet.exec(i[p+1])[0])||l.length>1&&o.length>1||(t=i.slice(p+1).join("\n")+t,p=c-1)),s=r||/\n\n(?!\s*$)/.test(h),p!==c-1&&(r="\n"===h.charAt(h.length-1),s||(s=r)),this.tokens.push({type:s?"loose_item_start":"list_item_start"}),this.token(h,!1),this.tokens.push({type:"list_item_end"});this.tokens.push({type:"list_end"})}else if(i=this.rules.html.exec(t))t=t.substring(i[0].length),this.tokens.push({type:this.options.sanitize?"paragraph":"html",pre:!this.options.sanitizer&&("pre"===i[1]||"script"===i[1]||"style"===i[1]),text:i[0]});else if(n&&(i=this.rules.def.exec(t)))t=t.substring(i[0].length),i[3]&&(i[3]=i[3].substring(1,i[3].length-1)),u=i[1].toLowerCase(),this.tokens.links[u]||(this.tokens.links[u]={href:i[2],title:i[3]});else if(n&&(i=this.rules.table.exec(t))){for(t=t.substring(i[0].length),h={type:"table",header:i[1].replace(/^ *| *\| *$/g,"").split(/ *\| */),align:i[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:i[3].replace(/(?: *\| *)?\n$/,"").split("\n")},p=0;p<h.align.length;p++)/^ *-+: *$/.test(h.align[p])?h.align[p]="right":/^ *:-+: *$/.test(h.align[p])?h.align[p]="center":/^ *:-+ *$/.test(h.align[p])?h.align[p]="left":h.align[p]=null;for(p=0;p<h.cells.length;p++)h.cells[p]=h.cells[p].replace(/^ *\| *| *\| *$/g,"").split(/ *\| */);this.tokens.push(h)}else if(i=this.rules.lheading.exec(t))t=t.substring(i[0].length),this.tokens.push({type:"heading",depth:"="===i[2]?1:2,text:i[1]});else if(n&&(i=this.rules.paragraph.exec(t)))t=t.substring(i[0].length),this.tokens.push({type:"paragraph",text:"\n"===i[1].charAt(i[1].length-1)?i[1].slice(0,-1):i[1]});else if(i=this.rules.text.exec(t))t=t.substring(i[0].length),this.tokens.push({type:"text",text:i[0]});else if(t)throw new Error("Infinite loop on byte: "+t.charCodeAt(0));return this.tokens};var n={escape:/^\\([\\`*{}\[\]()#+\-.!_>])/,autolink:/^<(scheme:[^\s\x00-\x1f<>]*|email)>/,url:g,tag:/^<!--[\s\S]*?-->|^<\/?[a-zA-Z0-9\-]+(?:"[^"]*"|'[^']*'|\s[^<'">\/]*)*?\/?>/,link:/^!?\[(inside)\]\(href\)/,reflink:/^!?\[(inside)\]\s*\[([^\]]*)\]/,nolink:/^!?\[((?:\[[^\]]*\]|\\[\[\]]|[^\[\]])*)\]/,strong:/^__([\s\S]+?)__(?!_)|^\*\*([\s\S]+?)\*\*(?!\*)/,em:/^_([^\s_](?:[^_]|__)+?[^\s_])_\b|^\*((?:\*\*|[^*])+?)\*(?!\*)/,code:/^(`+)\s*([\s\S]*?[^`]?)\s*\1(?!`)/,br:/^ {2,}\n(?!\s*$)/,del:g,text:/^[\s\S]+?(?=[\\<!\[`*]|\b_| {2,}\n|$)/};function r(e,t){if(this.options=t||d.defaults,this.links=e,this.rules=n.normal,this.renderer=this.options.renderer||new s,this.renderer.options=this.options,!this.links)throw new Error("Tokens array requires a `links` property.");this.options.gfm?this.options.breaks?this.rules=n.breaks:this.rules=n.gfm:this.options.pedantic&&(this.rules=n.pedantic)}function s(e){this.options=e||{}}function i(){}function l(e){this.tokens=[],this.token=null,this.options=e||d.defaults,this.options.renderer=this.options.renderer||new s,this.renderer=this.options.renderer,this.renderer.options=this.options}function o(e,t){return e.replace(t?/&/g:/&(?!#?\w+;)/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}function h(e){return e.replace(/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/gi,function(e,t){return"colon"===(t=t.toLowerCase())?":":"#"===t.charAt(0)?"x"===t.charAt(1)?String.fromCharCode(parseInt(t.substring(2),16)):String.fromCharCode(+t.substring(1)):""})}function a(e,t){return e=e.source,t=t||"",function n(r,s){return r?(s=(s=s.source||s).replace(/(^|[^\[])\^/g,"$1"),e=e.replace(r,s),n):new RegExp(e,t)}}function p(e,t){return u[" "+e]||(/^[^:]+:\/*[^/]*$/.test(e)?u[" "+e]=e+"/":u[" "+e]=e.replace(/[^/]*$/,"")),e=u[" "+e],"//"===t.slice(0,2)?e.replace(/:[\s\S]*/,":")+t:"/"===t.charAt(0)?e.replace(/(:\/*[^/]*)[\s\S]*/,"$1")+t:e+t}n._scheme=/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/,n._email=/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/,n.autolink=a(n.autolink)("scheme",n._scheme)("email",n._email)(),n._inside=/(?:\[[^\]]*\]|\\[\[\]]|[^\[\]]|\](?=[^\[]*\]))*/,n._href=/\s*<?([\s\S]*?)>?(?:\s+['"]([\s\S]*?)['"])?\s*/,n.link=a(n.link)("inside",n._inside)("href",n._href)(),n.reflink=a(n.reflink)("inside",n._inside)(),n.normal=f({},n),n.pedantic=f({},n.normal,{strong:/^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,em:/^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/}),n.gfm=f({},n.normal,{escape:a(n.escape)("])","~|])")(),url:a(/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/)("email",n._email)(),_backpedal:/(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,del:/^~~(?=\S)([\s\S]*?\S)~~/,text:a(n.text)("]|","~]|")("|","|https?://|ftp://|www\\.|[a-zA-Z0-9.!#$%&'*+/=?^_`{\\|}~-]+@|")()}),n.breaks=f({},n.gfm,{br:a(n.br)("{2,}","*")(),text:a(n.gfm.text)("{2,}","*")()}),r.rules=n,r.output=function(e,t,n){return new r(t,n).output(e)},r.prototype.output=function(e){for(var t,n,r,s,i="";e;)if(s=this.rules.escape.exec(e))e=e.substring(s[0].length),i+=s[1];else if(s=this.rules.autolink.exec(e))e=e.substring(s[0].length),r="@"===s[2]?"mailto:"+(n=o(this.mangle(s[1]))):n=o(s[1]),i+=this.renderer.link(r,null,n);else if(this.inLink||!(s=this.rules.url.exec(e))){if(s=this.rules.tag.exec(e))!this.inLink&&/^<a /i.test(s[0])?this.inLink=!0:this.inLink&&/^<\/a>/i.test(s[0])&&(this.inLink=!1),e=e.substring(s[0].length),i+=this.options.sanitize?this.options.sanitizer?this.options.sanitizer(s[0]):o(s[0]):s[0];else if(s=this.rules.link.exec(e))e=e.substring(s[0].length),this.inLink=!0,i+=this.outputLink(s,{href:s[2],title:s[3]}),this.inLink=!1;else if((s=this.rules.reflink.exec(e))||(s=this.rules.nolink.exec(e))){if(e=e.substring(s[0].length),t=(s[2]||s[1]).replace(/\s+/g," "),!(t=this.links[t.toLowerCase()])||!t.href){i+=s[0].charAt(0),e=s[0].substring(1)+e;continue}this.inLink=!0,i+=this.outputLink(s,t),this.inLink=!1}else if(s=this.rules.strong.exec(e))e=e.substring(s[0].length),i+=this.renderer.strong(this.output(s[2]||s[1]));else if(s=this.rules.em.exec(e))e=e.substring(s[0].length),i+=this.renderer.em(this.output(s[2]||s[1]));else if(s=this.rules.code.exec(e))e=e.substring(s[0].length),i+=this.renderer.codespan(o(s[2].trim(),!0));else if(s=this.rules.br.exec(e))e=e.substring(s[0].length),i+=this.renderer.br();else if(s=this.rules.del.exec(e))e=e.substring(s[0].length),i+=this.renderer.del(this.output(s[1]));else if(s=this.rules.text.exec(e))e=e.substring(s[0].length),i+=this.renderer.text(o(this.smartypants(s[0])));else if(e)throw new Error("Infinite loop on byte: "+e.charCodeAt(0))}else s[0]=this.rules._backpedal.exec(s[0])[0],e=e.substring(s[0].length),"@"===s[2]?r="mailto:"+(n=o(s[0])):(n=o(s[0]),r="www."===s[1]?"http://"+n:n),i+=this.renderer.link(r,null,n);return i},r.prototype.outputLink=function(e,t){var n=o(t.href),r=t.title?o(t.title):null;return"!"!==e[0].charAt(0)?this.renderer.link(n,r,this.output(e[1])):this.renderer.image(n,r,o(e[1]))},r.prototype.smartypants=function(e){return this.options.smartypants?e.replace(/---/g,"—").replace(/--/g,"–").replace(/(^|[-\u2014/(\[{"\s])'/g,"$1‘").replace(/'/g,"’").replace(/(^|[-\u2014/(\[{\u2018\s])"/g,"$1“").replace(/"/g,"”").replace(/\.{3}/g,"…"):e},r.prototype.mangle=function(e){if(!this.options.mangle)return e;for(var t,n="",r=e.length,s=0;s<r;s++)t=e.charCodeAt(s),Math.random()>.5&&(t="x"+t.toString(16)),n+="&#"+t+";";return n},s.prototype.code=function(e,t,n){if(this.options.highlight){var r=this.options.highlight(e,t);null!=r&&r!==e&&(n=!0,e=r)}return t?'<pre><code class="'+this.options.langPrefix+o(t,!0)+'">'+(n?e:o(e,!0))+"\n</code></pre>\n":"<pre><code>"+(n?e:o(e,!0))+"\n</code></pre>"},s.prototype.blockquote=function(e){return"<blockquote>\n"+e+"</blockquote>\n"},s.prototype.html=function(e){return e},s.prototype.heading=function(e,t,n){return"<h"+t+' id="'+this.options.headerPrefix+n.toLowerCase().replace(/[^\w]+/g,"-")+'">'+e+"</h"+t+">\n"},s.prototype.hr=function(){return this.options.xhtml?"<hr/>\n":"<hr>\n"},s.prototype.list=function(e,t){var n=t?"ol":"ul";return"<"+n+">\n"+e+"</"+n+">\n"},s.prototype.listitem=function(e){return"<li>"+e+"</li>\n"},s.prototype.paragraph=function(e){return"<p>"+e+"</p>\n"},s.prototype.table=function(e,t){return"<table>\n<thead>\n"+e+"</thead>\n<tbody>\n"+t+"</tbody>\n</table>\n"},s.prototype.tablerow=function(e){return"<tr>\n"+e+"</tr>\n"},s.prototype.tablecell=function(e,t){var n=t.header?"th":"td";return(t.align?"<"+n+' style="text-align:'+t.align+'">':"<"+n+">")+e+"</"+n+">\n"},s.prototype.strong=function(e){return"<strong>"+e+"</strong>"},s.prototype.em=function(e){return"<em>"+e+"</em>"},s.prototype.codespan=function(e){return"<code>"+e+"</code>"},s.prototype.br=function(){return this.options.xhtml?"<br/>":"<br>"},s.prototype.del=function(e){return"<del>"+e+"</del>"},s.prototype.link=function(e,t,n){if(this.options.sanitize){try{var r=decodeURIComponent(h(e)).replace(/[^\w:]/g,"").toLowerCase()}catch(e){return n}if(0===r.indexOf("javascript:")||0===r.indexOf("vbscript:")||0===r.indexOf("data:"))return n}this.options.baseUrl&&!c.test(e)&&(e=p(this.options.baseUrl,e));var s='<a href="'+e+'"';return t&&(s+=' title="'+t+'"'),s+=">"+n+"</a>"},s.prototype.image=function(e,t,n){this.options.baseUrl&&!c.test(e)&&(e=p(this.options.baseUrl,e));var r='<img src="'+e+'" alt="'+n+'"';return t&&(r+=' title="'+t+'"'),r+=this.options.xhtml?"/>":">"},s.prototype.text=function(e){return e},i.prototype.strong=i.prototype.em=i.prototype.codespan=i.prototype.del=i.prototype.text=function(e){return e},i.prototype.link=i.prototype.image=function(e,t,n){return""+n},i.prototype.br=function(){return""},l.parse=function(e,t){return new l(t).parse(e)},l.prototype.parse=function(e){this.inline=new r(e.links,this.options),this.inlineText=new r(e.links,f({},this.options,{renderer:new i})),this.tokens=e.reverse();for(var t="";this.next();)t+=this.tok();return t},l.prototype.next=function(){return this.token=this.tokens.pop()},l.prototype.peek=function(){return this.tokens[this.tokens.length-1]||0},l.prototype.parseText=function(){for(var e=this.token.text;"text"===this.peek().type;)e+="\n"+this.next().text;return this.inline.output(e)},l.prototype.tok=function(){switch(this.token.type){case"space":return"";case"hr":return this.renderer.hr();case"heading":return this.renderer.heading(this.inline.output(this.token.text),this.token.depth,h(this.inlineText.output(this.token.text)));case"code":return this.renderer.code(this.token.text,this.token.lang,this.token.escaped);case"table":var e,t,n,r,s="",i="";for(n="",e=0;e<this.token.header.length;e++)n+=this.renderer.tablecell(this.inline.output(this.token.header[e]),{header:!0,align:this.token.align[e]});for(s+=this.renderer.tablerow(n),e=0;e<this.token.cells.length;e++){for(t=this.token.cells[e],n="",r=0;r<t.length;r++)n+=this.renderer.tablecell(this.inline.output(t[r]),{header:!1,align:this.token.align[r]});i+=this.renderer.tablerow(n)}return this.renderer.table(s,i);case"blockquote_start":for(i="";"blockquote_end"!==this.next().type;)i+=this.tok();return this.renderer.blockquote(i);case"list_start":i="";for(var l=this.token.ordered;"list_end"!==this.next().type;)i+=this.tok();return this.renderer.list(i,l);case"list_item_start":for(i="";"list_item_end"!==this.next().type;)i+="text"===this.token.type?this.parseText():this.tok();return this.renderer.listitem(i);case"loose_item_start":for(i="";"list_item_end"!==this.next().type;)i+=this.tok();return this.renderer.listitem(i);case"html":var o=this.token.pre||this.options.pedantic?this.token.text:this.inline.output(this.token.text);return this.renderer.html(o);case"paragraph":return this.renderer.paragraph(this.inline.output(this.token.text));case"text":return this.renderer.paragraph(this.parseText())}};var u={},c=/^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;function g(){}function f(e){for(var t,n,r=1;r<arguments.length;r++)for(n in t=arguments[r])Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e}function d(e,n,r){if(null==e)throw new Error("marked(): input parameter is undefined or null");if("string"!=typeof e)throw new Error("marked(): input parameter is of type "+Object.prototype.toString.call(e)+", string expected");if(r||"function"==typeof n){r||(r=n,n=null);var s,i,h=(n=f({},d.defaults,n||{})).highlight,a=0;try{s=t.lex(e,n)}catch(e){return r(e)}i=s.length;var p=function(e){if(e)return n.highlight=h,r(e);var t;try{t=l.parse(s,n)}catch(t){e=t}return n.highlight=h,e?r(e):r(null,t)};if(!h||h.length<3)return p();if(delete n.highlight,!i)return p();for(;a<s.length;a++)!function(e){"code"!==e.type?--i||p():h(e.text,e.lang,function(t,n){return t?p(t):null==n||n===e.text?--i||p():(e.text=n,e.escaped=!0,void(--i||p()))})}(s[a])}else try{return n&&(n=f({},d.defaults,n)),l.parse(t.lex(e,n),n)}catch(e){if(e.message+="\nPlease report this to https://github.com/chjj/marked.",(n||d.defaults).silent)return"<p>An error occurred:</p><pre>"+o(e.message+"",!0)+"</pre>";throw e}}g.exec=g,d.options=d.setOptions=function(e){return f(d.defaults,e),d},d.defaults={gfm:!0,tables:!0,breaks:!1,pedantic:!1,sanitize:!1,sanitizer:null,mangle:!0,smartLists:!1,silent:!1,highlight:null,langPrefix:"lang-",smartypants:!1,headerPrefix:"",renderer:new s,xhtml:!1,baseUrl:null},d.Parser=l,d.parser=l.parse,d.Renderer=s,d.TextRenderer=i,d.Lexer=t,d.lexer=t.lex,d.InlineLexer=r,d.inlineLexer=r.output,d.parse=d,"undefined"!=typeof module&&"object"==typeof exports?module.exports=d:"function"==typeof define&&define.amd?define(function(){return d}):this.marked=d}).call(function(){return this||("undefined"!=typeof window?window:global)}()); | ||
!function(e){"use strict";var t={newline:/^\n+/,code:/^( {4}[^\n]+\n*)+/,fences:f,hr:/^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/,heading:/^ *(#{1,6}) *([^\n]+?) *#* *(?:\n+|$)/,nptable:f,blockquote:/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,list:/^( *)(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,html:/^ *(?:comment *(?:\n|\s*$)|closed *(?:\n{2,}|\s*$)|closing *(?:\n{2,}|\s*$))/,def:/^ {0,3}\[(label)\]: *\n? *<?([^\s>]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/,table:f,lheading:/^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/,paragraph:/^([^\n]+(?:\n?(?!hr|heading|lheading| {0,3}>|tag)[^\n]+)+)/,text:/^[^\n]+/};function n(e){this.tokens=[],this.tokens.links={},this.options=e||k.defaults,this.rules=t.normal,this.options.gfm&&(this.options.tables?this.rules=t.tables:this.rules=t.gfm)}t._label=/(?:\\[\[\]]|[^\[\]])+/,t._title=/(?:"(?:\\"|[^"]|"[^"\n]*")*"|'\n?(?:[^'\n]+\n?)*'|\([^()]*\))/,t.def=p(t.def).replace("label",t._label).replace("title",t._title).getRegex(),t.bullet=/(?:[*+-]|\d+\.)/,t.item=/^( *)(bull) [^\n]*(?:\n(?!\1bull )[^\n]*)*/,t.item=p(t.item,"gm").replace(/bull/g,t.bullet).getRegex(),t.list=p(t.list).replace(/bull/g,t.bullet).replace("hr","\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))").replace("def","\\n+(?="+t.def.source+")").getRegex(),t._tag="(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b",t.html=p(t.html).replace("comment",/<!--[\s\S]*?-->/).replace("closed",/<(tag)[\s\S]+?<\/\1>/).replace("closing",/<tag(?:"[^"]*"|'[^']*'|\s[^'"\/>\s]*)*?\/?>/).replace(/tag/g,t._tag).getRegex(),t.paragraph=p(t.paragraph).replace("hr",t.hr).replace("heading",t.heading).replace("lheading",t.lheading).replace("tag","<"+t._tag).getRegex(),t.blockquote=p(t.blockquote).replace("paragraph",t.paragraph).getRegex(),t.normal=d({},t),t.gfm=d({},t.normal,{fences:/^ *(`{3,}|~{3,})[ \.]*(\S+)? *\n([\s\S]*?)\n? *\1 *(?:\n+|$)/,paragraph:/^/,heading:/^ *(#{1,6}) +([^\n]+?) *#* *(?:\n+|$)/}),t.gfm.paragraph=p(t.paragraph).replace("(?!","(?!"+t.gfm.fences.source.replace("\\1","\\2")+"|"+t.list.source.replace("\\1","\\3")+"|").getRegex(),t.tables=d({},t.gfm,{nptable:/^ *(\S.*\|.*)\n *([-:]+ *\|[-| :]*)\n((?:.*\|.*(?:\n|$))*)\n*/,table:/^ *\|(.+)\n *\|( *[-:]+[-| :]*)\n((?: *\|.*(?:\n|$))*)\n*/}),n.rules=t,n.lex=function(e,t){return new n(t).lex(e)},n.prototype.lex=function(e){return e=e.replace(/\r\n|\r/g,"\n").replace(/\t/g," ").replace(/\u00a0/g," ").replace(/\u2424/g,"\n"),this.token(e,!0)},n.prototype.token=function(e,n){var r,s,i,l,o,a,h,p,u,c;for(e=e.replace(/^ +$/gm,"");e;)if((i=this.rules.newline.exec(e))&&(e=e.substring(i[0].length),i[0].length>1&&this.tokens.push({type:"space"})),i=this.rules.code.exec(e))e=e.substring(i[0].length),i=i[0].replace(/^ {4}/gm,""),this.tokens.push({type:"code",text:this.options.pedantic?i:i.replace(/\n+$/,"")});else if(i=this.rules.fences.exec(e))e=e.substring(i[0].length),this.tokens.push({type:"code",lang:i[2],text:i[3]||""});else if(i=this.rules.heading.exec(e))e=e.substring(i[0].length),this.tokens.push({type:"heading",depth:i[1].length,text:i[2]});else if(n&&(i=this.rules.nptable.exec(e))){for(e=e.substring(i[0].length),a={type:"table",header:i[1].replace(/^ *| *\| *$/g,"").split(/ *\| */),align:i[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:i[3].replace(/\n$/,"").split("\n")},p=0;p<a.align.length;p++)/^ *-+: *$/.test(a.align[p])?a.align[p]="right":/^ *:-+: *$/.test(a.align[p])?a.align[p]="center":/^ *:-+ *$/.test(a.align[p])?a.align[p]="left":a.align[p]=null;for(p=0;p<a.cells.length;p++)a.cells[p]=a.cells[p].split(/ *\| */);this.tokens.push(a)}else if(i=this.rules.hr.exec(e))e=e.substring(i[0].length),this.tokens.push({type:"hr"});else if(i=this.rules.blockquote.exec(e))e=e.substring(i[0].length),this.tokens.push({type:"blockquote_start"}),i=i[0].replace(/^ *> ?/gm,""),this.token(i,n),this.tokens.push({type:"blockquote_end"});else if(i=this.rules.list.exec(e)){for(e=e.substring(i[0].length),l=i[2],this.tokens.push({type:"list_start",ordered:l.length>1}),r=!1,c=(i=i[0].match(this.rules.item)).length,p=0;p<c;p++)h=(a=i[p]).length,~(a=a.replace(/^ *([*+-]|\d+\.) +/,"")).indexOf("\n ")&&(h-=a.length,a=this.options.pedantic?a.replace(/^ {1,4}/gm,""):a.replace(new RegExp("^ {1,"+h+"}","gm"),"")),this.options.smartLists&&p!==c-1&&(l===(o=t.bullet.exec(i[p+1])[0])||l.length>1&&o.length>1||(e=i.slice(p+1).join("\n")+e,p=c-1)),s=r||/\n\n(?!\s*$)/.test(a),p!==c-1&&(r="\n"===a.charAt(a.length-1),s||(s=r)),this.tokens.push({type:s?"loose_item_start":"list_item_start"}),this.token(a,!1),this.tokens.push({type:"list_item_end"});this.tokens.push({type:"list_end"})}else if(i=this.rules.html.exec(e))e=e.substring(i[0].length),this.tokens.push({type:this.options.sanitize?"paragraph":"html",pre:!this.options.sanitizer&&("pre"===i[1]||"script"===i[1]||"style"===i[1]),text:i[0]});else if(n&&(i=this.rules.def.exec(e)))e=e.substring(i[0].length),i[3]&&(i[3]=i[3].substring(1,i[3].length-1)),u=i[1].toLowerCase(),this.tokens.links[u]||(this.tokens.links[u]={href:i[2],title:i[3]});else if(n&&(i=this.rules.table.exec(e))){for(e=e.substring(i[0].length),a={type:"table",header:i[1].replace(/^ *| *\| *$/g,"").split(/ *\| */),align:i[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:i[3].replace(/(?: *\| *)?\n$/,"").split("\n")},p=0;p<a.align.length;p++)/^ *-+: *$/.test(a.align[p])?a.align[p]="right":/^ *:-+: *$/.test(a.align[p])?a.align[p]="center":/^ *:-+ *$/.test(a.align[p])?a.align[p]="left":a.align[p]=null;for(p=0;p<a.cells.length;p++)a.cells[p]=a.cells[p].replace(/^ *\| *| *\| *$/g,"").split(/ *\| */);this.tokens.push(a)}else if(i=this.rules.lheading.exec(e))e=e.substring(i[0].length),this.tokens.push({type:"heading",depth:"="===i[2]?1:2,text:i[1]});else if(n&&(i=this.rules.paragraph.exec(e)))e=e.substring(i[0].length),this.tokens.push({type:"paragraph",text:"\n"===i[1].charAt(i[1].length-1)?i[1].slice(0,-1):i[1]});else if(i=this.rules.text.exec(e))e=e.substring(i[0].length),this.tokens.push({type:"text",text:i[0]});else if(e)throw new Error("Infinite loop on byte: "+e.charCodeAt(0));return this.tokens};var r={escape:/^\\([\\`*{}\[\]()#+\-.!_>])/,autolink:/^<(scheme:[^\s\x00-\x1f<>]*|email)>/,url:f,tag:/^<!--[\s\S]*?-->|^<\/?[a-zA-Z0-9\-]+(?:"[^"]*"|'[^']*'|\s[^<'">\/\s]*)*?\/?>/,link:/^!?\[(inside)\]\(href\)/,reflink:/^!?\[(inside)\]\s*\[([^\]]*)\]/,nolink:/^!?\[((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\]/,strong:/^__([\s\S]+?)__(?!_)|^\*\*([\s\S]+?)\*\*(?!\*)/,em:/^_([^\s_](?:[^_]|__)+?[^\s_])_\b|^\*((?:\*\*|[^*])+?)\*(?!\*)/,code:/^(`+)\s*([\s\S]*?[^`]?)\s*\1(?!`)/,br:/^ {2,}\n(?!\s*$)/,del:f,text:/^[\s\S]+?(?=[\\<!\[`*]|\b_| {2,}\n|$)/};function s(e,t){if(this.options=t||k.defaults,this.links=e,this.rules=r.normal,this.renderer=this.options.renderer||new i,this.renderer.options=this.options,!this.links)throw new Error("Tokens array requires a `links` property.");this.options.gfm?this.options.breaks?this.rules=r.breaks:this.rules=r.gfm:this.options.pedantic&&(this.rules=r.pedantic)}function i(e){this.options=e||{}}function l(){}function o(e){this.tokens=[],this.token=null,this.options=e||k.defaults,this.options.renderer=this.options.renderer||new i,this.renderer=this.options.renderer,this.renderer.options=this.options}function a(e,t){return e.replace(t?/&/g:/&(?!#?\w+;)/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}function h(e){return e.replace(/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/gi,function(e,t){return"colon"===(t=t.toLowerCase())?":":"#"===t.charAt(0)?"x"===t.charAt(1)?String.fromCharCode(parseInt(t.substring(2),16)):String.fromCharCode(+t.substring(1)):""})}function p(e,t){return e=e.source,t=t||"",{replace:function(t,n){return n=(n=n.source||n).replace(/(^|[^\[])\^/g,"$1"),e=e.replace(t,n),this},getRegex:function(){return new RegExp(e,t)}}}function u(e,t){return c[" "+e]||(/^[^:]+:\/*[^/]*$/.test(e)?c[" "+e]=e+"/":c[" "+e]=e.replace(/[^/]*$/,"")),e=c[" "+e],"//"===t.slice(0,2)?e.replace(/:[\s\S]*/,":")+t:"/"===t.charAt(0)?e.replace(/(:\/*[^/]*)[\s\S]*/,"$1")+t:e+t}r._scheme=/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/,r._email=/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/,r.autolink=p(r.autolink).replace("scheme",r._scheme).replace("email",r._email).getRegex(),r._inside=/(?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]]|\](?=[^\[]*\]))*/,r._href=/\s*<?([\s\S]*?)>?(?:\s+['"]([\s\S]*?)['"])?\s*/,r.link=p(r.link).replace("inside",r._inside).replace("href",r._href).getRegex(),r.reflink=p(r.reflink).replace("inside",r._inside).getRegex(),r.normal=d({},r),r.pedantic=d({},r.normal,{strong:/^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,em:/^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/}),r.gfm=d({},r.normal,{escape:p(r.escape).replace("])","~|])").getRegex(),url:p(/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/).replace("email",r._email).getRegex(),_backpedal:/(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,del:/^~~(?=\S)([\s\S]*?\S)~~/,text:p(r.text).replace("]|","~]|").replace("|","|https?://|ftp://|www\\.|[a-zA-Z0-9.!#$%&'*+/=?^_`{\\|}~-]+@|").getRegex()}),r.breaks=d({},r.gfm,{br:p(r.br).replace("{2,}","*").getRegex(),text:p(r.gfm.text).replace("{2,}","*").getRegex()}),s.rules=r,s.output=function(e,t,n){return new s(t,n).output(e)},s.prototype.output=function(e){for(var t,n,r,s,i="";e;)if(s=this.rules.escape.exec(e))e=e.substring(s[0].length),i+=s[1];else if(s=this.rules.autolink.exec(e))e=e.substring(s[0].length),r="@"===s[2]?"mailto:"+(n=a(this.mangle(s[1]))):n=a(s[1]),i+=this.renderer.link(r,null,n);else if(this.inLink||!(s=this.rules.url.exec(e))){if(s=this.rules.tag.exec(e))!this.inLink&&/^<a /i.test(s[0])?this.inLink=!0:this.inLink&&/^<\/a>/i.test(s[0])&&(this.inLink=!1),e=e.substring(s[0].length),i+=this.options.sanitize?this.options.sanitizer?this.options.sanitizer(s[0]):a(s[0]):s[0];else if(s=this.rules.link.exec(e))e=e.substring(s[0].length),this.inLink=!0,i+=this.outputLink(s,{href:s[2],title:s[3]}),this.inLink=!1;else if((s=this.rules.reflink.exec(e))||(s=this.rules.nolink.exec(e))){if(e=e.substring(s[0].length),t=(s[2]||s[1]).replace(/\s+/g," "),!(t=this.links[t.toLowerCase()])||!t.href){i+=s[0].charAt(0),e=s[0].substring(1)+e;continue}this.inLink=!0,i+=this.outputLink(s,t),this.inLink=!1}else if(s=this.rules.strong.exec(e))e=e.substring(s[0].length),i+=this.renderer.strong(this.output(s[2]||s[1]));else if(s=this.rules.em.exec(e))e=e.substring(s[0].length),i+=this.renderer.em(this.output(s[2]||s[1]));else if(s=this.rules.code.exec(e))e=e.substring(s[0].length),i+=this.renderer.codespan(a(s[2].trim(),!0));else if(s=this.rules.br.exec(e))e=e.substring(s[0].length),i+=this.renderer.br();else if(s=this.rules.del.exec(e))e=e.substring(s[0].length),i+=this.renderer.del(this.output(s[1]));else if(s=this.rules.text.exec(e))e=e.substring(s[0].length),i+=this.renderer.text(a(this.smartypants(s[0])));else if(e)throw new Error("Infinite loop on byte: "+e.charCodeAt(0))}else s[0]=this.rules._backpedal.exec(s[0])[0],e=e.substring(s[0].length),"@"===s[2]?r="mailto:"+(n=a(s[0])):(n=a(s[0]),r="www."===s[1]?"http://"+n:n),i+=this.renderer.link(r,null,n);return i},s.prototype.outputLink=function(e,t){var n=a(t.href),r=t.title?a(t.title):null;return"!"!==e[0].charAt(0)?this.renderer.link(n,r,this.output(e[1])):this.renderer.image(n,r,a(e[1]))},s.prototype.smartypants=function(e){return this.options.smartypants?e.replace(/---/g,"—").replace(/--/g,"–").replace(/(^|[-\u2014/(\[{"\s])'/g,"$1‘").replace(/'/g,"’").replace(/(^|[-\u2014/(\[{\u2018\s])"/g,"$1“").replace(/"/g,"”").replace(/\.{3}/g,"…"):e},s.prototype.mangle=function(e){if(!this.options.mangle)return e;for(var t,n="",r=e.length,s=0;s<r;s++)t=e.charCodeAt(s),Math.random()>.5&&(t="x"+t.toString(16)),n+="&#"+t+";";return n},i.prototype.code=function(e,t,n){if(this.options.highlight){var r=this.options.highlight(e,t);null!=r&&r!==e&&(n=!0,e=r)}return t?'<pre><code class="'+this.options.langPrefix+a(t,!0)+'">'+(n?e:a(e,!0))+"\n</code></pre>\n":"<pre><code>"+(n?e:a(e,!0))+"\n</code></pre>"},i.prototype.blockquote=function(e){return"<blockquote>\n"+e+"</blockquote>\n"},i.prototype.html=function(e){return e},i.prototype.heading=function(e,t,n){return"<h"+t+' id="'+this.options.headerPrefix+n.toLowerCase().replace(/[^\w]+/g,"-")+'">'+e+"</h"+t+">\n"},i.prototype.hr=function(){return this.options.xhtml?"<hr/>\n":"<hr>\n"},i.prototype.list=function(e,t){var n=t?"ol":"ul";return"<"+n+">\n"+e+"</"+n+">\n"},i.prototype.listitem=function(e){return"<li>"+e+"</li>\n"},i.prototype.paragraph=function(e){return"<p>"+e+"</p>\n"},i.prototype.table=function(e,t){return"<table>\n<thead>\n"+e+"</thead>\n<tbody>\n"+t+"</tbody>\n</table>\n"},i.prototype.tablerow=function(e){return"<tr>\n"+e+"</tr>\n"},i.prototype.tablecell=function(e,t){var n=t.header?"th":"td";return(t.align?"<"+n+' style="text-align:'+t.align+'">':"<"+n+">")+e+"</"+n+">\n"},i.prototype.strong=function(e){return"<strong>"+e+"</strong>"},i.prototype.em=function(e){return"<em>"+e+"</em>"},i.prototype.codespan=function(e){return"<code>"+e+"</code>"},i.prototype.br=function(){return this.options.xhtml?"<br/>":"<br>"},i.prototype.del=function(e){return"<del>"+e+"</del>"},i.prototype.link=function(e,t,n){if(this.options.sanitize){try{var r=decodeURIComponent(h(e)).replace(/[^\w:]/g,"").toLowerCase()}catch(e){return n}if(0===r.indexOf("javascript:")||0===r.indexOf("vbscript:")||0===r.indexOf("data:"))return n}this.options.baseUrl&&!g.test(e)&&(e=u(this.options.baseUrl,e));var s='<a href="'+e+'"';return t&&(s+=' title="'+t+'"'),s+=">"+n+"</a>"},i.prototype.image=function(e,t,n){this.options.baseUrl&&!g.test(e)&&(e=u(this.options.baseUrl,e));var r='<img src="'+e+'" alt="'+n+'"';return t&&(r+=' title="'+t+'"'),r+=this.options.xhtml?"/>":">"},i.prototype.text=function(e){return e},l.prototype.strong=l.prototype.em=l.prototype.codespan=l.prototype.del=l.prototype.text=function(e){return e},l.prototype.link=l.prototype.image=function(e,t,n){return""+n},l.prototype.br=function(){return""},o.parse=function(e,t){return new o(t).parse(e)},o.prototype.parse=function(e){this.inline=new s(e.links,this.options),this.inlineText=new s(e.links,d({},this.options,{renderer:new l})),this.tokens=e.reverse();for(var t="";this.next();)t+=this.tok();return t},o.prototype.next=function(){return this.token=this.tokens.pop()},o.prototype.peek=function(){return this.tokens[this.tokens.length-1]||0},o.prototype.parseText=function(){for(var e=this.token.text;"text"===this.peek().type;)e+="\n"+this.next().text;return this.inline.output(e)},o.prototype.tok=function(){switch(this.token.type){case"space":return"";case"hr":return this.renderer.hr();case"heading":return this.renderer.heading(this.inline.output(this.token.text),this.token.depth,h(this.inlineText.output(this.token.text)));case"code":return this.renderer.code(this.token.text,this.token.lang,this.token.escaped);case"table":var e,t,n,r,s="",i="";for(n="",e=0;e<this.token.header.length;e++)n+=this.renderer.tablecell(this.inline.output(this.token.header[e]),{header:!0,align:this.token.align[e]});for(s+=this.renderer.tablerow(n),e=0;e<this.token.cells.length;e++){for(t=this.token.cells[e],n="",r=0;r<t.length;r++)n+=this.renderer.tablecell(this.inline.output(t[r]),{header:!1,align:this.token.align[r]});i+=this.renderer.tablerow(n)}return this.renderer.table(s,i);case"blockquote_start":for(i="";"blockquote_end"!==this.next().type;)i+=this.tok();return this.renderer.blockquote(i);case"list_start":i="";for(var l=this.token.ordered;"list_end"!==this.next().type;)i+=this.tok();return this.renderer.list(i,l);case"list_item_start":for(i="";"list_item_end"!==this.next().type;)i+="text"===this.token.type?this.parseText():this.tok();return this.renderer.listitem(i);case"loose_item_start":for(i="";"list_item_end"!==this.next().type;)i+=this.tok();return this.renderer.listitem(i);case"html":var o=this.token.pre||this.options.pedantic?this.token.text:this.inline.output(this.token.text);return this.renderer.html(o);case"paragraph":return this.renderer.paragraph(this.inline.output(this.token.text));case"text":return this.renderer.paragraph(this.parseText())}};var c={},g=/^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;function f(){}function d(e){for(var t,n,r=1;r<arguments.length;r++)for(n in t=arguments[r])Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e}function k(e,t,r){if(null==e)throw new Error("marked(): input parameter is undefined or null");if("string"!=typeof e)throw new Error("marked(): input parameter is of type "+Object.prototype.toString.call(e)+", string expected");if(r||"function"==typeof t){r||(r=t,t=null);var s,i,l=(t=d({},k.defaults,t||{})).highlight,h=0;try{s=n.lex(e,t)}catch(e){return r(e)}i=s.length;var p=function(e){if(e)return t.highlight=l,r(e);var n;try{n=o.parse(s,t)}catch(t){e=t}return t.highlight=l,e?r(e):r(null,n)};if(!l||l.length<3)return p();if(delete t.highlight,!i)return p();for(;h<s.length;h++)!function(e){"code"!==e.type?--i||p():l(e.text,e.lang,function(t,n){return t?p(t):null==n||n===e.text?--i||p():(e.text=n,e.escaped=!0,void(--i||p()))})}(s[h])}else try{return t&&(t=d({},k.defaults,t)),o.parse(n.lex(e,t),t)}catch(e){if(e.message+="\nPlease report this to https://github.com/chjj/marked.",(t||k.defaults).silent)return"<p>An error occurred:</p><pre>"+a(e.message+"",!0)+"</pre>";throw e}}f.exec=f,k.options=k.setOptions=function(e){return d(k.defaults,e),k},k.defaults={gfm:!0,tables:!0,breaks:!1,pedantic:!1,sanitize:!1,sanitizer:null,mangle:!0,smartLists:!1,silent:!1,highlight:null,langPrefix:"lang-",smartypants:!1,headerPrefix:"",renderer:new i,xhtml:!1,baseUrl:null},k.Parser=o,k.parser=o.parse,k.Renderer=i,k.TextRenderer=l,k.Lexer=n,k.lexer=n.lex,k.InlineLexer=s,k.inlineLexer=s.output,k.parse=k,"undefined"!=typeof module&&"object"==typeof exports?module.exports=k:"function"==typeof define&&define.amd?define(function(){return k}):e.marked=k}(this||("undefined"!=typeof window?window:global)); |
@@ -5,3 +5,3 @@ { | ||
"author": "Christopher Jeffrey", | ||
"version": "0.3.16", | ||
"version": "0.3.17", | ||
"main": "./lib/marked.js", | ||
@@ -27,7 +27,13 @@ "bin": "./bin/marked", | ||
"devDependencies": { | ||
"eslint": "^4.15.0", | ||
"eslint-config-standard": "^11.0.0-beta.0", | ||
"eslint-plugin-import": "^2.8.0", | ||
"eslint-plugin-node": "^5.2.1", | ||
"eslint-plugin-promise": "^3.6.0", | ||
"eslint-plugin-standard": "^3.0.1", | ||
"front-matter": "^2.3.0", | ||
"glob-to-regexp": "0.3.0", | ||
"markdown": "*", | ||
"markdown-it": "*", | ||
"showdown": "*", | ||
"markdown-it": "*", | ||
"front-matter": "^2.3.0", | ||
"glob-to-regexp": "0.3.0", | ||
"uglify-js": "^3.3.10" | ||
@@ -37,6 +43,11 @@ }, | ||
"test": "node test", | ||
"test:lint": "eslint lib/marked.js test/index.js", | ||
"bench": "node test --bench", | ||
"lint": "eslint --fix lib/marked.js test/index.js", | ||
"build": "uglifyjs lib/marked.js -cm --comments /Copyright/ -o marked.min.js", | ||
"preversion": "npm run build" | ||
"preversion": "npm run build && (git diff --quiet || git commit -am 'minify')" | ||
}, | ||
"engines": { | ||
"node": ">=0.10.0" | ||
} | ||
} |
420
README.md
@@ -1,50 +0,44 @@ | ||
# marked | ||
<ul> | ||
<li><a href="#marked">About</a></li> | ||
<li><a href="#install">Installation</a></li> | ||
<li><a href="#usage">Usage</a></li> | ||
<li><a href="#specifications">Supported Markdown specifications</a></li> | ||
<li><a href="#security">Security</a></li> | ||
<li><a href="#contributing">Contributing</a></li> | ||
<li><a href="#authors">Authors</a></li> | ||
<li><a href="#license">License</a></li> | ||
</ul> | ||
> A full-featured markdown parser and compiler, written in JavaScript. Built | ||
> for speed. | ||
<h2 id="marked">Marked</h2> | ||
[![NPM version](https://badge.fury.io/js/marked.svg)][badge] | ||
Marked is | ||
## Install | ||
1. built for speed.<sup>*</sup> | ||
2. a low-level markdown compiler that allows frequent parsing of large chunks of markdown without caching or blocking for long periods of time.<sup>**</sup> | ||
3. light-weight while implementing all markdown features from the supported flavors & specifications.<sup>***</sup> | ||
4. available as a command line interface (CLI) and running in client- or server-side JavaScript projects. | ||
``` bash | ||
npm install marked --save | ||
``` | ||
<p><small><sup>*</sup> Still working on metrics for comparative analysis and definition.</small><br> | ||
<small><sup>**</sup> As few dependencies as possible.</small><br> | ||
<small><sup>***</sup> Strict compliance could result in slower processing when running comparative benchmarking.</small></p> | ||
or if you want to use the `marked` CLI tool (not necessary when using npm run-scripts): | ||
<h2 id="installation">Installation</h2> | ||
``` bash | ||
npm install -g marked | ||
``` | ||
**CLI:** `npm install -g marked` | ||
## Usage | ||
**In-browser:** `npm install marked --save` | ||
Minimal usage: | ||
<h2 id="usage">Usage</h2> | ||
```js | ||
var marked = require('marked'); | ||
console.log(marked('I am using __markdown__.')); | ||
// Outputs: <p>I am using <strong>markdown</strong>.</p> | ||
``` | ||
**CLI** | ||
Example setting options: | ||
```js | ||
var marked = require('marked'); | ||
marked.setOptions({ | ||
renderer: new marked.Renderer(), | ||
gfm: true, | ||
tables: true, | ||
breaks: false, | ||
pedantic: false, | ||
sanitize: false, | ||
smartLists: true, | ||
smartypants: false, | ||
xhtml: false | ||
}); | ||
console.log(marked('I am using __markdown__.')); | ||
``` bash | ||
$ marked -o hello.html | ||
hello world | ||
^D | ||
$ cat hello.html | ||
<p>hello world</p> | ||
``` | ||
### Browser | ||
**Browser** | ||
@@ -57,3 +51,3 @@ ```html | ||
<title>Marked in the browser</title> | ||
<script src="lib/marked.js"></script> | ||
<script src="/path/to/marked.min.js"></script> | ||
</head> | ||
@@ -70,350 +64,36 @@ <body> | ||
## marked(markdownString [,options] [,callback]) | ||
### markdownString | ||
Marked offers [advanced configurations](https://github.com/markedjs/marked/blob/master/USAGE_ADVANCED.md) and [extensibility](https://github.com/markedjs/marked/blob/master/USAGE_EXTENSIBILITY.md) as well. | ||
Type: `string` | ||
<h2 id="specifications">Supported Markdown specifications</h2> | ||
String of markdown source to be compiled. | ||
We actively support the features of the following [Markdown flavors](https://github.com/commonmark/CommonMark/wiki/Markdown-Flavors). | ||
### options | ||
|Flavor |Version | | ||
|:----------------------------------------------------------|:----------| | ||
|The original markdown.pl |-- | | ||
|[CommonMark](http://spec.commonmark.org/0.28/) |0.28 | | ||
|[GitHub Flavored Markdown](https://github.github.com/gfm/) |0.28 | | ||
Type: `object` | ||
By supporting the above Markdown flavors, it's possible that Marked can help you use other flavors as well; however, these are not actively supported by the community. | ||
Hash of options. Can also be set using the `marked.setOptions` method as seen | ||
above. | ||
<h2 id="security">Security</h2> | ||
### callback | ||
The only completely secure system is the one that doesn't exist in the first place. Having said that, we take the security of Marked very seriously; however, none of us are necessarily security experts, so to speak. Therefore, if you find something, [say something](https://github.com/markedjs/marked/issues), or, better yet, fix the thing! :) | ||
Type: `function` | ||
<h2 id="contributing">Contributing</h2> | ||
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. | ||
The marked community enjoys a spirit of collaboration and contribution from all comers. Whether you're just getting started with Markdown, JavaScript, and Marked or you're a veteran with it all figured out, we're here to help each other improve as professionals while helping Marked improve technically. Please see our [contributing documentation](https://github.com/markedjs/marked/blob/master/CONTRIBUTING.md) for more details. | ||
## Options | ||
For our Contribution License Agreement, see our [license](https://github.com/markedjs/marked/blob/master/LICENSE.md). | ||
### highlight | ||
<h2 id="authors">Authors</h2> | ||
Type: `function` | ||
For list of credited authors and contributors, please see our [authors page](https://github.com/markedjs/marked/blob/master/AUTHORS.md). | ||
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]: | ||
<h2 id="license">License</h2> | ||
```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) | ||
- text(*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" typographic punctuation for things like quotes and dashes. | ||
### xhtml | ||
Type: `boolean` | ||
Default: `false` | ||
Self-close the tags for void elements (<br/>, <img/>, etc.) with a "/" as required by XHTML. | ||
## 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 | ||
frequently parse huge chunks of markdown without having to worry about | ||
caching the compiled output somehow...or blocking for an unnecessarily long time. | ||
marked is very concise and still implements all markdown features. It is also | ||
now fully compatible with the client-side. | ||
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 | ||
disadvantage in the benchmarks. | ||
Along with implementing every markdown feature, marked also implements [GFM | ||
features][gfmf]. | ||
## Benchmarks | ||
node v8.9.4 | ||
``` bash | ||
$ npm run bench | ||
marked completed in 3408ms. | ||
marked (gfm) completed in 3465ms. | ||
marked (pedantic) completed in 3032ms. | ||
showdown (reuse converter) completed in 21444ms. | ||
showdown (new converter) completed in 23058ms. | ||
markdown-it completed in 3364ms. | ||
markdown.js completed in 12090ms. | ||
``` | ||
### Pro level | ||
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); | ||
``` | ||
``` bash | ||
$ node | ||
> require('marked').lexer('> i am using marked.') | ||
[ { type: 'blockquote_start' }, | ||
{ type: 'paragraph', | ||
text: 'i am using marked.' }, | ||
{ type: 'blockquote_end' }, | ||
links: {} ] | ||
``` | ||
## 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. | ||
In other words, if you have a test to add, add it to `test/new/`. If your test | ||
uses a certain feature, for example, maybe it assumes GFM is *not* enabled, you | ||
can add [front-matter](https://www.npmjs.com/package/front-matter) to the top of | ||
your `.md` file | ||
``` yml | ||
--- | ||
gfm: false | ||
--- | ||
``` | ||
To run the tests: | ||
``` bash | ||
npm run test | ||
``` | ||
### Contribution and License Agreement | ||
If you contribute code to this project, 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>` | ||
## License | ||
Copyright (c) 2011-2018, Christopher Jeffrey. (MIT License) | ||
See LICENSE for more info. | ||
See [license](https://github.com/markedjs/marked/blob/master/LICENSE.md) for more details. | ||
[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 |
# Releasing Marked | ||
- [ ] See [contributing](https://github.com/markedjs/marked/blob/master/CONTRIBUTING.md) | ||
- [ ] Create release branch from `master` (`release-x.y.z`) | ||
- [ ] Submit PR with minimal name: Release x.y.z | ||
- [ ] Complete PR checklists | ||
## Overall strategy | ||
**Master is always shippable:** We try to merge PRs in such a way that `master` is the only branch to really be concerned about *and* `master` can always be released. This allows smoother flow between new fetures, bug fixes, and so on. (Almost a continuous deployment setup, without automation.) | ||
@@ -7,22 +14,12 @@ | ||
We follow [semantic versioning](https://semver.org) where the following sequence is true `[major].[minor].[patch]` (further, while in beta, you may see this `0.[major|minor].[minor|patch]`); therefore, consider the following implications of the release you are preparing: | ||
We follow [semantic versioning](https://semver.org) where the following sequence is true `[major].[minor].[patch]`; therefore, consider the following implications of the release you are preparing: | ||
1. **Major:** There is at least one change not deemed backward compatible. While in beta, the major will remain at zero; thereby, alerting consumers to the potentially volatile nature of the package. | ||
2. **Minor:** There is at least one new feature added to the release. While in beta, the minor will tend to be more analagous to a `major` release. For example, we plan to release `0.4.0` once we have fixed most, if not all, known issues related to the CommonMark and GFM specifications because the architecture changes planned during `0.4.0` will most likely introduce breaking changes. | ||
3. **Patch:** No breaking changes. Should fix a defect found in a feature. While in beta, the patch will tend to be more analagous to a `minor` release. | ||
1. **Major:** There is at least one change not deemed backward compatible. | ||
2. **Minor:** There is at least one new feature added to the release. | ||
3. **Patch:** No breaking changes, no new features. | ||
## Release process | ||
What to expect while Marked is a zero-major (0.x.y): | ||
- [ ] Fork `markedjs/marked` -> clone the library locally -> Make sure you are on the `master` branch | ||
- [ ] Create release branch from `master` (`release-##.##.##`) | ||
- `$ npm test` (run tests) | ||
- `$ npm version [major|minor|patch]` (updates `package.json` and creates `min` file) | ||
- `$ npm publish` (publish to NPM) | ||
- [ ] Commit changes locally -> Submit PR to `origin/master` -> Merge PR | ||
- `package.json` should, at minimum, have an updated version number. | ||
- If the release contains changes to the library (most likely) you should also see a new `marked.min.js` file. | ||
- [ ] Navigate to the "Releases" tab on the project main page -> "Draft new release" | ||
- Add version number matching the one in the `package.json` file after publishing the release | ||
- Make sure `master` is the branch from which the release will be made | ||
- Add notes regarding what users should expect from the release | ||
- Click "Publish release" | ||
1. The major will remain at zero; thereby, alerting consumers to the potentially volatile nature of the package. | ||
2. The minor will tend to be more analagous to a `major` release. For example, we plan to release `0.4.0` once we have fixed most, if not all, known issues related to the CommonMark and GFM specifications because the architecture changes planned during `0.4.0` will most likely introduce breaking changes. | ||
3. The patch will tend to be more analagous to a `minor` release. |
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Mixed license
License(Experimental) Package contains multiple licenses.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
89614
21
1232
12
1
98