from typing import NamedTuple, Callable, List, Tuple, Optional import re class LintIssue(NamedTuple): code: str msg: str span: Tuple[int,int] autofix: Optional[Callable[[str], str]] = None severity: str = "warning" # info/warning/error _LINT_RULES: List[Callable[[str], List[LintIssue]]] = [] def register_rule(fn): _LINT_RULES.append(fn) return fn def run_lints(text: str) -> List[LintIssue]: issues: List[LintIssue] = [] for rule in _LINT_RULES: try: issues.extend(rule(text)) except Exception: # безопасно пропускаем сбойное правило continue return issues @register_rule def r_break_spacing(s: str): issues = [] for m in re.finditer(r'(?