mod: переименование переменных для символов

This commit is contained in:
2025-08-22 15:37:02 +03:00
parent 8e18c7802e
commit 39ef02884e
5 changed files with 119 additions and 73 deletions

View File

@@ -35,16 +35,61 @@ EN_ALPHABET_LOWER = frozenset([char.lower() for char in EN_ALPHABET_UPPER])
EN_ALPHABET_FULL = EN_ALPHABET_UPPER | EN_ALPHABET_LOWER EN_ALPHABET_FULL = EN_ALPHABET_UPPER | EN_ALPHABET_LOWER
# --- Специальные символы --- # --- Специальные символы ---
NBSP_CHAR = '\u00A0' # Неразрывный пробел ( ) CHAR_NBSP = '\u00a0' # Неразрывный пробел ( )
SHY_CHAR = '\u00AD' # Мягкий перенос (­) CHAR_SHY = '\u00ad' # Мягкий перенос (­)
RU_QUOT1_OPEN = '«' CHAR_NDASH = '\u2013' # Cреднее тире ( / –)
RU_QUOT1_CLOSE = '»' CHAR_MDASH = '\u2014' # Длинное тире (— / —)
RU_QUOT2_OPEN = '' CHAR_HELLIP = '\u2026' # Многоточие (… / …)
RU_QUOT2_CLOSE = '' CHAR_RU_QUOT1_OPEN = '«' # Русские кавычки открывающие (« / «)
EN_QUOT1_OPEN = '' CHAR_RU_QUOT1_CLOSE = '»'
EN_QUOT1_CLOSE = '' CHAR_RU_QUOT2_OPEN = ''
EN_QUOT2_OPEN = '' CHAR_RU_QUOT2_CLOSE = ''
EN_QUOT2_CLOSE = '' CHAR_EN_QUOT1_OPEN = ''
CHAR_EN_QUOT1_CLOSE = ''
CHAR_EN_QUOT2_OPEN = ''
CHAR_EN_QUOT2_CLOSE = ''
CHAR_COPY = '\u00a9' # Символ авторского права / © / ©
CHAR_REG = '\u00ae' # Зарегистрированная торговая марка / ® / ®
CHAR_COPYP = '\u2117' # Знак звуковой записи / ℗ / &copyp;
CHAR_TRADE = '\u2122' # Знак торговой марки / ™ / ™
CHAR_ARROW_LR_DOUBLE = '\u21d4' # Двойная двунаправленная стрелка / ⇔ / ⇔
CHAR_ARROW_L_DOUBLE = '\u21d0' # Двойная стрелка влево / ⇐ / ⇐
CHAR_ARROW_R_DOUBLE = '\u21d2' # Двойная стрелка вправо / ⇒ / ⇒
CHAR_AP = '\u2248' # Приблизительно равно / ≈ / ≈
CHAR_ARROW_L = '\u27f5' # Стрелка влево / ← / ←
CHAR_ARROW_R = '\u27f6' # Стрелка вправо / → / →
CHAR_ARROW_LR = '\u27f7' # Длинная двунаправленная стрелка ↔ / ↔
CHAR_ARROW_L_LONG_DOUBLE = '\u27f8' # Длинная двойная стрелка влево
CHAR_ARROW_R_LONG_DOUBLE = '\u27f9' # Длинная двойная стрелка вправо
CHAR_ARROW_LR_LONG_DOUBLE = '\u27fa' # Длинная двойная двунаправленная стрелка
# === КОНСТАНТЫ ПСЕВДОГРАФИКИ ===
# Для простых замен "строка -> символ" используем список кортежей.
# Порядок важен: более длинные последовательности должны идти раньше более коротких, которые
# могут быть их частью (например, '<---' до '---', а та, в свою очередь, до '--').
STR_TO_SYMBOL_REPLACEMENTS = [
# 5-символьные последовательности
('<===>', CHAR_ARROW_LR_LONG_DOUBLE), # Длинная двойная двунаправленная стрелка
# 4-символьные последовательности
('<===', CHAR_ARROW_L_LONG_DOUBLE), # Длинная двойная стрелка влево
('===>', CHAR_ARROW_R_LONG_DOUBLE), # Длинная двойная стрелка вправо
('<==>', CHAR_ARROW_LR_DOUBLE), # Двойная двунаправленная стрелка
('(tm)', CHAR_TRADE), ('(TM)', CHAR_TRADE), # Знак торговой марки (нижний и верхний регистр)
('<-->', CHAR_ARROW_LR), # Длинная двунаправленная стрелка
# 3-символьные последовательности
('<--', CHAR_ARROW_L), # Стрелка влево
('-->', CHAR_ARROW_R), # Стрелка вправо
('==>', CHAR_ARROW_R_DOUBLE), # Двойная стрелка вправо
('<==', CHAR_ARROW_L_DOUBLE), # Двойная стрелка влево
('---', CHAR_MDASH), # Длинное тире
('...', CHAR_HELLIP), # Многоточие
('(c)', CHAR_COPY), ('(C)', CHAR_COPY), # Знак авторского права (нижний и верхний регистр)
('(r)', CHAR_REG), ('(R)', CHAR_REG), # Знак зарегистрированной торговой марки (нижний и верхний регистр)
('(p)', CHAR_COPYP), ('(P)', CHAR_COPYP), # Знак права на звукозапись (нижний и верхний регистр)
# 2-символьные последовательности
('--', CHAR_NDASH), # Среднее тире (дефисные соединения и диапазоны)
('~=', CHAR_AP), # Приблизительно равно (≈)
]
# === КОНСТАНТЫ ДЛЯ КОДИРОВАНИЯ HTML-МНЕМНОИКОВ === # === КОНСТАНТЫ ДЛЯ КОДИРОВАНИЯ HTML-МНЕМНОИКОВ ===
# --- ЧЕРНЫЙ СПИСОК: Символы, которые НИКОГДА не нужно кодировать в мнемоники --- # --- ЧЕРНЫЙ СПИСОК: Символы, которые НИКОГДА не нужно кодировать в мнемоники ---
@@ -57,8 +102,8 @@ NEVER_ENCODE_CHARS = (frozenset(['!', '#', '%', '(', ')', '*', ',', '.', '/', ':
# которые не видны, на глаз и не отличимы друг от друга в обычном тексте, или очень специфичные # которые не видны, на глаз и не отличимы друг от друга в обычном тексте, или очень специфичные
SAFE_MODE_CHARS_TO_MNEMONIC = frozenset([ SAFE_MODE_CHARS_TO_MNEMONIC = frozenset([
'<', '>', '&', '"', '\'', '<', '>', '&', '"', '\'',
SHY_CHAR, # Мягкий перенос (Soft Hyphen) -- &shy; CHAR_SHY, # Мягкий перенос (Soft Hyphen) -- &shy;
NBSP_CHAR, # Неразрывный пробел (Non-Breaking Space) -- &nbsp; CHAR_NBSP, # Неразрывный пробел (Non-Breaking Space) -- &nbsp;
'\u2002', # Полужирный пробел (En Space) -- &ensp; '\u2002', # Полужирный пробел (En Space) -- &ensp;
'\u2003', # Широкий пробел (Em Space) -- &emsp; '\u2003', # Широкий пробел (Em Space) -- &emsp;
'\u2007', # Цифровой пробел -- &numsp; '\u2007', # Цифровой пробел -- &numsp;
@@ -109,13 +154,13 @@ CUSTOM_ENCODE_MAP = {
# '\u007b': '&lcub;', # { / &lcub; / &lbrace; # '\u007b': '&lcub;', # { / &lcub; / &lbrace;
# '\u007d': '&rcub;', # } / &rcub; / &rbrace; # '\u007d': '&rcub;', # } / &rcub; / &rbrace;
# '\u007c': '&vert;', # | / &vert; / &verbar; / &VerticalLine; # '\u007c': '&vert;', # | / &vert; / &verbar; / &VerticalLine;
# '\u0026': '&amp;', # & / &amp; / &AMP; CHAR_NBSP: '&nbsp;', # / &nbsp; / &NonBreakingSpace;
# NBSP_CHAR: '&nbsp;', # / &nbsp; / &NonBreakingSpace; CHAR_REG: '&reg;', # ® / &reg; / &REG; / &circledR;
CHAR_COPY: '&copy;', # © / &copy; / &COPY;
'\u0022': '&quot;', # " / &quot; / &QUOT; '\u0022': '&quot;', # " / &quot; / &QUOT;
'\u0026': '&amp;', # & / &amp; / &AMP; '\u0026': '&amp;', # & / &amp; / &AMP;
'\u003e': '&gt;', # > / &gt; / &GT; '\u003e': '&gt;', # > / &gt; / &GT;
'\u003c': '&lt;', # < / &LT; / &lt; '\u003c': '&lt;', # < / &lt; / &LT;
'\u00ae': '&reg;', # ® / &reg; / &REG; / &circledR;
'\u00b7': '&middot;', # · / &middot; / &centerdot; / &CenterDot; '\u00b7': '&middot;', # · / &middot; / &centerdot; / &CenterDot;
'\u0060': '&grave;', # ` / &grave; / &DiacriticalGrave; '\u0060': '&grave;', # ` / &grave; / &DiacriticalGrave;
'\u00a8': '&die;', # ¨ / &die; / &Dot; / &uml; / &DoubleDot; '\u00a8': '&die;', # ¨ / &die; / &Dot; / &uml; / &DoubleDot;
@@ -127,7 +172,7 @@ CUSTOM_ENCODE_MAP = {
'\u2207': '&Del;', # ∇ / &Del; / &nabla; '\u2207': '&Del;', # ∇ / &Del; / &nabla;
'\u2061': '&af;', # / &af; / &ApplyFunction; '\u2061': '&af;', # / &af; / &ApplyFunction;
'\u2221': '&angmsd;', # ∡ / &angmsd; / &measuredangle; '\u2221': '&angmsd;', # ∡ / &angmsd; / &measuredangle;
'\u2248': '&ap;', # ≈ / &ap; / &thkap; / &approx; / &TildeTilde; / &thickapprox; CHAR_AP: '&ap;', # ≈ / &ap; / &thkap; / &approx; / &TildeTilde; / &thickapprox;
'\u224a': '&ape;', # ≊ / &ape; / &approxeq; '\u224a': '&ape;', # ≊ / &ape; / &approxeq;
'\u2254': '&Assign;', # ≔ / &Assign; / &colone; / &coloneq; '\u2254': '&Assign;', # ≔ / &Assign; / &colone; / &coloneq;
'\u224d': '&CupCap;', # ≍ / &CupCap; / &asympeq; '\u224d': '&CupCap;', # ≍ / &CupCap; / &asympeq;
@@ -228,12 +273,12 @@ CUSTOM_ENCODE_MAP = {
'\u2214': '&plusdo;', # ∔ / &plusdo; / &dotplus; '\u2214': '&plusdo;', # ∔ / &plusdo; / &dotplus;
'\u22a1': '&sdotb;', # ⊡ / &sdotb; / &dotsquare; '\u22a1': '&sdotb;', # ⊡ / &sdotb; / &dotsquare;
'\u21d3': '&dArr;', # ⇓ / &dArr; / &Downarrow; / &DoubleDownArrow; '\u21d3': '&dArr;', # ⇓ / &dArr; / &Downarrow; / &DoubleDownArrow;
'\u21d0': '&lArr;', # / &lArr; / &Leftarrow; / &DoubleLeftArrow; CHAR_ARROW_R_DOUBLE: '&rArr;', # / &rArr; / &Implies; / &Rightarrow; / &DoubleRightArrow;
'\u21d4': '&iff;', # / &iff; / &hArr; / &Leftrightarrow; / &DoubleLeftRightArrow; CHAR_ARROW_L_DOUBLE: '&lArr;', # / &lArr; / &Leftarrow; / &DoubleLeftArrow;
'\u27f8': '&xlArr;', # / &xlArr; / &Longleftarrow; / &DoubleLongLeftArrow; CHAR_ARROW_LR_DOUBLE: '&iff;', # / &iff; / &hArr; / &Leftrightarrow; / &DoubleLeftRightArrow;
'\u27fa': '&xhArr;', # / &xhArr; / &Longleftrightarrow; / &DoubleLongLeftRightArrow; CHAR_ARROW_L_LONG_DOUBLE: '&xlArr;', # / &xlArr; / &Longleftarrow; / &DoubleLongLeftArrow;
'\u27f9': '&xrArr;', # ⟹ / &xrArr; / &Longrightarrow; / &DoubleLongRightArrow; CHAR_ARROW_R_LONG_DOUBLE: '&xrArr;', # ⟹ / &xrArr; / &Longrightarrow; / &DoubleLongRightArrow;
'\u21d2': '&rArr;', # / &rArr; / &Implies; / &Rightarrow; / &DoubleRightArrow; CHAR_ARROW_LR_LONG_DOUBLE: '&xhArr;', # / &xhArr; / &Longleftrightarrow; / &DoubleLongLeftRightArrow;
'\u22a8': '&vDash;', # ⊨ / &vDash; / &DoubleRightTee; '\u22a8': '&vDash;', # ⊨ / &vDash; / &DoubleRightTee;
'\u21d1': '&uArr;', # ⇑ / &uArr; / &Uparrow; / &DoubleUpArrow; '\u21d1': '&uArr;', # ⇑ / &uArr; / &Uparrow; / &DoubleUpArrow;
'\u2202': '&part;', # ∂ / &part; / &PartialD; '\u2202': '&part;', # ∂ / &part; / &PartialD;
@@ -337,10 +382,10 @@ CUSTOM_ENCODE_MAP = {
'\u2a89': '&lnap;', # ⪉ / &lnap; / &lnapprox; '\u2a89': '&lnap;', # ⪉ / &lnap; / &lnapprox;
'\u2268': '&lnE;', # ≨ / &lnE; / &lneqq; '\u2268': '&lnE;', # ≨ / &lnE; / &lneqq;
'\u2a87': '&lne;', # ⪇ / &lne; / &lneq; '\u2a87': '&lne;', # ⪇ / &lne; / &lneq;
'\u27f5': '&xlarr;', # ⟵ / &xlarr; / &longleftarrow; / &LongLeftArrow; CHAR_ARROW_L: '&xlarr;', # ⟵ / &xlarr; / &longleftarrow; / &LongLeftArrow;
'\u27f7': '&xharr;', # / &xharr; / &longleftrightarrow; / &LongLeftRightArrow; CHAR_ARROW_R: '&xrarr;', # / &xrarr; / &LongRightArrow; / &longrightarrow;
CHAR_ARROW_LR: '&xharr;', # ⟷ / &xharr; / &longleftrightarrow; / &LongLeftRightArrow;
'\u27fc': '&xmap;', # ⟼ / &xmap; / &longmapsto; '\u27fc': '&xmap;', # ⟼ / &xmap; / &longmapsto;
'\u27f6': '&xrarr;', # ⟶ / &xrarr; / &LongRightArrow; / &longrightarrow;
'\u21ac': '&rarrlp;', # ↬ / &rarrlp; / &looparrowright; '\u21ac': '&rarrlp;', # ↬ / &rarrlp; / &looparrowright;
'\u201e': '&bdquo;', # „ / &bdquo; / &ldquor; '\u201e': '&bdquo;', # „ / &bdquo; / &ldquor;
'\u2199': '&swarr;', # ↙ / &swarr; / &swarrow; / &LowerLeftArrow; '\u2199': '&swarr;', # ↙ / &swarr; / &swarrow; / &LowerLeftArrow;
@@ -353,7 +398,7 @@ CUSTOM_ENCODE_MAP = {
'\u2133': '&Mscr;', # / &Mscr; / &phmmat; / &Mellintrf; '\u2133': '&Mscr;', # / &Mscr; / &phmmat; / &Mellintrf;
'\u2223': '&mid;', # / &mid; / &smid; / &shortmid; / &VerticalBar; '\u2223': '&mid;', # / &mid; / &smid; / &shortmid; / &VerticalBar;
'\u2213': '&mp;', # ∓ / &mp; / &mnplus; / &MinusPlus; '\u2213': '&mp;', # ∓ / &mp; / &mnplus; / &MinusPlus;
'\u2026': '&mldr;', # … / &mldr; / &hellip; CHAR_HELLIP: '&mldr;', # … / &mldr; / &hellip;
'\u22b8': '&mumap;', # ⊸ / &mumap; / &multimap; '\u22b8': '&mumap;', # ⊸ / &mumap; / &multimap;
'\u2249': '&nap;', # ≉ / &nap; / &napprox; / &NotTildeTilde; '\u2249': '&nap;', # ≉ / &nap; / &napprox; / &NotTildeTilde;
'\u266e': '&natur;', # ♮ / &natur; / &natural; '\u266e': '&natur;', # ♮ / &natur; / &natural;
@@ -486,7 +531,7 @@ CUSTOM_ENCODE_MAP = {
'\u20db': '&tdot;', # ⃛ / &tdot; / &TripleDot; '\u20db': '&tdot;', # ⃛ / &tdot; / &TripleDot;
'\u2234': '&there4;', # ∴ / &there4; / &Therefore; / &therefore; '\u2234': '&there4;', # ∴ / &there4; / &Therefore; / &therefore;
'\u03d1': '&thetav;', # ϑ / &thetav; / &vartheta; / &thetasym; '\u03d1': '&thetav;', # ϑ / &thetav; / &vartheta; / &thetasym;
'\u2122': '&trade;', # ™ / &trade; / &TRADE; CHAR_TRADE: '&trade;', # ™ / &trade; / &TRADE;
'\u25b5': '&utri;', # ▵ / &utri; / &triangle; '\u25b5': '&utri;', # ▵ / &utri; / &triangle;
'\u225c': '&trie;', # ≜ / &trie; / &triangleq; '\u225c': '&trie;', # ≜ / &trie; / &triangleq;
'\u21c5': '&udarr;', # ⇅ / &udarr; / &UpArrowDownArrow; '\u21c5': '&udarr;', # ⇅ / &udarr; / &UpArrowDownArrow;

View File

@@ -8,7 +8,7 @@ import regex
import logging import logging
import html import html
from etpgrf.config import ( from etpgrf.config import (
SHY_CHAR, LANG_RU, LANG_RU_OLD, LANG_EN, CHAR_SHY, LANG_RU, LANG_RU_OLD, LANG_EN,
RU_VOWELS_UPPER, RU_CONSONANTS_UPPER, RU_J_SOUND_UPPER, RU_SIGNS_UPPER, # RU_ALPHABET_UPPER, RU_VOWELS_UPPER, RU_CONSONANTS_UPPER, RU_J_SOUND_UPPER, RU_SIGNS_UPPER, # RU_ALPHABET_UPPER,
EN_VOWELS_UPPER, EN_CONSONANTS_UPPER # , EN_ALPHABET_UPPER EN_VOWELS_UPPER, EN_CONSONANTS_UPPER # , EN_ALPHABET_UPPER
) )
@@ -214,7 +214,7 @@ class Hyphenator:
left_part = word_to_split[:hyphen_idx] left_part = word_to_split[:hyphen_idx]
right_part = word_to_split[hyphen_idx:] right_part = word_to_split[hyphen_idx:]
# Рекурсивно делим левую и правую части и соединяем их через символ переноса # Рекурсивно делим левую и правую части и соединяем их через символ переноса
return split_word_ru(left_part) + SHY_CHAR + split_word_ru(right_part) return split_word_ru(left_part) + CHAR_SHY + split_word_ru(right_part)
# Основная логика # Основная логика
return split_word_ru(word) # Рекурсивно делим слово на части с переносами return split_word_ru(word) # Рекурсивно делим слово на части с переносами
@@ -316,7 +316,7 @@ class Hyphenator:
# Рекурсивно обрабатываем обе части и объединяем их символом переноса # Рекурсивно обрабатываем обе части и объединяем их символом переноса
return (split_word_en(word_to_split[:hyphen_idx]) + return (split_word_en(word_to_split[:hyphen_idx]) +
SHY_CHAR + split_word_en(word_to_split[hyphen_idx:])) CHAR_SHY + split_word_en(word_to_split[hyphen_idx:]))
# --- Конец логики для английского языка --- # --- Конец логики для английского языка ---
return split_word_en(word) return split_word_en(word)

View File

@@ -3,8 +3,9 @@
import regex import regex
import logging import logging
from .config import LANG_RU, LANG_EN, RU_QUOT1_OPEN, RU_QUOT1_CLOSE, EN_QUOT1_OPEN, EN_QUOT1_CLOSE, \ from .config import (LANG_RU, LANG_EN, CHAR_RU_QUOT1_OPEN, CHAR_RU_QUOT1_CLOSE, CHAR_EN_QUOT1_OPEN,
RU_QUOT2_OPEN, RU_QUOT2_CLOSE, EN_QUOT2_OPEN, EN_QUOT2_CLOSE CHAR_EN_QUOT1_CLOSE, CHAR_RU_QUOT2_OPEN, CHAR_RU_QUOT2_CLOSE, CHAR_EN_QUOT2_OPEN,
CHAR_EN_QUOT2_CLOSE)
from .comutil import parse_and_validate_langs from .comutil import parse_and_validate_langs
# --- Настройки логирования --- # --- Настройки логирования ---
@@ -13,8 +14,8 @@ logger = logging.getLogger(__name__)
# Определяем стили кавычек для разных языков # Определяем стили кавычек для разных языков
# Формат: (('открывающая_ур1', 'закрывающая_ур1'), ('открывающая_ур2', 'закрывающая_ур2')) # Формат: (('открывающая_ур1', 'закрывающая_ур1'), ('открывающая_ур2', 'закрывающая_ур2'))
_QUOTE_STYLES = { _QUOTE_STYLES = {
LANG_RU: ((RU_QUOT1_OPEN, RU_QUOT1_CLOSE), (RU_QUOT2_OPEN, RU_QUOT2_CLOSE)), LANG_RU: ((CHAR_RU_QUOT1_OPEN, CHAR_RU_QUOT1_CLOSE), (CHAR_RU_QUOT2_OPEN, CHAR_RU_QUOT2_CLOSE)),
LANG_EN: ((EN_QUOT1_OPEN, EN_QUOT1_CLOSE), (EN_QUOT2_OPEN, EN_QUOT2_CLOSE)), LANG_EN: ((CHAR_EN_QUOT1_OPEN, CHAR_EN_QUOT1_CLOSE), (CHAR_EN_QUOT2_OPEN, CHAR_EN_QUOT2_CLOSE)),
} }

View File

@@ -9,7 +9,7 @@ import logging
import html import html
from etpgrf.config import LANG_RU, LANG_RU_OLD, LANG_EN # , KEY_NBSP, ALL_ENTITIES from etpgrf.config import LANG_RU, LANG_RU_OLD, LANG_EN # , KEY_NBSP, ALL_ENTITIES
from etpgrf.comutil import parse_and_validate_langs from etpgrf.comutil import parse_and_validate_langs
from etpgrf.config import NBSP_CHAR from etpgrf.config import CHAR_NBSP
from etpgrf.defaults import etpgrf_settings from etpgrf.defaults import etpgrf_settings
# --- Наборы коротких слов для разных языков --- # --- Наборы коротких слов для разных языков ---
@@ -114,11 +114,11 @@ class Unbreakables:
# 1. Обработка слов, ПОСЛЕ которых нужен неразрывный пробел ("в дом" -> "в&nbsp;дом") # 1. Обработка слов, ПОСЛЕ которых нужен неразрывный пробел ("в дом" -> "в&nbsp;дом")
if self._pre_pattern: if self._pre_pattern:
processed_text = self._pre_pattern.sub(r"\g<1>" + NBSP_CHAR, processed_text) processed_text = self._pre_pattern.sub(r"\g<1>" + CHAR_NBSP, processed_text)
# 2. Обработка частиц, ПЕРЕД которыми нужен неразрывный пробел ("сказал бы" -> "сказал&nbsp;бы") # 2. Обработка частиц, ПЕРЕД которыми нужен неразрывный пробел ("сказал бы" -> "сказал&nbsp;бы")
if self._post_pattern: if self._post_pattern:
# \g<1> - это пробел, \g<2> - это частица # \g<1> - это пробел, \g<2> - это частица
processed_text = self._post_pattern.sub(NBSP_CHAR + r"\g<2>", processed_text) processed_text = self._post_pattern.sub(CHAR_NBSP + r"\g<2>", processed_text)
return processed_text return processed_text

View File

@@ -1,35 +1,35 @@
# tests/test_hyphenation.py # tests/test_hyphenation.py
import pytest import pytest
from etpgrf import Hyphenator from etpgrf import Hyphenator
from tests.test_unbreakables import ENGLISH_PREPOSITIONS_TO_TEST from etpgrf.config import CHAR_SHY
# --- Тестовые данные для русского языка --- # --- Тестовые данные для русского языка ---
# Формат: (входное_слово, ожидаемый_результат_с_переносами) # Формат: (входное_слово, ожидаемый_результат_с_переносами)
# Используем \u00AD - это Unicode-представление мягкого переноса (&shy;) # Используем {CHAR_SHY} - это Unicode-представление мягкого переноса (&shy;)
RUSSIAN_HYPHENATION_CASES = [ RUSSIAN_HYPHENATION_CASES = [
("дом", "дом"), # Сочень короткое (короче max_unhyphenated_len) не должно меняться ("дом", "дом"), # Сочень короткое (короче max_unhyphenated_len) не должно меняться
("проверка", "про\u00ADверка"), ("проверка", f"про{CHAR_SHY}верка"),
("тестирование", "тести\u00ADрова\u00ADние"), ("тестирование", f"тести{CHAR_SHY}рова{CHAR_SHY}ние"),
("благотворительностью", "бла\u00ADготво\u00ADритель\u00ADностью"), # Слово с переносом на мягкий знак ("благотворительностью", f"бла{CHAR_SHY}готво{CHAR_SHY}ритель{CHAR_SHY}ностью"), # Слово с переносом на мягкий знак
("фотоаппаратура", "фотоап\u00ADпара\u00ADтура"), # проверка слова со сдвоенной согласной ("фотоаппаратура", f"фотоап{CHAR_SHY}пара{CHAR_SHY}тура"), # проверка слова со сдвоенной согласной
("программирование", "про\u00ADграм\u00ADмиро\u00ADвание"), # слова со сдвоенной согласной ("программирование", f"про{CHAR_SHY}грам{CHAR_SHY}миро{CHAR_SHY}вание"), # слова со сдвоенной согласной
("сверхзвуковой", "сверх\u00ADзву\u00ADковой"), ("сверхзвуковой", f"сверх{CHAR_SHY}зву{CHAR_SHY}ковой"),
("автомобиль", "авто\u00ADмобиль"), ("автомобиль", f"авто{CHAR_SHY}мобиль"),
("интернационализация", "инте\u00ADрнаци\u00ADонали\u00ADзация"), ("интернационализация", f"инте{CHAR_SHY}рнаци{CHAR_SHY}онали{CHAR_SHY}зация"),
("электронный", "элек\u00ADтрон\u00ADный"), ("электронный", f"элек{CHAR_SHY}трон{CHAR_SHY}ный"),
("информационный", "инфо\u00ADрма\u00ADцион\u00ADный"), ("информационный", f"инфо{CHAR_SHY}рма{CHAR_SHY}цион{CHAR_SHY}ный"),
("автоматизация", "автома\u00ADтиза\u00ADция"), ("автоматизация", f"автома{CHAR_SHY}тиза{CHAR_SHY}ция"),
("многоклеточный", "мно\u00ADгокле\u00ADточный"), ("многоклеточный", f"мно{CHAR_SHY}гокле{CHAR_SHY}точный"),
("многофункциональный", "мно\u00ADгофун\u00ADкцио\u00ADналь\u00ADный"), ("многофункциональный", f"мно{CHAR_SHY}гофун{CHAR_SHY}кцио{CHAR_SHY}наль{CHAR_SHY}ный"),
("непрерывность", "непре\u00ADрывно\u00ADсть"), ("непрерывность", f"непре{CHAR_SHY}рывно{CHAR_SHY}сть"),
("сверхпроводимость", "сверх\u00ADпрово\u00ADдимо\u00ADсть"), ("сверхпроводимость", f"сверх{CHAR_SHY}прово{CHAR_SHY}димо{CHAR_SHY}сть"),
("многообразие", "мно\u00ADгоо\u00ADбра\u00ADзие"), ("многообразие", f"мно{CHAR_SHY}гоо{CHAR_SHY}бра{CHAR_SHY}зие"),
("противоречивость", "про\u00ADтиво\u00ADречи\u00ADвость"), ("противоречивость", f"про{CHAR_SHY}тиво{CHAR_SHY}речи{CHAR_SHY}вость"),
("непревзойденный", "непре\u00ADвзой\u00ADден\u00ADный"), ("непревзойденный", f"непре{CHAR_SHY}взой{CHAR_SHY}ден{CHAR_SHY}ный"),
("многослойный", "мно\u00ADгослой\u00ADный"), ("многослойный", f"мно{CHAR_SHY}гослой{CHAR_SHY}ный"),
("суперкомпьютер", "супе\u00ADрко\u00ADмпью\u00ADтер"), # Неправильный перенос (нужен словарь "приставок/корней/суффиксов") ("суперкомпьютер", f"супе{CHAR_SHY}рко{CHAR_SHY}мпью{CHAR_SHY}тер"), # Неправильный перенос (нужен словарь "приставок/корней/суффиксов")
("сверхчувствительный", "свер\u00ADхчув\u00ADстви\u00ADтель\u00ADный"), # Неправильный перенос ("сверхчувствительный", f"свер{CHAR_SHY}хчув{CHAR_SHY}стви{CHAR_SHY}тель{CHAR_SHY}ный"), # Неправильный перенос
("гиперподъездной", "гипе\u00ADрпо\u00ADдъез\u00ADдной"), # Неправильный перенос ("гиперподъездной", f"гипе{CHAR_SHY}рпо{CHAR_SHY}дъез{CHAR_SHY}дной"), # Неправильный перенос
] ]
@@ -49,17 +49,17 @@ def test_russian_word_hyphenation(input_word, expected_output):
ENGLISH_HYPHENATION_CASES = [ ENGLISH_HYPHENATION_CASES = [
("color", "color"), # Короткое слово, не должно меняться ("color", "color"), # Короткое слово, не должно меняться
("throughout", "throughout"), # Длинное слово, но из-за икс-графа "ough" не будет переноситься ("throughout", "throughout"), # Длинное слово, но из-за икс-графа "ough" не будет переноситься
("ambrella", "amb\u00ADrella"), ("ambrella", f"amb{CHAR_SHY}rella"),
("unbelievable", "unbel\u00ADiev\u00ADable"), # Проверка переноса перед суффиксом "able" ("unbelievable", f"unbel{CHAR_SHY}iev{CHAR_SHY}able"), # Проверка переноса перед суффиксом "able"
("acknowledgment", "ack\u00ADnow\u00ADledg\u00ADment"), # Проверка переноса перед суффиксом "ment" ("acknowledgment", f"ack{CHAR_SHY}now{CHAR_SHY}ledg{CHAR_SHY}ment"), # Проверка переноса перед суффиксом "ment"
("friendship", "frien\u00ADdship"), # Проверка переноса перед суффиксом "ship" ("friendship", f"frien{CHAR_SHY}dship"), # Проверка переноса перед суффиксом "ship"
("thoughtful", "though\u00ADtful"), # ("thoughtful", f"though{CHAR_SHY}tful"), #
("psychology", "psy\u00ADcho\u00ADlogy"), # Проверка переноса после "psy" ("psychology", f"psy{CHAR_SHY}cho{CHAR_SHY}logy"), # Проверка переноса после "psy"
("extraordinary", "ext\u00ADraor\u00ADdin\u00ADary"), # Проверка сложного слова ("extraordinary", f"ext{CHAR_SHY}raor{CHAR_SHY}din{CHAR_SHY}ary"), # Проверка сложного слова
("unbreakable", "unb\u00ADrea\u00ADkable"), # Проверка переноса перед "able" ("unbreakable", f"unb{CHAR_SHY}rea{CHAR_SHY}kable"), # Проверка переноса перед "able"
("acknowledgement", "ack\u00ADnow\u00ADledge\u00ADment"), # Проверка икс-графа "dge" ("acknowledgement", f"ack{CHAR_SHY}now{CHAR_SHY}ledge{CHAR_SHY}ment"), # Проверка икс-графа "dge"
("misunderstanding", "mis\u00ADunder\u00ADstan\u00ADding"), # Проверка сложного слова ("misunderstanding", f"mis{CHAR_SHY}under{CHAR_SHY}stan{CHAR_SHY}ding"), # Проверка сложного слова
("floccinaucinihilipilification", "floc\u00ADcin\u00ADauc\u00ADinih\u00ADili\u00ADpili\u00ADfica\u00ADtion"), ("floccinaucinihilipilification", f"floc{CHAR_SHY}cin{CHAR_SHY}auc{CHAR_SHY}inih{CHAR_SHY}ili{CHAR_SHY}pili{CHAR_SHY}fica{CHAR_SHY}tion"),
] ]
@pytest.mark.parametrize("input_word, expected_output", ENGLISH_HYPHENATION_CASES) @pytest.mark.parametrize("input_word, expected_output", ENGLISH_HYPHENATION_CASES)