# HTML blockimportloggingimportrefromtypingimportList,Tuple,Patternfrom.state_blockimportStateBlockfrom..common.html_blocksimportblock_namesfrom..common.html_reimportHTML_OPEN_CLOSE_TAG_STRLOGGER=logging.getLogger(__name__)# An array of opening and corresponding closing sequences for html tags,# last argument defines whether it can terminate a paragraph or notHTML_SEQUENCES:List[Tuple[Pattern,Pattern,bool]]=[(re.compile(r"^<(script|pre|style|textarea)(?=(\s|>|$))",re.IGNORECASE),re.compile(r"<\/(script|pre|style|textarea)>",re.IGNORECASE),True,),(re.compile(r"^<!--"),re.compile(r"-->"),True),(re.compile(r"^<\?"),re.compile(r"\?>"),True),(re.compile(r"^<![A-Z]"),re.compile(r">"),True),(re.compile(r"^<!\[CDATA\["),re.compile(r"\]\]>"),True),(re.compile("^</?("+"|".join(block_names)+")(?=(\\s|/?>|$))",re.IGNORECASE),re.compile(r"^$"),True,),(re.compile(HTML_OPEN_CLOSE_TAG_STR+"\\s*$"),re.compile(r"^$"),False),]
[文档]defhtml_block(state:StateBlock,startLine:int,endLine:int,silent:bool):LOGGER.debug("entering html_block: %s, %s, %s, %s",state,startLine,endLine,silent)pos=state.bMarks[startLine]+state.tShift[startLine]maximum=state.eMarks[startLine]# if it's indented more than 3 spaces, it should be a code blockifstate.sCount[startLine]-state.blkIndent>=4:returnFalseifnotstate.md.options.get("html",None):returnFalseifstate.srcCharCode[pos]!=0x3C:# /* < */returnFalselineText=state.src[pos:maximum]html_seq=NoneforHTML_SEQUENCEinHTML_SEQUENCES:ifHTML_SEQUENCE[0].search(lineText):html_seq=HTML_SEQUENCEbreakifnothtml_seq:returnFalseifsilent:# true if this sequence can be a terminator, false otherwisereturnhtml_seq[2]nextLine=startLine+1# If we are here - we detected HTML block.# Let's roll down till block end.ifnothtml_seq[1].search(lineText):whilenextLine<endLine:ifstate.sCount[nextLine]<state.blkIndent:breakpos=state.bMarks[nextLine]+state.tShift[nextLine]maximum=state.eMarks[nextLine]lineText=state.src[pos:maximum]ifhtml_seq[1].search(lineText):iflen(lineText)!=0:nextLine+=1breaknextLine+=1state.line=nextLinetoken=state.push("html_block","",0)token.map=[startLine,nextLine]token.content=state.getLines(startLine,nextLine,state.blkIndent,True)returnTrue