mod: +тесты html-мнемоник для decode_to_unicode() ..

This commit is contained in:
2025-08-05 22:38:28 +03:00
parent 65970f3170
commit 3684088fd0
2 changed files with 323 additions and 18 deletions

View File

@@ -37,21 +37,33 @@ EN_ALPHABET_FULL = EN_ALPHABET_UPPER | EN_ALPHABET_LOWER
# === КОНСТАНТЫ ДЛЯ КОДИРОВАНИЯ HTML-МНЕМНОИКОВ ===
# --- ЧЕРНЫЙ СПИСОК: Символы, которые НИКОГДА не нужно кодировать в мнемоники ---
NEVER_ENCODE_CHARS = (frozenset(['!', '#', '%', '(', ')', '*', ',', '.', '/', ':', ';', '=', '?', '@',
'[', '\\', ']', '^', '_', '`', '{', '|', '}', '~'])
'[', '\\', ']', '^', '_', '`', '{', '|', '}', '~', '\n', '\t', '\r'])
| RU_ALPHABET_FULL | EN_ALPHABET_FULL)
# 2. БЕЛЫЙ СПИСОК (ДЛЯ БЕЗОПАСНОСТИ):
# Символы, которые ВСЕГДА должны превращаться в мнемоники в "безопасных" режимах вывода. Сюда добавлены символы,
# которые или не видны, или на глаз и не отличимы друг от друга в обычном тексте
SAFE_MODE_CHARS_TO_MNEMONIC = frozenset(['<', '>', '&', '"', '\'',
'\u00AD', # мягкий перенос (Soft Hyphen)
'\u00A0', # неразрывный пробел (Non-Breaking Space)
'\u200D', # нулевая ширина (с объединением) (Zero Width Joiner)
'\u200C', # нулевая ширина (без объединения) (Zero Width Non-Joiner)
'\u2002', # Полужирный пробел (En Space)
'\u2003']) # Широкий пробел (Em Space)
# которые не видны, на глаз и не отличимы друг от друга в обычном тексте, или очень специфичные
SAFE_MODE_CHARS_TO_MNEMONIC = frozenset([
'<', '>', '&', '"', '\'',
'\u00AD', # Мягкий перенос (Soft Hyphen) -- &shy;
'\u00A0', # Неразрывный пробел (Non-Breaking Space) -- &nbsp;
'\u2002', # Полужирный пробел (En Space) -- &ensp;
'\u2003', # Широкий пробел (Em Space) -- &emsp;
'\u2007', # Цифровой пробел -- &numsp;)
'\u2008', # Пунктуационный пробел -- &puncsp;
'\u2009', # Междусимвольный пробел -- &thinsp;'
'\u200A', # Толщина волоса (Hair Space) -- &hairsp;
'\u200B', # Негативный пробел (Negative Space) -- &NegativeThinSpace;
'\u200C', # Нулевая ширина (без объединения) (Zero Width Non-Joiner) -- &zwj;
'\u200D', # Нулевая ширина (с объединением) (Zero Width Joiner) -- &zwnj;
'\u200E', # Изменить направление текста на слева-направо (Left-to-Right Mark /LRE) -- &lrm;
'\u200F', # Изменить направление текста направо-налево (Right-to-Left Mark /RLM) -- &rlm;
'\u205F', # Средний пробел (Medium Mathematical Space) -- &MediumSpace;
'\u2060', # &NoBreak;
'\u2062', # &InvisibleTimes;
'\u2063', # &InvisibleComma;
])
# 3. СПИСОК ДЛЯ ЧИСЛОВОГО КОДИРОВАНИЯ: Символы без стандартного имени.
ALWAYS_ENCODE_TO_NUMERIC_CHARS = frozenset([
@@ -62,14 +74,15 @@ ALWAYS_ENCODE_TO_NUMERIC_CHARS = frozenset([
'\u20B9', # Знак индийской рупии (₹)
'\u20BC', # Знак азербайджанского маната
'\u20BE', # Знак грузинский лари (₾)
'\u022d', # Специальный символ LEFT-TO-RIGHT OVERRIDE (устанавливает направление текста слева-направо)
'\u022e', # Специальный символ RIGHT-TO-LEFT OVERRIDE (устанавливает направление текста справа-налево)
])
# 4. СЛОВАРЬ ПРИОРИТЕТОВ: Кастомные или предпочитаемые мнемоники.
# Эти правила применяются в последнюю очередь и имеют наивысший приоритет,
# 4. СЛОВАРЬ ПРИОРИТЕТОВ: Кастомные или предпочитаемые мнемоники.
# Некоторые utf-символы имеют несколько мнемоник, а значит для таких символов преобразование
# в из utf во html-мнемоники может иметь несколько вариантов. Словарь приоритетов задает предпочтительное
# преобразование. Эти правила применяются в последнюю очередь и имеют наивысший приоритет,
# гарантируя предсказуемый результат для символов с несколькими именами.
# Также используется для создания исключений из "черного списка" NEVER_ENCODE_CHARS.
#
# Также можно использовать для создания исключений из "черного списка" NEVER_ENCODE_CHARS.
CUSTOM_ENCODE_MAP = {
'\u2010': '&hyphen;', # Для \u2010 всегда предпочитаем &hyphen;, а не &dash;
# Исключения для букв, которые есть в алфавитах, но должны кодироваться (для обеспечения консистентности):
@@ -77,6 +90,24 @@ CUSTOM_ENCODE_MAP = {
# 'Œ': '&OElig;',
# 'æ': '&aelig;',
# 'œ': '&oelig;',
'\u3253': '&alefsym;', # ℵ / &alefsym / &aleph;
'&': '&amp;', # & / &amp; / &AMP;
'\u2220': '&ang;', # ∠ / &ang; / &angle;
'\u2061': '&af;', # &af; / &ApplyFunction;
'\u2248': '&asymp;', # ≈ / &asymp; / &approx; / &ap; / &thickapprox; / &thkap; / &TildeTilde;
'\u00c5': '&Aring;', # Å / &Aring; / &angst; /
'\u224a': '&ape;', # ≊ / &ape; / &&approxeq;
'\u2305': '&barwed;', # ⌅ / &barwed; / &barwedge;
'\u2235': '&becaus;', # ∵ / &becaus; / &Because; / &because;
'\u224c': '&bcong;', # ≌ / &backcong; / &bcong;
'\u03f6': '&bepsi;', # ϶ / &bepsi; / &backepsilon;
'\u212c': '&Bscr;', # / &Bscr; / &Bernoullis; / &bernou;
'\u22a5': '&perp;', # ⊥ / perp; / &bot; / &bottom; / UpTee
'\u2035': '&bprime;', # / &bprime; / &backprime;
'\u02d8': '&breve;', # ˘ / &breve; / &Breve;
'\u223d': '&bsim;', # ∽ / &bsim; / &backsim;
'\u22cd': '&bsime;', # ⋍ / &bsime; / &backsimeq;
'\u2022': '&bull;', # • / &bull; / &bullet;
}
# === Динамическая генерация карт преобразования ===