[文档]deftokenize(state:StateInline,silent:bool):"""Insert each marker as a separate text token, and add it to delimiter list"""start=state.posmarker=state.srcCharCode[start]ifsilent:returnFalseifmarker!=0x7E:# /* ~ */returnFalsescanned=state.scanDelims(state.pos,True)length=scanned.lengthch=chr(marker)iflength<2:returnFalseiflength%2:token=state.push("text","",0)token.content=chlength-=1i=0whilei<length:token=state.push("text","",0)token.content=ch+chstate.delimiters.append(Delimiter(**{"marker":marker,"length":0,# disable "rule of 3" length checks meant for emphasis"jump":i//2,# for `~~` 1 marker = 2 characters"token":len(state.tokens)-1,"end":-1,"open":scanned.can_open,"close":scanned.can_close,}))i+=2state.pos+=scanned.lengthreturnTrue
def_postProcess(state:StateInline,delimiters:List[Delimiter]):loneMarkers=[]maximum=len(delimiters)i=0whilei<maximum:startDelim=delimiters[i]ifstartDelim.marker!=0x7E:# /* ~ */i+=1continueifstartDelim.end==-1:i+=1continueendDelim=delimiters[startDelim.end]token=state.tokens[startDelim.token]token.type="s_open"token.tag="s"token.nesting=1token.markup="~~"token.content=""token=state.tokens[endDelim.token]token.type="s_close"token.tag="s"token.nesting=-1token.markup="~~"token.content=""if(state.tokens[endDelim.token-1].type=="text"andstate.tokens[endDelim.token-1].content=="~"):loneMarkers.append(endDelim.token-1)i+=1# If a marker sequence has an odd number of characters, it's splitted# like this: `~~~~~` -> `~` + `~~` + `~~`, leaving one marker at the# start of the sequence.## So, we have to move all those markers after subsequent s_close tags.#whileloneMarkers:i=loneMarkers.pop()j=i+1while(j<len(state.tokens))and(state.tokens[j].type=="s_close"):j+=1j-=1ifi!=j:token=state.tokens[j]state.tokens[j]=state.tokens[i]state.tokens[i]=token
[文档]defpostProcess(state:StateInline):"""Walk through delimiter list and replace text tokens with tags."""tokens_meta=state.tokens_metamaximum=len(state.tokens_meta)_postProcess(state,state.delimiters)curr=0whilecurr<maximum:try:curr_meta=tokens_meta[curr]exceptIndexError:passelse:ifcurr_metaand"delimiters"incurr_meta:_postProcess(state,curr_meta["delimiters"])curr+=1