add: русская дореволюционная орфография для переносов

This commit is contained in:
Sergei Erjemin 2025-05-13 16:04:26 +03:00
parent 5390e0583e
commit b593c0148b
3 changed files with 17 additions and 10 deletions

View File

@ -1,6 +1,6 @@
| in progress // в процессе разработки | | in progress // в процессе разработки |
|--------------------------------------| |--------------------------------------|
| -----4 | | ------5 |
# Типограф для Web # Типограф для Web

View File

@ -9,8 +9,9 @@ MODE_MIXED = "mixed"
# Языки, поддерживаемые библиотекой # Языки, поддерживаемые библиотекой
LANG_RU = 'ru' # Русский LANG_RU = 'ru' # Русский
LANG_RU_OLD = 'ru-old' # Русская дореволюционная орфография
LANG_EN = 'en' # Английский LANG_EN = 'en' # Английский
SUPPORTED_LANGS = frozenset([LANG_RU, LANG_EN]) SUPPORTED_LANGS = frozenset([LANG_RU, LANG_RU_OLD, LANG_EN])
# Язык(и) по умолчанию, если не указаны пользователем и не заданы через ETPGRF_DEFAULT_LANGS_MODULE # Язык(и) по умолчанию, если не указаны пользователем и не заданы через ETPGRF_DEFAULT_LANGS_MODULE
# DEFAULT_LANGS = LANG_RU # DEFAULT_LANGS = LANG_RU

View File

@ -1,5 +1,5 @@
import regex 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.defaults import etpgrf_settings
from etpgrf.comutil import parse_and_validate_mode, parse_and_validate_langs 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_CONSONANTS_UPPER = frozenset(['Б', 'В', 'Г', 'Д', 'Ж', 'З', 'К', 'Л', 'М', 'Н', 'П', 'Р', 'С', 'Т', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ'])
_RU_J_SOUND_UPPER = frozenset(['Й']) _RU_J_SOUND_UPPER = frozenset(['Й'])
_RU_SIGNS_UPPER = frozenset(['Ь', 'Ъ']) _RU_SIGNS_UPPER = frozenset(['Ь', 'Ъ'])
_RU_OLD_I_DESYAT = frozenset(['І']) # И-десятеричное _RU_OLD_VOWELS_UPPER = frozenset(['І', # И-десятеричное (гласная)
_RU_OLD_YAT = frozenset(['Ѣ']) # Ять 'Ѣ']) # Ять (гласная)
_RU_OLD_FITA = frozenset(['Ѳ']) # Фита _RU_OLD_CONSONANTS_UPPER = frozenset(['Ѳ', # Фита (согласная)
_RU_OLD_IZHITSA = frozenset(['Ѵ']) # Ижица (может быть и гласной, и согласной - сложный случай!) 'Ѵ']) # Ижица (может быть и гласной, и согласной - сложный случай!)
_EN_VOWELS_UPPER = frozenset(['A', 'E', 'I', 'O', 'U', 'Æ', 'Œ']) _EN_VOWELS_UPPER = frozenset(['A', 'E', 'I', 'O', 'U', 'Æ', 'Œ'])
@ -51,7 +51,13 @@ class Hyphenator:
self._consonants |= _RU_CONSONANTS_UPPER self._consonants |= _RU_CONSONANTS_UPPER
self._j_sound_upper |= _RU_J_SOUND_UPPER self._j_sound_upper |= _RU_J_SOUND_UPPER
self._signs_upper |= _RU_SIGNS_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: if LANG_EN in self.langs:
self._vowels |= _EN_VOWELS_UPPER self._vowels |= _EN_VOWELS_UPPER
self._consonants |= _EN_CONSONANTS_UPPER self._consonants |= _EN_CONSONANTS_UPPER
@ -97,8 +103,8 @@ class Hyphenator:
print("слово:", word, " // mode:", self.mode, " // langs:", self.langs) print("слово:", word, " // mode:", self.mode, " // langs:", self.langs)
# 2. ОБНАРУЖЕНИЕ ЯЗЫКА И ПОДКЛЮЧЕНИЕ ЯЗЫКОВОЙ ЛОГИКИ # 2. ОБНАРУЖЕНИЕ ЯЗЫКА И ПОДКЛЮЧЕНИЕ ЯЗЫКОВОЙ ЛОГИКИ
# Поиск вхождения букв строки (слова) через `frozenset` -- O(1). Это быстрее регулярного выражения -- O(n) # Поиск вхождения букв строки (слова) через `frozenset` -- O(1). Это быстрее регулярного выражения -- O(n)
# 2.1. Проверяем RU # 2.1. Проверяем RU и RU_OLD (правила одинаковые, но разные наборы букв)
if LANG_RU in self.langs and frozenset(word.upper()) <= self._ru_alphabet_upper: 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}") print(f"#### Applying Russian rules to: {word}")
# Поиск допустимой позиции для переноса около заданного индекса # Поиск допустимой позиции для переноса около заданного индекса