mod: Висячая пунктуация в конвейре

This commit is contained in:
2025-12-23 17:19:42 +03:00
parent 22ddf6ef11
commit 80dde55f42

View File

@@ -14,6 +14,7 @@ from etpgrf.quotes import QuotesProcessor
from etpgrf.layout import LayoutProcessor from etpgrf.layout import LayoutProcessor
from etpgrf.symbols import SymbolsProcessor from etpgrf.symbols import SymbolsProcessor
from etpgrf.sanitizer import SanitizerProcessor from etpgrf.sanitizer import SanitizerProcessor
from etpgrf.hanging import HangingPunctuationProcessor
from etpgrf.codec import decode_to_unicode, encode_from_unicode from etpgrf.codec import decode_to_unicode, encode_from_unicode
from etpgrf.config import PROTECTED_HTML_TAGS, SANITIZE_ALL_HTML from etpgrf.config import PROTECTED_HTML_TAGS, SANITIZE_ALL_HTML
@@ -34,6 +35,7 @@ class Typographer:
layout: LayoutProcessor | bool | None = True, # Правила для тире и спецсимволов layout: LayoutProcessor | bool | None = True, # Правила для тире и спецсимволов
symbols: SymbolsProcessor | bool | None = True, # Правила для псевдографики symbols: SymbolsProcessor | bool | None = True, # Правила для псевдографики
sanitizer: SanitizerProcessor | str | bool | None = None, # Правила очистки sanitizer: SanitizerProcessor | str | bool | None = None, # Правила очистки
hanging_punctuation: str | bool | list[str] | None = None, # Висячая пунктуация
# ... другие модули правил ... # ... другие модули правил ...
): ):
@@ -96,6 +98,11 @@ class Typographer:
elif sanitizer: # Если передана строка режима или True elif sanitizer: # Если передана строка режима или True
self.sanitizer = SanitizerProcessor(mode=sanitizer) self.sanitizer = SanitizerProcessor(mode=sanitizer)
# J. --- Конфигурация висячей пунктуации ---
self.hanging: HangingPunctuationProcessor | None = None
if hanging_punctuation:
self.hanging = HangingPunctuationProcessor(mode=hanging_punctuation)
# Z. --- Логирование инициализации --- # Z. --- Логирование инициализации ---
logger.debug(f"Typographer `__init__`: langs: {self.langs}, mode: {self.mode}, " logger.debug(f"Typographer `__init__`: langs: {self.langs}, mode: {self.mode}, "
f"hyphenation: {self.hyphenation is not None}, " f"hyphenation: {self.hyphenation is not None}, "
@@ -104,6 +111,7 @@ class Typographer:
f"layout: {self.layout is not None}, " f"layout: {self.layout is not None}, "
f"symbols: {self.symbols is not None}, " f"symbols: {self.symbols is not None}, "
f"sanitizer: {self.sanitizer is not None}, " f"sanitizer: {self.sanitizer is not None}, "
f"hanging: {self.hanging is not None}, "
f"process_html: {self.process_html}") f"process_html: {self.process_html}")
@@ -216,6 +224,11 @@ class Typographer:
# который применит все остальные правила к каждому текстовому узлу. # который применит все остальные правила к каждому текстовому узлу.
self._walk_tree(soup) self._walk_tree(soup)
# --- ЭТАП 4.5: Висячая пунктуация ---
# Применяем после всех текстовых преобразований, но перед финальной сборкой
if self.hanging:
self.hanging.process(soup)
# --- ЭТАП 5: Финальная сборка --- # --- ЭТАП 5: Финальная сборка ---
processed_html = str(soup) processed_html = str(soup)
# BeautifulSoup по умолчанию экранирует амперсанды (& -> &), которые мы сгенерировали # BeautifulSoup по умолчанию экранирует амперсанды (& -> &), которые мы сгенерировали