From 4d9f4a798e93f35682c55603f788e408a0260aae Mon Sep 17 00:00:00 2001 From: erjemin Date: Sun, 11 May 2025 23:00:08 +0300 Subject: [PATCH] =?UTF-8?q?add:=20=D0=BD=D0=B0=D1=81=D0=BB=D0=B5=D0=B4?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20lang/mode=20=D0=BF=D1=80?= =?UTF-8?q?=D0=B8=20=D1=80=D0=B0=D1=81=D1=81=D1=82=D0=B0=D0=BD=D0=BE=D0=B2?= =?UTF-8?q?=D0=BA=D0=B5=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BD=D0=BE=D1=81=D0=B0?= =?UTF-8?q?=D1=85=20=D0=B2=20=D0=BA=D0=BE=D0=BD=D0=B2=D0=B5=D0=B9=D0=B5?= =?UTF-8?q?=D1=80=D0=B5=20=D0=A2=D0=B8=D0=BF=D0=BE=D0=B3=D1=80=D0=B0=D1=84?= =?UTF-8?q?=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- etpgrf/hyphenation.py | 4 ++-- etpgrf/typograph.py | 24 ++++++++++++++++-------- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/etpgrf/hyphenation.py b/etpgrf/hyphenation.py index 3118b2f..a817dbf 100755 --- a/etpgrf/hyphenation.py +++ b/etpgrf/hyphenation.py @@ -15,8 +15,8 @@ class Hyphenator: """Правила расстановки переносов для разных языков. """ def __init__(self, - langs: frozenset[str] = DEFAULT_LANGS, # Языки, которые обрабатываем в переносе слов - mode: str = DEFAULT_MODE, # Режим обработки текста + langs: frozenset[str] = None, # Языки, которые обрабатываем в переносе слов + mode: str = None, # Режим обработки текста max_unhyphenated_len: int = 14, # Максимальная длина непереносимой группы min_chars_per_part: int = 3): # Минимальная длина после переноса (хвост, который разрешено переносить) self.langs: frozenset[str] = parse_and_validate_langs(langs) diff --git a/etpgrf/typograph.py b/etpgrf/typograph.py index bf5233b..fa9906e 100644 --- a/etpgrf/typograph.py +++ b/etpgrf/typograph.py @@ -1,13 +1,13 @@ -from etpgrf.config import DEFAULT_MODE, DEFAULT_LANGS from etpgrf.comutil import parce_and_validate_mode, parse_and_validate_langs from etpgrf.hyphenation import Hyphenator +import copy # --- Основной класс Typographer --- class Typographer: def __init__(self, - langs: str | list[str] | tuple[str, ...] | frozenset[str] = DEFAULT_LANGS, - mode: str = DEFAULT_MODE, + langs: str | list[str] | tuple[str, ...] | frozenset[str] | None = None, + mode: str | None = None, hyphenation_rule: Hyphenator | None = None, # Перенос слов и параметры расстановки переносов # glue_prepositions_rule: GluePrepositionsRule | None = None, # Для других правил # ... другие модули правил ... @@ -20,16 +20,24 @@ class Typographer: self.mode: str = parce_and_validate_mode(mode) # Сохраняем переданные модули правил - self.hyphenation_rule = hyphenation_rule + if hyphenation_rule is not None: + # 1. Создаем поверхностную копию объекта hyphenation_rule. + self.hyphenation_rule = copy.copy(hyphenation_rule) + # 2. Наследуем режим типографа, если он не задан в hyphenation_rule. + if self.hyphenation_rule.mode is None: + self.hyphenation_rule.mode = self.mode + # 2. Наследуем языки от типографа, если они не заданы в hyphenation_rule. + if self.hyphenation_rule.langs is None: + self.hyphenation_rule.langs = self.langs + else: + self.hyphenation_rule = hyphenation_rule + # Конвейер для обработки текста def process(self, text: str) -> str: processed_text = text if self.hyphenation_rule: - # Передаем активные языки и символ переноса, если модуль Hyphenator - # не получает их в своем __init__ напрямую от пользователя, - # а конструируется с настройками по умолчанию, а потом конфигурируется. - # В нашем примере Hyphenator уже получает их в __init__. + # Обработчик переносов (Hyphenator) активен. Обрабатываем текст... processed_text = self.hyphenation_rule.hyp_in_text(processed_text) # if self.glue_prepositions_rule: