import MarkdownIt from 'markdown-it' ; import { RuleBlock } from 'markdown-it/lib/parser_block' ; const blockNames = require ( 'markdown-it/lib/common/html_blocks' ) ; const HTML_OPEN_CLOSE_TAG_RE = require ( 'markdown-it/lib/common/html_re' ) . HTML_OPEN_CLOSE_TAG_RE ; const HTML_SEQUENCES = [ [ /^<(script|pre|style)(?=(\s|>|$))/i , /<\/(script|pre|style)>/i , true ] , [ /^<!--/ , /-->/ , true ] , [ /^<\?/ , /\?>/ , true ] , [ /^<![A-Z]/ , />/ , true ] , [ /^<!\[CDATA\[/ , /\]\]>/ , true ] , [ /^<[A-Z]/ , />/ , true ] , [ /^<\w+\-/ , />/ , true ] , [ new RegExp ( '^</?(' + blockNames . join ( '|' ) + ')(?=(\\s|/?>|$))' , 'i' ) , /^$/ , true ] , [ new RegExp ( HTML_OPEN_CLOSE_TAG_RE . source + '\\s*$' ) , /^$/ , false ] , ] ; export const componentPlugin = ( md ) => { md . block . ruler . at ( 'html_block' , htmlBlock ) ; } ; const htmlBlock = ( state , startLine , endLine , silent ) : boolean => { let i , nextLine , lineText ; let pos = state . bMarks [ startLine ] + state . tShift [ startLine ] ; let max = state . eMarks [ startLine ] ; if ( state . sCount [ startLine ] - state . blkIndent >= 4 ) { return false ; } if ( ! state . md . options . html ) { return false ; } if ( state . src . charCodeAt ( pos ) !== 0x3c ) { return false ; } lineText = state . src . slice ( pos , max ) ; for ( i = 0 ; i < HTML_SEQUENCES . length ; i ++ ) { if ( HTML_SEQUENCES [ i ] [ 0 ] . test ( lineText ) ) { break ; } } if ( i === HTML_SEQUENCES . length ) { return false ; } if ( silent ) { return HTML_SEQUENCES [ i ] [ 2 ] ; } nextLine = startLine + 1 ; if ( ! HTML_SEQUENCES [ i ] [ 1 ] . test ( lineText ) ) { for ( ; nextLine < endLine ; nextLine ++ ) { if ( state . sCount [ nextLine ] < state . blkIndent ) { break ; } pos = state . bMarks [ nextLine ] + state . tShift [ nextLine ] ; max = state . eMarks [ nextLine ] ; lineText = state . src . slice ( pos , max ) ; if ( HTML_SEQUENCES [ i ] [ 1 ] . test ( lineText ) ) { if ( lineText . length !== 0 ) { nextLine ++ ; } break ; } } } state . line = nextLine ; const token = state . push ( 'html_block' , '' , 0 ) ; token . map = [ startLine , nextLine ] ; token . content = state . getLines ( startLine , nextLine , state . blkIndent , true ) ; return true ; } ;