[文档]deftext_collapse(state:StateInline,*args):""" Clean up tokens after emphasis and strikethrough postprocessing: merge adjacent text nodes into one and re-calculate all token levels This is necessary because initially emphasis delimiter markers (``*, _, ~``) are treated as their own separate text tokens. Then emphasis rule either leaves them as text (needed to merge with adjacent text) or turns them into opening/closing tags (which messes up levels inside). """level=0maximum=len(state.tokens)curr=last=0whilecurr<maximum:# re-calculate levels after emphasis/strikethrough turns some text nodes# into opening/closing tagsifstate.tokens[curr].nesting<0:level-=1# closing tagstate.tokens[curr].level=levelifstate.tokens[curr].nesting>0:level+=1# opening tagif(state.tokens[curr].type=="text"andcurr+1<maximumandstate.tokens[curr+1].type=="text"):# collapse two adjacent text nodesstate.tokens[curr+1].content=(state.tokens[curr].content+state.tokens[curr+1].content)else:ifcurr!=last:state.tokens[last]=state.tokens[curr]last+=1curr+=1ifcurr!=last:delstate.tokens[last:]