[文档]deflinkify(state:StateCore)->None:blockTokens=state.tokensifnotstate.md.options.linkify:returnifnotstate.md.linkify:raiseModuleNotFoundError("Linkify enabled but not installed.")forjinrange(len(blockTokens)):ifblockTokens[j].type!="inline"ornotstate.md.linkify.pretest(blockTokens[j].content):continuetokens=blockTokens[j].childrenhtmlLinkLevel=0# We scan from the end, to keep position when new tags added.# Use reversed logic in links start/end matchasserttokensisnotNonei=len(tokens)whilei>=1:i-=1assertisinstance(tokens,list)currentToken=tokens[i]# Skip content of markdown linksifcurrentToken.type=="link_close":i-=1while(tokens[i].level!=currentToken.levelandtokens[i].type!="link_open"):i-=1continue# Skip content of html tag linksifcurrentToken.type=="html_inline":ifisLinkOpen(currentToken.content)andhtmlLinkLevel>0:htmlLinkLevel-=1ifisLinkClose(currentToken.content):htmlLinkLevel+=1ifhtmlLinkLevel>0:continueifcurrentToken.type=="text"andstate.md.linkify.test(currentToken.content):text=currentToken.contentlinks=state.md.linkify.match(text)# Now split string to nodesnodes=[]level=currentToken.levellastPos=0forlninrange(len(links)):url=links[ln].urlfullUrl=state.md.normalizeLink(url)ifnotstate.md.validateLink(fullUrl):continueurlText=links[ln].text# Linkifier might send raw hostnames like "example.com", where url# starts with domain name. So we prepend http:// in those cases,# and remove it afterwards.ifnotlinks[ln].schema:urlText=HTTP_RE.sub("",state.md.normalizeLinkText("http://"+urlText))eliflinks[ln].schema=="mailto:"andTEST_MAILTO_RE.search(urlText):urlText=MAILTO_RE.sub("",state.md.normalizeLinkText("mailto:"+urlText))else:urlText=state.md.normalizeLinkText(urlText)pos=links[ln].indexifpos>lastPos:token=Token("text","",0)token.content=text[lastPos:pos]token.level=levelnodes.append(token)token=Token("link_open","a",1)token.attrs={"href":fullUrl}token.level=levellevel+=1token.markup="linkify"token.info="auto"nodes.append(token)token=Token("text","",0)token.content=urlTexttoken.level=levelnodes.append(token)token=Token("link_close","a",-1)level-=1token.level=leveltoken.markup="linkify"token.info="auto"nodes.append(token)lastPos=links[ln].last_indexiflastPos<len(text):token=Token("text","",0)token.content=text[lastPos:]token.level=levelnodes.append(token)blockTokens[j].children=tokens=arrayReplaceAt(tokens,i,nodes)