add: minor .
This commit is contained in:
parent
30368cedfd
commit
9e5488ec26
@ -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)
|
||||
|
4
main.py
4
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! Это <i>тестовый текст для проверки расстановки</i> переносов в словах. Миллион 100-метровошеих жирножирафов.")
|
||||
|
Loading…
x
Reference in New Issue
Block a user