From b593c0148bbc13d52eecd6509d757c1638fd31e3 Mon Sep 17 00:00:00 2001 From: erjemin Date: Tue, 13 May 2025 16:04:26 +0300 Subject: [PATCH] =?UTF-8?q?add:=20=D1=80=D1=83=D1=81=D1=81=D0=BA=D0=B0?= =?UTF-8?q?=D1=8F=20=D0=B4=D0=BE=D1=80=D0=B5=D0=B2=D0=BE=D0=BB=D1=8E=D1=86?= =?UTF-8?q?=D0=B8=D0=BE=D0=BD=D0=BD=D0=B0=D1=8F=20=D0=BE=D1=80=D1=84=D0=BE?= =?UTF-8?q?=D0=B3=D1=80=D0=B0=D1=84=D0=B8=D1=8F=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D0=BD=D0=BE=D1=81=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- etpgrf/config.py | 3 ++- etpgrf/hyphenation.py | 22 ++++++++++++++-------- 3 files changed, 17 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 65b57e7..510ccb1 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ | in progress // в процессе разработки | |--------------------------------------| -| -----4 | +| ------5 | # Типограф для Web diff --git a/etpgrf/config.py b/etpgrf/config.py index 53f5bf4..200a3d5 100644 --- a/etpgrf/config.py +++ b/etpgrf/config.py @@ -9,8 +9,9 @@ MODE_MIXED = "mixed" # Языки, поддерживаемые библиотекой LANG_RU = 'ru' # Русский +LANG_RU_OLD = 'ru-old' # Русская дореволюционная орфография LANG_EN = 'en' # Английский -SUPPORTED_LANGS = frozenset([LANG_RU, LANG_EN]) +SUPPORTED_LANGS = frozenset([LANG_RU, LANG_RU_OLD, LANG_EN]) # Язык(и) по умолчанию, если не указаны пользователем и не заданы через ETPGRF_DEFAULT_LANGS_MODULE # DEFAULT_LANGS = LANG_RU diff --git a/etpgrf/hyphenation.py b/etpgrf/hyphenation.py index 09a86e2..5038781 100755 --- a/etpgrf/hyphenation.py +++ b/etpgrf/hyphenation.py @@ -1,5 +1,5 @@ import regex -from etpgrf.config import LANG_RU, LANG_EN, SHY_ENTITIES, MODE_UNICODE +from etpgrf.config import LANG_RU, LANG_RU_OLD, LANG_EN, SHY_ENTITIES, MODE_UNICODE from etpgrf.defaults import etpgrf_settings from etpgrf.comutil import parse_and_validate_mode, parse_and_validate_langs @@ -7,10 +7,10 @@ _RU_VOWELS_UPPER = frozenset(['А', 'О', 'И', 'Е', 'Ё', 'Э', 'Ы', 'У', ' _RU_CONSONANTS_UPPER = frozenset(['Б', 'В', 'Г', 'Д', 'Ж', 'З', 'К', 'Л', 'М', 'Н', 'П', 'Р', 'С', 'Т', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ']) _RU_J_SOUND_UPPER = frozenset(['Й']) _RU_SIGNS_UPPER = frozenset(['Ь', 'Ъ']) -_RU_OLD_I_DESYAT = frozenset(['І']) # И-десятеричное -_RU_OLD_YAT = frozenset(['Ѣ']) # Ять -_RU_OLD_FITA = frozenset(['Ѳ']) # Фита -_RU_OLD_IZHITSA = frozenset(['Ѵ']) # Ижица (может быть и гласной, и согласной - сложный случай!) +_RU_OLD_VOWELS_UPPER = frozenset(['І', # И-десятеричное (гласная) + 'Ѣ']) # Ять (гласная) +_RU_OLD_CONSONANTS_UPPER = frozenset(['Ѳ', # Фита (согласная) + 'Ѵ']) # Ижица (может быть и гласной, и согласной - сложный случай!) _EN_VOWELS_UPPER = frozenset(['A', 'E', 'I', 'O', 'U', 'Æ', 'Œ']) @@ -51,7 +51,13 @@ class Hyphenator: self._consonants |= _RU_CONSONANTS_UPPER self._j_sound_upper |= _RU_J_SOUND_UPPER self._signs_upper |= _RU_SIGNS_UPPER - self._ru_alphabet_upper |= _RU_VOWELS_UPPER | _RU_CONSONANTS_UPPER | _RU_SIGNS_UPPER | _RU_J_SOUND_UPPER + self._ru_alphabet_upper |= self._vowels | self._consonants | self._j_sound_upper | self._signs_upper + if LANG_RU_OLD in self.langs: + self._vowels |= _RU_VOWELS_UPPER | _RU_OLD_VOWELS_UPPER + self._consonants |= _RU_CONSONANTS_UPPER | _RU_OLD_CONSONANTS_UPPER + self._j_sound_upper |= _RU_J_SOUND_UPPER + self._signs_upper |= _RU_SIGNS_UPPER + self._ru_alphabet_upper |= self._vowels | self._consonants | self._j_sound_upper | self._signs_upper if LANG_EN in self.langs: self._vowels |= _EN_VOWELS_UPPER self._consonants |= _EN_CONSONANTS_UPPER @@ -97,8 +103,8 @@ class Hyphenator: print("слово:", word, " // mode:", self.mode, " // langs:", self.langs) # 2. ОБНАРУЖЕНИЕ ЯЗЫКА И ПОДКЛЮЧЕНИЕ ЯЗЫКОВОЙ ЛОГИКИ # Поиск вхождения букв строки (слова) через `frozenset` -- O(1). Это быстрее регулярного выражения -- O(n) - # 2.1. Проверяем RU - if LANG_RU in self.langs and frozenset(word.upper()) <= self._ru_alphabet_upper: + # 2.1. Проверяем RU и RU_OLD (правила одинаковые, но разные наборы букв) + if (LANG_RU in self.langs or LANG_RU_OLD in self.langs) and frozenset(word.upper()) <= self._ru_alphabet_upper: # Пользователь подключил русскую логику, и слово содержит только русские буквы print(f"#### Applying Russian rules to: {word}") # Поиск допустимой позиции для переноса около заданного индекса