const util = require ( "util" ) ; function isValidDelim ( state , pos ) { let canOpen = true , canClose = true ; const max = state . posMax as number ; const prevChar = pos > 0 ? state . src . charCodeAt ( pos - 1 ) : - 1 ; const nextChar = pos + 1 <= max ? state . src . charCodeAt ( pos + 1 ) : - 1 ; if ( prevChar === 0x20 || prevChar === 0x09 || ( nextChar >= 0x30 && nextChar <= 0x39 ) ) { canClose = false ; } if ( nextChar === 0x20 || nextChar === 0x09 ) { canOpen = false ; } return { canOpen , canClose } ; } function math_inline ( state , silent ) { var start , match , token , res , pos ; if ( state . src [ state . pos ] !== "$" ) { return false ; } res = isValidDelim ( state , state . pos ) ; if ( ! res . canOpen ) { if ( ! silent ) { state . pending += "$" ; } state . pos += 1 ; return true ; } start = state . pos + 1 ; match = start ; while ( ( match = state . src . indexOf ( "$" , match ) ) !== - 1 ) { pos = match - 1 ; while ( state . src [ pos ] === "\\" ) { pos -= 1 ; } if ( ( ( match - pos ) % 2 ) === 1 ) { break ; } match += 1 ; } if ( match === - 1 ) { if ( ! silent ) { state . pending += "$" ; } state . pos = start ; return true ; } if ( match - start === 0 ) { if ( ! silent ) { state . pending += "$$" ; } state . pos = start + 1 ; return true ; } res = isValidDelim ( state , match ) ; if ( ! res . canClose ) { if ( ! silent ) { state . pending += "$" ; } state . pos = start ; return true ; } if ( ! silent ) { token = state . push ( 'math_inline' , 'math' , 0 ) ; token . markup = "$" ; token . content = state . src . slice ( start , match ) ; } state . pos = match + 1 ; return true ; } function math_block ( state , start , end , silent ) { var firstLine , lastLine , next , lastPos , found = false , token , pos = state . bMarks [ start ] + state . tShift [ start ] , max = state . eMarks [ start ] ; if ( pos + 2 > max ) { return false ; } if ( state . src . slice ( pos , pos + 2 ) !== '$$' ) { return false ; } pos += 2 ; firstLine = state . src . slice ( pos , max ) ; if ( silent ) { return true ; } if ( firstLine . trim ( ) . slice ( - 2 ) === '$$' ) { firstLine = firstLine . trim ( ) . slice ( 0 , - 2 ) ; found = true ; } for ( next = start ; ! found ; ) { next ++ ; if ( next >= end ) { break ; } pos = state . bMarks [ next ] + state . tShift [ next ] ; max = state . eMarks [ next ] ; if ( pos < max && state . tShift [ next ] < state . blkIndent ) { break ; } if ( state . src . slice ( pos , max ) . trim ( ) . slice ( - 2 ) === '$$' ) { lastPos = state . src . slice ( 0 , max ) . lastIndexOf ( '$$' ) ; lastLine = state . src . slice ( pos , lastPos ) ; found = true ; } } state . line = next + 1 ; token = state . push ( 'math_block' , 'math' , 0 ) ; token . block = true ; token . content = ( firstLine && firstLine . trim ( ) ? firstLine + '\n' : '' ) + state . getLines ( start + 1 , next , state . tShift [ start ] , true ) + ( lastLine && lastLine . trim ( ) ? lastLine : '' ) ; token . map = [ start , state . line ] ; token . markup = '$$' ; return true ; } module . exports = function math_plugin ( md , _options ) { var inlineRenderer = function ( tokens , idx ) { return "<tex>" + Buffer . from ( tokens [ idx ] . content ) . toString ( 'base64' ) + "</tex>" ; } ; var blockRenderer = function ( tokens , idx ) { return "<p><tex>" + Buffer . from ( tokens [ idx ] . content ) . toString ( 'base64' ) + "</tex></p>\n" ; } ; md . inline . ruler . after ( 'escape' , 'math_inline' , math_inline ) ; md . block . ruler . after ( 'blockquote' , 'math_block' , math_block , { alt : [ 'paragraph' , 'reference' , 'blockquote' , 'list' ] } ) ; md . renderer . rules . math_inline = inlineRenderer ; md . renderer . rules . math_block = blockRenderer ; } ;