add: codec (внутренний utf-8 и мнемокод для in/out

This commit is contained in:
2025-07-21 14:46:13 +03:00
parent 1c5fe77706
commit 7ff18dc2e8
6 changed files with 135 additions and 47 deletions

View File

@@ -19,21 +19,28 @@ SUPPORTED_LANGS = frozenset([LANG_RU, LANG_RU_OLD, LANG_EN])
# DEFAULT_HYP_MAX_LEN = 10 # Максимальная длина слова без переносов
# DEFAULT_HYP_MIN_LEN = 3 # Минимальный "хвост" слова для переноса
# ----------------- соответствия `unicode` и `mnemonic` для типографа
# === Соответствия `unicode` и `mnemonic` для типографа
# Переносы
KEY_SHY = 'SHY'
SHY_ENTITIES = {
'SHY': ('\u00AD', '­'), # Мягкий перенос
KEY_SHY: ('\u00AD', '­'), # Мягкий перенос
}
# Пробелы и неразрывные пробелы
KEY_NBSP = 'NBSP'
KEY_THINSP = 'THINSP'
KEY_ENSP = 'ENSP'
KEY_EMSP = 'EMSP'
KEY_ZWNJ = 'ZWNJ'
KEY_ZWJ = 'ZWJ'
SPACE_ENTITIES = {
'NBSP': ('\u00A0', ' '), # Неразрывный пробел
'THINSP': ('\u2009', ' '), # Тонкий пробел
'ENSP': ('\u2002', ' '), # Полу-широкий пробел
'EMSP': ('\u2003', ' '), # Широкий пробел
'ZWNJ': ('\u200C', '‌'), # Разрывный пробел нулевой ширины (без пробела)
'ZWJ': ('\u200D', '‍'), # Неразрывный пробел нулевой ширины
KEY_NBSP: ('\u00A0', ' '), # Неразрывный пробел
KEY_THINSP: ('\u2009', ' '), # Тонкий пробел
KEY_ENSP: ('\u2002', ' '), # Полу-широкий пробел
KEY_EMSP: ('\u2003', ' '), # Широкий пробел
KEY_ZWNJ: ('\u200C', '‌'), # Разрывный пробел нулевой ширины (без пробела)
KEY_ZWJ: ('\u200D', '‍'), # Неразрывный пробел нулевой ширины
}
# Тире и дефисы
@@ -60,6 +67,7 @@ QUOTE_ENTITIES = {
'RSAQUO': ('\u203A', '›'), # Закрывающая французская угловая кавычка --
}
# Символы валют
CURRENCY_ENTITIES = {
'DOLLAR': ('\u0024', '$'), # Доллар
'CENT': ('\u00A2', '¢'), # Цент
@@ -70,14 +78,46 @@ CURRENCY_ENTITIES = {
'RUBLE': ('\u20BD', '₽'), # Российский рубль (₽)
}
# Математические символы
KEY_LT = 'LT'
KEY_GT = 'GT'
MATH_ENTITIES = {
KEY_LT: ('\u00B7', '&lt;'), # Меньше (<)
KEY_GT: ('\u00B7', '&gt;'), # Больше (>)
'PLUS': ('\u002B', '&plus;'), # Плюс (+)
'MINUS': ('\u2212', '&minus;'), # Минус ()
'MULTIPLY': ('\u00D7', '&times;'), # Умножение (×)
'DIVIDE': ('\u00F7', '&divide;'), # Деление (÷)
'EQUALS': ('\u003D', '&equals;'), # Равно (=)
'NOT_EQUAL': ('\u2260', '&ne;'), # Не равно (≠)
'PLUSMN': ('\u00B1', '&plusmn;'), # Плюс-минус (±)
'LESS_EQUAL': ('\u2264', '&le;'), # Меньше или равно (≤)
'GREATER_EQUAL': ('\u2265', '&ge;'), # Больше или равно (≥)
'APPROX_EQUAL': ('\u2245', '&cong;'), # Приблизительно равно (≅)
'APPROX_EQ': ('\u2245', '&approxeq;'), # Приблизительно равно (≅)
'APPROX': ('\u2248', '&asymp;'), # Приблизительно равно (≈)
}
# Другие символы (пример для расширения)
KEY_AMP = 'AMP'
SYMBOL_ENTITIES = {
KEY_AMP: ('\u0026', '&smp;'), #Амперсанд (&)
'HELLIP': ('\u2026', '&hellip;'), # Многоточие
'COPY': ('\u00A9', '&copy;'), # Копирайт
# ... стрелочки, математические символы и т.д. по мере необходимости
}
# Сущности, которые ВСЕГДА должны выводиться как мнемоники в режиме MODE_MIXED
# Указываются их ИМЕНА (ключи из словарей выше)
ALWAYS_MNEMONIC_IN_SAFE_MODE = frozenset(['SHY', 'NBSP', 'ZWSP'])
# --- Сборка и валидация ---
# 1. Создаем единый словарь всех сущностей для удобного доступа
ALL_ENTITIES = {
**SHY_ENTITIES, **SPACE_ENTITIES, **DASH_ENTITIES, **MATH_ENTITIES,
**QUOTE_ENTITIES, **CURRENCY_ENTITIES, **SYMBOL_ENTITIES
}
# Сущности, которые ВСЕГДА должны выводиться как мнемоники в режиме MODE_MIXED
# Указываются их ИМЕНА (ключи из словарей выше).
# NOTE: Повторное использование магических строк 'SHY', 'NBSP' и т.д. не создает новый объект в памяти. Умный Python
# когда видит одинаковую строку в коде применяет интернирование строк (string interning).
ALWAYS_MNEMONIC_IN_SAFE_MODE = frozenset([KEY_AMP, KEY_LT, KEY_GT, KEY_SHY, KEY_NBSP, KEY_ZWNJ, KEY_ZWJ])