| """Proceess '\n'.""" | |
| from ..common.utils import charStrAt, isStrSpace | |
| from .state_inline import StateInline | |
| def newline(state: StateInline, silent: bool) -> bool: | |
| pos = state.pos | |
| if state.src[pos] != "\n": | |
| return False | |
| pmax = len(state.pending) - 1 | |
| maximum = state.posMax | |
| # ' \n' -> hardbreak | |
| # Lookup in pending chars is bad practice! Don't copy to other rules! | |
| # Pending string is stored in concat mode, indexed lookups will cause | |
| # conversion to flat mode. | |
| if not silent: | |
| if pmax >= 0 and charStrAt(state.pending, pmax) == " ": | |
| if pmax >= 1 and charStrAt(state.pending, pmax - 1) == " ": | |
| # Find whitespaces tail of pending chars. | |
| ws = pmax - 1 | |
| while ws >= 1 and charStrAt(state.pending, ws - 1) == " ": | |
| ws -= 1 | |
| state.pending = state.pending[:ws] | |
| state.push("hardbreak", "br", 0) | |
| else: | |
| state.pending = state.pending[:-1] | |
| state.push("softbreak", "br", 0) | |
| else: | |
| state.push("softbreak", "br", 0) | |
| pos += 1 | |
| # skip heading spaces for next line | |
| while pos < maximum and isStrSpace(state.src[pos]): | |
| pos += 1 | |
| state.pos = pos | |
| return True | |