| """Horizontal rule | |
| At least 3 of these characters on a line * - _ | |
| """ | |
| import logging | |
| from ..common.utils import isStrSpace | |
| from .state_block import StateBlock | |
| LOGGER = logging.getLogger(__name__) | |
| def hr(state: StateBlock, startLine: int, endLine: int, silent: bool) -> bool: | |
| LOGGER.debug("entering hr: %s, %s, %s, %s", state, startLine, endLine, silent) | |
| pos = state.bMarks[startLine] + state.tShift[startLine] | |
| maximum = state.eMarks[startLine] | |
| if state.is_code_block(startLine): | |
| return False | |
| try: | |
| marker = state.src[pos] | |
| except IndexError: | |
| return False | |
| pos += 1 | |
| # Check hr marker | |
| if marker not in ("*", "-", "_"): | |
| return False | |
| # markers can be mixed with spaces, but there should be at least 3 of them | |
| cnt = 1 | |
| while pos < maximum: | |
| ch = state.src[pos] | |
| pos += 1 | |
| if ch != marker and not isStrSpace(ch): | |
| return False | |
| if ch == marker: | |
| cnt += 1 | |
| if cnt < 3: | |
| return False | |
| if silent: | |
| return True | |
| state.line = startLine + 1 | |
| token = state.push("hr", "hr", 0) | |
| token.map = [startLine, state.line] | |
| token.markup = marker * (cnt + 1) | |
| return True | |