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