2019-11-06 11:54:31 -06:00
/ * *
* marked - a markdown parser
2020-02-05 16:59:36 +00:00
* Copyright ( c ) 2011 - 2020 , Christopher Jeffrey . ( MIT Licensed )
2019-11-06 11:54:31 -06:00
* https : //github.com/markedjs/marked
* /
2019-11-06 12:05:09 -06:00
/ * *
2019-11-07 12:49:10 -06:00
* DO NOT EDIT THIS FILE
* The code in this file is generated from files in . / src /
2019-11-06 12:05:09 -06:00
* /
2019-11-05 15:31:51 -06:00
2019-11-07 12:49:10 -06:00
( function ( global , factory ) {
typeof exports === 'object' && typeof module !== 'undefined' ? module . exports = factory ( ) :
typeof define === 'function' && define . amd ? define ( factory ) :
( global = global || self , global . marked = factory ( ) ) ;
} ( this , ( function ( ) { 'use strict' ;
2019-11-06 11:11:39 -06:00
2019-11-07 12:49:10 -06:00
function _defineProperties ( target , props ) {
for ( var i = 0 ; i < props . length ; i ++ ) {
var descriptor = props [ i ] ;
descriptor . enumerable = descriptor . enumerable || false ;
descriptor . configurable = true ;
if ( "value" in descriptor ) descriptor . writable = true ;
Object . defineProperty ( target , descriptor . key , descriptor ) ;
}
}
2019-11-06 11:11:39 -06:00
2019-11-07 12:49:10 -06:00
function _createClass ( Constructor , protoProps , staticProps ) {
if ( protoProps ) _defineProperties ( Constructor . prototype , protoProps ) ;
if ( staticProps ) _defineProperties ( Constructor , staticProps ) ;
return Constructor ;
}
2019-11-05 15:31:51 -06:00
2019-12-05 23:08:43 +00:00
function createCommonjsModule ( fn , module ) {
return module = { exports : { } } , fn ( module , module . exports ) , module . exports ;
2019-11-07 12:49:10 -06:00
}
2019-11-05 15:31:51 -06:00
2019-12-05 23:08:43 +00:00
var defaults = createCommonjsModule ( function ( module ) {
function getDefaults ( ) {
return {
baseUrl : null ,
breaks : false ,
gfm : true ,
headerIds : true ,
headerPrefix : '' ,
highlight : null ,
langPrefix : 'language-' ,
mangle : true ,
pedantic : false ,
renderer : null ,
sanitize : false ,
sanitizer : null ,
silent : false ,
smartLists : false ,
smartypants : false ,
xhtml : false
} ;
}
2019-11-06 11:11:39 -06:00
2019-12-05 23:08:43 +00:00
function changeDefaults ( newDefaults ) {
module . exports . defaults = newDefaults ;
}
module . exports = {
defaults : getDefaults ( ) ,
getDefaults : getDefaults ,
changeDefaults : changeDefaults
} ;
} ) ;
var defaults _1 = defaults . defaults ;
var defaults _2 = defaults . getDefaults ;
var defaults _3 = defaults . changeDefaults ;
2019-11-06 12:05:09 -06:00
2019-11-07 12:49:10 -06:00
/ * *
* Helpers
* /
2019-12-05 23:08:43 +00:00
var escapeTest = /[&<>"']/ ;
var escapeReplace = /[&<>"']/g ;
var escapeTestNoEncode = /[<>"']|&(?!#?\w+;)/ ;
var escapeReplaceNoEncode = /[<>"']|&(?!#?\w+;)/g ;
var escapeReplacements = {
'&' : '&' ,
'<' : '<' ,
'>' : '>' ,
'"' : '"' ,
"'" : '''
} ;
var getEscapeReplacement = function getEscapeReplacement ( ch ) {
return escapeReplacements [ ch ] ;
} ;
2019-11-07 12:49:10 -06:00
function escape ( html , encode ) {
if ( encode ) {
2019-12-05 23:08:43 +00:00
if ( escapeTest . test ( html ) ) {
return html . replace ( escapeReplace , getEscapeReplacement ) ;
2019-11-07 12:49:10 -06:00
}
} else {
2019-12-05 23:08:43 +00:00
if ( escapeTestNoEncode . test ( html ) ) {
return html . replace ( escapeReplaceNoEncode , getEscapeReplacement ) ;
2019-11-07 12:49:10 -06:00
}
}
2019-11-06 12:05:09 -06:00
2019-11-07 12:49:10 -06:00
return html ;
2019-11-05 15:31:51 -06:00
}
2019-11-06 12:05:09 -06:00
2019-12-05 23:08:43 +00:00
var unescapeTest = /&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig ;
2019-11-05 15:31:51 -06:00
2019-11-07 12:49:10 -06:00
function unescape ( html ) {
// explicitly match decimal, hex, and named HTML entities
2019-12-05 23:08:43 +00:00
return html . replace ( unescapeTest , function ( _ , n ) {
2019-11-07 12:49:10 -06:00
n = n . toLowerCase ( ) ;
if ( n === 'colon' ) return ':' ;
2019-11-06 12:05:09 -06:00
2019-11-07 12:49:10 -06:00
if ( n . charAt ( 0 ) === '#' ) {
return n . charAt ( 1 ) === 'x' ? String . fromCharCode ( parseInt ( n . substring ( 2 ) , 16 ) ) : String . fromCharCode ( + n . substring ( 1 ) ) ;
}
2019-11-06 12:05:09 -06:00
2019-11-07 12:49:10 -06:00
return '' ;
} ) ;
}
2019-11-06 12:05:09 -06:00
2019-12-05 23:08:43 +00:00
var caret = /(^|[^\[])\^/g ;
2019-11-07 12:49:10 -06:00
function edit ( regex , opt ) {
regex = regex . source || regex ;
opt = opt || '' ;
var obj = {
replace : function replace ( name , val ) {
val = val . source || val ;
2019-12-05 23:08:43 +00:00
val = val . replace ( caret , '$1' ) ;
2019-11-07 12:49:10 -06:00
regex = regex . replace ( name , val ) ;
return obj ;
} ,
getRegex : function getRegex ( ) {
return new RegExp ( regex , opt ) ;
}
} ;
return obj ;
}
2019-11-06 12:05:09 -06:00
2019-12-05 23:08:43 +00:00
var nonWordAndColonTest = /[^\w:]/g ;
var originIndependentUrl = /^$|^[a-z][a-z0-9+.-]*:|^[?#]/i ;
2019-11-06 12:05:09 -06:00
2019-11-07 12:49:10 -06:00
function cleanUrl ( sanitize , base , href ) {
if ( sanitize ) {
var prot ;
2019-11-06 12:05:09 -06:00
2019-11-07 12:49:10 -06:00
try {
2019-12-05 23:08:43 +00:00
prot = decodeURIComponent ( unescape ( href ) ) . replace ( nonWordAndColonTest , '' ) . toLowerCase ( ) ;
2019-11-07 12:49:10 -06:00
} catch ( e ) {
return null ;
2019-11-05 15:31:51 -06:00
}
2019-11-07 12:49:10 -06:00
if ( prot . indexOf ( 'javascript:' ) === 0 || prot . indexOf ( 'vbscript:' ) === 0 || prot . indexOf ( 'data:' ) === 0 ) {
return null ;
}
2019-11-05 15:31:51 -06:00
}
2019-12-05 23:08:43 +00:00
if ( base && ! originIndependentUrl . test ( href ) ) {
2019-11-07 12:49:10 -06:00
href = resolveUrl ( base , href ) ;
2019-11-05 15:31:51 -06:00
}
2019-11-07 12:49:10 -06:00
try {
href = encodeURI ( href ) . replace ( /%25/g , '%' ) ;
} catch ( e ) {
return null ;
2019-11-05 15:31:51 -06:00
}
2019-11-07 12:49:10 -06:00
return href ;
}
2019-11-06 11:11:39 -06:00
2019-12-05 23:08:43 +00:00
var baseUrls = { } ;
var justDomain = /^[^:]+:\/*[^/]*$/ ;
var protocol = /^([^:]+:)[\s\S]*$/ ;
var domain = /^([^:]+:\/*[^/]*)[\s\S]*$/ ;
2019-11-05 15:31:51 -06:00
2019-11-07 12:49:10 -06:00
function resolveUrl ( base , href ) {
2019-12-05 23:08:43 +00:00
if ( ! baseUrls [ ' ' + base ] ) {
2019-11-07 12:49:10 -06:00
// we can ignore everything in base after the last slash of its path component,
// but we might need to add _that_
// https://tools.ietf.org/html/rfc3986#section-3
2019-12-05 23:08:43 +00:00
if ( justDomain . test ( base ) ) {
baseUrls [ ' ' + base ] = base + '/' ;
2019-11-07 12:49:10 -06:00
} else {
2019-12-05 23:08:43 +00:00
baseUrls [ ' ' + base ] = rtrim ( base , '/' , true ) ;
2019-11-07 12:49:10 -06:00
}
}
2019-11-05 15:31:51 -06:00
2019-12-05 23:08:43 +00:00
base = baseUrls [ ' ' + base ] ;
2019-11-07 12:49:10 -06:00
var relativeBase = base . indexOf ( ':' ) === - 1 ;
2019-11-05 15:31:51 -06:00
2019-11-07 12:49:10 -06:00
if ( href . substring ( 0 , 2 ) === '//' ) {
if ( relativeBase ) {
return href ;
2019-11-05 15:31:51 -06:00
}
2019-12-05 23:08:43 +00:00
return base . replace ( protocol , '$1' ) + href ;
2019-11-07 12:49:10 -06:00
} else if ( href . charAt ( 0 ) === '/' ) {
if ( relativeBase ) {
return href ;
}
2019-12-05 23:08:43 +00:00
return base . replace ( domain , '$1' ) + href ;
2019-11-07 12:49:10 -06:00
} else {
return base + href ;
2019-11-05 15:31:51 -06:00
}
2019-11-07 12:49:10 -06:00
}
2019-11-06 11:11:39 -06:00
2019-12-05 23:08:43 +00:00
var noopTest = {
exec : function noopTest ( ) { }
} ;
2019-11-06 11:11:39 -06:00
2019-11-07 12:49:10 -06:00
function merge ( obj ) {
var i = 1 ,
target ,
key ;
2019-11-05 15:31:51 -06:00
2019-11-07 12:49:10 -06:00
for ( ; i < arguments . length ; i ++ ) {
target = arguments [ i ] ;
2019-11-05 15:31:51 -06:00
2019-11-07 12:49:10 -06:00
for ( key in target ) {
if ( Object . prototype . hasOwnProperty . call ( target , key ) ) {
obj [ key ] = target [ key ] ;
}
}
2019-11-05 15:31:51 -06:00
}
2019-11-07 12:49:10 -06:00
return obj ;
}
2019-11-05 15:31:51 -06:00
2019-11-07 12:49:10 -06:00
function splitCells ( tableRow , count ) {
// ensure that every cell-delimiting pipe has a space
// before it to distinguish it from an escaped pipe
var row = tableRow . replace ( /\|/g , function ( match , offset , str ) {
var escaped = false ,
curr = offset ;
2019-11-05 15:31:51 -06:00
2019-11-07 12:49:10 -06:00
while ( -- curr >= 0 && str [ curr ] === '\\' ) {
escaped = ! escaped ;
}
2019-11-05 15:31:51 -06:00
2019-11-07 12:49:10 -06:00
if ( escaped ) {
// odd number of slashes means | is escaped
// so we leave it alone
return '|' ;
} else {
// add space before unescaped |
return ' |' ;
}
} ) ,
cells = row . split ( / \|/ ) ;
var i = 0 ;
2019-11-05 15:31:51 -06:00
2019-11-07 12:49:10 -06:00
if ( cells . length > count ) {
cells . splice ( count ) ;
} else {
while ( cells . length < count ) {
cells . push ( '' ) ;
}
}
2019-11-06 12:05:09 -06:00
2019-11-07 12:49:10 -06:00
for ( ; i < cells . length ; i ++ ) {
// leading or trailing whitespace is ignored per the gfm spec
cells [ i ] = cells [ i ] . trim ( ) . replace ( /\\\|/g , '|' ) ;
}
2019-11-05 15:31:51 -06:00
2019-11-07 12:49:10 -06:00
return cells ;
} // Remove trailing 'c's. Equivalent to str.replace(/c*$/, '').
// /c*$/ is vulnerable to REDOS.
// invert: Remove suffix of non-c chars instead. Default falsey.
2019-11-06 11:11:39 -06:00
2019-11-07 12:49:10 -06:00
function rtrim ( str , c , invert ) {
var l = str . length ;
2019-11-05 15:31:51 -06:00
2019-11-07 12:49:10 -06:00
if ( l === 0 ) {
return '' ;
} // Length of suffix matching the invert condition.
2019-11-05 15:31:51 -06:00
2019-11-07 12:49:10 -06:00
var suffLen = 0 ; // Step left until we fail to match the invert condition.
2019-11-05 15:31:51 -06:00
2019-11-07 12:49:10 -06:00
while ( suffLen < l ) {
var currChar = str . charAt ( l - suffLen - 1 ) ;
2019-11-06 12:05:09 -06:00
2019-11-07 12:49:10 -06:00
if ( currChar === c && ! invert ) {
suffLen ++ ;
} else if ( currChar !== c && invert ) {
suffLen ++ ;
} else {
break ;
2019-11-06 12:05:09 -06:00
}
2019-11-05 15:31:51 -06:00
}
2019-11-07 12:49:10 -06:00
return str . substr ( 0 , l - suffLen ) ;
}
2019-11-06 11:11:39 -06:00
2019-11-07 12:49:10 -06:00
function findClosingBracket ( str , b ) {
if ( str . indexOf ( b [ 1 ] ) === - 1 ) {
return - 1 ;
2019-11-05 15:31:51 -06:00
}
2019-11-07 12:49:10 -06:00
var l = str . length ;
var level = 0 ,
i = 0 ;
2019-11-05 15:31:51 -06:00
2019-11-07 12:49:10 -06:00
for ( ; i < l ; i ++ ) {
if ( str [ i ] === '\\' ) {
i ++ ;
} else if ( str [ i ] === b [ 0 ] ) {
level ++ ;
} else if ( str [ i ] === b [ 1 ] ) {
level -- ;
2019-11-05 15:31:51 -06:00
2019-11-07 12:49:10 -06:00
if ( level < 0 ) {
return i ;
2019-11-05 15:31:51 -06:00
}
}
}
2019-11-07 12:49:10 -06:00
return - 1 ;
}
2019-11-06 11:11:39 -06:00
2019-11-07 12:49:10 -06:00
function checkSanitizeDeprecation ( opt ) {
if ( opt && opt . sanitize && ! opt . silent ) {
console . warn ( 'marked(): sanitize and sanitizer parameters are deprecated since version 0.7.0, should not be used and will be removed in the future. Read more here: https://marked.js.org/#/USING_ADVANCED.md#options' ) ;
2019-11-05 15:31:51 -06:00
}
}
2019-11-07 12:49:10 -06:00
var helpers = {
escape : escape ,
unescape : unescape ,
edit : edit ,
cleanUrl : cleanUrl ,
resolveUrl : resolveUrl ,
2019-12-05 23:08:43 +00:00
noopTest : noopTest ,
2019-11-07 12:49:10 -06:00
merge : merge ,
splitCells : splitCells ,
rtrim : rtrim ,
findClosingBracket : findClosingBracket ,
checkSanitizeDeprecation : checkSanitizeDeprecation
} ;
2019-11-06 12:05:09 -06:00
2019-12-05 23:08:43 +00:00
var noopTest$1 = helpers . noopTest ,
2019-11-07 12:49:10 -06:00
edit$1 = helpers . edit ,
merge$1 = helpers . merge ;
/ * *
* Block - Level Grammar
* /
var block = {
newline : /^\n+/ ,
code : /^( {4}[^\n]+\n*)+/ ,
2020-02-11 18:14:18 +00:00
fences : /^ {0,3}(`{3,}(?=[^`\n]*\n)|~{3,})([^\n]*)\n(?:|([\s\S]*?)\n)(?: {0,3}\1[~`]* *(?:\n+|$)|$)/ ,
2019-11-07 12:49:10 -06:00
hr : /^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/ ,
heading : /^ {0,3}(#{1,6}) +([^\n]*?)(?: +#+)? *(?:\n+|$)/ ,
blockquote : /^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/ ,
list : /^( {0,3})(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/ ,
html : '^ {0,3}(?:' // optional indentation
+ '<(script|pre|style)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)' // (1)
+ '|comment[^\\n]*(\\n+|$)' // (2)
+ '|<\\?[\\s\\S]*?\\?>\\n*' // (3)
+ '|<![A-Z][\\s\\S]*?>\\n*' // (4)
+ '|<!\\[CDATA\\[[\\s\\S]*?\\]\\]>\\n*' // (5)
+ '|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:\\n{2,}|$)' // (6)
+ '|<(?!script|pre|style)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:\\n{2,}|$)' // (7) open tag
+ '|</(?!script|pre|style)[a-z][\\w-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:\\n{2,}|$)' // (7) closing tag
+ ')' ,
def : /^ {0,3}\[(label)\]: *\n? *<?([^\s>]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/ ,
2019-12-05 23:08:43 +00:00
nptable : noopTest$1 ,
table : noopTest$1 ,
2019-11-07 12:49:10 -06:00
lheading : /^([^\n]+)\n {0,3}(=+|-+) *(?:\n+|$)/ ,
// regex template, placeholders will be replaced according to different paragraph
// interruption rules of commonmark and the original markdown spec:
_paragraph : /^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html)[^\n]+)*)/ ,
text : /^[^\n]+/
} ;
block . _label = /(?!\s*\])(?:\\[\[\]]|[^\[\]])+/ ;
block . _title = /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/ ;
block . def = edit$1 ( block . def ) . replace ( 'label' , block . _label ) . replace ( 'title' , block . _title ) . getRegex ( ) ;
block . bullet = /(?:[*+-]|\d{1,9}\.)/ ;
block . item = /^( *)(bull) ?[^\n]*(?:\n(?!\1bull ?)[^\n]*)*/ ;
block . item = edit$1 ( block . item , 'gm' ) . replace ( /bull/g , block . bullet ) . getRegex ( ) ;
block . list = edit$1 ( block . list ) . replace ( /bull/g , block . bullet ) . replace ( 'hr' , '\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))' ) . replace ( 'def' , '\\n+(?=' + block . def . source + ')' ) . getRegex ( ) ;
block . _tag = 'address|article|aside|base|basefont|blockquote|body|caption' + '|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption' + '|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe' + '|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option' + '|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr' + '|track|ul' ;
block . _comment = /<!--(?!-?>)[\s\S]*?-->/ ;
block . html = edit$1 ( block . html , 'i' ) . replace ( 'comment' , block . _comment ) . replace ( 'tag' , block . _tag ) . replace ( 'attribute' , / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/ ) . getRegex ( ) ;
2020-03-06 20:20:24 +00:00
block . paragraph = edit$1 ( block . _paragraph ) . replace ( 'hr' , block . hr ) . replace ( 'heading' , ' {0,3}#{1,6} ' ) . replace ( '|lheading' , '' ) // setex headings don't interrupt commonmark paragraphs
2020-02-11 18:14:18 +00:00
. replace ( 'blockquote' , ' {0,3}>' ) . replace ( 'fences' , ' {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n' ) . replace ( 'list' , ' {0,3}(?:[*+-]|1[.)]) ' ) // only lists starting from 1 can interrupt
2019-11-07 12:49:10 -06:00
. replace ( 'html' , '</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|!--)' ) . replace ( 'tag' , block . _tag ) // pars can be interrupted by type (6) html blocks
. getRegex ( ) ;
block . blockquote = edit$1 ( block . blockquote ) . replace ( 'paragraph' , block . paragraph ) . getRegex ( ) ;
/ * *
* Normal Block Grammar
* /
block . normal = merge$1 ( { } , block ) ;
/ * *
* GFM Block Grammar
* /
block . gfm = merge$1 ( { } , block . normal , {
nptable : /^ *([^|\n ].*\|.*)\n *([-:]+ *\|[-| :]*)(?:\n((?:.*[^>\n ].*(?:\n|$))*)\n*|$)/ ,
2020-03-06 20:20:24 +00:00
table : '^ *\\|(.+)\\n' // Header
+ ' *\\|?( *[-:]+[-| :]*)' // Align
+ '(?:\\n((?:(?!^|>|\\n| |hr|heading|lheading|code|fences|list|html).*(?:\\n|$))*)\\n*|$)' // Cells
2019-11-07 12:49:10 -06:00
} ) ;
2020-03-06 20:20:24 +00:00
block . gfm . table = edit$1 ( block . gfm . table ) . replace ( 'hr' , block . hr ) . replace ( 'heading' , ' {0,3}#{1,6} ' ) . replace ( 'lheading' , '([^\\n]+)\\n {0,3}(=+|-+) *(?:\\n+|$)' ) . replace ( 'blockquote' , ' {0,3}>' ) . replace ( 'code' , ' {4}[^\\n]' ) . replace ( 'fences' , ' {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n' ) . replace ( 'list' , ' {0,3}(?:[*+-]|1[.)]) ' ) // only lists starting from 1 can interrupt
. replace ( 'html' , '</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|!--)' ) . replace ( 'tag' , block . _tag ) // pars can be interrupted by type (6) html blocks
. getRegex ( ) ;
2019-11-07 12:49:10 -06:00
/ * *
* Pedantic grammar ( original John Gruber ' s loose markdown specification )
* /
block . pedantic = merge$1 ( { } , block . normal , {
html : edit$1 ( '^ *(?:comment *(?:\\n|\\s*$)' + '|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)' // closed tag
+ '|<tag(?:"[^"]*"|\'[^\']*\'|\\s[^\'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))' ) . replace ( 'comment' , block . _comment ) . replace ( /tag/g , '(?!(?:' + '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' ) . getRegex ( ) ,
def : /^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/ ,
heading : /^ *(#{1,6}) *([^\n]+?) *(?:#+ *)?(?:\n+|$)/ ,
2019-12-05 23:08:43 +00:00
fences : noopTest$1 ,
2019-11-07 12:49:10 -06:00
// fences not supported
paragraph : edit$1 ( block . normal . _paragraph ) . replace ( 'hr' , block . hr ) . replace ( 'heading' , ' *#{1,6} *[^\n]' ) . replace ( 'lheading' , block . lheading ) . replace ( 'blockquote' , ' {0,3}>' ) . replace ( '|fences' , '' ) . replace ( '|list' , '' ) . replace ( '|html' , '' ) . getRegex ( )
} ) ;
/ * *
* Inline - Level Grammar
* /
var inline = {
escape : /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/ ,
autolink : /^<(scheme:[^\s\x00-\x1f<>]*|email)>/ ,
2019-12-05 23:08:43 +00:00
url : noopTest$1 ,
2019-11-07 12:49:10 -06:00
tag : '^comment' + '|^</[a-zA-Z][\\w:-]*\\s*>' // self-closing tag
2019-11-05 15:31:51 -06:00
+ '|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>' // open tag
+ '|^<\\?[\\s\\S]*?\\?>' // processing instruction, e.g. <?php ?>
+ '|^<![a-zA-Z]+\\s[\\s\\S]*?>' // declaration, e.g. <!DOCTYPE html>
2019-11-07 12:49:10 -06:00
+ '|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>' ,
// CDATA section
link : /^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/ ,
reflink : /^!?\[(label)\]\[(?!\s*\])((?:\\[\[\]]?|[^\[\]\\])+)\]/ ,
nolink : /^!?\[(?!\s*\])((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\](?:\[\])?/ ,
strong : /^__([^\s_])__(?!_)|^\*\*([^\s*])\*\*(?!\*)|^__([^\s][\s\S]*?[^\s])__(?!_)|^\*\*([^\s][\s\S]*?[^\s])\*\*(?!\*)/ ,
em : /^_([^\s_])_(?!_)|^\*([^\s*<\[])\*(?!\*)|^_([^\s<][\s\S]*?[^\s_])_(?!_|[^\spunctuation])|^_([^\s_<][\s\S]*?[^\s])_(?!_|[^\spunctuation])|^\*([^\s<"][\s\S]*?[^\s\*])\*(?!\*|[^\spunctuation])|^\*([^\s*"<\[][\s\S]*?[^\s])\*(?!\*)/ ,
code : /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/ ,
br : /^( {2,}|\\)\n(?!\s*$)/ ,
2019-12-05 23:08:43 +00:00
del : noopTest$1 ,
2019-11-07 12:49:10 -06:00
text : /^(`+|[^`])(?:[\s\S]*?(?:(?=[\\<!\[`*]|\b_|$)|[^ ](?= {2,}\n))|(?= {2,}\n))/
} ; // list of punctuation marks from common mark spec
// without ` and ] to workaround Rule 17 (inline code blocks/links)
inline . _punctuation = '!"#$%&\'()*+,\\-./:;<=>?@\\[^_{|}~' ;
inline . em = edit$1 ( inline . em ) . replace ( /punctuation/g , inline . _punctuation ) . getRegex ( ) ;
inline . _escapes = /\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g ;
inline . _scheme = /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/ ;
inline . _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])?)+(?![-_])/ ;
inline . autolink = edit$1 ( inline . autolink ) . replace ( 'scheme' , inline . _scheme ) . replace ( 'email' , inline . _email ) . getRegex ( ) ;
inline . _attribute = /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/ ;
inline . tag = edit$1 ( inline . tag ) . replace ( 'comment' , block . _comment ) . replace ( 'attribute' , inline . _attribute ) . getRegex ( ) ;
inline . _label = /(?:\[[^\[\]]*\]|\\.|`[^`]*`|[^\[\]\\`])*?/ ;
inline . _href = /<(?:\\[<>]?|[^\s<>\\])*>|[^\s\x00-\x1f]*/ ;
inline . _title = /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/ ;
inline . link = edit$1 ( inline . link ) . replace ( 'label' , inline . _label ) . replace ( 'href' , inline . _href ) . replace ( 'title' , inline . _title ) . getRegex ( ) ;
inline . reflink = edit$1 ( inline . reflink ) . replace ( 'label' , inline . _label ) . getRegex ( ) ;
/ * *
* Normal Inline Grammar
* /
inline . normal = merge$1 ( { } , inline ) ;
/ * *
* Pedantic Inline Grammar
* /
inline . pedantic = merge$1 ( { } , inline . normal , {
strong : /^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/ ,
em : /^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/ ,
link : edit$1 ( /^!?\[(label)\]\((.*?)\)/ ) . replace ( 'label' , inline . _label ) . getRegex ( ) ,
reflink : edit$1 ( /^!?\[(label)\]\s*\[([^\]]*)\]/ ) . replace ( 'label' , inline . _label ) . getRegex ( )
} ) ;
/ * *
* GFM Inline Grammar
* /
inline . gfm = merge$1 ( { } , inline . normal , {
escape : edit$1 ( inline . escape ) . replace ( '])' , '~|])' ) . getRegex ( ) ,
_extended _email : /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/ ,
url : /^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/ ,
_backpedal : /(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/ ,
del : /^~+(?=\S)([\s\S]*?\S)~+/ ,
text : /^(`+|[^`])(?:[\s\S]*?(?:(?=[\\<!\[`*~]|\b_|https?:\/\/|ftp:\/\/|www\.|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@))|(?= {2,}\n|[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@))/
} ) ;
inline . gfm . url = edit$1 ( inline . gfm . url , 'i' ) . replace ( 'email' , inline . gfm . _extended _email ) . getRegex ( ) ;
/ * *
* GFM + Line Breaks Inline Grammar
* /
inline . breaks = merge$1 ( { } , inline . gfm , {
br : edit$1 ( inline . br ) . replace ( '{2,}' , '*' ) . getRegex ( ) ,
text : edit$1 ( inline . gfm . text ) . replace ( '\\b_' , '\\b_| {2,}\\n' ) . replace ( /\{2,\}/g , '*' ) . getRegex ( )
} ) ;
2019-11-27 00:36:10 -06:00
var rules = {
2019-11-07 12:49:10 -06:00
block : block ,
inline : inline
} ;
2019-11-06 11:11:39 -06:00
2019-12-05 23:08:43 +00:00
var defaults$1 = defaults . defaults ;
2019-11-27 00:36:10 -06:00
var block$1 = rules . block ;
2019-11-07 12:49:10 -06:00
var rtrim$1 = helpers . rtrim ,
splitCells$1 = helpers . splitCells ,
escape$1 = helpers . escape ;
/ * *
* Block Lexer
* /
var Lexer _1 =
/*#__PURE__*/
function ( ) {
function Lexer ( options ) {
this . tokens = [ ] ;
this . tokens . links = Object . create ( null ) ;
this . options = options || defaults$1 ;
this . rules = block$1 . normal ;
2019-03-21 01:50:47 -05:00
2019-11-07 12:49:10 -06:00
if ( this . options . pedantic ) {
this . rules = block$1 . pedantic ;
} else if ( this . options . gfm ) {
this . rules = block$1 . gfm ;
}
}
/ * *
* Expose Block Rules
* /
2019-11-05 15:31:51 -06:00
2019-03-21 01:50:47 -05:00
2019-12-04 17:29:13 +01:00
/ * *
* Static Lex Method
* /
Lexer . lex = function lex ( src , options ) {
var lexer = new Lexer ( options ) ;
return lexer . lex ( src ) ;
} ;
2019-03-21 01:50:47 -05:00
2019-12-04 17:29:13 +01:00
var _proto = Lexer . prototype ;
2019-11-07 12:49:10 -06:00
2019-12-04 17:29:13 +01:00
/ * *
* Preprocessing
* /
_proto . lex = function lex ( src ) {
src = src . replace ( /\r\n|\r/g , '\n' ) . replace ( /\t/g , ' ' ) ;
return this . token ( src , true ) ;
} ;
2019-11-07 12:49:10 -06:00
2019-12-04 17:29:13 +01:00
/ * *
* Lexing
* /
_proto . token = function token ( src , top ) {
src = src . replace ( /^ +$/gm , '' ) ;
var next , loose , cap , bull , b , item , listStart , listItems , t , space , i , tag , l , isordered , istask , ischecked ;
2019-11-07 12:49:10 -06:00
2019-12-04 17:29:13 +01:00
while ( src ) {
// newline
if ( cap = this . rules . newline . exec ( src ) ) {
src = src . substring ( cap [ 0 ] . length ) ;
2019-11-07 12:49:10 -06:00
2019-12-04 17:29:13 +01:00
if ( cap [ 0 ] . length > 1 ) {
this . tokens . push ( {
type : 'space'
} ) ;
}
} // code
2019-11-07 12:49:10 -06:00
2019-12-04 17:29:13 +01:00
if ( cap = this . rules . code . exec ( src ) ) {
var lastToken = this . tokens [ this . tokens . length - 1 ] ;
src = src . substring ( cap [ 0 ] . length ) ; // An indented code block cannot interrupt a paragraph.
2019-11-07 12:49:10 -06:00
2019-12-04 17:29:13 +01:00
if ( lastToken && lastToken . type === 'paragraph' ) {
lastToken . text += '\n' + cap [ 0 ] . trimRight ( ) ;
} else {
cap = cap [ 0 ] . replace ( /^ {4}/gm , '' ) ;
2019-11-07 12:49:10 -06:00
this . tokens . push ( {
type : 'code' ,
2019-12-04 17:29:13 +01:00
codeBlockStyle : 'indented' ,
text : ! this . options . pedantic ? rtrim$1 ( cap , '\n' ) : cap
2019-11-07 12:49:10 -06:00
} ) ;
2019-12-04 17:29:13 +01:00
}
2019-11-05 15:31:51 -06:00
2019-12-04 17:29:13 +01:00
continue ;
} // fences
if ( cap = this . rules . fences . exec ( src ) ) {
src = src . substring ( cap [ 0 ] . length ) ;
this . tokens . push ( {
type : 'code' ,
lang : cap [ 2 ] ? cap [ 2 ] . trim ( ) : cap [ 2 ] ,
text : cap [ 3 ] || ''
} ) ;
continue ;
} // heading
if ( cap = this . rules . heading . exec ( src ) ) {
src = src . substring ( cap [ 0 ] . length ) ;
this . tokens . push ( {
type : 'heading' ,
depth : cap [ 1 ] . length ,
text : cap [ 2 ]
} ) ;
continue ;
} // table no leading pipe (gfm)
if ( cap = this . rules . nptable . exec ( src ) ) {
item = {
type : 'table' ,
header : splitCells$1 ( cap [ 1 ] . replace ( /^ *| *\| *$/g , '' ) ) ,
align : cap [ 2 ] . replace ( /^ *|\| *$/g , '' ) . split ( / *\| */ ) ,
cells : cap [ 3 ] ? cap [ 3 ] . replace ( /\n$/ , '' ) . split ( '\n' ) : [ ]
} ;
2019-03-21 01:50:47 -05:00
2019-12-04 17:29:13 +01:00
if ( item . header . length === item . align . length ) {
2019-11-07 12:49:10 -06:00
src = src . substring ( cap [ 0 ] . length ) ;
2019-12-04 17:29:13 +01:00
for ( i = 0 ; i < item . align . length ; i ++ ) {
if ( /^ *-+: *$/ . test ( item . align [ i ] ) ) {
item . align [ i ] = 'right' ;
} else if ( /^ *:-+: *$/ . test ( item . align [ i ] ) ) {
item . align [ i ] = 'center' ;
} else if ( /^ *:-+ *$/ . test ( item . align [ i ] ) ) {
item . align [ i ] = 'left' ;
} else {
item . align [ i ] = null ;
2019-11-07 12:49:10 -06:00
}
}
2019-03-21 01:50:47 -05:00
2019-12-04 17:29:13 +01:00
for ( i = 0 ; i < item . cells . length ; i ++ ) {
item . cells [ i ] = splitCells$1 ( item . cells [ i ] , item . header . length ) ;
}
2019-03-21 01:50:47 -05:00
2019-12-04 17:29:13 +01:00
this . tokens . push ( item ) ;
2019-11-07 12:49:10 -06:00
continue ;
2019-12-04 17:29:13 +01:00
}
} // hr
if ( cap = this . rules . hr . exec ( src ) ) {
src = src . substring ( cap [ 0 ] . length ) ;
this . tokens . push ( {
type : 'hr'
} ) ;
continue ;
} // blockquote
if ( cap = this . rules . blockquote . exec ( src ) ) {
src = src . substring ( cap [ 0 ] . length ) ;
this . tokens . push ( {
type : 'blockquote_start'
} ) ;
cap = cap [ 0 ] . replace ( /^ *> ?/gm , '' ) ; // Pass `top` to keep the current
// "toplevel" state. This is exactly
// how markdown.pl works.
this . token ( cap , top ) ;
this . tokens . push ( {
type : 'blockquote_end'
} ) ;
continue ;
} // list
if ( cap = this . rules . list . exec ( src ) ) {
src = src . substring ( cap [ 0 ] . length ) ;
bull = cap [ 2 ] ;
isordered = bull . length > 1 ;
listStart = {
type : 'list_start' ,
ordered : isordered ,
start : isordered ? + bull : '' ,
loose : false
} ;
this . tokens . push ( listStart ) ; // Get each top-level item.
2019-11-07 12:49:10 -06:00
2019-12-04 17:29:13 +01:00
cap = cap [ 0 ] . match ( this . rules . item ) ;
listItems = [ ] ;
next = false ;
l = cap . length ;
i = 0 ;
2019-11-07 12:49:10 -06:00
2019-12-04 17:29:13 +01:00
for ( ; i < l ; i ++ ) {
item = cap [ i ] ; // Remove the list item's bullet
// so it is seen as the next token.
2019-11-07 12:49:10 -06:00
2019-12-04 17:29:13 +01:00
space = item . length ;
item = item . replace ( /^ *([*+-]|\d+\.) */ , '' ) ; // Outdent whatever the
// list item contains. Hacky.
2019-11-07 12:49:10 -06:00
2019-12-04 17:29:13 +01:00
if ( ~ item . indexOf ( '\n ' ) ) {
space -= item . length ;
item = ! this . options . pedantic ? item . replace ( new RegExp ( '^ {1,' + space + '}' , 'gm' ) , '' ) : item . replace ( /^ {1,4}/gm , '' ) ;
} // Determine whether the next list item belongs here.
// Backpedal if it does not belong in this list.
2019-11-07 12:49:10 -06:00
2019-12-04 17:29:13 +01:00
if ( i !== l - 1 ) {
b = block$1 . bullet . exec ( cap [ i + 1 ] ) [ 0 ] ;
2019-11-07 12:49:10 -06:00
2019-12-04 17:29:13 +01:00
if ( bull . length > 1 ? b . length === 1 : b . length > 1 || this . options . smartLists && b !== bull ) {
src = cap . slice ( i + 1 ) . join ( '\n' ) + src ;
i = l - 1 ;
2019-11-07 12:49:10 -06:00
}
2019-12-04 17:29:13 +01:00
} // Determine whether item is loose or not.
// Use: /(^|\n)(?! )[^\n]+\n\n(?!\s*$)/
// for discount behavior.
2019-11-07 12:49:10 -06:00
2019-12-04 17:29:13 +01:00
loose = next || /\n\n(?!\s*$)/ . test ( item ) ;
2019-11-07 12:49:10 -06:00
2019-12-04 17:29:13 +01:00
if ( i !== l - 1 ) {
next = item . charAt ( item . length - 1 ) === '\n' ;
if ( ! loose ) loose = next ;
}
2019-11-07 12:49:10 -06:00
2019-12-04 17:29:13 +01:00
if ( loose ) {
listStart . loose = true ;
} // Check for task list items
2019-11-07 12:49:10 -06:00
2019-12-04 17:29:13 +01:00
istask = /^\[[ xX]\] / . test ( item ) ;
ischecked = undefined ;
2019-11-07 12:49:10 -06:00
2019-12-04 17:29:13 +01:00
if ( istask ) {
ischecked = item [ 1 ] !== ' ' ;
item = item . replace ( /^\[[ xX]\] +/ , '' ) ;
2019-11-07 12:49:10 -06:00
}
2019-11-05 15:31:51 -06:00
2019-12-04 17:29:13 +01:00
t = {
type : 'list_item_start' ,
task : istask ,
checked : ischecked ,
loose : loose
} ;
listItems . push ( t ) ;
this . tokens . push ( t ) ; // Recurse.
2019-11-05 15:31:51 -06:00
2019-12-04 17:29:13 +01:00
this . token ( item , false ) ;
2019-11-07 12:49:10 -06:00
this . tokens . push ( {
2019-12-04 17:29:13 +01:00
type : 'list_item_end'
2019-11-07 12:49:10 -06:00
} ) ;
2019-12-04 17:29:13 +01:00
}
2019-11-07 12:49:10 -06:00
2019-12-04 17:29:13 +01:00
if ( listStart . loose ) {
l = listItems . length ;
i = 0 ;
2019-11-07 12:49:10 -06:00
2019-12-04 17:29:13 +01:00
for ( ; i < l ; i ++ ) {
listItems [ i ] . loose = true ;
2019-11-07 12:49:10 -06:00
}
2019-12-04 17:29:13 +01:00
}
2019-11-07 12:49:10 -06:00
2019-12-04 17:29:13 +01:00
this . tokens . push ( {
type : 'list_end'
} ) ;
continue ;
} // html
if ( cap = this . rules . html . exec ( src ) ) {
src = src . substring ( cap [ 0 ] . length ) ;
this . tokens . push ( {
type : this . options . sanitize ? 'paragraph' : 'html' ,
pre : ! this . options . sanitizer && ( cap [ 1 ] === 'pre' || cap [ 1 ] === 'script' || cap [ 1 ] === 'style' ) ,
text : this . options . sanitize ? this . options . sanitizer ? this . options . sanitizer ( cap [ 0 ] ) : escape$1 ( cap [ 0 ] ) : cap [ 0 ]
} ) ;
continue ;
} // def
if ( top && ( cap = this . rules . def . exec ( src ) ) ) {
src = src . substring ( cap [ 0 ] . length ) ;
if ( cap [ 3 ] ) cap [ 3 ] = cap [ 3 ] . substring ( 1 , cap [ 3 ] . length - 1 ) ;
tag = cap [ 1 ] . toLowerCase ( ) . replace ( /\s+/g , ' ' ) ;
if ( ! this . tokens . links [ tag ] ) {
this . tokens . links [ tag ] = {
href : cap [ 2 ] ,
title : cap [ 3 ]
2019-11-07 12:49:10 -06:00
} ;
2019-12-04 17:29:13 +01:00
}
2019-11-07 12:49:10 -06:00
2019-12-04 17:29:13 +01:00
continue ;
} // table (gfm)
2019-11-07 12:49:10 -06:00
2019-12-04 17:29:13 +01:00
if ( cap = this . rules . table . exec ( src ) ) {
item = {
type : 'table' ,
header : splitCells$1 ( cap [ 1 ] . replace ( /^ *| *\| *$/g , '' ) ) ,
align : cap [ 2 ] . replace ( /^ *|\| *$/g , '' ) . split ( / *\| */ ) ,
cells : cap [ 3 ] ? cap [ 3 ] . replace ( /\n$/ , '' ) . split ( '\n' ) : [ ]
} ;
2019-11-07 12:49:10 -06:00
2019-12-04 17:29:13 +01:00
if ( item . header . length === item . align . length ) {
2019-11-07 12:49:10 -06:00
src = src . substring ( cap [ 0 ] . length ) ;
2019-03-21 01:50:47 -05:00
2019-12-04 17:29:13 +01:00
for ( i = 0 ; i < item . align . length ; i ++ ) {
if ( /^ *-+: *$/ . test ( item . align [ i ] ) ) {
item . align [ i ] = 'right' ;
} else if ( /^ *:-+: *$/ . test ( item . align [ i ] ) ) {
item . align [ i ] = 'center' ;
} else if ( /^ *:-+ *$/ . test ( item . align [ i ] ) ) {
item . align [ i ] = 'left' ;
} else {
item . align [ i ] = null ;
}
}
2019-11-05 15:31:51 -06:00
2019-12-04 17:29:13 +01:00
for ( i = 0 ; i < item . cells . length ; i ++ ) {
item . cells [ i ] = splitCells$1 ( item . cells [ i ] . replace ( /^ *\| *| *\| *$/g , '' ) , item . header . length ) ;
}
2019-11-05 15:31:51 -06:00
2019-12-04 17:29:13 +01:00
this . tokens . push ( item ) ;
2019-11-07 12:49:10 -06:00
continue ;
}
2019-12-04 17:29:13 +01:00
} // lheading
if ( cap = this . rules . lheading . exec ( src ) ) {
src = src . substring ( cap [ 0 ] . length ) ;
this . tokens . push ( {
type : 'heading' ,
depth : cap [ 2 ] . charAt ( 0 ) === '=' ? 1 : 2 ,
text : cap [ 1 ]
} ) ;
continue ;
} // top-level paragraph
if ( top && ( cap = this . rules . paragraph . exec ( src ) ) ) {
src = src . substring ( cap [ 0 ] . length ) ;
this . tokens . push ( {
type : 'paragraph' ,
text : cap [ 1 ] . charAt ( cap [ 1 ] . length - 1 ) === '\n' ? cap [ 1 ] . slice ( 0 , - 1 ) : cap [ 1 ]
} ) ;
continue ;
} // text
if ( cap = this . rules . text . exec ( src ) ) {
// Top-level should never reach here.
src = src . substring ( cap [ 0 ] . length ) ;
this . tokens . push ( {
type : 'text' ,
text : cap [ 0 ]
} ) ;
continue ;
2019-11-07 12:49:10 -06:00
}
2019-11-05 15:31:51 -06:00
2019-12-04 17:29:13 +01:00
if ( src ) {
throw new Error ( 'Infinite loop on byte: ' + src . charCodeAt ( 0 ) ) ;
}
2019-11-07 12:49:10 -06:00
}
2019-12-04 17:29:13 +01:00
return this . tokens ;
} ;
_createClass ( Lexer , null , [ {
2019-11-07 12:49:10 -06:00
key : "rules" ,
get : function get ( ) {
return block$1 ;
}
} ] ) ;
2019-11-05 15:31:51 -06:00
2019-11-07 12:49:10 -06:00
return Lexer ;
} ( ) ;
2019-11-05 15:31:51 -06:00
2019-12-05 23:08:43 +00:00
var defaults$2 = defaults . defaults ;
2019-11-07 12:49:10 -06:00
var cleanUrl$1 = helpers . cleanUrl ,
escape$2 = helpers . escape ;
/ * *
* Renderer
* /
2019-11-05 15:31:51 -06:00
2019-11-07 12:49:10 -06:00
var Renderer _1 =
/*#__PURE__*/
function ( ) {
function Renderer ( options ) {
this . options = options || defaults$2 ;
2019-11-06 12:05:09 -06:00
}
2019-11-05 15:31:51 -06:00
2019-12-04 17:29:13 +01:00
var _proto = Renderer . prototype ;
2019-11-05 15:31:51 -06:00
2019-12-04 17:29:13 +01:00
_proto . code = function code ( _code , infostring , escaped ) {
var lang = ( infostring || '' ) . match ( /\S*/ ) [ 0 ] ;
2019-11-05 15:31:51 -06:00
2019-12-04 17:29:13 +01:00
if ( this . options . highlight ) {
var out = this . options . highlight ( _code , lang ) ;
2019-11-05 15:31:51 -06:00
2019-12-04 17:29:13 +01:00
if ( out != null && out !== _code ) {
escaped = true ;
_code = out ;
2019-11-07 12:49:10 -06:00
}
}
2019-12-04 17:29:13 +01:00
if ( ! lang ) {
return '<pre><code>' + ( escaped ? _code : escape$2 ( _code , true ) ) + '</code></pre>' ;
2019-11-07 12:49:10 -06:00
}
2019-11-05 15:31:51 -06:00
2019-12-04 17:29:13 +01:00
return '<pre><code class="' + this . options . langPrefix + escape$2 ( lang , true ) + '">' + ( escaped ? _code : escape$2 ( _code , true ) ) + '</code></pre>\n' ;
} ;
2019-11-05 15:31:51 -06:00
2019-12-04 17:29:13 +01:00
_proto . blockquote = function blockquote ( quote ) {
return '<blockquote>\n' + quote + '</blockquote>\n' ;
} ;
2019-11-05 15:31:51 -06:00
2019-12-04 17:29:13 +01:00
_proto . html = function html ( _html ) {
return _html ;
} ;
2019-11-05 15:31:51 -06:00
2019-12-04 17:29:13 +01:00
_proto . heading = function heading ( text , level , raw , slugger ) {
if ( this . options . headerIds ) {
return '<h' + level + ' id="' + this . options . headerPrefix + slugger . slug ( raw ) + '">' + text + '</h' + level + '>\n' ;
} // ignore IDs
2019-11-06 12:05:09 -06:00
2019-11-05 15:31:51 -06:00
2019-12-04 17:29:13 +01:00
return '<h' + level + '>' + text + '</h' + level + '>\n' ;
} ;
_proto . hr = function hr ( ) {
return this . options . xhtml ? '<hr/>\n' : '<hr>\n' ;
} ;
_proto . list = function list ( body , ordered , start ) {
var type = ordered ? 'ol' : 'ul' ,
startatt = ordered && start !== 1 ? ' start="' + start + '"' : '' ;
return '<' + type + startatt + '>\n' + body + '</' + type + '>\n' ;
} ;
_proto . listitem = function listitem ( text ) {
return '<li>' + text + '</li>\n' ;
} ;
_proto . checkbox = function checkbox ( checked ) {
return '<input ' + ( checked ? 'checked="" ' : '' ) + 'disabled="" type="checkbox"' + ( this . options . xhtml ? ' /' : '' ) + '> ' ;
} ;
_proto . paragraph = function paragraph ( text ) {
return '<p>' + text + '</p>\n' ;
} ;
_proto . table = function table ( header , body ) {
if ( body ) body = '<tbody>' + body + '</tbody>' ;
return '<table>\n' + '<thead>\n' + header + '</thead>\n' + body + '</table>\n' ;
} ;
_proto . tablerow = function tablerow ( content ) {
return '<tr>\n' + content + '</tr>\n' ;
} ;
_proto . tablecell = function tablecell ( content , flags ) {
var type = flags . header ? 'th' : 'td' ;
var tag = flags . align ? '<' + type + ' align="' + flags . align + '">' : '<' + type + '>' ;
return tag + content + '</' + type + '>\n' ;
} ;
// span level renderer
_proto . strong = function strong ( text ) {
return '<strong>' + text + '</strong>' ;
} ;
_proto . em = function em ( text ) {
return '<em>' + text + '</em>' ;
} ;
_proto . codespan = function codespan ( text ) {
return '<code>' + text + '</code>' ;
} ;
_proto . br = function br ( ) {
return this . options . xhtml ? '<br/>' : '<br>' ;
} ;
_proto . del = function del ( text ) {
return '<del>' + text + '</del>' ;
} ;
_proto . link = function link ( href , title , text ) {
href = cleanUrl$1 ( this . options . sanitize , this . options . baseUrl , href ) ;
if ( href === null ) {
return text ;
2019-11-06 11:11:39 -06:00
}
2019-11-05 15:31:51 -06:00
2019-12-04 17:29:13 +01:00
var out = '<a href="' + escape$2 ( href ) + '"' ;
2019-11-05 15:31:51 -06:00
2019-12-04 17:29:13 +01:00
if ( title ) {
out += ' title="' + title + '"' ;
}
2019-11-05 15:31:51 -06:00
2019-12-04 17:29:13 +01:00
out += '>' + text + '</a>' ;
return out ;
} ;
_proto . image = function image ( href , title , text ) {
href = cleanUrl$1 ( this . options . sanitize , this . options . baseUrl , href ) ;
2019-11-05 15:31:51 -06:00
2019-12-04 17:29:13 +01:00
if ( href === null ) {
return text ;
2019-11-07 12:49:10 -06:00
}
2019-12-04 17:29:13 +01:00
var out = '<img src="' + href + '" alt="' + text + '"' ;
if ( title ) {
out += ' title="' + title + '"' ;
2019-11-07 12:49:10 -06:00
}
2019-12-04 17:29:13 +01:00
out += this . options . xhtml ? '/>' : '>' ;
return out ;
} ;
_proto . text = function text ( _text ) {
return _text ;
} ;
2019-11-05 15:31:51 -06:00
2019-11-07 12:49:10 -06:00
return Renderer ;
} ( ) ;
2019-11-05 15:31:51 -06:00
2019-11-07 12:49:10 -06:00
/ * *
* Slugger generates header id
* /
var Slugger _1 =
/*#__PURE__*/
function ( ) {
function Slugger ( ) {
this . seen = { } ;
}
/ * *
* Convert string to unique id
* /
2019-11-05 15:31:51 -06:00
2019-12-04 17:29:13 +01:00
var _proto = Slugger . prototype ;
2019-11-05 15:31:51 -06:00
2019-12-04 17:29:13 +01:00
_proto . slug = function slug ( value ) {
var slug = value . toLowerCase ( ) . trim ( ) . replace ( /[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g , '' ) . replace ( /\s/g , '-' ) ;
2019-11-06 11:11:39 -06:00
2019-12-04 17:29:13 +01:00
if ( this . seen . hasOwnProperty ( slug ) ) {
var originalSlug = slug ;
2019-11-06 11:11:39 -06:00
2019-12-04 17:29:13 +01:00
do {
this . seen [ originalSlug ] ++ ;
slug = originalSlug + '-' + this . seen [ originalSlug ] ;
} while ( this . seen . hasOwnProperty ( slug ) ) ;
2019-11-07 12:49:10 -06:00
}
2019-12-04 17:29:13 +01:00
this . seen [ slug ] = 0 ;
return slug ;
} ;
2019-11-07 12:49:10 -06:00
return Slugger ;
} ( ) ;
2019-12-05 23:08:43 +00:00
var defaults$3 = defaults . defaults ;
2019-11-27 00:36:10 -06:00
var inline$1 = rules . inline ;
2019-11-07 12:49:10 -06:00
var findClosingBracket$1 = helpers . findClosingBracket ,
escape$3 = helpers . escape ;
/ * *
* Inline Lexer & Compiler
* /
var InlineLexer _1 =
/*#__PURE__*/
function ( ) {
function InlineLexer ( links , options ) {
this . options = options || defaults$3 ;
this . links = links ;
this . rules = inline$1 . normal ;
this . options . renderer = this . options . renderer || new Renderer _1 ( ) ;
this . renderer = this . options . renderer ;
this . renderer . options = this . options ;
if ( ! this . links ) {
throw new Error ( 'Tokens array requires a `links` property.' ) ;
}
2019-11-05 15:31:51 -06:00
2019-11-07 12:49:10 -06:00
if ( this . options . pedantic ) {
this . rules = inline$1 . pedantic ;
} else if ( this . options . gfm ) {
if ( this . options . breaks ) {
this . rules = inline$1 . breaks ;
} else {
this . rules = inline$1 . gfm ;
}
}
2019-11-06 11:11:39 -06:00
}
2019-11-07 12:49:10 -06:00
/ * *
* Expose Inline Rules
* /
2019-12-04 17:29:13 +01:00
/ * *
* Static Lexing / Compiling Method
* /
InlineLexer . output = function output ( src , links , options ) {
var inline = new InlineLexer ( links , options ) ;
return inline . output ( src ) ;
}
/ * *
* Lexing / Compiling
* /
;
var _proto = InlineLexer . prototype ;
_proto . output = function output ( src ) {
var out = '' ,
link ,
text ,
href ,
title ,
cap ,
prevCapZero ;
while ( src ) {
// escape
if ( cap = this . rules . escape . exec ( src ) ) {
src = src . substring ( cap [ 0 ] . length ) ;
out += escape$3 ( cap [ 1 ] ) ;
continue ;
} // tag
if ( cap = this . rules . tag . exec ( src ) ) {
if ( ! this . inLink && /^<a /i . test ( cap [ 0 ] ) ) {
this . inLink = true ;
} else if ( this . inLink && /^<\/a>/i . test ( cap [ 0 ] ) ) {
this . inLink = false ;
}
2019-11-07 12:49:10 -06:00
2019-12-04 17:29:13 +01:00
if ( ! this . inRawBlock && /^<(pre|code|kbd|script)(\s|>)/i . test ( cap [ 0 ] ) ) {
this . inRawBlock = true ;
} else if ( this . inRawBlock && /^<\/(pre|code|kbd|script)(\s|>)/i . test ( cap [ 0 ] ) ) {
this . inRawBlock = false ;
}
2019-11-07 12:49:10 -06:00
2019-12-04 17:29:13 +01:00
src = src . substring ( cap [ 0 ] . length ) ;
2020-02-13 18:08:58 +00:00
out += this . renderer . html ( this . options . sanitize ? this . options . sanitizer ? this . options . sanitizer ( cap [ 0 ] ) : escape$3 ( cap [ 0 ] ) : cap [ 0 ] ) ;
2019-12-04 17:29:13 +01:00
continue ;
} // link
2019-11-07 12:49:10 -06:00
2019-12-04 17:29:13 +01:00
if ( cap = this . rules . link . exec ( src ) ) {
var lastParenIndex = findClosingBracket$1 ( cap [ 2 ] , '()' ) ;
if ( lastParenIndex > - 1 ) {
var start = cap [ 0 ] . indexOf ( '!' ) === 0 ? 5 : 4 ;
var linkLen = start + cap [ 1 ] . length + lastParenIndex ;
cap [ 2 ] = cap [ 2 ] . substring ( 0 , lastParenIndex ) ;
cap [ 0 ] = cap [ 0 ] . substring ( 0 , linkLen ) . trim ( ) ;
cap [ 3 ] = '' ;
}
2019-11-07 12:49:10 -06:00
2019-12-04 17:29:13 +01:00
src = src . substring ( cap [ 0 ] . length ) ;
this . inLink = true ;
href = cap [ 2 ] ;
2019-11-07 12:49:10 -06:00
2019-12-04 17:29:13 +01:00
if ( this . options . pedantic ) {
link = /^([^'"]*[^\s])\s+(['"])(.*)\2/ . exec ( href ) ;
2019-11-07 12:49:10 -06:00
2019-12-04 17:29:13 +01:00
if ( link ) {
href = link [ 1 ] ;
title = link [ 3 ] ;
} else {
title = '' ;
2019-11-07 12:49:10 -06:00
}
2019-12-04 17:29:13 +01:00
} else {
title = cap [ 3 ] ? cap [ 3 ] . slice ( 1 , - 1 ) : '' ;
}
2019-11-07 12:49:10 -06:00
2019-12-04 17:29:13 +01:00
href = href . trim ( ) . replace ( /^<([\s\S]*)>$/ , '$1' ) ;
out += this . outputLink ( cap , {
href : InlineLexer . escapes ( href ) ,
title : InlineLexer . escapes ( title )
} ) ;
this . inLink = false ;
continue ;
} // reflink, nolink
2019-11-07 12:49:10 -06:00
2019-12-04 17:29:13 +01:00
if ( ( cap = this . rules . reflink . exec ( src ) ) || ( cap = this . rules . nolink . exec ( src ) ) ) {
src = src . substring ( cap [ 0 ] . length ) ;
link = ( cap [ 2 ] || cap [ 1 ] ) . replace ( /\s+/g , ' ' ) ;
link = this . links [ link . toLowerCase ( ) ] ;
2019-11-07 12:49:10 -06:00
2019-12-04 17:29:13 +01:00
if ( ! link || ! link . href ) {
out += cap [ 0 ] . charAt ( 0 ) ;
src = cap [ 0 ] . substring ( 1 ) + src ;
2019-11-07 12:49:10 -06:00
continue ;
2019-12-04 17:29:13 +01:00
}
2019-03-21 01:50:47 -05:00
2019-12-04 17:29:13 +01:00
this . inLink = true ;
out += this . outputLink ( cap , link ) ;
this . inLink = false ;
continue ;
} // strong
2019-03-21 01:50:47 -05:00
2019-12-04 17:29:13 +01:00
if ( cap = this . rules . strong . exec ( src ) ) {
src = src . substring ( cap [ 0 ] . length ) ;
out += this . renderer . strong ( this . output ( cap [ 4 ] || cap [ 3 ] || cap [ 2 ] || cap [ 1 ] ) ) ;
continue ;
} // em
2019-03-21 01:50:47 -05:00
2019-12-04 17:29:13 +01:00
if ( cap = this . rules . em . exec ( src ) ) {
src = src . substring ( cap [ 0 ] . length ) ;
out += this . renderer . em ( this . output ( cap [ 6 ] || cap [ 5 ] || cap [ 4 ] || cap [ 3 ] || cap [ 2 ] || cap [ 1 ] ) ) ;
continue ;
} // code
2019-03-21 01:50:47 -05:00
2019-12-04 17:29:13 +01:00
if ( cap = this . rules . code . exec ( src ) ) {
src = src . substring ( cap [ 0 ] . length ) ;
out += this . renderer . codespan ( escape$3 ( cap [ 2 ] . trim ( ) , true ) ) ;
continue ;
} // br
2019-03-21 01:50:47 -05:00
2019-12-04 17:29:13 +01:00
if ( cap = this . rules . br . exec ( src ) ) {
src = src . substring ( cap [ 0 ] . length ) ;
out += this . renderer . br ( ) ;
continue ;
} // del (gfm)
2019-03-21 01:50:47 -05:00
2019-12-04 17:29:13 +01:00
if ( cap = this . rules . del . exec ( src ) ) {
src = src . substring ( cap [ 0 ] . length ) ;
out += this . renderer . del ( this . output ( cap [ 1 ] ) ) ;
continue ;
} // autolink
2019-03-21 01:50:47 -05:00
2019-12-04 17:29:13 +01:00
if ( cap = this . rules . autolink . exec ( src ) ) {
src = src . substring ( cap [ 0 ] . length ) ;
2019-03-21 01:50:47 -05:00
2019-12-04 17:29:13 +01:00
if ( cap [ 2 ] === '@' ) {
text = escape$3 ( this . mangle ( cap [ 1 ] ) ) ;
href = 'mailto:' + text ;
} else {
text = escape$3 ( cap [ 1 ] ) ;
href = text ;
}
2019-03-21 01:50:47 -05:00
2019-12-04 17:29:13 +01:00
out += this . renderer . link ( href , null , text ) ;
continue ;
} // url (gfm)
2019-03-21 01:50:47 -05:00
2019-12-04 17:29:13 +01:00
if ( ! this . inLink && ( cap = this . rules . url . exec ( src ) ) ) {
if ( cap [ 2 ] === '@' ) {
text = escape$3 ( cap [ 0 ] ) ;
href = 'mailto:' + text ;
} else {
// do extended autolink path validation
do {
prevCapZero = cap [ 0 ] ;
cap [ 0 ] = this . rules . _backpedal . exec ( cap [ 0 ] ) [ 0 ] ;
} while ( prevCapZero !== cap [ 0 ] ) ;
text = escape$3 ( cap [ 0 ] ) ;
if ( cap [ 1 ] === 'www.' ) {
href = 'http://' + text ;
2019-11-07 12:49:10 -06:00
} else {
href = text ;
}
2019-12-04 17:29:13 +01:00
}
2019-03-21 01:50:47 -05:00
2019-12-04 17:29:13 +01:00
src = src . substring ( cap [ 0 ] . length ) ;
out += this . renderer . link ( href , null , text ) ;
continue ;
} // text
2019-03-21 01:50:47 -05:00
2019-12-04 17:29:13 +01:00
if ( cap = this . rules . text . exec ( src ) ) {
src = src . substring ( cap [ 0 ] . length ) ;
2019-03-21 01:50:47 -05:00
2019-12-04 17:29:13 +01:00
if ( this . inRawBlock ) {
out += this . renderer . text ( this . options . sanitize ? this . options . sanitizer ? this . options . sanitizer ( cap [ 0 ] ) : escape$3 ( cap [ 0 ] ) : cap [ 0 ] ) ;
} else {
out += this . renderer . text ( escape$3 ( this . smartypants ( cap [ 0 ] ) ) ) ;
}
2019-03-21 01:50:47 -05:00
2019-12-04 17:29:13 +01:00
continue ;
}
2019-03-21 01:50:47 -05:00
2019-12-04 17:29:13 +01:00
if ( src ) {
throw new Error ( 'Infinite loop on byte: ' + src . charCodeAt ( 0 ) ) ;
}
}
2019-03-21 01:50:47 -05:00
2019-12-04 17:29:13 +01:00
return out ;
} ;
2019-03-21 01:50:47 -05:00
2019-12-04 17:29:13 +01:00
InlineLexer . escapes = function escapes ( text ) {
return text ? text . replace ( InlineLexer . rules . _escapes , '$1' ) : text ;
}
/ * *
* Compile Link
* /
;
2019-03-21 01:50:47 -05:00
2019-12-04 17:29:13 +01:00
_proto . outputLink = function outputLink ( cap , link ) {
var href = link . href ,
title = link . title ? escape$3 ( link . title ) : null ;
return cap [ 0 ] . charAt ( 0 ) !== '!' ? this . renderer . link ( href , title , this . output ( cap [ 1 ] ) ) : this . renderer . image ( href , title , escape$3 ( cap [ 1 ] ) ) ;
}
/ * *
* Smartypants Transformations
* /
;
_proto . smartypants = function smartypants ( text ) {
if ( ! this . options . smartypants ) return text ;
return text // em-dashes
. replace ( /---/g , "\u2014" ) // en-dashes
. replace ( /--/g , "\u2013" ) // opening singles
. replace ( /(^|[-\u2014/(\[{"\s])'/g , "$1\u2018" ) // closing singles & apostrophes
. replace ( /'/g , "\u2019" ) // opening doubles
. replace ( /(^|[-\u2014/(\[{\u2018\s])"/g , "$1\u201C" ) // closing doubles
. replace ( /"/g , "\u201D" ) // ellipses
. replace ( /\.{3}/g , "\u2026" ) ;
}
/ * *
* Mangle Links
* /
;
2019-11-05 15:31:51 -06:00
2019-12-04 17:29:13 +01:00
_proto . mangle = function mangle ( text ) {
if ( ! this . options . mangle ) return text ;
var l = text . length ;
var out = '' ,
i = 0 ,
ch ;
2019-11-07 12:49:10 -06:00
2019-12-04 17:29:13 +01:00
for ( ; i < l ; i ++ ) {
ch = text . charCodeAt ( i ) ;
if ( Math . random ( ) > 0.5 ) {
ch = 'x' + ch . toString ( 16 ) ;
2019-03-21 01:18:31 -05:00
}
2019-11-05 15:31:51 -06:00
2019-12-04 17:29:13 +01:00
out += '&#' + ch + ';' ;
2019-03-21 01:18:31 -05:00
}
2019-11-07 12:49:10 -06:00
2019-12-04 17:29:13 +01:00
return out ;
} ;
2019-03-21 01:50:47 -05:00
2019-12-04 17:29:13 +01:00
_createClass ( InlineLexer , null , [ {
2019-11-07 12:49:10 -06:00
key : "rules" ,
get : function get ( ) {
return inline$1 ;
}
} ] ) ;
return InlineLexer ;
} ( ) ;
/ * *
* TextRenderer
* returns only the textual part of the token
* /
var TextRenderer _1 =
/*#__PURE__*/
function ( ) {
2019-12-04 17:29:13 +01:00
function TextRenderer ( ) { }
2019-11-07 12:49:10 -06:00
2019-12-04 17:29:13 +01:00
var _proto = TextRenderer . prototype ;
// no need for block level renderers
_proto . strong = function strong ( text ) {
return text ;
} ;
_proto . em = function em ( text ) {
return text ;
} ;
_proto . codespan = function codespan ( text ) {
return text ;
} ;
_proto . del = function del ( text ) {
return text ;
} ;
_proto . text = function text ( _text ) {
return _text ;
} ;
_proto . link = function link ( href , title , text ) {
return '' + text ;
} ;
_proto . image = function image ( href , title , text ) {
return '' + text ;
} ;
_proto . br = function br ( ) {
return '' ;
} ;
2019-11-07 12:49:10 -06:00
return TextRenderer ;
} ( ) ;
2019-12-05 23:08:43 +00:00
var defaults$4 = defaults . defaults ;
2019-11-07 12:49:10 -06:00
var merge$2 = helpers . merge ,
unescape$1 = helpers . unescape ;
/ * *
* Parsing & Compiling
* /
var Parser _1 =
/*#__PURE__*/
function ( ) {
function Parser ( options ) {
this . tokens = [ ] ;
this . token = null ;
this . options = options || defaults$4 ;
this . options . renderer = this . options . renderer || new Renderer _1 ( ) ;
this . renderer = this . options . renderer ;
this . renderer . options = this . options ;
this . slugger = new Slugger _1 ( ) ;
2019-11-06 11:11:39 -06:00
}
2019-11-07 12:49:10 -06:00
/ * *
* Static Parse Method
* /
2019-03-21 01:50:47 -05:00
2019-12-04 17:29:13 +01:00
Parser . parse = function parse ( tokens , options ) {
var parser = new Parser ( options ) ;
return parser . parse ( tokens ) ;
} ;
2019-03-21 01:50:47 -05:00
2019-12-04 17:29:13 +01:00
var _proto = Parser . prototype ;
2019-03-21 01:50:47 -05:00
2019-12-04 17:29:13 +01:00
/ * *
* Parse Loop
* /
_proto . parse = function parse ( tokens ) {
this . inline = new InlineLexer _1 ( tokens . links , this . options ) ; // use an InlineLexer with a TextRenderer to extract pure text
2019-03-21 01:50:47 -05:00
2019-12-04 17:29:13 +01:00
this . inlineText = new InlineLexer _1 ( tokens . links , merge$2 ( { } , this . options , {
renderer : new TextRenderer _1 ( )
} ) ) ;
this . tokens = tokens . reverse ( ) ;
var out = '' ;
2019-03-21 01:50:47 -05:00
2019-12-04 17:29:13 +01:00
while ( this . next ( ) ) {
out += this . tok ( ) ;
2019-11-07 12:49:10 -06:00
}
2019-03-21 01:50:47 -05:00
2019-12-04 17:29:13 +01:00
return out ;
} ;
2019-03-21 01:50:47 -05:00
2019-12-04 17:29:13 +01:00
/ * *
* Next Token
* /
_proto . next = function next ( ) {
this . token = this . tokens . pop ( ) ;
return this . token ;
} ;
/ * *
* Preview Next Token
* /
_proto . peek = function peek ( ) {
return this . tokens [ this . tokens . length - 1 ] || 0 ;
} ;
/ * *
* Parse Text Tokens
* /
_proto . parseText = function parseText ( ) {
var body = this . token . text ;
2019-03-21 01:50:47 -05:00
2019-12-04 17:29:13 +01:00
while ( this . peek ( ) . type === 'text' ) {
body += '\n' + this . next ( ) . text ;
2019-11-07 12:49:10 -06:00
}
2019-12-04 17:29:13 +01:00
return this . inline . output ( body ) ;
} ;
2019-11-07 12:49:10 -06:00
2019-12-04 17:29:13 +01:00
/ * *
* Parse Current Token
* /
_proto . tok = function tok ( ) {
var body = '' ;
2019-11-07 12:49:10 -06:00
2019-12-04 17:29:13 +01:00
switch ( this . token . type ) {
case 'space' :
{
return '' ;
}
2019-11-07 12:49:10 -06:00
2019-12-04 17:29:13 +01:00
case 'hr' :
{
return this . renderer . hr ( ) ;
}
2019-11-07 12:49:10 -06:00
2019-12-04 17:29:13 +01:00
case 'heading' :
{
return this . renderer . heading ( this . inline . output ( this . token . text ) , this . token . depth , unescape$1 ( this . inlineText . output ( this . token . text ) ) , this . slugger ) ;
}
2019-11-07 12:49:10 -06:00
2019-12-04 17:29:13 +01:00
case 'code' :
{
return this . renderer . code ( this . token . text , this . token . lang , this . token . escaped ) ;
}
2019-11-07 12:49:10 -06:00
2019-12-04 17:29:13 +01:00
case 'table' :
{
var header = '' ,
i ,
row ,
cell ,
j ; // header
2019-11-07 12:49:10 -06:00
2019-12-04 17:29:13 +01:00
cell = '' ;
2019-11-07 12:49:10 -06:00
2019-12-04 17:29:13 +01:00
for ( i = 0 ; i < this . token . header . length ; i ++ ) {
cell += this . renderer . tablecell ( this . inline . output ( this . token . header [ i ] ) , {
header : true ,
align : this . token . align [ i ]
} ) ;
}
header += this . renderer . tablerow ( cell ) ;
2019-11-07 12:49:10 -06:00
2019-12-04 17:29:13 +01:00
for ( i = 0 ; i < this . token . cells . length ; i ++ ) {
row = this . token . cells [ i ] ;
cell = '' ;
for ( j = 0 ; j < row . length ; j ++ ) {
cell += this . renderer . tablecell ( this . inline . output ( row [ j ] ) , {
header : false ,
align : this . token . align [ j ]
} ) ;
2019-11-07 12:49:10 -06:00
}
2019-12-04 17:29:13 +01:00
body += this . renderer . tablerow ( cell ) ;
2019-11-07 12:49:10 -06:00
}
2019-12-04 17:29:13 +01:00
return this . renderer . table ( header , body ) ;
}
2019-11-07 12:49:10 -06:00
2019-12-04 17:29:13 +01:00
case 'blockquote_start' :
{
body = '' ;
2019-11-07 12:49:10 -06:00
2019-12-04 17:29:13 +01:00
while ( this . next ( ) . type !== 'blockquote_end' ) {
body += this . tok ( ) ;
2019-11-07 12:49:10 -06:00
}
2019-12-04 17:29:13 +01:00
return this . renderer . blockquote ( body ) ;
}
2019-11-07 12:49:10 -06:00
2019-12-04 17:29:13 +01:00
case 'list_start' :
{
body = '' ;
var ordered = this . token . ordered ,
start = this . token . start ;
2019-11-07 12:49:10 -06:00
2019-12-04 17:29:13 +01:00
while ( this . next ( ) . type !== 'list_end' ) {
body += this . tok ( ) ;
2019-11-07 12:49:10 -06:00
}
2019-12-04 17:29:13 +01:00
return this . renderer . list ( body , ordered , start ) ;
}
case 'list_item_start' :
{
body = '' ;
var loose = this . token . loose ;
var checked = this . token . checked ;
var task = this . token . task ;
if ( this . token . task ) {
if ( loose ) {
if ( this . peek ( ) . type === 'text' ) {
var nextToken = this . peek ( ) ;
nextToken . text = this . renderer . checkbox ( checked ) + ' ' + nextToken . text ;
2019-11-07 12:49:10 -06:00
} else {
2019-12-04 17:29:13 +01:00
this . tokens . push ( {
type : 'text' ,
text : this . renderer . checkbox ( checked )
} ) ;
2019-11-07 12:49:10 -06:00
}
2019-12-04 17:29:13 +01:00
} else {
body += this . renderer . checkbox ( checked ) ;
2019-11-07 12:49:10 -06:00
}
}
2019-12-04 17:29:13 +01:00
while ( this . next ( ) . type !== 'list_item_end' ) {
body += ! loose && this . token . type === 'text' ? this . parseText ( ) : this . tok ( ) ;
2019-11-07 12:49:10 -06:00
}
2019-12-04 17:29:13 +01:00
return this . renderer . listitem ( body , task , checked ) ;
}
2019-11-07 12:49:10 -06:00
2019-12-04 17:29:13 +01:00
case 'html' :
{
// TODO parse inline content if parameter markdown=1
return this . renderer . html ( this . token . text ) ;
}
2019-11-07 12:49:10 -06:00
2019-12-04 17:29:13 +01:00
case 'paragraph' :
{
return this . renderer . paragraph ( this . inline . output ( this . token . text ) ) ;
}
2019-11-07 12:49:10 -06:00
2019-12-04 17:29:13 +01:00
case 'text' :
{
return this . renderer . paragraph ( this . parseText ( ) ) ;
}
default :
{
var errMsg = 'Token with "' + this . token . type + '" type was not found.' ;
if ( this . options . silent ) {
console . log ( errMsg ) ;
} else {
throw new Error ( errMsg ) ;
2019-11-07 12:49:10 -06:00
}
2019-12-04 17:29:13 +01:00
}
2019-11-07 12:49:10 -06:00
}
2019-12-04 17:29:13 +01:00
} ;
2019-11-07 12:49:10 -06:00
return Parser ;
} ( ) ;
var merge$3 = helpers . merge ,
checkSanitizeDeprecation$1 = helpers . checkSanitizeDeprecation ,
escape$4 = helpers . escape ;
2019-12-05 23:08:43 +00:00
var getDefaults = defaults . getDefaults ,
changeDefaults = defaults . changeDefaults ,
defaults$5 = defaults . defaults ;
2019-11-07 12:49:10 -06:00
/ * *
* Marked
* /
function marked ( src , opt , callback ) {
// throw error in case of non string input
if ( typeof src === 'undefined' || src === null ) {
throw new Error ( 'marked(): input parameter is undefined or null' ) ;
2019-11-05 15:31:51 -06:00
}
2019-03-21 01:50:47 -05:00
2019-11-07 12:49:10 -06:00
if ( typeof src !== 'string' ) {
throw new Error ( 'marked(): input parameter is of type ' + Object . prototype . toString . call ( src ) + ', string expected' ) ;
2019-11-06 12:05:09 -06:00
}
2019-03-21 01:50:47 -05:00
2019-11-07 12:49:10 -06:00
if ( callback || typeof opt === 'function' ) {
var _ret = function ( ) {
if ( ! callback ) {
callback = opt ;
opt = null ;
}
2019-03-21 01:50:47 -05:00
2019-11-07 12:49:10 -06:00
opt = merge$3 ( { } , marked . defaults , opt || { } ) ;
checkSanitizeDeprecation$1 ( opt ) ;
var highlight = opt . highlight ;
var tokens ,
pending ,
i = 0 ;
try {
tokens = Lexer _1 . lex ( src , opt ) ;
} catch ( e ) {
return {
v : callback ( e )
} ;
}
2019-03-21 01:50:47 -05:00
2019-11-07 12:49:10 -06:00
pending = tokens . length ;
2019-03-21 01:50:47 -05:00
2019-11-07 12:49:10 -06:00
var done = function done ( err ) {
if ( err ) {
opt . highlight = highlight ;
return callback ( err ) ;
}
2019-03-21 01:50:47 -05:00
2019-11-07 12:49:10 -06:00
var out ;
2019-03-21 01:50:47 -05:00
2019-11-07 12:49:10 -06:00
try {
out = Parser _1 . parse ( tokens , opt ) ;
} catch ( e ) {
err = e ;
}
2019-03-21 01:50:47 -05:00
2019-11-07 12:49:10 -06:00
opt . highlight = highlight ;
return err ? callback ( err ) : callback ( null , out ) ;
} ;
2019-03-21 01:50:47 -05:00
2019-11-07 12:49:10 -06:00
if ( ! highlight || highlight . length < 3 ) {
return {
v : done ( )
} ;
}
2019-03-21 01:50:47 -05:00
2019-11-07 12:49:10 -06:00
delete opt . highlight ;
if ( ! pending ) return {
v : done ( )
} ;
2019-03-21 01:50:47 -05:00
2019-11-07 12:49:10 -06:00
for ( ; i < tokens . length ; i ++ ) {
( function ( token ) {
if ( token . type !== 'code' ) {
return -- pending || done ( ) ;
}
2019-03-21 01:50:47 -05:00
2019-11-07 12:49:10 -06:00
return highlight ( token . text , token . lang , function ( err , code ) {
if ( err ) return done ( err ) ;
2019-03-21 01:50:47 -05:00
2019-11-07 12:49:10 -06:00
if ( code == null || code === token . text ) {
return -- pending || done ( ) ;
}
2019-03-21 01:50:47 -05:00
2019-11-07 12:49:10 -06:00
token . text = code ;
token . escaped = true ;
-- pending || done ( ) ;
} ) ;
} ) ( tokens [ i ] ) ;
}
2019-03-21 01:50:47 -05:00
2019-11-07 12:49:10 -06:00
return {
v : void 0
} ;
} ( ) ;
2019-03-21 01:50:47 -05:00
2019-12-04 17:29:13 +01:00
if ( typeof _ret === "object" ) return _ret . v ;
2019-11-07 12:49:10 -06:00
}
2019-03-21 01:50:47 -05:00
2019-11-05 15:31:51 -06:00
try {
2019-11-07 12:49:10 -06:00
opt = merge$3 ( { } , marked . defaults , opt || { } ) ;
checkSanitizeDeprecation$1 ( opt ) ;
return Parser _1 . parse ( Lexer _1 . lex ( src , opt ) , opt ) ;
2019-11-05 15:31:51 -06:00
} catch ( e ) {
2019-11-07 12:49:10 -06:00
e . message += '\nPlease report this to https://github.com/markedjs/marked.' ;
2019-03-21 01:50:47 -05:00
2019-11-07 12:49:10 -06:00
if ( ( opt || marked . defaults ) . silent ) {
return '<p>An error occurred:</p><pre>' + escape$4 ( e . message + '' , true ) + '</pre>' ;
2019-11-06 12:05:09 -06:00
}
2019-11-07 12:49:10 -06:00
throw e ;
2019-11-05 15:31:51 -06:00
}
}
2019-11-07 12:49:10 -06:00
/ * *
* Options
* /
2019-03-21 01:50:47 -05:00
2019-11-06 11:11:39 -06:00
2019-11-07 12:49:10 -06:00
marked . options = marked . setOptions = function ( opt ) {
merge$3 ( marked . defaults , opt ) ;
2019-12-05 23:08:43 +00:00
changeDefaults ( marked . defaults ) ;
2019-11-07 12:49:10 -06:00
return marked ;
2019-11-05 15:31:51 -06:00
} ;
2019-03-21 01:50:47 -05:00
2019-12-05 23:08:43 +00:00
marked . getDefaults = getDefaults ;
2019-11-07 12:49:10 -06:00
marked . defaults = defaults$5 ;
/ * *
* Expose
* /
marked . Parser = Parser _1 ;
marked . parser = Parser _1 . parse ;
marked . Renderer = Renderer _1 ;
marked . TextRenderer = TextRenderer _1 ;
marked . Lexer = Lexer _1 ;
marked . lexer = Lexer _1 . lex ;
marked . InlineLexer = InlineLexer _1 ;
marked . inlineLexer = InlineLexer _1 . output ;
marked . Slugger = Slugger _1 ;
marked . parse = marked ;
var marked _1 = marked ;
return marked _1 ;
} ) ) ) ;