2021-11-02 07:32:17 -07:00
/ * *
* marked - a markdown parser
2022-01-06 15:33:25 +00:00
* Copyright ( c ) 2011 - 2022 , Christopher Jeffrey . ( MIT Licensed )
2021-11-02 07:32:17 -07:00
* https : //github.com/markedjs/marked
* /
/ * *
* DO NOT EDIT THIS FILE
* The code in this file is generated from files in . / src /
* /
2021-11-12 13:38:04 -08:00
'use strict' ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
Object . defineProperty ( exports , '__esModule' , { value : true } ) ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08: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 ) ;
2021-11-02 07:32:17 -07:00
}
2021-11-12 13:38:04 -08:00
}
function _createClass ( Constructor , protoProps , staticProps ) {
if ( protoProps ) _defineProperties ( Constructor . prototype , protoProps ) ;
if ( staticProps ) _defineProperties ( Constructor , staticProps ) ;
2022-01-06 15:33:25 +00:00
Object . defineProperty ( Constructor , "prototype" , {
writable : false
} ) ;
2021-11-12 13:38:04 -08:00
return Constructor ;
}
function _unsupportedIterableToArray ( o , minLen ) {
if ( ! o ) return ;
if ( typeof o === "string" ) return _arrayLikeToArray ( o , minLen ) ;
var n = Object . prototype . toString . call ( o ) . slice ( 8 , - 1 ) ;
if ( n === "Object" && o . constructor ) n = o . constructor . name ;
if ( n === "Map" || n === "Set" ) return Array . from ( o ) ;
if ( n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/ . test ( n ) ) return _arrayLikeToArray ( o , minLen ) ;
}
function _arrayLikeToArray ( arr , len ) {
if ( len == null || len > arr . length ) len = arr . length ;
for ( var i = 0 , arr2 = new Array ( len ) ; i < len ; i ++ ) arr2 [ i ] = arr [ i ] ;
return arr2 ;
}
function _createForOfIteratorHelperLoose ( o , allowArrayLike ) {
var it = typeof Symbol !== "undefined" && o [ Symbol . iterator ] || o [ "@@iterator" ] ;
if ( it ) return ( it = it . call ( o ) ) . next . bind ( it ) ;
if ( Array . isArray ( o ) || ( it = _unsupportedIterableToArray ( o ) ) || allowArrayLike && o && typeof o . length === "number" ) {
if ( it ) o = it ;
var i = 0 ;
return function ( ) {
if ( i >= o . length ) return {
done : true
} ;
return {
done : false ,
value : o [ i ++ ]
2021-11-02 07:32:17 -07:00
} ;
} ;
}
2021-11-12 13:38:04 -08:00
throw new TypeError ( "Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method." ) ;
}
function getDefaults ( ) {
return {
baseUrl : null ,
breaks : false ,
extensions : null ,
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 ,
tokenizer : null ,
walkTokens : null ,
xhtml : false
2021-11-02 07:32:17 -07:00
} ;
2021-11-12 13:38:04 -08:00
}
exports . defaults = getDefaults ( ) ;
function changeDefaults ( newDefaults ) {
exports . defaults = newDefaults ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
/ * *
* Helpers
* /
var escapeTest = /[&<>"']/ ;
var escapeReplace = /[&<>"']/g ;
var escapeTestNoEncode = /[<>"']|&(?!#?\w+;)/ ;
var escapeReplaceNoEncode = /[<>"']|&(?!#?\w+;)/g ;
var escapeReplacements = {
'&' : '&' ,
'<' : '<' ,
'>' : '>' ,
'"' : '"' ,
"'" : '''
} ;
var getEscapeReplacement = function getEscapeReplacement ( ch ) {
return escapeReplacements [ ch ] ;
} ;
function escape ( html , encode ) {
if ( encode ) {
if ( escapeTest . test ( html ) ) {
return html . replace ( escapeReplace , getEscapeReplacement ) ;
}
} else {
if ( escapeTestNoEncode . test ( html ) ) {
return html . replace ( escapeReplaceNoEncode , getEscapeReplacement ) ;
2021-11-02 07:32:17 -07:00
}
}
2021-11-12 13:38:04 -08:00
return html ;
}
var unescapeTest = /&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig ;
2022-04-08 01:54:20 +00:00
/ * *
* @ param { string } html
* /
2021-11-12 13:38:04 -08:00
function unescape ( html ) {
// explicitly match decimal, hex, and named HTML entities
return html . replace ( unescapeTest , function ( _ , n ) {
n = n . toLowerCase ( ) ;
if ( n === 'colon' ) return ':' ;
if ( n . charAt ( 0 ) === '#' ) {
return n . charAt ( 1 ) === 'x' ? String . fromCharCode ( parseInt ( n . substring ( 2 ) , 16 ) ) : String . fromCharCode ( + n . substring ( 1 ) ) ;
2021-11-02 07:32:17 -07:00
}
2021-11-12 13:38:04 -08:00
return '' ;
} ) ;
}
var caret = /(^|[^\[])\^/g ;
2022-04-08 01:54:20 +00:00
/ * *
* @ param { string | RegExp } regex
* @ param { string } opt
* /
2021-11-12 13:38:04 -08:00
function edit ( regex , opt ) {
2022-04-08 01:54:20 +00:00
regex = typeof regex === 'string' ? regex : regex . source ;
2021-11-12 13:38:04 -08:00
opt = opt || '' ;
var obj = {
replace : function replace ( name , val ) {
val = val . source || val ;
val = val . replace ( caret , '$1' ) ;
regex = regex . replace ( name , val ) ;
return obj ;
} ,
getRegex : function getRegex ( ) {
return new RegExp ( regex , opt ) ;
2021-11-02 07:32:17 -07:00
}
2021-11-12 13:38:04 -08:00
} ;
return obj ;
}
var nonWordAndColonTest = /[^\w:]/g ;
var originIndependentUrl = /^$|^[a-z][a-z0-9+.-]*:|^[?#]/i ;
2022-04-08 01:54:20 +00:00
/ * *
* @ param { boolean } sanitize
* @ param { string } base
* @ param { string } href
* /
2021-11-12 13:38:04 -08:00
function cleanUrl ( sanitize , base , href ) {
if ( sanitize ) {
var prot ;
2021-11-02 07:32:17 -07:00
try {
2021-11-12 13:38:04 -08:00
prot = decodeURIComponent ( unescape ( href ) ) . replace ( nonWordAndColonTest , '' ) . toLowerCase ( ) ;
2021-11-02 07:32:17 -07:00
} catch ( e ) {
return null ;
}
2021-11-12 13:38:04 -08:00
if ( prot . indexOf ( 'javascript:' ) === 0 || prot . indexOf ( 'vbscript:' ) === 0 || prot . indexOf ( 'data:' ) === 0 ) {
return null ;
2021-11-02 07:32:17 -07:00
}
2021-11-12 13:38:04 -08:00
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( base && ! originIndependentUrl . test ( href ) ) {
href = resolveUrl ( base , href ) ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
try {
href = encodeURI ( href ) . replace ( /%25/g , '%' ) ;
} catch ( e ) {
return null ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
return href ;
}
var baseUrls = { } ;
var justDomain = /^[^:]+:\/*[^/]*$/ ;
var protocol = /^([^:]+:)[\s\S]*$/ ;
var domain = /^([^:]+:\/*[^/]*)[\s\S]*$/ ;
2022-04-08 01:54:20 +00:00
/ * *
* @ param { string } base
* @ param { string } href
* /
2021-11-12 13:38:04 -08:00
function resolveUrl ( base , href ) {
if ( ! baseUrls [ ' ' + base ] ) {
// 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
if ( justDomain . test ( base ) ) {
baseUrls [ ' ' + base ] = base + '/' ;
2021-11-02 07:32:17 -07:00
} else {
2021-11-12 13:38:04 -08:00
baseUrls [ ' ' + base ] = rtrim ( base , '/' , true ) ;
2021-11-02 07:32:17 -07:00
}
}
2021-11-12 13:38:04 -08:00
base = baseUrls [ ' ' + base ] ;
var relativeBase = base . indexOf ( ':' ) === - 1 ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( href . substring ( 0 , 2 ) === '//' ) {
if ( relativeBase ) {
return href ;
2021-11-02 07:32:17 -07:00
}
2021-11-12 13:38:04 -08:00
return base . replace ( protocol , '$1' ) + href ;
} else if ( href . charAt ( 0 ) === '/' ) {
if ( relativeBase ) {
return href ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
return base . replace ( domain , '$1' ) + href ;
} else {
return base + href ;
}
}
var noopTest = {
exec : function noopTest ( ) { }
} ;
function merge ( obj ) {
var i = 1 ,
target ,
key ;
for ( ; i < arguments . length ; i ++ ) {
target = arguments [ i ] ;
for ( key in target ) {
if ( Object . prototype . hasOwnProperty . call ( target , key ) ) {
obj [ key ] = target [ key ] ;
2021-11-02 07:32:17 -07:00
}
}
2021-11-12 13:38:04 -08:00
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
return obj ;
}
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 ;
while ( -- curr >= 0 && str [ curr ] === '\\' ) {
escaped = ! escaped ;
2021-11-02 07:32:17 -07:00
}
2021-11-12 13:38:04 -08:00
if ( escaped ) {
// odd number of slashes means | is escaped
// so we leave it alone
return '|' ;
2021-11-02 07:32:17 -07:00
} else {
2021-11-12 13:38:04 -08:00
// add space before unescaped |
return ' |' ;
2021-11-02 07:32:17 -07:00
}
2021-11-12 13:38:04 -08:00
} ) ,
cells = row . split ( / \|/ ) ;
var i = 0 ; // First/last cell in a row cannot be empty if it has no leading/trailing pipe
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( ! cells [ 0 ] . trim ( ) ) {
cells . shift ( ) ;
}
2021-11-02 07:32:17 -07:00
2022-01-27 04:11:57 +00:00
if ( cells . length > 0 && ! cells [ cells . length - 1 ] . trim ( ) ) {
2021-11-12 13:38:04 -08:00
cells . pop ( ) ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( cells . length > count ) {
cells . splice ( count ) ;
} else {
while ( cells . length < count ) {
cells . push ( '' ) ;
}
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
for ( ; i < cells . length ; i ++ ) {
// leading or trailing whitespace is ignored per the gfm spec
cells [ i ] = cells [ i ] . trim ( ) . replace ( /\\\|/g , '|' ) ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
return cells ;
2022-04-08 01:54:20 +00:00
}
/ * *
* Remove trailing 'c' s . Equivalent to str . replace ( /c*$/ , '' ) .
* /c*$/ is vulnerable to REDOS .
*
* @ param { string } str
* @ param { string } c
* @ param { boolean } invert Remove suffix of non - c chars instead . Default falsey .
* /
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
function rtrim ( str , c , invert ) {
var l = str . length ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( l === 0 ) {
return '' ;
} // Length of suffix matching the invert condition.
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
var suffLen = 0 ; // Step left until we fail to match the invert condition.
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
while ( suffLen < l ) {
var currChar = str . charAt ( l - suffLen - 1 ) ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( currChar === c && ! invert ) {
suffLen ++ ;
} else if ( currChar !== c && invert ) {
suffLen ++ ;
} else {
break ;
2021-11-02 07:32:17 -07:00
}
2021-11-12 13:38:04 -08:00
}
2021-11-02 07:32:17 -07:00
2022-04-08 01:54:20 +00:00
return str . slice ( 0 , l - suffLen ) ;
2021-11-12 13:38:04 -08:00
}
function findClosingBracket ( str , b ) {
if ( str . indexOf ( b [ 1 ] ) === - 1 ) {
2021-11-02 07:32:17 -07:00
return - 1 ;
}
2021-11-12 13:38:04 -08:00
var l = str . length ;
var level = 0 ,
i = 0 ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
for ( ; i < l ; i ++ ) {
if ( str [ i ] === '\\' ) {
i ++ ;
} else if ( str [ i ] === b [ 0 ] ) {
level ++ ;
} else if ( str [ i ] === b [ 1 ] ) {
level -- ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( level < 0 ) {
return i ;
2021-11-02 07:32:17 -07:00
}
}
}
2021-11-12 13:38:04 -08:00
return - 1 ;
}
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' ) ;
}
} // copied from https://stackoverflow.com/a/5450113/806777
2021-11-02 07:32:17 -07:00
2022-04-08 01:54:20 +00:00
/ * *
* @ param { string } pattern
* @ param { number } count
* /
2021-11-12 13:38:04 -08:00
function repeatString ( pattern , count ) {
if ( count < 1 ) {
return '' ;
2021-11-02 07:32:17 -07:00
}
2021-11-12 13:38:04 -08:00
var result = '' ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
while ( count > 1 ) {
if ( count & 1 ) {
result += pattern ;
2021-11-02 07:32:17 -07:00
}
2021-11-12 13:38:04 -08:00
count >>= 1 ;
pattern += pattern ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
return result + pattern ;
}
function outputLink ( cap , link , raw , lexer ) {
var href = link . href ;
var title = link . title ? escape ( link . title ) : null ;
var text = cap [ 1 ] . replace ( /\\([\[\]])/g , '$1' ) ;
if ( cap [ 0 ] . charAt ( 0 ) !== '!' ) {
lexer . state . inLink = true ;
var token = {
type : 'link' ,
raw : raw ,
href : href ,
title : title ,
text : text ,
tokens : lexer . inlineTokens ( text , [ ] )
} ;
lexer . state . inLink = false ;
return token ;
}
2022-05-02 06:13:56 +00:00
return {
type : 'image' ,
raw : raw ,
href : href ,
title : title ,
text : escape ( text )
} ;
2021-11-12 13:38:04 -08:00
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
function indentCodeCompensation ( raw , text ) {
var matchIndentToCode = raw . match ( /^(\s+)(?:```)/ ) ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( matchIndentToCode === null ) {
return text ;
}
var indentToCode = matchIndentToCode [ 1 ] ;
return text . split ( '\n' ) . map ( function ( node ) {
var matchIndentInNode = node . match ( /^\s+/ ) ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( matchIndentInNode === null ) {
2021-11-02 07:32:17 -07:00
return node ;
2021-11-12 13:38:04 -08:00
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
var indentInNode = matchIndentInNode [ 0 ] ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( indentInNode . length >= indentToCode . length ) {
return node . slice ( indentToCode . length ) ;
2021-11-02 07:32:17 -07:00
}
2021-11-12 13:38:04 -08:00
return node ;
} ) . join ( '\n' ) ;
}
/ * *
* Tokenizer
* /
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
var Tokenizer = /*#__PURE__*/ function ( ) {
function Tokenizer ( options ) {
this . options = options || exports . defaults ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
var _proto = Tokenizer . prototype ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
_proto . space = function space ( src ) {
var cap = this . rules . block . newline . exec ( src ) ;
2021-11-02 07:32:17 -07:00
2022-01-06 15:33:25 +00:00
if ( cap && cap [ 0 ] . length > 0 ) {
2021-11-12 13:38:04 -08:00
return {
2022-01-06 15:33:25 +00:00
type : 'space' ,
raw : cap [ 0 ]
2021-11-12 13:38:04 -08:00
} ;
}
} ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
_proto . code = function code ( src ) {
var cap = this . rules . block . code . exec ( src ) ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( cap ) {
var text = cap [ 0 ] . replace ( /^ {1,4}/gm , '' ) ;
return {
type : 'code' ,
raw : cap [ 0 ] ,
codeBlockStyle : 'indented' ,
text : ! this . options . pedantic ? rtrim ( text , '\n' ) : text
} ;
}
} ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
_proto . fences = function fences ( src ) {
var cap = this . rules . block . fences . exec ( src ) ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( cap ) {
var raw = cap [ 0 ] ;
var text = indentCodeCompensation ( raw , cap [ 3 ] || '' ) ;
return {
type : 'code' ,
raw : raw ,
lang : cap [ 2 ] ? cap [ 2 ] . trim ( ) : cap [ 2 ] ,
text : text
} ;
}
} ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
_proto . heading = function heading ( src ) {
var cap = this . rules . block . heading . exec ( src ) ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( cap ) {
var text = cap [ 2 ] . trim ( ) ; // remove trailing #s
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( /#$/ . test ( text ) ) {
var trimmed = rtrim ( text , '#' ) ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( this . options . pedantic ) {
text = trimmed . trim ( ) ;
} else if ( ! trimmed || / $/ . test ( trimmed ) ) {
// CommonMark requires space before trailing #s
text = trimmed . trim ( ) ;
}
2021-11-02 07:32:17 -07:00
}
2021-11-12 13:38:04 -08:00
var token = {
type : 'heading' ,
raw : cap [ 0 ] ,
depth : cap [ 1 ] . length ,
text : text ,
tokens : [ ]
} ;
this . lexer . inline ( token . text , token . tokens ) ;
return token ;
}
} ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
_proto . hr = function hr ( src ) {
var cap = this . rules . block . hr . exec ( src ) ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( cap ) {
return {
type : 'hr' ,
raw : cap [ 0 ]
} ;
}
} ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
_proto . blockquote = function blockquote ( src ) {
var cap = this . rules . block . blockquote . exec ( src ) ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( cap ) {
2022-04-11 00:38:29 +00:00
var text = cap [ 0 ] . replace ( /^ *>[ \t]?/gm , '' ) ;
2021-11-12 13:38:04 -08:00
return {
type : 'blockquote' ,
raw : cap [ 0 ] ,
tokens : this . lexer . blockTokens ( text , [ ] ) ,
text : text
} ;
}
} ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
_proto . list = function list ( src ) {
var cap = this . rules . block . list . exec ( src ) ;
if ( cap ) {
2021-12-09 23:59:39 +00:00
var raw , istask , ischecked , indent , i , blankLine , endsWithBlankLine , line , nextLine , rawLine , itemContents , endEarly ;
2021-11-12 13:38:04 -08:00
var bull = cap [ 1 ] . trim ( ) ;
var isordered = bull . length > 1 ;
var list = {
type : 'list' ,
raw : '' ,
ordered : isordered ,
start : isordered ? + bull . slice ( 0 , - 1 ) : '' ,
loose : false ,
items : [ ]
} ;
bull = isordered ? "\\d{1,9}\\" + bull . slice ( - 1 ) : "\\" + bull ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( this . options . pedantic ) {
bull = isordered ? bull : '[*+-]' ;
} // Get next list item
2021-11-02 07:32:17 -07:00
2022-04-11 00:38:29 +00:00
var itemRegex = new RegExp ( "^( {0,3}" + bull + ")((?:[\t ][^\\n]*)?(?:\\n|$))" ) ; // Check if current bullet point can start a new List Item
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
while ( src ) {
2021-12-09 23:59:39 +00:00
endEarly = false ;
2021-12-01 22:18:07 -05:00
if ( ! ( cap = itemRegex . exec ( src ) ) ) {
2021-11-12 13:38:04 -08:00
break ;
}
2021-11-02 07:32:17 -07:00
2021-12-01 22:18:07 -05:00
if ( this . rules . block . hr . test ( src ) ) {
// End list if bullet was actually HR (possibly move into itemRegex?)
2021-11-12 13:38:04 -08:00
break ;
}
2021-11-02 07:32:17 -07:00
2021-12-01 22:18:07 -05:00
raw = cap [ 0 ] ;
src = src . substring ( raw . length ) ;
line = cap [ 2 ] . split ( '\n' , 1 ) [ 0 ] ;
nextLine = src . split ( '\n' , 1 ) [ 0 ] ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( this . options . pedantic ) {
indent = 2 ;
2021-12-01 22:18:07 -05:00
itemContents = line . trimLeft ( ) ;
2021-11-12 13:38:04 -08:00
} else {
indent = cap [ 2 ] . search ( /[^ ]/ ) ; // Find first non-space char
2021-11-02 07:32:17 -07:00
2021-12-01 22:18:07 -05:00
indent = indent > 4 ? 1 : indent ; // Treat indented code blocks (> 4 spaces) as having only 1 indent
2021-11-02 07:32:17 -07:00
2021-12-01 22:18:07 -05:00
itemContents = line . slice ( indent ) ;
indent += cap [ 1 ] . length ;
2021-11-12 13:38:04 -08:00
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
blankLine = false ;
2021-11-02 07:32:17 -07:00
2021-12-01 22:18:07 -05:00
if ( ! line && /^ *$/ . test ( nextLine ) ) {
// Items begin with at most one blank line
raw += nextLine + '\n' ;
src = src . substring ( nextLine . length + 1 ) ;
2021-12-09 23:59:39 +00:00
endEarly = true ;
2021-11-12 13:38:04 -08:00
}
2021-11-02 07:32:17 -07:00
2021-12-09 23:59:39 +00:00
if ( ! endEarly ) {
2022-05-02 06:13:56 +00:00
var nextBulletRegex = new RegExp ( "^ {0," + Math . min ( 3 , indent - 1 ) + "}(?:[*+-]|\\d{1,9}[.)])((?: [^\\n]*)?(?:\\n|$))" ) ;
2022-06-13 03:16:22 +00:00
var hrRegex = new RegExp ( "^ {0," + Math . min ( 3 , indent - 1 ) + "}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)" ) ;
2022-07-11 15:15:22 +00:00
var fencesBeginRegex = new RegExp ( "^ {0," + Math . min ( 3 , indent - 1 ) + "}(?:```|~~~)" ) ;
var headingBeginRegex = new RegExp ( "^ {0," + Math . min ( 3 , indent - 1 ) + "}#" ) ; // Check if following lines should be included in List Item
2021-11-02 07:32:17 -07:00
2021-12-09 23:59:39 +00:00
while ( src ) {
rawLine = src . split ( '\n' , 1 ) [ 0 ] ;
line = rawLine ; // Re-align to follow commonmark nesting rules
2021-11-02 07:32:17 -07:00
2021-12-09 23:59:39 +00:00
if ( this . options . pedantic ) {
line = line . replace ( /^ {1,4}(?=( {4})*[^ ])/g , ' ' ) ;
2022-06-13 03:16:22 +00:00
} // End list item if found code fences
if ( fencesBeginRegex . test ( line ) ) {
break ;
} // End list item if found start of new heading
2022-07-11 15:15:22 +00:00
if ( headingBeginRegex . test ( line ) ) {
2022-06-13 03:16:22 +00:00
break ;
2021-12-09 23:59:39 +00:00
} // End list item if found start of new bullet
2021-11-02 07:32:17 -07:00
2021-12-09 23:59:39 +00:00
if ( nextBulletRegex . test ( line ) ) {
break ;
2022-05-02 06:13:56 +00:00
} // Horizontal rule found
if ( hrRegex . test ( src ) ) {
break ;
2021-12-09 23:59:39 +00:00
}
2021-11-02 07:32:17 -07:00
2021-12-09 23:59:39 +00:00
if ( line . search ( /[^ ]/ ) >= indent || ! line . trim ( ) ) {
// Dedent if possible
itemContents += '\n' + line . slice ( indent ) ;
} else if ( ! blankLine ) {
// Until blank line, item doesn't need indentation
itemContents += '\n' + line ;
} else {
// Otherwise, improper indentation ends this item
break ;
}
2021-12-01 22:18:07 -05:00
2021-12-09 23:59:39 +00:00
if ( ! blankLine && ! line . trim ( ) ) {
// Check if current line is blank
blankLine = true ;
}
2021-12-01 22:18:07 -05:00
2021-12-09 23:59:39 +00:00
raw += rawLine + '\n' ;
src = src . substring ( rawLine . length + 1 ) ;
}
2021-11-12 13:38:04 -08:00
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( ! list . loose ) {
// If the previous item ended with a blank line, the list is loose
if ( endsWithBlankLine ) {
list . loose = true ;
} else if ( /\n *\n *$/ . test ( raw ) ) {
endsWithBlankLine = true ;
}
} // Check for task list items
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( this . options . gfm ) {
istask = /^\[[ xX]\] / . exec ( itemContents ) ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( istask ) {
ischecked = istask [ 0 ] !== '[ ] ' ;
itemContents = itemContents . replace ( /^\[[ xX]\] +/ , '' ) ;
2021-11-02 07:32:17 -07:00
}
}
2021-11-12 13:38:04 -08:00
list . items . push ( {
type : 'list_item' ,
raw : raw ,
task : ! ! istask ,
checked : ischecked ,
loose : false ,
text : itemContents
} ) ;
list . raw += raw ;
} // Do not consume newlines at end of final item. Alternatively, make itemRegex *start* with any newlines to simplify/speed up endsWithBlankLine logic
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
list . items [ list . items . length - 1 ] . raw = raw . trimRight ( ) ;
list . items [ list . items . length - 1 ] . text = itemContents . trimRight ( ) ;
list . raw = list . raw . trimRight ( ) ;
var l = list . items . length ; // Item child tokens handled here at end because we needed to have the final item to trim it first
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
for ( i = 0 ; i < l ; i ++ ) {
this . lexer . state . top = false ;
list . items [ i ] . tokens = this . lexer . blockTokens ( list . items [ i ] . text , [ ] ) ;
2022-01-06 15:33:25 +00:00
var spacers = list . items [ i ] . tokens . filter ( function ( t ) {
2021-11-12 13:38:04 -08:00
return t . type === 'space' ;
2022-01-06 15:33:25 +00:00
} ) ;
var hasMultipleLineBreaks = spacers . every ( function ( t ) {
var chars = t . raw . split ( '' ) ;
var lineBreaks = 0 ;
for ( var _iterator = _createForOfIteratorHelperLoose ( chars ) , _step ; ! ( _step = _iterator ( ) ) . done ; ) {
var _char = _step . value ;
if ( _char === '\n' ) {
lineBreaks += 1 ;
}
if ( lineBreaks > 1 ) {
return true ;
}
}
return false ;
} ) ;
if ( ! list . loose && spacers . length && hasMultipleLineBreaks ) {
// Having a single line break doesn't mean a list is loose. A single line break is terminating the last list item
2021-11-12 13:38:04 -08:00
list . loose = true ;
list . items [ i ] . loose = true ;
}
2021-11-02 07:32:17 -07:00
}
2021-11-12 13:38:04 -08:00
return list ;
}
} ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
_proto . html = function html ( src ) {
var cap = this . rules . block . html . exec ( src ) ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( cap ) {
var token = {
type : 'html' ,
raw : cap [ 0 ] ,
pre : ! this . options . sanitizer && ( cap [ 1 ] === 'pre' || cap [ 1 ] === 'script' || cap [ 1 ] === 'style' ) ,
text : cap [ 0 ]
} ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( this . options . sanitize ) {
token . type = 'paragraph' ;
token . text = this . options . sanitizer ? this . options . sanitizer ( cap [ 0 ] ) : escape ( cap [ 0 ] ) ;
token . tokens = [ ] ;
this . lexer . inline ( token . text , token . tokens ) ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
return token ;
}
} ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
_proto . def = function def ( src ) {
var cap = this . rules . block . def . exec ( src ) ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( cap ) {
if ( cap [ 3 ] ) cap [ 3 ] = cap [ 3 ] . substring ( 1 , cap [ 3 ] . length - 1 ) ;
var tag = cap [ 1 ] . toLowerCase ( ) . replace ( /\s+/g , ' ' ) ;
return {
type : 'def' ,
tag : tag ,
raw : cap [ 0 ] ,
href : cap [ 2 ] ,
title : cap [ 3 ]
} ;
}
} ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
_proto . table = function table ( src ) {
var cap = this . rules . block . table . exec ( src ) ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( cap ) {
var item = {
type : 'table' ,
header : splitCells ( cap [ 1 ] ) . map ( function ( c ) {
return {
text : c
} ;
} ) ,
align : cap [ 2 ] . replace ( /^ *|\| *$/g , '' ) . split ( / *\| */ ) ,
2022-01-26 21:52:15 +00:00
rows : cap [ 3 ] && cap [ 3 ] . trim ( ) ? cap [ 3 ] . replace ( /\n[ \t]*$/ , '' ) . split ( '\n' ) : [ ]
2021-11-12 13:38:04 -08:00
} ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( item . header . length === item . align . length ) {
item . raw = cap [ 0 ] ;
var l = item . align . length ;
var i , j , k , row ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
for ( i = 0 ; i < l ; 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 ;
}
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
l = item . rows . length ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
for ( i = 0 ; i < l ; i ++ ) {
item . rows [ i ] = splitCells ( item . rows [ i ] , item . header . length ) . map ( function ( c ) {
return {
text : c
} ;
} ) ;
} // parse child tokens inside headers and cells
// header child tokens
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
l = item . header . length ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
for ( j = 0 ; j < l ; j ++ ) {
item . header [ j ] . tokens = [ ] ;
2022-05-17 13:30:17 +00:00
this . lexer . inline ( item . header [ j ] . text , item . header [ j ] . tokens ) ;
2021-11-12 13:38:04 -08:00
} // cell child tokens
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
l = item . rows . length ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
for ( j = 0 ; j < l ; j ++ ) {
row = item . rows [ j ] ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
for ( k = 0 ; k < row . length ; k ++ ) {
row [ k ] . tokens = [ ] ;
2022-05-17 13:30:17 +00:00
this . lexer . inline ( row [ k ] . text , row [ k ] . tokens ) ;
2021-11-12 13:38:04 -08:00
}
}
return item ;
2021-11-02 07:32:17 -07:00
}
2021-11-12 13:38:04 -08:00
}
} ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
_proto . lheading = function lheading ( src ) {
var cap = this . rules . block . lheading . exec ( src ) ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( cap ) {
var token = {
type : 'heading' ,
raw : cap [ 0 ] ,
depth : cap [ 2 ] . charAt ( 0 ) === '=' ? 1 : 2 ,
text : cap [ 1 ] ,
tokens : [ ]
} ;
this . lexer . inline ( token . text , token . tokens ) ;
return token ;
}
} ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
_proto . paragraph = function paragraph ( src ) {
var cap = this . rules . block . paragraph . exec ( src ) ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( cap ) {
var token = {
type : 'paragraph' ,
raw : cap [ 0 ] ,
text : cap [ 1 ] . charAt ( cap [ 1 ] . length - 1 ) === '\n' ? cap [ 1 ] . slice ( 0 , - 1 ) : cap [ 1 ] ,
tokens : [ ]
} ;
this . lexer . inline ( token . text , token . tokens ) ;
return token ;
}
} ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
_proto . text = function text ( src ) {
var cap = this . rules . block . text . exec ( src ) ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( cap ) {
var token = {
type : 'text' ,
raw : cap [ 0 ] ,
text : cap [ 0 ] ,
tokens : [ ]
} ;
this . lexer . inline ( token . text , token . tokens ) ;
return token ;
}
} ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
_proto . escape = function escape$1 ( src ) {
var cap = this . rules . inline . escape . exec ( src ) ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( cap ) {
return {
type : 'escape' ,
raw : cap [ 0 ] ,
text : escape ( cap [ 1 ] )
} ;
}
} ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
_proto . tag = function tag ( src ) {
var cap = this . rules . inline . tag . exec ( src ) ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( cap ) {
if ( ! this . lexer . state . inLink && /^<a /i . test ( cap [ 0 ] ) ) {
this . lexer . state . inLink = true ;
} else if ( this . lexer . state . inLink && /^<\/a>/i . test ( cap [ 0 ] ) ) {
this . lexer . state . inLink = false ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( ! this . lexer . state . inRawBlock && /^<(pre|code|kbd|script)(\s|>)/i . test ( cap [ 0 ] ) ) {
this . lexer . state . inRawBlock = true ;
} else if ( this . lexer . state . inRawBlock && /^<\/(pre|code|kbd|script)(\s|>)/i . test ( cap [ 0 ] ) ) {
this . lexer . state . inRawBlock = false ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
return {
type : this . options . sanitize ? 'text' : 'html' ,
raw : cap [ 0 ] ,
inLink : this . lexer . state . inLink ,
inRawBlock : this . lexer . state . inRawBlock ,
text : this . options . sanitize ? this . options . sanitizer ? this . options . sanitizer ( cap [ 0 ] ) : escape ( cap [ 0 ] ) : cap [ 0 ]
} ;
}
} ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
_proto . link = function link ( src ) {
var cap = this . rules . inline . link . exec ( src ) ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( cap ) {
var trimmedUrl = cap [ 2 ] . trim ( ) ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( ! this . options . pedantic && /^</ . test ( trimmedUrl ) ) {
// commonmark requires matching angle brackets
if ( ! />$/ . test ( trimmedUrl ) ) {
return ;
} // ending angle bracket cannot be escaped
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
var rtrimSlash = rtrim ( trimmedUrl . slice ( 0 , - 1 ) , '\\' ) ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( ( trimmedUrl . length - rtrimSlash . length ) % 2 === 0 ) {
return ;
}
} else {
// find closing parenthesis
var lastParenIndex = findClosingBracket ( 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 ] = '' ;
}
2021-11-02 07:32:17 -07:00
}
2021-11-12 13:38:04 -08:00
var href = cap [ 2 ] ;
var title = '' ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( this . options . pedantic ) {
// split pedantic href and title
var link = /^([^'"]*[^\s])\s+(['"])(.*)\2/ . exec ( href ) ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( link ) {
href = link [ 1 ] ;
title = link [ 3 ] ;
2021-11-02 07:32:17 -07:00
}
2021-11-12 13:38:04 -08:00
} else {
title = cap [ 3 ] ? cap [ 3 ] . slice ( 1 , - 1 ) : '' ;
2021-11-02 07:32:17 -07:00
}
2021-11-12 13:38:04 -08:00
href = href . trim ( ) ;
if ( /^</ . test ( href ) ) {
if ( this . options . pedantic && ! />$/ . test ( trimmedUrl ) ) {
// pedantic allows starting angle bracket without ending angle bracket
href = href . slice ( 1 ) ;
} else {
href = href . slice ( 1 , - 1 ) ;
}
2021-11-02 07:32:17 -07:00
}
2021-11-12 13:38:04 -08:00
return outputLink ( cap , {
href : href ? href . replace ( this . rules . inline . _escapes , '$1' ) : href ,
title : title ? title . replace ( this . rules . inline . _escapes , '$1' ) : title
} , cap [ 0 ] , this . lexer ) ;
}
} ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
_proto . reflink = function reflink ( src , links ) {
var cap ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( ( cap = this . rules . inline . reflink . exec ( src ) ) || ( cap = this . rules . inline . nolink . exec ( src ) ) ) {
var link = ( cap [ 2 ] || cap [ 1 ] ) . replace ( /\s+/g , ' ' ) ;
link = links [ link . toLowerCase ( ) ] ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( ! link || ! link . href ) {
var text = cap [ 0 ] . charAt ( 0 ) ;
return {
type : 'text' ,
raw : text ,
text : text
} ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
return outputLink ( cap , link , cap [ 0 ] , this . lexer ) ;
}
} ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
_proto . emStrong = function emStrong ( src , maskedSrc , prevChar ) {
if ( prevChar === void 0 ) {
prevChar = '' ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
var match = this . rules . inline . emStrong . lDelim . exec ( src ) ;
if ( ! match ) return ; // _ can't be between two alphanumerics. \p{L}\p{N} includes non-english alphabet/numbers as well
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( match [ 3 ] && prevChar . match ( / ( ? : [ 0 - 9 A - Z a - z \ x A A \ x B 2 \ x B 3 \ x B 5 \ x B 9 \ x B A \ x B C - \ x B E \ x C 0 - \ x D 6 \ x D 8 - \ x F 6 \ x F 8 - \ u 0 2 C 1 \ u 0 2 C 6 - \ u 0 2 D 1 \ u 0 2 E 0 - \ u 0 2 E 4 \ u 0 2 E C \ u 0 2 E E \ u 0 3 7 0 - \ u 0 3 7 4 \ u 0 3 7 6 \ u 0 3 7 7 \ u 0 3 7 A - \ u 0 3 7 D \ u 0 3 7 F \ u 0 3 8 6 \ u 0 3 8 8 - \ u 0 3 8 A \ u 0 3 8 C \ u 0 3 8 E - \ u 0 3 A 1 \ u 0 3 A 3 - \ u 0 3 F 5 \ u 0 3 F 7 - \ u 0 4 8 1 \ u 0 4 8 A - \ u 0 5 2 F \ u 0 5 3 1 - \ u 0 5 5 6 \ u 0 5 5 9 \ u 0 5 6 0 - \ u 0 5 8 8 \ u 0 5 D 0 - \ u 0 5 E A \ u 0 5 E F - \ u 0 5 F 2 \ u 0 6 2 0 - \ u 0 6 4 A \ u 0 6 6 0 - \ u 0 6 6 9 \ u 0 6 6 E \ u 0 6 6 F \ u 0 6 7 1 - \ u 0 6 D 3 \ u 0 6 D 5 \ u 0 6 E 5 \ u 0 6 E 6 \ u 0 6 E E - \ u 0 6 F C \ u 0 6 F F \ u 0 7 1 0 \ u 0 7 1 2 - \ u 0 7 2 F \ u 0 7 4 D - \ u 0 7 A 5 \ u 0 7 B 1 \ u 0 7 C 0 - \ u 0 7 E A \ u 0 7 F 4 \ u 0 7 F 5 \ u 0 7 F A \ u 0 8 0 0 - \ u 0 8 1 5 \ u 0 8 1 A \ u 0 8 2 4 \ u 0 8 2 8 \ u 0 8 4 0 - \ u 0 8 5 8 \ u 0 8 6 0 - \ u 0 8 6 A \ u 0 8 7 0 - \ u 0 8 8 7 \ u 0 8 8 9 - \ u 0 8 8 E \ u 0 8 A 0 - \ u 0 8 C 9 \ u 0 9 0 4 - \ u 0 9 3 9 \ u 0 9 3 D \ u 0 9 5 0 \ u 0 9 5 8 - \ u 0 9 6 1 \ u 0 9 6 6 - \ u 0 9 6 F \ u 0 9 7 1 - \ u 0 9 8 0 \ u 0 9 8 5 - \ u 0 9 8 C \ u 0 9 8 F \ u 0 9 9 0 \ u 0 9 9 3 - \ u 0 9 A 8 \ u 0 9 A A - \ u 0 9 B 0 \ u 0 9 B 2 \ u 0 9 B 6 - \ u 0 9 B 9 \ u 0 9 B D \ u 0 9 C E \ u 0 9 D C \ u 0 9 D D \ u 0 9 D F - \ u 0 9 E 1 \ u 0 9 E 6 - \ u 0 9 F 1 \ u 0 9 F 4 - \ u 0 9 F 9 \ u 0 9 F C \ u 0 A 0 5 - \ u 0 A 0 A \ u 0 A 0 F \ u 0 A 1 0 \ u 0 A 1 3 - \ u 0 A 2 8 \ u 0 A 2 A - \ u 0 A 3 0 \ u 0 A 3 2 \ u 0 A 3 3 \ u 0 A 3 5 \ u 0 A 3 6 \ u 0 A 3 8 \ u 0 A 3 9 \ u 0 A 5 9 - \ u 0 A 5 C \ u 0 A 5 E \ u 0 A 6 6 - \ u 0 A 6 F \ u 0 A 7 2 - \ u 0 A 7 4 \ u 0 A 8 5 - \ u 0 A 8 D \ u 0 A 8 F - \ u 0 A 9 1 \ u 0 A 9 3 - \ u 0 A A 8 \ u 0 A A A - \ u 0 A B 0 \ u 0 A B 2 \ u 0 A B 3 \ u 0 A B 5 - \ u 0 A B 9 \ u 0 A B D \ u 0 A D 0 \ u 0 A E 0 \ u 0 A E 1 \ u 0 A E 6 - \ u 0 A E F \ u 0 A F 9 \ u 0 B 0 5 - \ u 0 B 0 C \ u 0 B 0 F \ u 0 B 1 0 \ u 0 B 1 3 - \ u 0 B 2 8 \ u 0 B 2 A - \ u 0 B 3 0 \ u 0 B 3 2 \ u 0 B 3 3 \ u 0 B 3 5 - \ u 0 B 3 9 \ u 0 B 3 D \ u 0 B 5 C \ u 0 B 5 D \ u 0 B 5 F - \ u 0 B 6 1 \ u 0 B 6 6 - \ u 0 B 6 F \ u 0 B 7 1 - \ u 0 B 7 7 \ u 0 B 8 3 \ u 0 B 8 5 - \ u 0 B 8 A \ u 0 B 8 E - \ u 0 B 9 0 \ u 0 B 9 2 - \ u 0 B 9 5 \ u 0 B 9 9 \ u 0 B 9 A \ u 0 B 9 C \ u 0 B 9 E \ u 0 B 9 F \ u 0 B A 3 \ u 0 B A 4 \ u 0 B A 8 - \ u 0 B A A \ u 0 B A E - \ u 0 B B 9 \ u 0 B D 0 \ u 0 B E 6 - \ u 0 B F 2 \ u 0 C 0 5 - \ u 0 C 0 C \ u 0 C 0 E - \ u 0 C 1 0 \ u 0 C 1 2 - \ u 0 C 2 8 \ u 0 C 2 A - \ u 0 C 3 9 \ u 0 C 3 D \ u 0 C 5 8 - \ u 0 C 5 A \ u 0 C 5 D \ u 0 C 6 0 \ u 0 C 6 1 \ u 0 C 6 6 - \ u 0 C 6 F \ u 0 C 7 8 - \ u 0 C 7 E \ u 0 C 8 0 \ u 0 C 8 5 - \ u 0 C 8 C \ u 0 C 8 E - \ u 0 C 9 0 \ u 0 C 9 2 - \ u 0 C A 8 \ u 0 C A A - \ u 0 C B 3 \ u 0 C B 5 - \ u 0 C B 9 \ u 0 C B D \ u 0 C D D \ u 0 C D E \ u 0 C E 0 \ u 0 C E 1 \ u 0 C E 6 - \ u 0 C E F \ u 0 C F 1 \ u 0 C F 2 \ u 0 D 0 4 - \ u 0 D 0 C \ u 0 D 0 E - \ u 0 D 1 0 \ u 0 D 1 2 - \ u 0 D 3 A \ u 0 D 3 D \ u 0 D 4 E \ u 0 D 5 4 - \ u 0 D 5 6 \ u 0 D 5 8 - \ u 0 D 6 1 \ u 0 D 6 6 - \ u 0 D 7 8 \ u 0 D 7 A - \ u 0 D 7 F \ u 0 D 8 5 - \ u 0 D 9 6 \ u 0 D 9 A - \ u 0 D B 1 \ u 0 D B 3 - \ u 0 D B B \ u 0 D B D \ u 0 D C 0 - \ u 0 D C 6 \ u 0 D E 6 - \ u 0 D E F \ u 0 E 0 1 - \ u 0 E 3 0 \ u 0 E 3 2 \ u 0 E 3 3 \ u 0 E 4 0 - \ u 0 E 4 6 \ u 0 E 5 0 - \ u 0 E 5 9 \ u 0 E 8 1 \ u 0 E 8 2 \ u 0 E 8 4 \ u 0 E 8 6 - \ u 0 E 8 A \ u 0 E 8 C - \ u 0 E A 3 \ u 0 E A 5 \ u 0 E A 7 - \ u 0 E B 0 \ u 0 E B 2 \ u 0 E B 3 \ u 0 E B D \ u 0 E C 0 - \ u 0 E C 4 \ u 0 E C 6 \ u 0 E D 0 - \ u 0 E D 9 \ u 0 E D C - \ u 0 E D F \ u 0 F 0 0 \ u 0 F 2 0 - \ u 0 F 3 3 \ u 0 F 4 0 - \ u 0 F 4 7 \ u 0 F 4 9 - \ u 0 F 6 C \ u 0 F 8 8 - \ u 0 F 8 C \ u 1 0 0 0 - \ u 1 0 2 A \ u 1 0 3 F - \ u 1 0 4 9 \ u 1 0 5 0 - \ u 1 0 5 5 \ u 1 0 5 A - \ u 1 0 5 D \ u 1 0 6 1 \ u 1 0 6 5 \ u 1 0 6 6 \ u 1 0 6 E - \ u 1 0 7 0 \ u 1 0 7 5 - \ u 1 0 8 1 \ u 1 0 8 E \ u 1 0 9 0 - \ u 1 0 9 9 \ u 1 0 A 0 - \ u 1 0 C 5 \ u 1 0 C 7 \ u 1 0 C D \ u 1 0 D 0 - \ u 1 0 F A \ u 1 0 F C - \ u 1 2 4 8 \ u 1 2 4 A - \ u 1 2 4 D \ u 1 2 5 0 - \ u 1 2 5 6 \ u 1 2 5 8 \ u 1 2 5 A - \ u 1 2 5 D \ u 1 2 6 0 - \ u 1 2 8 8 \ u 1 2 8 A - \ u 1 2 8 D \ u 1 2 9 0 - \ u 1 2 B 0 \ u 1 2 B 2 - \ u 1 2 B 5 \ u 1 2 B 8 - \ u 1 2 B E \ u 1 2 C 0 \ u 1 2 C 2 - \ u 1 2 C 5 \ u 1 2 C 8 - \ u 1 2 D 6 \ u 1 2 D 8 - \ u 1 3 1 0 \ u 1 3 1 2 - \ u 1 3 1 5 \ u 1 3 1 8 - \ u 1 3 5 A \ u 1 3 6 9 - \ u 1 3 7 C \ u 1 3 8 0 - \ u 1 3 8 F \ u 1 3 A 0 - \ u 1 3 F 5 \ u 1 3 F 8 - \ u 1 3 F D \ u 1 4 0 1 - \ u 1 6 6 C \ u 1 6 6 F - \ u 1 6 7 F \ u 1 6 8 1 - \ u 1 6 9 A \ u 1 6 A 0 - \ u 1 6 E A \ u 1 6 E E - \ u 1 6 F 8 \ u 1 7 0 0 - \ u 1 7 1 1 \ u 1 7 1 F - \ u 1 7 3 1 \ u 1 7 4 0 - \ u 1 7 5 1 \ u 1 7 6 0 - \ u 1 7 6 C \ u 1 7 6 E - \ u 1 7 7 0 \ u 1 7 8 0 - \ u 1 7 B 3 \ u 1 7 D 7 \ u 1 7 D C \ u 1 7 E 0 - \ u 1 7 E 9 \ u 1 7 F 0 - \ u 1 7 F 9 \ u 1 8 1 0 - \ u 1 8 1 9 \ u 1 8 2 0 - \ u 1 8 7 8 \ u 1 8 8 0 - \ u 1 8 8 4 \ u 1 8 8 7 - \ u 1 8 A 8 \ u 1 8 A A \ u 1 8 B 0 - \ u 1 8 F 5 \ u 1 9 0 0 - \ u 1 9 1 E \ u 1 9 4 6 - \ u 1 9 6 D \ u 1 9 7 0 - \ u 1 9 7 4 \ u 1 9 8 0 - \ u 1 9 A B \ u 1 9 B 0 - \ u 1 9 C 9 \ u 1 9 D 0 - \ u 1 9 D A \ u 1 A 0 0 - \ u 1 A 1 6 \ u 1 A 2 0 - \ u 1 A 5 4 \ u 1 A 8 0 - \ u 1 A 8 9 \ u 1 A 9 0 - \ u 1 A 9 9 \ u 1 A A 7 \ u 1 B 0 5 - \ u 1 B 3 3 \ u 1 B 4 5 - \ u 1 B 4 C \ u 1 B 5 0 - \ u 1 B 5 9 \ u 1 B 8 3 - \ u 1 B A 0 \ u 1 B A E - \ u 1 B E 5 \ u 1 C 0 0 - \ u 1 C 2 3 \ u 1 C 4 0 - \ u 1 C 4 9 \ u 1 C 4 D - \ u 1 C 7 D \ u 1 C 8 0 - \ u 1 C 8 8 \ u 1 C 9 0 - \ u 1 C B A \ u 1 C B D - \ u 1 C B F \ u 1 C E 9 - \ u 1 C E C \ u 1 C E E - \ u 1 C F 3 \ u 1 C F 5 \ u 1 C F 6 \ u 1 C F A \ u 1 D 0 0 - \ u 1 D B F \ u 1 E 0 0 - \ u 1 F 1 5 \ u 1 F 1 8 - \ u 1 F 1 D \ u 1 F 2 0 - \ u 1 F 4 5 \ u 1 F 4 8 - \ u 1 F 4 D \ u 1 F 5 0 - \ u 1 F 5 7 \ u 1 F 5 9 \ u 1 F 5 B \ u 1 F 5 D \ u 1 F 5 F - \ u 1 F 7 D \ u 1 F 8 0 - \ u 1 F B 4 \ u 1 F B 6 - \ u 1 F B C \ u 1 F B E \ u 1 F C 2 - \ u 1 F C 4 \ u 1 F C 6 - \ u 1 F C C \ u 1 F D 0 - \ u 1 F D 3 \ u 1 F D 6 - \ u 1 F D B \ u 1 F E 0 - \ u 1 F E C \ u 1 F F 2 - \ u 1 F F 4 \ u 1 F F 6 - \ u 1 F F C \ u 2 0 7 0 \ u 2 0 7 1 \ u 2 0 7 4 - \ u 2 0 7 9 \ u 2 0 7 F - \ u 2 0 8 9 \ u 2 0 9 0 - \ u 2 0 9 C \ u 2 1 0 2 \ u 2 1 0 7 \ u 2 1 0 A - \ u 2 1 1 3 \ u 2 1 1 5 \ u 2 1 1 9 - \ u 2 1 1 D \ u 2 1 2 4 \ u 2 1 2 6 \ u 2 1 2 8 \ u 2 1 2 A - \ u 2 1 2 D \ u 2 1 2 F - \ u 2 1 3 9 \ u 2 1 3 C - \ u 2 1 3 F \ u 2 1 4 5 - \ u 2 1 4 9 \ u 2 1 4 E \ u 2 1 5 0 - \ u 2 1 8 9 \ u 2 4 6 0 - \ u 2 4 9 B \ u 2 4 E A - \ u 2 4 F F \ u 2 7 7 6 - \ u 2 7 9 3 \ u 2 C 0 0 - \ u 2 C E 4 \ u 2 C E B - \ u 2 C E E \ u 2 C F 2 \ u 2 C F 3 \ u 2 C F D \ u 2 D 0 0 - \ u 2 D 2 5 \ u 2 D 2 7 \ u 2 D 2 D \ u 2 D 3 0 - \ u 2 D 6 7 \ u 2 D 6 F \ u 2 D 8 0 - \ u 2 D 9 6 \ u 2 D A 0 - \ u 2 D A 6 \ u 2 D A 8 - \ u 2 D A E \ u 2 D B 0 - \ u 2 D B 6 \ u 2 D B 8 - \ u 2 D B E \ u 2 D C 0 - \ u 2 D C 6 \ u 2 D C 8 - \ u 2 D C E \ u 2 D D 0 - \ u 2 D D 6 \ u 2 D D 8 - \ u 2 D D E \ u 2 E 2 F \ u 3 0 0 5 - \ u 3 0 0 7 \ u 3 0 2 1 - \ u 3 0 2 9 \ u 3 0 3 1 - \ u 3 0 3 5 \ u 3 0 3 8 - \ u 3 0 3 C \ u 3 0 4 1 - \ u 3 0 9 6 \ u 3 0 9 D - \ u 3 0 9 F \ u 3 0 A 1 - \ u 3 0 F A \ u 3 0 F C - \ u 3 0 F F \ u 3 1 0 5 - \ u 3 1 2 F \ u 3 1 3 1 - \ u 3 1 8 E \ u 3 1 9 2 - \ u 3 1 9 5 \ u 3 1 A 0 - \ u 3 1 B F \ u 3 1 F 0 - \ u 3 1 F F \ u 3 2 2 0 - \ u 3 2 2 9 \ u 3 2 4 8 - \ u 3 2 4 F \ u 3 2 5 1 - \ u 3 2 5 F \ u 3 2 8 0 - \ u 3 2 8 9 \ u 3 2 B 1 - \ u 3 2 B F \ u 3 4 0 0 - \ u 4 D B F \ u 4 E 0 0 - \ u A 4 8 C \ u A 4 D 0 - \ u A 4 F D \ u A 5 0 0 - \ u A 6 0 C \ u A 6 1 0 - \ u A 6 2 B \ u A 6 4 0 - \ u A 6 6 E \ u A 6 7 F - \ u A 6 9 D \ u A 6 A 0 - \ u A 6 E F \ u A 7 1 7 - \ u A 7 1 F \ u A 7 2 2 - \ u A 7 8 8 \ u A 7 8 B - \ u A 7 C A \ u A 7 D 0 \ u A 7 D 1 \ u A 7 D 3 \ u A 7 D 5 - \ u A 7 D 9 \ u A 7 F 2 - \ u A 8 0 1 \ u A 8 0 3 - \ u A 8 0 5 \ u A 8 0 7 - \ u A 8 0 A \ u A 8 0 C - \ u A 8 2 2 \ u A 8 3 0 - \ u A 8 3 5 \ u A 8 4 0 - \ u A 8 7 3 \ u A 8 8 2 - \ u A 8 B 3 \ u A 8 D
var nextChar = match [ 1 ] || match [ 2 ] || '' ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( ! nextChar || nextChar && ( prevChar === '' || this . rules . inline . punctuation . exec ( prevChar ) ) ) {
var lLength = match [ 0 ] . length - 1 ;
var rDelim ,
rLength ,
delimTotal = lLength ,
midDelimTotal = 0 ;
var endReg = match [ 0 ] [ 0 ] === '*' ? this . rules . inline . emStrong . rDelimAst : this . rules . inline . emStrong . rDelimUnd ;
endReg . lastIndex = 0 ; // Clip maskedSrc to same section of string as src (move to lexer?)
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
maskedSrc = maskedSrc . slice ( - 1 * src . length + lLength ) ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
while ( ( match = endReg . exec ( maskedSrc ) ) != null ) {
rDelim = match [ 1 ] || match [ 2 ] || match [ 3 ] || match [ 4 ] || match [ 5 ] || match [ 6 ] ;
if ( ! rDelim ) continue ; // skip single * in __abc*abc__
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
rLength = rDelim . length ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( match [ 3 ] || match [ 4 ] ) {
// found another Left Delim
delimTotal += rLength ;
continue ;
} else if ( match [ 5 ] || match [ 6 ] ) {
// either Left or Right Delim
if ( lLength % 3 && ! ( ( lLength + rLength ) % 3 ) ) {
midDelimTotal += rLength ;
continue ; // CommonMark Emphasis Rules 9-10
}
2021-11-02 07:32:17 -07:00
}
2021-11-12 13:38:04 -08:00
delimTotal -= rLength ;
if ( delimTotal > 0 ) continue ; // Haven't found enough closing delimiters
// Remove extra characters. *a*** -> *a*
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
rLength = Math . min ( rLength , rLength + delimTotal + midDelimTotal ) ; // Create `em` if smallest delimiter has odd char count. *a***
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( Math . min ( lLength , rLength ) % 2 ) {
var _text = src . slice ( 1 , lLength + match . index + rLength ) ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
return {
type : 'em' ,
raw : src . slice ( 0 , lLength + match . index + rLength + 1 ) ,
text : _text ,
tokens : this . lexer . inlineTokens ( _text , [ ] )
} ;
} // Create 'strong' if smallest delimiter has even char count. **a***
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
var text = src . slice ( 2 , lLength + match . index + rLength - 1 ) ;
2021-11-02 07:32:17 -07:00
return {
2021-11-12 13:38:04 -08:00
type : 'strong' ,
raw : src . slice ( 0 , lLength + match . index + rLength + 1 ) ,
text : text ,
tokens : this . lexer . inlineTokens ( text , [ ] )
2021-11-02 07:32:17 -07:00
} ;
}
2021-11-12 13:38:04 -08:00
}
} ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
_proto . codespan = function codespan ( src ) {
var cap = this . rules . inline . code . exec ( src ) ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( cap ) {
var text = cap [ 2 ] . replace ( /\n/g , ' ' ) ;
var hasNonSpaceChars = /[^ ]/ . test ( text ) ;
var hasSpaceCharsOnBothEnds = /^ / . test ( text ) && / $/ . test ( text ) ;
if ( hasNonSpaceChars && hasSpaceCharsOnBothEnds ) {
text = text . substring ( 1 , text . length - 1 ) ;
2021-11-02 07:32:17 -07:00
}
2021-11-12 13:38:04 -08:00
text = escape ( text , true ) ;
return {
type : 'codespan' ,
raw : cap [ 0 ] ,
text : text
} ;
}
} ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
_proto . br = function br ( src ) {
var cap = this . rules . inline . br . exec ( src ) ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( cap ) {
return {
type : 'br' ,
raw : cap [ 0 ]
} ;
}
} ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
_proto . del = function del ( src ) {
var cap = this . rules . inline . del . exec ( src ) ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( cap ) {
return {
type : 'del' ,
raw : cap [ 0 ] ,
text : cap [ 2 ] ,
tokens : this . lexer . inlineTokens ( cap [ 2 ] , [ ] )
} ;
}
} ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
_proto . autolink = function autolink ( src , mangle ) {
var cap = this . rules . inline . autolink . exec ( src ) ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( cap ) {
var text , href ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( cap [ 2 ] === '@' ) {
text = escape ( this . options . mangle ? mangle ( cap [ 1 ] ) : cap [ 1 ] ) ;
href = 'mailto:' + text ;
} else {
text = escape ( cap [ 1 ] ) ;
href = text ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
return {
type : 'link' ,
raw : cap [ 0 ] ,
text : text ,
href : href ,
tokens : [ {
type : 'text' ,
raw : text ,
text : text
} ]
} ;
}
} ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
_proto . url = function url ( src , mangle ) {
var cap ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( cap = this . rules . inline . url . exec ( src ) ) {
var text , href ;
if ( cap [ 2 ] === '@' ) {
text = escape ( this . options . mangle ? mangle ( cap [ 0 ] ) : cap [ 0 ] ) ;
href = 'mailto:' + text ;
} else {
// do extended autolink path validation
var prevCapZero ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
do {
prevCapZero = cap [ 0 ] ;
cap [ 0 ] = this . rules . inline . _backpedal . exec ( cap [ 0 ] ) [ 0 ] ;
} while ( prevCapZero !== cap [ 0 ] ) ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
text = escape ( cap [ 0 ] ) ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( cap [ 1 ] === 'www.' ) {
href = 'http://' + text ;
2021-11-02 07:32:17 -07:00
} else {
2021-11-12 13:38:04 -08:00
href = text ;
2021-11-02 07:32:17 -07:00
}
2021-11-12 13:38:04 -08:00
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
return {
type : 'link' ,
raw : cap [ 0 ] ,
text : text ,
href : href ,
tokens : [ {
2021-11-02 07:32:17 -07:00
type : 'text' ,
2021-11-12 13:38:04 -08:00
raw : text ,
2021-11-02 07:32:17 -07:00
text : text
2021-11-12 13:38:04 -08:00
} ]
} ;
}
} ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
_proto . inlineText = function inlineText ( src , smartypants ) {
var cap = this . rules . inline . text . exec ( src ) ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( cap ) {
var text ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( this . lexer . state . inRawBlock ) {
text = this . options . sanitize ? this . options . sanitizer ? this . options . sanitizer ( cap [ 0 ] ) : escape ( cap [ 0 ] ) : cap [ 0 ] ;
} else {
text = escape ( this . options . smartypants ? smartypants ( cap [ 0 ] ) : cap [ 0 ] ) ;
}
return {
type : 'text' ,
raw : cap [ 0 ] ,
text : text
} ;
}
2021-11-02 07:32:17 -07:00
} ;
2021-11-12 13:38:04 -08:00
return Tokenizer ;
} ( ) ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
/ * *
* Block - Level Grammar
* /
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
var block = {
newline : /^(?: *(?:\n|$))+/ ,
code : /^( {4}[^\n]+(?:\n(?: *(?:\n|$))*)?)+/ ,
fences : /^ {0,3}(`{3,}(?=[^`\n]*\n)|~{3,})([^\n]*)\n(?:|([\s\S]*?)\n)(?: {0,3}\1[~`]* *(?=\n|$)|$)/ ,
2022-04-11 00:38:29 +00:00
hr : /^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/ ,
2021-11-12 13:38:04 -08:00
heading : /^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/ ,
blockquote : /^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/ ,
2022-04-11 00:38:29 +00:00
list : /^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/ ,
2021-11-12 13:38:04 -08:00
html : '^ {0,3}(?:' // optional indentation
+ '<(script|pre|style|textarea)[\\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 *)+\\n|$)' // (6)
+ '|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$)' // (7) open tag
+ '|</(?!script|pre|style|textarea)[a-z][\\w-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$)' // (7) closing tag
+ ')' ,
2022-01-13 02:03:16 +00:00
def : /^ {0,3}\[(label)\]: *(?:\n *)?<?([^\s>]+)>?(?:(?: +(?:\n *)?| *\n *)(title))? *(?:\n+|$)/ ,
2021-11-12 13:38:04 -08:00
table : noopTest ,
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:
2021-11-25 00:12:00 +00:00
_paragraph : /^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/ ,
2021-11-12 13:38:04 -08:00
text : /^[^\n]+/
} ;
2022-01-13 02:03:16 +00:00
block . _label = /(?!\s*\])(?:\\.|[^\[\]\\])+/ ;
2021-11-12 13:38:04 -08:00
block . _title = /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/ ;
block . def = edit ( block . def ) . replace ( 'label' , block . _label ) . replace ( 'title' , block . _title ) . getRegex ( ) ;
block . bullet = /(?:[*+-]|\d{1,9}[.)])/ ;
block . listItemStart = edit ( /^( *)(bull) */ ) . replace ( 'bull' , block . bullet ) . getRegex ( ) ;
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 ( ) ;
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 ( block . html , 'i' ) . replace ( 'comment' , block . _comment ) . replace ( 'tag' , block . _tag ) . replace ( 'attribute' , / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/ ) . getRegex ( ) ;
block . paragraph = edit ( block . _paragraph ) . replace ( 'hr' , block . hr ) . replace ( 'heading' , ' {0,3}#{1,6} ' ) . replace ( '|lheading' , '' ) // setex headings don't interrupt commonmark paragraphs
2021-11-25 00:12:00 +00:00
. replace ( '|table' , '' ) . 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
2021-11-12 13:38:04 -08:00
. replace ( 'html' , '</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)' ) . replace ( 'tag' , block . _tag ) // pars can be interrupted by type (6) html blocks
. getRegex ( ) ;
block . blockquote = edit ( block . blockquote ) . replace ( 'paragraph' , block . paragraph ) . getRegex ( ) ;
/ * *
* Normal Block Grammar
* /
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
block . normal = merge ( { } , block ) ;
/ * *
* GFM Block Grammar
* /
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
block . gfm = merge ( { } , block . normal , {
table : '^ *([^\\n ].*\\|.*)\\n' // Header
+ ' {0,3}(?:\\| *)?(:?-+:? *(?:\\| *:?-+:? *)*)(?:\\| *)?' // Align
+ '(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)' // Cells
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
} ) ;
block . gfm . table = edit ( block . gfm . table ) . replace ( 'hr' , block . hr ) . replace ( 'heading' , ' {0,3}#{1,6} ' ) . 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|textarea|!--)' ) . replace ( 'tag' , block . _tag ) // tables can be interrupted by type (6) html blocks
. getRegex ( ) ;
2021-11-25 00:12:00 +00:00
block . gfm . paragraph = edit ( block . _paragraph ) . replace ( 'hr' , block . hr ) . replace ( 'heading' , ' {0,3}#{1,6} ' ) . replace ( '|lheading' , '' ) // setex headings don't interrupt commonmark paragraphs
. replace ( 'table' , block . gfm . table ) // interrupt paragraphs with table
. 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
. replace ( 'html' , '</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)' ) . replace ( 'tag' , block . _tag ) // pars can be interrupted by type (6) html blocks
. getRegex ( ) ;
2021-11-12 13:38:04 -08:00
/ * *
* Pedantic grammar ( original John Gruber ' s loose markdown specification )
* /
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
block . pedantic = merge ( { } , block . normal , {
html : edit ( '^ *(?: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+|$)/ ,
fences : noopTest ,
// fences not supported
paragraph : edit ( 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
* /
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
var inline = {
escape : /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/ ,
autolink : /^<(scheme:[^\s\x00-\x1f<>]*|email)>/ ,
url : noopTest ,
tag : '^comment' + '|^</[a-zA-Z][\\w:-]*\\s*>' // self-closing tag
+ '|^<[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>
+ '|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>' ,
// CDATA section
link : /^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/ ,
2022-01-13 02:03:16 +00:00
reflink : /^!?\[(label)\]\[(ref)\]/ ,
nolink : /^!?\[(ref)\](?:\[\])?/ ,
2021-11-12 13:38:04 -08:00
reflinkSearch : 'reflink|nolink(?!\\()' ,
emStrong : {
lDelim : /^(?:\*+(?:([punct_])|[^\s*]))|^_+(?:([punct*])|([^\s_]))/ ,
// (1) and (2) can only be a Right Delimiter. (3) and (4) can only be Left. (5) and (6) can be either Left or Right.
2022-04-08 01:54:20 +00:00
// () Skip orphan inside strong () Consume to delim (1) #*** (2) a***#, a*** (3) #***a, ***a (4) ***# (5) #***# (6) a***a
rDelimAst : /^[^_*]*?\_\_[^_*]*?\*[^_*]*?(?=\_\_)|[^*]+(?=[^*])|[punct_](\*+)(?=[\s]|$)|[^punct*_\s](\*+)(?=[punct_\s]|$)|[punct_\s](\*+)(?=[^punct*_\s])|[\s](\*+)(?=[punct_])|[punct_](\*+)(?=[punct_])|[^punct*_\s](\*+)(?=[^punct*_\s])/ ,
rDelimUnd : /^[^_*]*?\*\*[^_*]*?\_[^_*]*?(?=\*\*)|[^_]+(?=[^_])|[punct*](\_+)(?=[\s]|$)|[^punct*_\s](\_+)(?=[punct*\s]|$)|[punct*\s](\_+)(?=[^punct*_\s])|[\s](\_+)(?=[punct*])|[punct*](\_+)(?=[punct*])/ // ^- Not allowed for _
2021-11-12 13:38:04 -08:00
} ,
code : /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/ ,
br : /^( {2,}|\\)\n(?!\s*$)/ ,
del : noopTest ,
text : /^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*_]|\b_|$)|[^ ](?= {2,}\n)))/ ,
punctuation : /^([\spunctuation])/
} ; // list of punctuation marks from CommonMark spec
// without * and _ to handle the different emphasis markers * and _
inline . _punctuation = '!"#$%&\'()+\\-.,/:;<=>?@\\[\\]`^{|}~' ;
inline . punctuation = edit ( inline . punctuation ) . replace ( /punctuation/g , inline . _punctuation ) . getRegex ( ) ; // sequences em should skip over [title](link), `code`, <html>
inline . blockSkip = /\[[^\]]*?\]\([^\)]*?\)|`[^`]*?`|<[^>]*?>/g ;
inline . escapedEmSt = /\\\*|\\_/g ;
inline . _comment = edit ( block . _comment ) . replace ( '(?:-->|$)' , '-->' ) . getRegex ( ) ;
inline . emStrong . lDelim = edit ( inline . emStrong . lDelim ) . replace ( /punct/g , inline . _punctuation ) . getRegex ( ) ;
inline . emStrong . rDelimAst = edit ( inline . emStrong . rDelimAst , 'g' ) . replace ( /punct/g , inline . _punctuation ) . getRegex ( ) ;
inline . emStrong . rDelimUnd = edit ( inline . emStrong . rDelimUnd , 'g' ) . replace ( /punct/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 ( 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 ( inline . tag ) . replace ( 'comment' , inline . _comment ) . replace ( 'attribute' , inline . _attribute ) . getRegex ( ) ;
inline . _label = /(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/ ;
inline . _href = /<(?:\\.|[^\n<>\\])+>|[^\s\x00-\x1f]*/ ;
inline . _title = /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/ ;
inline . link = edit ( inline . link ) . replace ( 'label' , inline . _label ) . replace ( 'href' , inline . _href ) . replace ( 'title' , inline . _title ) . getRegex ( ) ;
2022-01-13 02:03:16 +00:00
inline . reflink = edit ( inline . reflink ) . replace ( 'label' , inline . _label ) . replace ( 'ref' , block . _label ) . getRegex ( ) ;
inline . nolink = edit ( inline . nolink ) . replace ( 'ref' , block . _label ) . getRegex ( ) ;
2021-11-12 13:38:04 -08:00
inline . reflinkSearch = edit ( inline . reflinkSearch , 'g' ) . replace ( 'reflink' , inline . reflink ) . replace ( 'nolink' , inline . nolink ) . getRegex ( ) ;
/ * *
* Normal Inline Grammar
* /
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
inline . normal = merge ( { } , inline ) ;
/ * *
* Pedantic Inline Grammar
* /
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
inline . pedantic = merge ( { } , inline . normal , {
strong : {
start : /^__|\*\*/ ,
middle : /^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/ ,
endAst : /\*\*(?!\*)/g ,
endUnd : /__(?!_)/g
} ,
em : {
start : /^_|\*/ ,
middle : /^()\*(?=\S)([\s\S]*?\S)\*(?!\*)|^_(?=\S)([\s\S]*?\S)_(?!_)/ ,
endAst : /\*(?!\*)/g ,
endUnd : /_(?!_)/g
} ,
link : edit ( /^!?\[(label)\]\((.*?)\)/ ) . replace ( 'label' , inline . _label ) . getRegex ( ) ,
reflink : edit ( /^!?\[(label)\]\s*\[([^\]]*)\]/ ) . replace ( 'label' , inline . _label ) . getRegex ( )
} ) ;
/ * *
* GFM Inline Grammar
* /
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
inline . gfm = merge ( { } , inline . normal , {
escape : edit ( 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~])\1(?=[^~]|$)/ ,
text : /^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\<!\[`*~_]|\b_|https?:\/\/|ftp:\/\/|www\.|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)))/
} ) ;
inline . gfm . url = edit ( inline . gfm . url , 'i' ) . replace ( 'email' , inline . gfm . _extended _email ) . getRegex ( ) ;
/ * *
* GFM + Line Breaks Inline Grammar
* /
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
inline . breaks = merge ( { } , inline . gfm , {
br : edit ( inline . br ) . replace ( '{2,}' , '*' ) . getRegex ( ) ,
text : edit ( inline . gfm . text ) . replace ( '\\b_' , '\\b_| {2,}\\n' ) . replace ( /\{2,\}/g , '*' ) . getRegex ( )
} ) ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
/ * *
* smartypants text replacement
2022-04-08 01:54:20 +00:00
* @ param { string } text
2021-11-12 13:38:04 -08:00
* /
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
function smartypants ( 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 email addresses
2022-04-08 01:54:20 +00:00
* @ param { string } text
2021-11-12 13:38:04 -08:00
* /
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
function mangle ( text ) {
var out = '' ,
i ,
ch ;
var l = text . length ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
for ( i = 0 ; i < l ; i ++ ) {
ch = text . charCodeAt ( i ) ;
if ( Math . random ( ) > 0.5 ) {
ch = 'x' + ch . toString ( 16 ) ;
2021-11-02 07:32:17 -07:00
}
2021-11-12 13:38:04 -08:00
out += '&#' + ch + ';' ;
2021-11-02 07:32:17 -07:00
}
2021-11-12 13:38:04 -08:00
return out ;
}
/ * *
* Block Lexer
* /
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
var Lexer = /*#__PURE__*/ function ( ) {
function Lexer ( options ) {
this . tokens = [ ] ;
this . tokens . links = Object . create ( null ) ;
this . options = options || exports . defaults ;
this . options . tokenizer = this . options . tokenizer || new Tokenizer ( ) ;
this . tokenizer = this . options . tokenizer ;
this . tokenizer . options = this . options ;
this . tokenizer . lexer = this ;
this . inlineQueue = [ ] ;
this . state = {
inLink : false ,
inRawBlock : false ,
top : true
} ;
var rules = {
block : block . normal ,
inline : inline . normal
} ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( this . options . pedantic ) {
rules . block = block . pedantic ;
rules . inline = inline . pedantic ;
} else if ( this . options . gfm ) {
rules . block = block . gfm ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( this . options . breaks ) {
rules . inline = inline . breaks ;
} else {
rules . inline = inline . gfm ;
}
2021-11-02 07:32:17 -07:00
}
2021-11-12 13:38:04 -08:00
this . tokenizer . rules = rules ;
}
/ * *
* Expose Rules
* /
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
/ * *
* Static Lex Method
* /
Lexer . lex = function lex ( src , options ) {
var lexer = new Lexer ( options ) ;
return lexer . lex ( src ) ;
}
/ * *
* Static Lex Inline Method
* /
;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
Lexer . lexInline = function lexInline ( src , options ) {
var lexer = new Lexer ( options ) ;
return lexer . inlineTokens ( src ) ;
}
/ * *
* Preprocessing
* /
;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
var _proto = Lexer . prototype ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
_proto . lex = function lex ( src ) {
2022-04-11 00:38:29 +00:00
src = src . replace ( /\r\n|\r/g , '\n' ) ;
2021-11-12 13:38:04 -08:00
this . blockTokens ( src , this . tokens ) ;
var next ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
while ( next = this . inlineQueue . shift ( ) ) {
this . inlineTokens ( next . src , next . tokens ) ;
2021-11-02 07:32:17 -07:00
}
2021-11-12 13:38:04 -08:00
return this . tokens ;
}
/ * *
* Lexing
* /
;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
_proto . blockTokens = function blockTokens ( src , tokens ) {
var _this = this ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( tokens === void 0 ) {
tokens = [ ] ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( this . options . pedantic ) {
2022-04-11 00:38:29 +00:00
src = src . replace ( /\t/g , ' ' ) . replace ( /^ +$/gm , '' ) ;
} else {
src = src . replace ( /^( *)(\t+)/gm , function ( _ , leading , tabs ) {
return leading + ' ' . repeat ( tabs . length ) ;
} ) ;
2021-11-12 13:38:04 -08:00
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
var token , lastToken , cutSrc , lastParagraphClipped ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
while ( src ) {
if ( this . options . extensions && this . options . extensions . block && this . options . extensions . block . some ( function ( extTokenizer ) {
if ( token = extTokenizer . call ( {
lexer : _this
} , src , tokens ) ) {
2021-11-02 07:32:17 -07:00
src = src . substring ( token . raw . length ) ;
2021-11-12 13:38:04 -08:00
tokens . push ( token ) ;
return true ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
return false ;
} ) ) {
continue ;
} // newline
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( token = this . tokenizer . space ( src ) ) {
src = src . substring ( token . raw . length ) ;
2021-11-02 07:32:17 -07:00
2022-01-06 15:33:25 +00:00
if ( token . raw . length === 1 && tokens . length > 0 ) {
// if there's a single \n as a spacer, it's terminating the last line,
// so move it there so that we don't get unecessary paragraph tags
tokens [ tokens . length - 1 ] . raw += '\n' ;
} else {
2021-11-12 13:38:04 -08:00
tokens . push ( token ) ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
continue ;
} // code
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( token = this . tokenizer . code ( src ) ) {
src = src . substring ( token . raw . length ) ;
lastToken = tokens [ tokens . length - 1 ] ; // An indented code block cannot interrupt a paragraph.
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( lastToken && ( lastToken . type === 'paragraph' || lastToken . type === 'text' ) ) {
lastToken . raw += '\n' + token . raw ;
lastToken . text += '\n' + token . text ;
this . inlineQueue [ this . inlineQueue . length - 1 ] . src = lastToken . text ;
} else {
2021-11-02 07:32:17 -07:00
tokens . push ( token ) ;
2021-11-12 13:38:04 -08:00
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
continue ;
} // fences
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( token = this . tokenizer . fences ( src ) ) {
src = src . substring ( token . raw . length ) ;
tokens . push ( token ) ;
continue ;
} // heading
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( token = this . tokenizer . heading ( src ) ) {
src = src . substring ( token . raw . length ) ;
tokens . push ( token ) ;
continue ;
} // hr
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( token = this . tokenizer . hr ( src ) ) {
src = src . substring ( token . raw . length ) ;
tokens . push ( token ) ;
continue ;
} // blockquote
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( token = this . tokenizer . blockquote ( src ) ) {
src = src . substring ( token . raw . length ) ;
tokens . push ( token ) ;
continue ;
} // list
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( token = this . tokenizer . list ( src ) ) {
src = src . substring ( token . raw . length ) ;
tokens . push ( token ) ;
continue ;
} // html
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( token = this . tokenizer . html ( src ) ) {
src = src . substring ( token . raw . length ) ;
tokens . push ( token ) ;
continue ;
} // def
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( token = this . tokenizer . def ( src ) ) {
src = src . substring ( token . raw . length ) ;
lastToken = tokens [ tokens . length - 1 ] ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( lastToken && ( lastToken . type === 'paragraph' || lastToken . type === 'text' ) ) {
lastToken . raw += '\n' + token . raw ;
lastToken . text += '\n' + token . raw ;
this . inlineQueue [ this . inlineQueue . length - 1 ] . src = lastToken . text ;
} else if ( ! this . tokens . links [ token . tag ] ) {
this . tokens . links [ token . tag ] = {
href : token . href ,
title : token . title
} ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
continue ;
} // table (gfm)
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( token = this . tokenizer . table ( src ) ) {
src = src . substring ( token . raw . length ) ;
tokens . push ( token ) ;
continue ;
} // lheading
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( token = this . tokenizer . lheading ( src ) ) {
src = src . substring ( token . raw . length ) ;
tokens . push ( token ) ;
continue ;
} // top-level paragraph
// prevent paragraph consuming extensions by clipping 'src' to extension start
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
cutSrc = src ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( this . options . extensions && this . options . extensions . startBlock ) {
( function ( ) {
var startIndex = Infinity ;
var tempSrc = src . slice ( 1 ) ;
var tempStart = void 0 ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
_this . options . extensions . startBlock . forEach ( function ( getStartIndex ) {
tempStart = getStartIndex . call ( {
lexer : this
} , tempSrc ) ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( typeof tempStart === 'number' && tempStart >= 0 ) {
startIndex = Math . min ( startIndex , tempStart ) ;
}
} ) ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( startIndex < Infinity && startIndex >= 0 ) {
cutSrc = src . substring ( 0 , startIndex + 1 ) ;
2021-11-02 07:32:17 -07:00
}
2021-11-12 13:38:04 -08:00
} ) ( ) ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( this . state . top && ( token = this . tokenizer . paragraph ( cutSrc ) ) ) {
lastToken = tokens [ tokens . length - 1 ] ;
if ( lastParagraphClipped && lastToken . type === 'paragraph' ) {
lastToken . raw += '\n' + token . raw ;
lastToken . text += '\n' + token . text ;
this . inlineQueue . pop ( ) ;
this . inlineQueue [ this . inlineQueue . length - 1 ] . src = lastToken . text ;
} else {
tokens . push ( token ) ;
2021-11-02 07:32:17 -07:00
}
2021-11-12 13:38:04 -08:00
lastParagraphClipped = cutSrc . length !== src . length ;
src = src . substring ( token . raw . length ) ;
continue ;
} // text
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( token = this . tokenizer . text ( src ) ) {
src = src . substring ( token . raw . length ) ;
lastToken = tokens [ tokens . length - 1 ] ;
if ( lastToken && lastToken . type === 'text' ) {
lastToken . raw += '\n' + token . raw ;
lastToken . text += '\n' + token . text ;
this . inlineQueue . pop ( ) ;
this . inlineQueue [ this . inlineQueue . length - 1 ] . src = lastToken . text ;
} else {
tokens . push ( token ) ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
continue ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( src ) {
var errMsg = 'Infinite loop on byte: ' + src . charCodeAt ( 0 ) ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( this . options . silent ) {
console . error ( errMsg ) ;
break ;
} else {
throw new Error ( errMsg ) ;
}
2021-11-02 07:32:17 -07:00
}
2021-11-12 13:38:04 -08:00
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
this . state . top = true ;
return tokens ;
} ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
_proto . inline = function inline ( src , tokens ) {
this . inlineQueue . push ( {
src : src ,
tokens : tokens
} ) ;
}
/ * *
* Lexing / Compiling
* /
;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
_proto . inlineTokens = function inlineTokens ( src , tokens ) {
var _this2 = this ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( tokens === void 0 ) {
tokens = [ ] ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
var token , lastToken , cutSrc ; // String with links masked to avoid interference with em and strong
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
var maskedSrc = src ;
var match ;
var keepPrevChar , prevChar ; // Mask out reflinks
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( this . tokens . links ) {
var links = Object . keys ( this . tokens . links ) ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( links . length > 0 ) {
while ( ( match = this . tokenizer . rules . inline . reflinkSearch . exec ( maskedSrc ) ) != null ) {
if ( links . includes ( match [ 0 ] . slice ( match [ 0 ] . lastIndexOf ( '[' ) + 1 , - 1 ) ) ) {
maskedSrc = maskedSrc . slice ( 0 , match . index ) + '[' + repeatString ( 'a' , match [ 0 ] . length - 2 ) + ']' + maskedSrc . slice ( this . tokenizer . rules . inline . reflinkSearch . lastIndex ) ;
}
}
2021-11-02 07:32:17 -07:00
}
2021-11-12 13:38:04 -08:00
} // Mask out other blocks
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
while ( ( match = this . tokenizer . rules . inline . blockSkip . exec ( maskedSrc ) ) != null ) {
maskedSrc = maskedSrc . slice ( 0 , match . index ) + '[' + repeatString ( 'a' , match [ 0 ] . length - 2 ) + ']' + maskedSrc . slice ( this . tokenizer . rules . inline . blockSkip . lastIndex ) ;
} // Mask out escaped em & strong delimiters
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
while ( ( match = this . tokenizer . rules . inline . escapedEmSt . exec ( maskedSrc ) ) != null ) {
maskedSrc = maskedSrc . slice ( 0 , match . index ) + '++' + maskedSrc . slice ( this . tokenizer . rules . inline . escapedEmSt . lastIndex ) ;
}
while ( src ) {
if ( ! keepPrevChar ) {
prevChar = '' ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
keepPrevChar = false ; // extensions
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( this . options . extensions && this . options . extensions . inline && this . options . extensions . inline . some ( function ( extTokenizer ) {
if ( token = extTokenizer . call ( {
lexer : _this2
} , src , tokens ) ) {
2021-11-02 07:32:17 -07:00
src = src . substring ( token . raw . length ) ;
tokens . push ( token ) ;
2021-11-12 13:38:04 -08:00
return true ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
return false ;
} ) ) {
continue ;
} // escape
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( token = this . tokenizer . escape ( src ) ) {
src = src . substring ( token . raw . length ) ;
tokens . push ( token ) ;
continue ;
} // tag
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( token = this . tokenizer . tag ( src ) ) {
src = src . substring ( token . raw . length ) ;
lastToken = tokens [ tokens . length - 1 ] ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( lastToken && token . type === 'text' && lastToken . type === 'text' ) {
lastToken . raw += token . raw ;
lastToken . text += token . text ;
} else {
2021-11-02 07:32:17 -07:00
tokens . push ( token ) ;
2021-11-12 13:38:04 -08:00
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
continue ;
} // link
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( token = this . tokenizer . link ( src ) ) {
src = src . substring ( token . raw . length ) ;
tokens . push ( token ) ;
continue ;
} // reflink, nolink
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( token = this . tokenizer . reflink ( src , this . tokens . links ) ) {
src = src . substring ( token . raw . length ) ;
lastToken = tokens [ tokens . length - 1 ] ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( lastToken && token . type === 'text' && lastToken . type === 'text' ) {
lastToken . raw += token . raw ;
lastToken . text += token . text ;
} else {
2021-11-02 07:32:17 -07:00
tokens . push ( token ) ;
2021-11-12 13:38:04 -08:00
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
continue ;
} // em & strong
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( token = this . tokenizer . emStrong ( src , maskedSrc , prevChar ) ) {
src = src . substring ( token . raw . length ) ;
tokens . push ( token ) ;
continue ;
} // code
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( token = this . tokenizer . codespan ( src ) ) {
src = src . substring ( token . raw . length ) ;
tokens . push ( token ) ;
continue ;
} // br
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( token = this . tokenizer . br ( src ) ) {
src = src . substring ( token . raw . length ) ;
tokens . push ( token ) ;
continue ;
} // del (gfm)
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( token = this . tokenizer . del ( src ) ) {
src = src . substring ( token . raw . length ) ;
tokens . push ( token ) ;
continue ;
} // autolink
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( token = this . tokenizer . autolink ( src , mangle ) ) {
src = src . substring ( token . raw . length ) ;
tokens . push ( token ) ;
continue ;
} // url (gfm)
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( ! this . state . inLink && ( token = this . tokenizer . url ( src , mangle ) ) ) {
src = src . substring ( token . raw . length ) ;
tokens . push ( token ) ;
continue ;
} // text
// prevent inlineText consuming extensions by clipping 'src' to extension start
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
cutSrc = src ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( this . options . extensions && this . options . extensions . startInline ) {
( function ( ) {
var startIndex = Infinity ;
var tempSrc = src . slice ( 1 ) ;
var tempStart = void 0 ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
_this2 . options . extensions . startInline . forEach ( function ( getStartIndex ) {
tempStart = getStartIndex . call ( {
lexer : this
} , tempSrc ) ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( typeof tempStart === 'number' && tempStart >= 0 ) {
startIndex = Math . min ( startIndex , tempStart ) ;
}
} ) ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( startIndex < Infinity && startIndex >= 0 ) {
cutSrc = src . substring ( 0 , startIndex + 1 ) ;
2021-11-02 07:32:17 -07:00
}
2021-11-12 13:38:04 -08:00
} ) ( ) ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( token = this . tokenizer . inlineText ( cutSrc , smartypants ) ) {
src = src . substring ( token . raw . length ) ;
if ( token . raw . slice ( - 1 ) !== '_' ) {
// Track prevChar before string of ____ started
prevChar = token . raw . slice ( - 1 ) ;
2021-11-02 07:32:17 -07:00
}
2021-11-12 13:38:04 -08:00
keepPrevChar = true ;
lastToken = tokens [ tokens . length - 1 ] ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( lastToken && lastToken . type === 'text' ) {
lastToken . raw += token . raw ;
lastToken . text += token . text ;
} else {
tokens . push ( token ) ;
2021-11-02 07:32:17 -07:00
}
2021-11-12 13:38:04 -08:00
continue ;
2021-11-02 07:32:17 -07:00
}
2021-11-12 13:38:04 -08:00
if ( src ) {
var errMsg = 'Infinite loop on byte: ' + src . charCodeAt ( 0 ) ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( this . options . silent ) {
console . error ( errMsg ) ;
break ;
} else {
throw new Error ( errMsg ) ;
}
2021-11-02 07:32:17 -07:00
}
2021-11-12 13:38:04 -08:00
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
return tokens ;
} ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
_createClass ( Lexer , null , [ {
key : "rules" ,
get : function get ( ) {
return {
block : block ,
inline : inline
} ;
2021-11-02 07:32:17 -07:00
}
2021-11-12 13:38:04 -08:00
} ] ) ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
return Lexer ;
} ( ) ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
/ * *
* Renderer
* /
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
var Renderer = /*#__PURE__*/ function ( ) {
function Renderer ( options ) {
this . options = options || exports . defaults ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
var _proto = Renderer . prototype ;
_proto . code = function code ( _code , infostring , escaped ) {
var lang = ( infostring || '' ) . match ( /\S*/ ) [ 0 ] ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( this . options . highlight ) {
var out = this . options . highlight ( _code , lang ) ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( out != null && out !== _code ) {
escaped = true ;
_code = out ;
2021-11-02 07:32:17 -07:00
}
2021-11-12 13:38:04 -08:00
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
_code = _code . replace ( /\n$/ , '' ) + '\n' ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( ! lang ) {
return '<pre><code>' + ( escaped ? _code : escape ( _code , true ) ) + '</code></pre>\n' ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
return '<pre><code class="' + this . options . langPrefix + escape ( lang , true ) + '">' + ( escaped ? _code : escape ( _code , true ) ) + '</code></pre>\n' ;
2022-04-08 01:54:20 +00:00
}
/ * *
* @ param { string } quote
* /
;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
_proto . blockquote = function blockquote ( quote ) {
2022-04-08 01:54:20 +00:00
return "<blockquote>\n" + quote + "</blockquote>\n" ;
2021-11-12 13:38:04 -08:00
} ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
_proto . html = function html ( _html ) {
return _html ;
2022-04-08 01:54:20 +00:00
}
/ * *
* @ param { string } text
* @ param { string } level
* @ param { string } raw
* @ param { any } slugger
* /
;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
_proto . heading = function heading ( text , level , raw , slugger ) {
if ( this . options . headerIds ) {
2022-04-08 01:54:20 +00:00
var id = this . options . headerPrefix + slugger . slug ( raw ) ;
return "<h" + level + " id=\"" + id + "\">" + text + "</h" + level + ">\n" ;
2021-11-12 13:38:04 -08:00
} // ignore IDs
2021-11-02 07:32:17 -07:00
2022-04-08 01:54:20 +00:00
return "<h" + level + ">" + text + "</h" + level + ">\n" ;
2021-11-12 13:38:04 -08:00
} ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
_proto . hr = function hr ( ) {
return this . options . xhtml ? '<hr/>\n' : '<hr>\n' ;
} ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
_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' ;
2022-04-08 01:54:20 +00:00
}
/ * *
* @ param { string } text
* /
;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
_proto . listitem = function listitem ( text ) {
2022-04-08 01:54:20 +00:00
return "<li>" + text + "</li>\n" ;
2021-11-12 13:38:04 -08:00
} ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
_proto . checkbox = function checkbox ( checked ) {
return '<input ' + ( checked ? 'checked="" ' : '' ) + 'disabled="" type="checkbox"' + ( this . options . xhtml ? ' /' : '' ) + '> ' ;
2022-04-08 01:54:20 +00:00
}
/ * *
* @ param { string } text
* /
;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
_proto . paragraph = function paragraph ( text ) {
2022-04-08 01:54:20 +00:00
return "<p>" + text + "</p>\n" ;
}
/ * *
* @ param { string } header
* @ param { string } body
* /
;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
_proto . table = function table ( header , body ) {
2022-04-08 01:54:20 +00:00
if ( body ) body = "<tbody>" + body + "</tbody>" ;
2021-11-12 13:38:04 -08:00
return '<table>\n' + '<thead>\n' + header + '</thead>\n' + body + '</table>\n' ;
2022-04-08 01:54:20 +00:00
}
/ * *
* @ param { string } content
* /
;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
_proto . tablerow = function tablerow ( content ) {
2022-04-08 01:54:20 +00:00
return "<tr>\n" + content + "</tr>\n" ;
2021-11-12 13:38:04 -08:00
} ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
_proto . tablecell = function tablecell ( content , flags ) {
var type = flags . header ? 'th' : 'td' ;
2022-04-08 01:54:20 +00:00
var tag = flags . align ? "<" + type + " align=\"" + flags . align + "\">" : "<" + type + ">" ;
return tag + content + ( "</" + type + ">\n" ) ;
}
/ * *
* span level renderer
* @ param { string } text
* /
2021-11-12 13:38:04 -08:00
;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
_proto . strong = function strong ( text ) {
2022-04-08 01:54:20 +00:00
return "<strong>" + text + "</strong>" ;
}
/ * *
* @ param { string } text
* /
;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
_proto . em = function em ( text ) {
2022-04-08 01:54:20 +00:00
return "<em>" + text + "</em>" ;
}
/ * *
* @ param { string } text
* /
;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
_proto . codespan = function codespan ( text ) {
2022-04-08 01:54:20 +00:00
return "<code>" + text + "</code>" ;
2021-11-12 13:38:04 -08:00
} ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
_proto . br = function br ( ) {
return this . options . xhtml ? '<br/>' : '<br>' ;
2022-04-08 01:54:20 +00:00
}
/ * *
* @ param { string } text
* /
;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
_proto . del = function del ( text ) {
2022-04-08 01:54:20 +00:00
return "<del>" + text + "</del>" ;
}
/ * *
* @ param { string } href
* @ param { string } title
* @ param { string } text
* /
;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
_proto . link = function link ( href , title , text ) {
href = cleanUrl ( this . options . sanitize , this . options . baseUrl , href ) ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( href === null ) {
return text ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
var out = '<a href="' + escape ( href ) + '"' ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( title ) {
out += ' title="' + title + '"' ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
out += '>' + text + '</a>' ;
return out ;
2022-04-08 01:54:20 +00:00
}
/ * *
* @ param { string } href
* @ param { string } title
* @ param { string } text
* /
;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
_proto . image = function image ( href , title , text ) {
href = cleanUrl ( this . options . sanitize , this . options . baseUrl , href ) ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( href === null ) {
return text ;
}
2021-11-02 07:32:17 -07:00
2022-04-08 01:54:20 +00:00
var out = "<img src=\"" + href + "\" alt=\"" + text + "\"" ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( title ) {
2022-04-08 01:54:20 +00:00
out += " title=\"" + title + "\"" ;
2021-11-12 13:38:04 -08:00
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
out += this . options . xhtml ? '/>' : '>' ;
return out ;
} ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
_proto . text = function text ( _text ) {
return _text ;
} ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
return Renderer ;
} ( ) ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
/ * *
* TextRenderer
* returns only the textual part of the token
* /
var TextRenderer = /*#__PURE__*/ function ( ) {
function TextRenderer ( ) { }
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
var _proto = TextRenderer . prototype ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
// no need for block level renderers
_proto . strong = function strong ( text ) {
return text ;
} ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
_proto . em = function em ( text ) {
return text ;
} ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
_proto . codespan = function codespan ( text ) {
return text ;
} ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
_proto . del = function del ( text ) {
return text ;
} ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
_proto . html = function html ( text ) {
return text ;
} ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
_proto . text = function text ( _text ) {
return _text ;
} ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
_proto . link = function link ( href , title , text ) {
return '' + text ;
} ;
_proto . image = function image ( href , title , text ) {
return '' + text ;
} ;
_proto . br = function br ( ) {
return '' ;
} ;
return TextRenderer ;
} ( ) ;
/ * *
* Slugger generates header id
* /
var Slugger = /*#__PURE__*/ function ( ) {
function Slugger ( ) {
this . seen = { } ;
}
2022-04-08 01:54:20 +00:00
/ * *
* @ param { string } value
* /
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
var _proto = Slugger . prototype ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
_proto . serialize = function serialize ( value ) {
return value . toLowerCase ( ) . trim ( ) // remove html tags
. replace ( /<[!\/a-z].*?>/ig , '' ) // remove unwanted chars
. replace ( /[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g , '' ) . replace ( /\s/g , '-' ) ;
}
2021-11-02 07:32:17 -07:00
/ * *
2021-11-12 13:38:04 -08:00
* Finds the next safe ( unique ) slug to use
2022-04-08 01:54:20 +00:00
* @ param { string } originalSlug
* @ param { boolean } isDryRun
2021-11-02 07:32:17 -07:00
* /
2021-11-12 13:38:04 -08:00
;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
_proto . getNextSafeSlug = function getNextSafeSlug ( originalSlug , isDryRun ) {
var slug = originalSlug ;
var occurenceAccumulator = 0 ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( this . seen . hasOwnProperty ( slug ) ) {
occurenceAccumulator = this . seen [ originalSlug ] ;
do {
occurenceAccumulator ++ ;
slug = originalSlug + '-' + occurenceAccumulator ;
} while ( this . seen . hasOwnProperty ( slug ) ) ;
2021-11-02 07:32:17 -07:00
}
2021-11-12 13:38:04 -08:00
if ( ! isDryRun ) {
this . seen [ originalSlug ] = occurenceAccumulator ;
this . seen [ slug ] = 0 ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
return slug ;
}
/ * *
* Convert string to unique id
2022-04-08 01:54:20 +00:00
* @ param { object } [ options ]
* @ param { boolean } [ options . dryrun ] Generates the next unique slug without
* updating the internal accumulator .
2021-11-12 13:38:04 -08:00
* /
;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
_proto . slug = function slug ( value , options ) {
if ( options === void 0 ) {
options = { } ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
var slug = this . serialize ( value ) ;
return this . getNextSafeSlug ( slug , options . dryrun ) ;
} ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
return Slugger ;
} ( ) ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
/ * *
* Parsing & Compiling
* /
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
var Parser = /*#__PURE__*/ function ( ) {
function Parser ( options ) {
this . options = options || exports . defaults ;
this . options . renderer = this . options . renderer || new Renderer ( ) ;
this . renderer = this . options . renderer ;
this . renderer . options = this . options ;
this . textRenderer = new TextRenderer ( ) ;
this . slugger = new Slugger ( ) ;
}
/ * *
* Static Parse Method
* /
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
Parser . parse = function parse ( tokens , options ) {
var parser = new Parser ( options ) ;
return parser . parse ( tokens ) ;
}
2021-11-02 07:32:17 -07:00
/ * *
2021-11-12 13:38:04 -08:00
* Static Parse Inline Method
2021-11-02 07:32:17 -07:00
* /
2021-11-12 13:38:04 -08:00
;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
Parser . parseInline = function parseInline ( tokens , options ) {
var parser = new Parser ( options ) ;
return parser . parseInline ( tokens ) ;
}
/ * *
* Parse Loop
* /
;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
var _proto = Parser . prototype ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
_proto . parse = function parse ( tokens , top ) {
if ( top === void 0 ) {
top = true ;
2021-11-02 07:32:17 -07:00
}
2021-11-12 13:38:04 -08:00
var out = '' ,
i ,
j ,
k ,
l2 ,
l3 ,
row ,
cell ,
header ,
body ,
token ,
ordered ,
start ,
loose ,
itemBody ,
item ,
checked ,
task ,
checkbox ,
ret ;
var l = tokens . length ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
for ( i = 0 ; i < l ; i ++ ) {
token = tokens [ i ] ; // Run any renderer extensions
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( this . options . extensions && this . options . extensions . renderers && this . options . extensions . renderers [ token . type ] ) {
ret = this . options . extensions . renderers [ token . type ] . call ( {
parser : this
} , token ) ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( ret !== false || ! [ 'space' , 'hr' , 'heading' , 'code' , 'table' , 'blockquote' , 'list' , 'html' , 'paragraph' , 'text' ] . includes ( token . type ) ) {
out += ret || '' ;
continue ;
}
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
switch ( token . type ) {
case 'space' :
{
continue ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
case 'hr' :
{
out += this . renderer . hr ( ) ;
continue ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
case 'heading' :
{
out += this . renderer . heading ( this . parseInline ( token . tokens ) , token . depth , unescape ( this . parseInline ( token . tokens , this . textRenderer ) ) , this . slugger ) ;
2021-11-02 07:32:17 -07:00
continue ;
}
2021-11-12 13:38:04 -08:00
case 'code' :
{
out += this . renderer . code ( token . text , token . lang , token . escaped ) ;
continue ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
case 'table' :
{
header = '' ; // header
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
cell = '' ;
l2 = token . header . length ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
for ( j = 0 ; j < l2 ; j ++ ) {
cell += this . renderer . tablecell ( this . parseInline ( token . header [ j ] . tokens ) , {
header : true ,
align : token . align [ j ]
} ) ;
2021-11-02 07:32:17 -07:00
}
2021-11-12 13:38:04 -08:00
header += this . renderer . tablerow ( cell ) ;
body = '' ;
l2 = token . rows . length ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
for ( j = 0 ; j < l2 ; j ++ ) {
row = token . rows [ j ] ;
2021-11-02 07:32:17 -07:00
cell = '' ;
2021-11-12 13:38:04 -08:00
l3 = row . length ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
for ( k = 0 ; k < l3 ; k ++ ) {
cell += this . renderer . tablecell ( this . parseInline ( row [ k ] . tokens ) , {
header : false ,
align : token . align [ k ]
2021-11-02 07:32:17 -07:00
} ) ;
}
2021-11-12 13:38:04 -08:00
body += this . renderer . tablerow ( cell ) ;
2021-11-02 07:32:17 -07:00
}
2021-11-12 13:38:04 -08:00
out += this . renderer . table ( header , body ) ;
continue ;
}
case 'blockquote' :
{
body = this . parse ( token . tokens ) ;
out += this . renderer . blockquote ( body ) ;
continue ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
case 'list' :
{
ordered = token . ordered ;
start = token . start ;
loose = token . loose ;
l2 = token . items . length ;
body = '' ;
for ( j = 0 ; j < l2 ; j ++ ) {
item = token . items [ j ] ;
checked = item . checked ;
task = item . task ;
itemBody = '' ;
if ( item . task ) {
checkbox = this . renderer . checkbox ( checked ) ;
if ( loose ) {
if ( item . tokens . length > 0 && item . tokens [ 0 ] . type === 'paragraph' ) {
item . tokens [ 0 ] . text = checkbox + ' ' + item . tokens [ 0 ] . text ;
if ( item . tokens [ 0 ] . tokens && item . tokens [ 0 ] . tokens . length > 0 && item . tokens [ 0 ] . tokens [ 0 ] . type === 'text' ) {
item . tokens [ 0 ] . tokens [ 0 ] . text = checkbox + ' ' + item . tokens [ 0 ] . tokens [ 0 ] . text ;
2021-11-02 07:32:17 -07:00
}
} else {
2021-11-12 13:38:04 -08:00
item . tokens . unshift ( {
type : 'text' ,
text : checkbox
} ) ;
2021-11-02 07:32:17 -07:00
}
2021-11-12 13:38:04 -08:00
} else {
itemBody += checkbox ;
2021-11-02 07:32:17 -07:00
}
}
2021-11-12 13:38:04 -08:00
itemBody += this . parse ( item . tokens , loose ) ;
body += this . renderer . listitem ( itemBody , task , checked ) ;
2021-11-02 07:32:17 -07:00
}
2021-11-12 13:38:04 -08:00
out += this . renderer . list ( body , ordered , start ) ;
continue ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
case 'html' :
{
// TODO parse inline content if parameter markdown=1
out += this . renderer . html ( token . text ) ;
continue ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
case 'paragraph' :
{
out += this . renderer . paragraph ( this . parseInline ( token . tokens ) ) ;
continue ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
case 'text' :
{
body = token . tokens ? this . parseInline ( token . tokens ) : token . text ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
while ( i + 1 < l && tokens [ i + 1 ] . type === 'text' ) {
token = tokens [ ++ i ] ;
body += '\n' + ( token . tokens ? this . parseInline ( token . tokens ) : token . text ) ;
2021-11-02 07:32:17 -07:00
}
2021-11-12 13:38:04 -08:00
out += top ? this . renderer . paragraph ( body ) : body ;
continue ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
default :
{
var errMsg = 'Token with "' + token . type + '" type was not found.' ;
if ( this . options . silent ) {
console . error ( errMsg ) ;
return ;
} else {
throw new Error ( errMsg ) ;
2021-11-02 07:32:17 -07:00
}
2021-11-12 13:38:04 -08:00
}
2021-11-02 07:32:17 -07:00
}
}
2021-11-12 13:38:04 -08:00
return out ;
}
/ * *
* Parse Inline Tokens
* /
;
_proto . parseInline = function parseInline ( tokens , renderer ) {
renderer = renderer || this . renderer ;
var out = '' ,
i ,
token ,
ret ;
var l = tokens . length ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
for ( i = 0 ; i < l ; i ++ ) {
token = tokens [ i ] ; // Run any renderer extensions
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( this . options . extensions && this . options . extensions . renderers && this . options . extensions . renderers [ token . type ] ) {
ret = this . options . extensions . renderers [ token . type ] . call ( {
parser : this
} , token ) ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( ret !== false || ! [ 'escape' , 'html' , 'link' , 'image' , 'strong' , 'em' , 'codespan' , 'br' , 'del' , 'text' ] . includes ( token . type ) ) {
out += ret || '' ;
continue ;
2021-11-02 07:32:17 -07:00
}
2021-11-12 13:38:04 -08:00
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
switch ( token . type ) {
case 'escape' :
{
out += renderer . text ( token . text ) ;
break ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
case 'html' :
{
out += renderer . html ( token . text ) ;
break ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
case 'link' :
{
out += renderer . link ( token . href , token . title , this . parseInline ( token . tokens , renderer ) ) ;
break ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
case 'image' :
{
out += renderer . image ( token . href , token . title , token . text ) ;
break ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
case 'strong' :
{
out += renderer . strong ( this . parseInline ( token . tokens , renderer ) ) ;
break ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
case 'em' :
{
out += renderer . em ( this . parseInline ( token . tokens , renderer ) ) ;
break ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
case 'codespan' :
{
out += renderer . codespan ( token . text ) ;
break ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
case 'br' :
{
out += renderer . br ( ) ;
break ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
case 'del' :
{
out += renderer . del ( this . parseInline ( token . tokens , renderer ) ) ;
break ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
case 'text' :
{
out += renderer . text ( token . text ) ;
break ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
default :
{
var errMsg = 'Token with "' + token . type + '" type was not found.' ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( this . options . silent ) {
console . error ( errMsg ) ;
return ;
} else {
throw new Error ( errMsg ) ;
2021-11-02 07:32:17 -07:00
}
2021-11-12 13:38:04 -08:00
}
2021-11-02 07:32:17 -07:00
}
2021-11-12 13:38:04 -08:00
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
return out ;
} ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
return Parser ;
} ( ) ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
/ * *
* Marked
* /
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
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' ) ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( typeof src !== 'string' ) {
throw new Error ( 'marked(): input parameter is of type ' + Object . prototype . toString . call ( src ) + ', string expected' ) ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( typeof opt === 'function' ) {
callback = opt ;
opt = null ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
opt = merge ( { } , marked . defaults , opt || { } ) ;
checkSanitizeDeprecation ( opt ) ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( callback ) {
var highlight = opt . highlight ;
var tokens ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
try {
tokens = Lexer . lex ( src , opt ) ;
} catch ( e ) {
return callback ( e ) ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
var done = function done ( err ) {
var out ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( ! err ) {
try {
if ( opt . walkTokens ) {
marked . walkTokens ( tokens , opt . walkTokens ) ;
2021-11-02 07:32:17 -07:00
}
2021-11-12 13:38:04 -08:00
out = Parser . parse ( tokens , opt ) ;
} catch ( e ) {
err = e ;
}
2021-11-02 07:32:17 -07:00
}
2021-11-12 13:38:04 -08:00
opt . highlight = highlight ;
return err ? callback ( err ) : callback ( null , out ) ;
} ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( ! highlight || highlight . length < 3 ) {
return done ( ) ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
delete opt . highlight ;
if ( ! tokens . length ) return done ( ) ;
var pending = 0 ;
marked . walkTokens ( tokens , function ( token ) {
if ( token . type === 'code' ) {
pending ++ ;
setTimeout ( function ( ) {
highlight ( token . text , token . lang , function ( err , code ) {
if ( err ) {
return done ( err ) ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( code != null && code !== token . text ) {
token . text = code ;
token . escaped = true ;
}
pending -- ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( pending === 0 ) {
done ( ) ;
}
} ) ;
} , 0 ) ;
2021-11-02 07:32:17 -07:00
}
2021-11-12 13:38:04 -08:00
} ) ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( pending === 0 ) {
done ( ) ;
2021-11-02 07:32:17 -07:00
}
2021-11-12 13:38:04 -08:00
return ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
try {
var _tokens = Lexer . lex ( src , opt ) ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( opt . walkTokens ) {
marked . walkTokens ( _tokens , opt . walkTokens ) ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
return Parser . parse ( _tokens , opt ) ;
} catch ( e ) {
e . message += '\nPlease report this to https://github.com/markedjs/marked.' ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( opt . silent ) {
return '<p>An error occurred:</p><pre>' + escape ( e . message + '' , true ) + '</pre>' ;
2021-11-02 07:32:17 -07:00
}
2021-11-12 13:38:04 -08:00
throw e ;
2021-11-02 07:32:17 -07:00
}
2021-11-12 13:38:04 -08:00
}
/ * *
* Options
* /
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
marked . options = marked . setOptions = function ( opt ) {
merge ( marked . defaults , opt ) ;
changeDefaults ( marked . defaults ) ;
return marked ;
} ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
marked . getDefaults = getDefaults ;
marked . defaults = exports . defaults ;
/ * *
* Use Extension
* /
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
marked . use = function ( ) {
for ( var _len = arguments . length , args = new Array ( _len ) , _key = 0 ; _key < _len ; _key ++ ) {
args [ _key ] = arguments [ _key ] ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
var opts = merge . apply ( void 0 , [ { } ] . concat ( args ) ) ;
var extensions = marked . defaults . extensions || {
renderers : { } ,
childTokens : { }
} ;
var hasExtensions ;
args . forEach ( function ( pack ) {
// ==-- Parse "addon" extensions --== //
if ( pack . extensions ) {
hasExtensions = true ;
pack . extensions . forEach ( function ( ext ) {
if ( ! ext . name ) {
throw new Error ( 'extension name required' ) ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( ext . renderer ) {
// Renderer extensions
var prevRenderer = extensions . renderers ? extensions . renderers [ ext . name ] : null ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( prevRenderer ) {
// Replace extension with func to run new extension but fall back if false
extensions . renderers [ ext . name ] = function ( ) {
for ( var _len2 = arguments . length , args = new Array ( _len2 ) , _key2 = 0 ; _key2 < _len2 ; _key2 ++ ) {
args [ _key2 ] = arguments [ _key2 ] ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
var ret = ext . renderer . apply ( this , args ) ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( ret === false ) {
ret = prevRenderer . apply ( this , args ) ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
return ret ;
} ;
} else {
extensions . renderers [ ext . name ] = ext . renderer ;
2021-11-02 07:32:17 -07:00
}
2021-11-12 13:38:04 -08:00
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( ext . tokenizer ) {
// Tokenizer Extensions
if ( ! ext . level || ext . level !== 'block' && ext . level !== 'inline' ) {
throw new Error ( "extension level must be 'block' or 'inline'" ) ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( extensions [ ext . level ] ) {
extensions [ ext . level ] . unshift ( ext . tokenizer ) ;
} else {
extensions [ ext . level ] = [ ext . tokenizer ] ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( ext . start ) {
// Function to check for start of token
if ( ext . level === 'block' ) {
if ( extensions . startBlock ) {
extensions . startBlock . push ( ext . start ) ;
} else {
extensions . startBlock = [ ext . start ] ;
}
} else if ( ext . level === 'inline' ) {
if ( extensions . startInline ) {
extensions . startInline . push ( ext . start ) ;
} else {
extensions . startInline = [ ext . start ] ;
2021-11-02 07:32:17 -07:00
}
}
}
2021-11-12 13:38:04 -08:00
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( ext . childTokens ) {
// Child tokens to be visited by walkTokens
extensions . childTokens [ ext . name ] = ext . childTokens ;
}
} ) ;
} // ==-- Parse "overwrite" extensions --== //
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( pack . renderer ) {
( function ( ) {
var renderer = marked . defaults . renderer || new Renderer ( ) ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
var _loop = function _loop ( prop ) {
var prevRenderer = renderer [ prop ] ; // Replace renderer with func to run extension, but fall back if false
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
renderer [ prop ] = function ( ) {
for ( var _len3 = arguments . length , args = new Array ( _len3 ) , _key3 = 0 ; _key3 < _len3 ; _key3 ++ ) {
args [ _key3 ] = arguments [ _key3 ] ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
var ret = pack . renderer [ prop ] . apply ( renderer , args ) ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( ret === false ) {
ret = prevRenderer . apply ( renderer , args ) ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
return ret ;
2021-11-02 07:32:17 -07:00
} ;
2021-11-12 13:38:04 -08:00
} ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
for ( var prop in pack . renderer ) {
_loop ( prop ) ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
opts . renderer = renderer ;
} ) ( ) ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( pack . tokenizer ) {
( function ( ) {
var tokenizer = marked . defaults . tokenizer || new Tokenizer ( ) ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
var _loop2 = function _loop2 ( prop ) {
var prevTokenizer = tokenizer [ prop ] ; // Replace tokenizer with func to run extension, but fall back if false
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
tokenizer [ prop ] = function ( ) {
for ( var _len4 = arguments . length , args = new Array ( _len4 ) , _key4 = 0 ; _key4 < _len4 ; _key4 ++ ) {
args [ _key4 ] = arguments [ _key4 ] ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
var ret = pack . tokenizer [ prop ] . apply ( tokenizer , args ) ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( ret === false ) {
ret = prevTokenizer . apply ( tokenizer , args ) ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
return ret ;
2021-11-02 07:32:17 -07:00
} ;
2021-11-12 13:38:04 -08:00
} ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
for ( var prop in pack . tokenizer ) {
_loop2 ( prop ) ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
opts . tokenizer = tokenizer ;
} ) ( ) ;
} // ==-- Parse WalkTokens extensions --== //
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( pack . walkTokens ) {
var _walkTokens = marked . defaults . walkTokens ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
opts . walkTokens = function ( token ) {
pack . walkTokens . call ( this , token ) ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( _walkTokens ) {
_walkTokens . call ( this , token ) ;
}
} ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( hasExtensions ) {
opts . extensions = extensions ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
marked . setOptions ( opts ) ;
} ) ;
} ;
/ * *
* Run callback for every token
* /
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
marked . walkTokens = function ( tokens , callback ) {
var _loop3 = function _loop3 ( ) {
var token = _step . value ;
callback . call ( marked , token ) ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
switch ( token . type ) {
case 'table' :
{
for ( var _iterator2 = _createForOfIteratorHelperLoose ( token . header ) , _step2 ; ! ( _step2 = _iterator2 ( ) ) . done ; ) {
var cell = _step2 . value ;
marked . walkTokens ( cell . tokens , callback ) ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
for ( var _iterator3 = _createForOfIteratorHelperLoose ( token . rows ) , _step3 ; ! ( _step3 = _iterator3 ( ) ) . done ; ) {
var row = _step3 . value ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
for ( var _iterator4 = _createForOfIteratorHelperLoose ( row ) , _step4 ; ! ( _step4 = _iterator4 ( ) ) . done ; ) {
var _cell = _step4 . value ;
marked . walkTokens ( _cell . tokens , callback ) ;
2021-11-02 07:32:17 -07:00
}
}
2021-11-12 13:38:04 -08:00
break ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
case 'list' :
{
marked . walkTokens ( token . items , callback ) ;
break ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
default :
{
if ( marked . defaults . extensions && marked . defaults . extensions . childTokens && marked . defaults . extensions . childTokens [ token . type ] ) {
// Walk any extensions
marked . defaults . extensions . childTokens [ token . type ] . forEach ( function ( childTokens ) {
marked . walkTokens ( token [ childTokens ] , callback ) ;
} ) ;
} else if ( token . tokens ) {
marked . walkTokens ( token . tokens , callback ) ;
}
}
2021-11-02 07:32:17 -07:00
}
} ;
2021-11-12 13:38:04 -08:00
for ( var _iterator = _createForOfIteratorHelperLoose ( tokens ) , _step ; ! ( _step = _iterator ( ) ) . done ; ) {
_loop3 ( ) ;
}
} ;
/ * *
* Parse Inline
2022-04-08 01:54:20 +00:00
* @ param { string } src
2021-11-12 13:38:04 -08:00
* /
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
marked . parseInline = function ( src , opt ) {
// throw error in case of non string input
if ( typeof src === 'undefined' || src === null ) {
throw new Error ( 'marked.parseInline(): input parameter is undefined or null' ) ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( typeof src !== 'string' ) {
throw new Error ( 'marked.parseInline(): input parameter is of type ' + Object . prototype . toString . call ( src ) + ', string expected' ) ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
opt = merge ( { } , marked . defaults , opt || { } ) ;
checkSanitizeDeprecation ( opt ) ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
try {
var tokens = Lexer . lexInline ( src , opt ) ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( opt . walkTokens ) {
marked . walkTokens ( tokens , opt . walkTokens ) ;
}
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
return Parser . parseInline ( tokens , opt ) ;
} catch ( e ) {
e . message += '\nPlease report this to https://github.com/markedjs/marked.' ;
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
if ( opt . silent ) {
return '<p>An error occurred:</p><pre>' + escape ( e . message + '' , true ) + '</pre>' ;
2021-11-02 07:32:17 -07:00
}
2021-11-12 13:38:04 -08:00
throw e ;
}
} ;
/ * *
* Expose
* /
2021-11-02 07:32:17 -07:00
2021-11-12 13:38:04 -08:00
marked . Parser = Parser ;
marked . parser = Parser . parse ;
marked . Renderer = Renderer ;
marked . TextRenderer = TextRenderer ;
marked . Lexer = Lexer ;
marked . lexer = Lexer . lex ;
marked . Tokenizer = Tokenizer ;
marked . Slugger = Slugger ;
marked . parse = marked ;
var options = marked . options ;
var setOptions = marked . setOptions ;
var use = marked . use ;
var walkTokens = marked . walkTokens ;
var parseInline = marked . parseInline ;
var parse = marked ;
var parser = Parser . parse ;
var lexer = Lexer . lex ;
exports . Lexer = Lexer ;
exports . Parser = Parser ;
exports . Renderer = Renderer ;
exports . Slugger = Slugger ;
exports . TextRenderer = TextRenderer ;
exports . Tokenizer = Tokenizer ;
exports . getDefaults = getDefaults ;
exports . lexer = lexer ;
exports . marked = marked ;
exports . options = options ;
exports . parse = parse ;
exports . parseInline = parseInline ;
exports . parser = parser ;
exports . setOptions = setOptions ;
exports . use = use ;
exports . walkTokens = walkTokens ;