From 9e5488ec26e2700ef2c8e0f75a81560af35692af Mon Sep 17 00:00:00 2001 From: erjemin Date: Sun, 11 May 2025 02:22:26 +0300 Subject: [PATCH] add: minor . --- etpgrf/hyphenation.py | 34 +++++++++++++++++----------------- main.py | 4 +++- 2 files changed, 20 insertions(+), 18 deletions(-) diff --git a/etpgrf/hyphenation.py b/etpgrf/hyphenation.py index a77a6eb..ed5d67c 100755 --- a/etpgrf/hyphenation.py +++ b/etpgrf/hyphenation.py @@ -19,10 +19,10 @@ class HyphenationRule: """ def __init__(self, langs: frozenset[str], # Языки, которые обрабатываем в переносе слов - max_len_hyphenation_not_required: int = 14, # Максимальная длина непереносимой группы + max_unhyphenated_len: int = 14, # Максимальная длина непереносимой группы min_chars_per_part: int = 3): # Минимальная длина после переноса (хвост, который разрешено переносить) self.langs = langs - self.max_len_hyphenation__not_required = max_len_hyphenation_not_required + self.max_unhyphenated_len = max_unhyphenated_len self.min_chars_per_part = min_chars_per_part # Внутренние языковые ресурсы, если нужны специфично для переносов @@ -80,24 +80,24 @@ class HyphenationRule: """ # Поиск допустимой позиции для переноса около заданного индекса - def find_hyphen_point(word_2find_point: str, start_idx: int) -> int: - vow_indices = [i for i, char_w in enumerate(word_2find_point) if self._is_vow(char_w)] + def find_hyphen_point(word_segment: str, start_idx: int) -> int: + vow_indices = [i for i, char_w in enumerate(word_segment) if self._is_vow(char_w)] if not vow_indices: # Если в слове нет гласных, то перенос невозможен return -1 # Ищем ближайшую гласную до или после start_idx for i in vow_indices: - if i >= start_idx - self.min_chars_per_part and i + self.min_chars_per_part < len(word_2find_point): + if i >= start_idx - self.min_chars_per_part and i + self.min_chars_per_part < len(word_segment): # Проверяем, что после гласной есть минимум символов "хвоста" ind = i + 1 - if (self._is_cons(word_2find_point[ind]) or self._is_j_sound(word_2find_point[ind])) and not self._is_vow(word_2find_point[ind + 1]): + if (self._is_cons(word_segment[ind]) or self._is_j_sound(word_segment[ind])) and not self._is_vow(word_segment[ind + 1]): # Й -- полугласная. Перенос после неё только в случае, если дальше идет согласная # (например, "бой-кий"), но запретить, если идет гласная (например, "ма-йка" не переносится). ind += 1 - if ind <= self.min_chars_per_part or ind >= len(word_2find_point) - self.min_chars_per_part: + if ind <= self.min_chars_per_part or ind >= len(word_segment) - self.min_chars_per_part: # Не отделяем 3 символ с начала или конца (это некрасиво) continue - if self._is_sign(word_2find_point[ind]) or self._is_sign(word_2find_point[-1]): + if self._is_sign(word_segment[ind]) or self._is_sign(word_segment[-1]): # Пропускаем мягкий/твердый знак. Согласно правилам русской типографики (например, ГОСТ 7.62-2008 # или рекомендации по набору текста), перенос не должен разрывать слово так, чтобы мягкий или # твердый знак оказывался в начале или конце строки @@ -106,23 +106,23 @@ class HyphenationRule: return -1 # Не нашли подходящую позицию # Рекурсивное деление слова - def split_word(word_to_hyphenation: str) -> str: - if len(word_to_hyphenation) <= self.max_len_hyphenation__not_required: # Если длина укладывается в лимит, перенос не нужен - return word_to_hyphenation + def split_word(word_to_split: str) -> str: + if len(word_to_split) <= self.max_unhyphenated_len: # Если длина укладывается в лимит, перенос не нужен + return word_to_split - hyphen_idx = find_hyphen_point(word_to_hyphenation, len(word_to_hyphenation) // 2) # Ищем точку переноса около середины + hyphen_idx = find_hyphen_point(word_to_split, len(word_to_split) // 2) # Ищем точку переноса около середины if hyphen_idx == -1: # Если не нашли точку переноса - return word_to_hyphenation + return word_to_split - left_part = word_to_hyphenation[:hyphen_idx] - right_part = word_to_hyphenation[hyphen_idx:] + left_part = word_to_split[:hyphen_idx] + right_part = word_to_split[hyphen_idx:] # Рекурсивно делим левую и правую части return split_word(left_part) + "-­" + split_word(right_part) # Основная логика - if len(word) <= self.max_len_hyphenation__not_required or not any(self._is_vow(c) for c in word): + if len(word) <= self.max_unhyphenated_len or not any(self._is_vow(c) for c in word): # Короткое слово или без гласных "делению не подлежит", выходим из рекурсии return word return split_word(word) # Рекурсивно делим слово на части с переносами @@ -136,7 +136,7 @@ class HyphenationRule: """ rus_worlds = regex.findall(r'\b[а-яА-Я]+\b', text) # ищем все русскоязычные слова в тексте for word in rus_worlds: - if len(word) > self.max_len_hyphenation__not_required: + if len(word) > self.max_unhyphenated_len: hyphenated_word = self.hyphenation_in_word(word) print(f'{word} -> {hyphenated_word}') text = text.replace(word, hyphenated_word) diff --git a/main.py b/main.py index 1535c35..52d14cd 100644 --- a/main.py +++ b/main.py @@ -6,10 +6,12 @@ if __name__ == '__main__': # --- Пример использования --- print("\n--- Пример использования класса---\n") # Определяем пользовательские правила переносов - hyphen_settings = HyphenationRule(langs=frozenset(['ru']), max_len_hyphenation_not_required=8) + hyphen_settings = HyphenationRule(langs=frozenset(['ru']), max_unhyphenated_len=8) # Определяем пользовательские правила типографа typo = Typographer(langs='ru', code_out='utf-8', hyphenation_rule=hyphen_settings) + result = hyphen_settings.apply(text="Бармалейщина") + print(result, "\n\n") result = typo.process(text="Какой-то длинный текст для проверки переносов. Перпердикюляция!") print(result, "\n\n") result = typo.process(text="Привет, World! Это тестовый текст для проверки расстановки переносов в словах. Миллион 100-метровошеих жирножирафов.")