"""Чистка wiki-текстов от навигационного и служебного markdown-мусора.""" import re RETURN_TO_RE = re.compile(r"^\*\*\s*Вернуться на\s*:?\s*\*\*\s*:?$") LINK_ONLY_RE = re.compile(r"^\[[^\]\n]+\]\([^\)\n]+\)$") SOURCE_NOTE_RE = re.compile(r"^_Источник\s*:.*_$") INLINE_LINK_RE = re.compile(r"\[([^\]\n]+)\]\([^\)\n]+\)") MULTI_BLANK_RE = re.compile(r"\n{3,}") def clean_markdown_text(text: str) -> str: """Удаляет навигационный мусор и раскрывает инлайн-ссылки. Правила: - Строка `**Вернуться на:**` — выбрасывается. - Строка, целиком состоящая из markdown-ссылки `[x](url)` — выбрасывается (это навигация). - Строка `_Источник: .../file.md_` — выбрасывается. - Инлайн-ссылки в теле `[текст](url)` заменяются на `текст`. - 3+ подряд переносов строк сжимаются до 2. """ if not text: return "" lines = text.split("\n") cleaned_lines = [] for line in lines: stripped = line.strip() if RETURN_TO_RE.match(stripped): continue if LINK_ONLY_RE.match(stripped): continue if SOURCE_NOTE_RE.match(stripped): continue cleaned_lines.append(line) text = "\n".join(cleaned_lines) text = INLINE_LINK_RE.sub(r"\1", text) text = MULTI_BLANK_RE.sub("\n\n", text) return text.strip()