| 12345678910111213141516171819202122232425262728293031323334353637383940414243 |
- from .state_inline import StateInline
- def fragments_join(state: StateInline) -> None:
- """
- 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 = 0
- maximum = len(state.tokens)
- curr = last = 0
- while curr < maximum:
- # re-calculate levels after emphasis/strikethrough turns some text nodes
- # into opening/closing tags
- if state.tokens[curr].nesting < 0:
- level -= 1 # closing tag
- state.tokens[curr].level = level
- if state.tokens[curr].nesting > 0:
- level += 1 # opening tag
- if (
- state.tokens[curr].type == "text"
- and curr + 1 < maximum
- and state.tokens[curr + 1].type == "text"
- ):
- # collapse two adjacent text nodes
- state.tokens[curr + 1].content = (
- state.tokens[curr].content + state.tokens[curr + 1].content
- )
- else:
- if curr != last:
- state.tokens[last] = state.tokens[curr]
- last += 1
- curr += 1
- if curr != last:
- del state.tokens[last:]
|