add: config.py как единый источник правды (на базе html.entities)
This commit is contained in:
@@ -3,22 +3,25 @@
|
|||||||
|
|
||||||
import regex
|
import regex
|
||||||
import html
|
import html
|
||||||
from etpgrf.config import (ALL_ENTITIES, ALWAYS_MNEMONIC_IN_SAFE_MODE, MODE_MNEMONIC, MODE_MIXED)
|
from . import config
|
||||||
|
# from etpgrf.config import (ALL_ENTITIES, ALWAYS_MNEMONIC_IN_SAFE_MODE, MODE_MNEMONIC, MODE_MIXED)
|
||||||
|
|
||||||
# --- Создаем словарь для кодирования Unicode -> Mnemonic ---
|
# --- Создаем словарь для кодирования Unicode -> Mnemonic ---
|
||||||
# {'\u00A0': ' ', '\u2014': '—', ...}
|
# Получаем готовую карту для кодирования один раз при импорте
|
||||||
_ENCODE_MAP = {}
|
_ENCODE_MAP = config.get_encode_map()
|
||||||
|
# Создаем таблицу для быстрой замены через str.translate
|
||||||
|
_TRANSLATE_TABLE = str.maketrans(_ENCODE_MAP)
|
||||||
|
|
||||||
|
#
|
||||||
for name, (uni_char, mnemonic) in ALL_ENTITIES.items():
|
# for name, (uni_char, mnemonic) in ALL_ENTITIES.items():
|
||||||
_ENCODE_MAP[uni_char] = mnemonic
|
# _ENCODE_MAP[uni_char] = mnemonic
|
||||||
|
|
||||||
# --- Основные функции кодека ---
|
# --- Основные функции кодека ---
|
||||||
|
|
||||||
def decode_to_unicode(text: str) -> str:
|
def decode_to_unicode(text: str) -> str:
|
||||||
"""
|
"""
|
||||||
Преобразует все известные HTML-мнемоники в их Unicode-эквиваленты,
|
Преобразует все известные HTML-мнемоники и числовые коды в их
|
||||||
используя стандартную библиотеку html.
|
Unicode-эквиваленты, используя стандартную библиотеку html.
|
||||||
"""
|
"""
|
||||||
if not text or '&' not in text:
|
if not text or '&' not in text:
|
||||||
return text
|
return text
|
||||||
@@ -29,26 +32,27 @@ def encode_from_unicode(text: str, mode: str) -> str:
|
|||||||
"""
|
"""
|
||||||
Преобразует Unicode-символы в HTML-мнемоники в соответствии с режимом.
|
Преобразует Unicode-символы в HTML-мнемоники в соответствии с режимом.
|
||||||
"""
|
"""
|
||||||
if not text or mode not in [MODE_MNEMONIC, MODE_MIXED]:
|
if not text:
|
||||||
# В режиме 'unicode' или неизвестном режиме ничего не делаем
|
# Если текст пустой, просто возвращаем его
|
||||||
|
return text
|
||||||
|
if mode == config.MODE_UNICODE:
|
||||||
|
# В режиме 'unicode' ничего не делаем
|
||||||
return text
|
return text
|
||||||
|
|
||||||
# 1. Определяем, какие символы нужно заменить
|
if mode == config.MODE_MNEMONIC:
|
||||||
if mode == MODE_MNEMONIC:
|
# В режиме 'mnemonic' заменяем все известные символы, используя
|
||||||
# В режиме 'mnemonic' заменяем все известные нам символы
|
# заранее скомпилированную таблицу для максимальной производительности.
|
||||||
chars_to_replace = set(_ENCODE_MAP.keys())
|
return text.translate(_TRANSLATE_TABLE)
|
||||||
else: # mode == MODE_MIXED
|
if mode == config.MODE_MIXED:
|
||||||
# В смешанном режиме заменяем только "безопасные" символы
|
# Создаем временную карту только для "безопасных" символов
|
||||||
# (те, что могут вызывать проблемы с отображением или переносами)
|
safe_map = {
|
||||||
safe_chars = {ALL_ENTITIES[name][0] for name in ALWAYS_MNEMONIC_IN_SAFE_MODE}
|
char: _ENCODE_MAP[char]
|
||||||
chars_to_replace = set(_ENCODE_MAP.keys()) & safe_chars
|
for char in config.SAFE_MODE_CHARS_TO_MNEMONIC
|
||||||
|
if char in _ENCODE_MAP
|
||||||
|
}
|
||||||
|
if not safe_map:
|
||||||
|
return text
|
||||||
|
return text.translate(str.maketrans(safe_map))
|
||||||
|
|
||||||
if not chars_to_replace:
|
# Возвращаем исходный текст, если режим не распознан
|
||||||
return text
|
return text
|
||||||
|
|
||||||
# 2. Создаем паттерн для поиска только нужных символов
|
|
||||||
# regex.escape важен, если в наборе будут спецсимволы, например, '-'
|
|
||||||
pattern = regex.compile(f"[{regex.escape(''.join(chars_to_replace))}]")
|
|
||||||
|
|
||||||
# 3. Заменяем найденные символы, используя нашу карту
|
|
||||||
return pattern.sub(lambda m: _ENCODE_MAP[m.group(0)], text)
|
|
||||||
|
967
etpgrf/config.py
967
etpgrf/config.py
@@ -1,878 +1,143 @@
|
|||||||
# etpgrf/conf.py
|
# etpgrf/conf.py
|
||||||
# Настройки по умолчанию для типографа etpgrf
|
# Настройки по умолчанию и "источник правды" для типографа etpgrf
|
||||||
|
from html import entities
|
||||||
|
|
||||||
|
# === КОНФИГУРАЦИИ ===
|
||||||
# Режимы "отдачи" результатов обработки
|
# Режимы "отдачи" результатов обработки
|
||||||
MODE_UNICODE = "unicode"
|
MODE_UNICODE = "unicode"
|
||||||
MODE_MNEMONIC = "mnemonic"
|
MODE_MNEMONIC = "mnemonic"
|
||||||
MODE_MIXED = "mixed"
|
MODE_MIXED = "mixed"
|
||||||
# DEFAULT_MODE = MODE_MIXED
|
|
||||||
|
|
||||||
# Языки, поддерживаемые библиотекой
|
# Языки, поддерживаемые библиотекой
|
||||||
LANG_RU = 'ru' # Русский
|
LANG_RU = 'ru' # Русский
|
||||||
LANG_RU_OLD = 'ruold' # Русская дореволюционная орфография
|
LANG_RU_OLD = 'ruold' # Русская дореволюционная орфография
|
||||||
LANG_EN = 'en' # Английский
|
LANG_EN = 'en' # Английский
|
||||||
SUPPORTED_LANGS = frozenset([LANG_RU, LANG_RU_OLD, LANG_EN])
|
SUPPORTED_LANGS = frozenset([LANG_RU, LANG_RU_OLD, LANG_EN])
|
||||||
# Язык(и) по умолчанию, если не указаны пользователем и не заданы через ETPGRF_DEFAULT_LANGS_MODULE
|
|
||||||
# DEFAULT_LANGS = LANG_RU
|
|
||||||
|
|
||||||
# Значения по умолчанию для параметров Hyphenator
|
|
||||||
# DEFAULT_HYP_MAX_LEN = 10 # Максимальная длина слова без переносов
|
|
||||||
# DEFAULT_HYP_MIN_LEN = 3 # Минимальный "хвост" слова для переноса
|
|
||||||
|
|
||||||
# === Соответствия `unicode` и `mnemonic` для типографа
|
# === ИСТОЧНИК ПРАВДЫ ===
|
||||||
|
# --- Базовые алфавиты: Эти константы используются как для правил переноса, так и для правил кодирования ---
|
||||||
|
|
||||||
# Переносы
|
# Русский алфавит
|
||||||
KEY_SHY = 'shy'
|
RU_VOWELS_UPPER = frozenset(['А', 'О', 'И', 'Е', 'Ё', 'Э', 'Ы', 'У', 'Ю', 'Я'])
|
||||||
SHY_ENTITIES = {
|
RU_CONSONANTS_UPPER = frozenset(['Б', 'В', 'Г', 'Д', 'Ж', 'З', 'К', 'Л', 'М', 'Н', 'П', 'Р', 'С', 'Т', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ'])
|
||||||
KEY_SHY: ('\u00AD', '­'), # Мягкий перенос
|
RU_J_SOUND_UPPER = frozenset(['Й'])
|
||||||
|
RU_SIGNS_UPPER = frozenset(['Ь', 'Ъ'])
|
||||||
|
RU_ALPHABET_UPPER = RU_VOWELS_UPPER | RU_CONSONANTS_UPPER | RU_J_SOUND_UPPER | RU_SIGNS_UPPER
|
||||||
|
RU_ALPHABET_LOWER = frozenset([char.lower() for char in RU_ALPHABET_UPPER])
|
||||||
|
RU_ALPHABET_FULL = RU_ALPHABET_UPPER | RU_ALPHABET_LOWER
|
||||||
|
|
||||||
|
# Английский алфавит
|
||||||
|
EN_VOWELS_UPPER = frozenset(['A', 'E', 'I', 'O', 'U', 'Æ', 'Œ'])
|
||||||
|
EN_CONSONANTS_UPPER = frozenset(['B', 'C', 'D', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'V', 'W', 'X', 'Y', 'Z'])
|
||||||
|
EN_ALPHABET_UPPER = EN_VOWELS_UPPER | EN_CONSONANTS_UPPER
|
||||||
|
EN_ALPHABET_LOWER = frozenset([char.lower() for char in EN_ALPHABET_UPPER])
|
||||||
|
EN_ALPHABET_FULL = EN_ALPHABET_UPPER | EN_ALPHABET_LOWER
|
||||||
|
|
||||||
|
# === КОНСТАНТЫ ДЛЯ КОДИРОВАНИЯ HTML-МНЕМНОИКОВ ===
|
||||||
|
# --- ЧЕРНЫЙ СПИСОК: Символы, которые НИКОГДА не нужно кодировать в мнемоники ---
|
||||||
|
NEVER_ENCODE_CHARS = (frozenset(['!', '#', '%', '(', ')', '*', ',', '.', '/', ':', ';', '=', '?', '@',
|
||||||
|
'[', '\\', ']', '^', '_', '`', '{', '|', '}', '~'])
|
||||||
|
| 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)
|
||||||
|
|
||||||
|
# 3. СПИСОК ДЛЯ ЧИСЛОВОГО КОДИРОВАНИЯ: Символы без стандартного имени.
|
||||||
|
ALWAYS_ENCODE_TO_NUMERIC_CHARS = frozenset([
|
||||||
|
'\u058F', # Знак армянского драма (֏)
|
||||||
|
'\u20BD', # Знак русского рубля (₽)
|
||||||
|
'\u20B4', # Знак украинской гривны (₴)
|
||||||
|
'\u20B8', # Знак казахстанского тенге (₸)
|
||||||
|
'\u20B9', # Знак индийской рупии (₹)
|
||||||
|
'\u20BC', # Знак азербайджанского маната
|
||||||
|
'\u20BE', # Знак грузинский лари (₾)
|
||||||
|
'\u022d', # Специальный символ LEFT-TO-RIGHT OVERRIDE (устанавливает направление текста слева-направо)
|
||||||
|
'\u022e', # Специальный символ RIGHT-TO-LEFT OVERRIDE (устанавливает направление текста справа-налево)
|
||||||
|
])
|
||||||
|
|
||||||
|
# 4. СЛОВАРЬ ПРИОРИТЕТОВ: Кастомные или предпочитаемые мнемоники.
|
||||||
|
# Эти правила применяются в последнюю очередь и имеют наивысший приоритет,
|
||||||
|
# гарантируя предсказуемый результат для символов с несколькими именами.
|
||||||
|
# Также используется для создания исключений из "черного списка" NEVER_ENCODE_CHARS.
|
||||||
|
CUSTOM_ENCODE_MAP = {
|
||||||
|
'\u2010': '‐', # Для \u2010 всегда предпочитаем ‐, а не ‐
|
||||||
|
# Исключения для букв, которые есть в алфавитах, но должны кодироваться (для обеспечения консистентности):
|
||||||
|
# 'Æ': 'Æ',
|
||||||
|
# 'Œ': 'Œ',
|
||||||
|
# 'æ': 'æ',
|
||||||
|
# 'œ': 'œ',
|
||||||
}
|
}
|
||||||
|
|
||||||
# Пробелы и неразрывные пробелы
|
# === Динамическая генерация карт преобразования ===
|
||||||
KEY_NBSP = 'nbsp'
|
|
||||||
KEY_THINSP = 'thinsp'
|
|
||||||
KEY_ENSP = 'ensp'
|
|
||||||
KEY_EMSP = 'emsp'
|
|
||||||
KEY_ZWNJ = 'zwnj'
|
|
||||||
KEY_ZWJ = 'zwj'
|
|
||||||
SPACE_ENTITIES = {
|
|
||||||
KEY_NBSP: ('\u00A0', ' '), # Неразрывный пробел
|
|
||||||
KEY_ENSP: ('\u2002', ' '), # Полу-широкий пробел (En space)
|
|
||||||
KEY_EMSP: ('\u2003', ' '), # Широкий пробел (Em space)
|
|
||||||
KEY_THINSP: ('\u2009', ' '), # Тонкий пробел (Thin space)
|
|
||||||
KEY_ZWJ: ('\u200D', '‍'), # Нулевая ширина (с объединением) (Zero Width Joiner)
|
|
||||||
KEY_ZWNJ: ('\u200C', '‌'), # Нулевая ширина (без объединения) (Zero Width Non-Joiner)
|
|
||||||
}
|
|
||||||
|
|
||||||
# Тире и дефисы
|
def _build_translation_maps() -> dict[str, str]:
|
||||||
DASH_ENTITIES = {
|
"""
|
||||||
'ndash': ('\u2013', '–'), # Cреднее тире (En dash)
|
Создает карту для кодирования на лету, используя все доступные источники
|
||||||
'mdash': ('\u2014', '—'), # Длинное тире
|
из html.entities и строгий порядок приоритетов для обеспечения
|
||||||
'hyphen': ('\u2010', '‐'), # Обычный дефис (если нужно отличать от минуса)
|
предсказуемого и детерминированного результата.
|
||||||
'horbar': ('\u2015', '―'), # Горизонтальная линия (длинная черта)
|
"""
|
||||||
}
|
# ШАГ 1: Создаем ЕДИНУЮ и ПОЛНУЮ карту {каноническое_имя: числовой_код}.
|
||||||
|
# Это решает проблему разных форматов и дубликатов с точкой с запятой.
|
||||||
|
unified_name2codepoint = {}
|
||||||
|
|
||||||
# Кавычки
|
# Сначала обрабатываем большой исторический словарь.
|
||||||
KEY_QUOT = 'quot'
|
for name, codepoint in entities.name2codepoint.items():
|
||||||
KEY_LAQUO = 'laquo'
|
# Нормализуем имя СРАЗУ, убирая опциональную точку с запятой (в html.entities предусмотрено, что иногда
|
||||||
KEY_RAQUO = 'raquo'
|
# символ `;` не ставится всякими неаккуратными верстальщиками и парсерами).
|
||||||
KEY_LDQUO = 'ldquo'
|
canonical_name = name.rstrip(';')
|
||||||
KEY_RDQUO = 'rdquo'
|
unified_name2codepoint[canonical_name] = codepoint
|
||||||
QUOTE_ENTITIES = {
|
# Затем обновляем его современным стандартом html5.
|
||||||
KEY_QUOT: ('\u0022', '"'), # Двойная кавычка (универсальная) -- "
|
# Это гарантирует, что если мнемоника есть в обоих, будет использована версия из html5.
|
||||||
'apos': ('\u0027', '''), # Апостроф (одинарная кавычка) -- '
|
for name, char in entities.html5.items():
|
||||||
KEY_LAQUO: ('\u00AB', '«'), # Открывающая (левая) кавычка «ёлочка» -- «
|
# НОВОЕ: Проверяем, что значение является ОДИНОЧНЫМ символом.
|
||||||
KEY_RAQUO: ('\u00BB', '»'), # Закрывающая (правая) кавычка «ёлочка» -- »
|
# Наш кодек, основанный на str.translate, не может обрабатывать
|
||||||
KEY_LDQUO: ('\u201C', '“'), # Oткрывающая (левая) двойная кавычка -- “
|
# мнемоники, которые соответствуют строкам из нескольких символов
|
||||||
KEY_RDQUO: ('\u201D', '”'), # Закрывающая (правая) двойная кавычка -- ”
|
# (например, символ + вариативный селектор). Мы их игнорируем.
|
||||||
'bdquo': ('\u201E', '„'), # Нижняя двойная кавычка -- „
|
if len(char) != 1:
|
||||||
'lsquo': ('\u2018', '‘'), # Открывающая (левая) одинарная кавычка -- ‘
|
continue
|
||||||
'rsquo': ('\u2019', '’'), # Закрывающая (правая) одинарная кавычка -- ’
|
# Нормализуем имя СРАЗУ.
|
||||||
'sbquo': ('\u201A', '‚'), # Нижняя одинарная кавычка -- ‚
|
canonical_name = name.rstrip(';')
|
||||||
'lsaquo': ('\u2039', '‹'), # Открывающая французская угловая кавычка -- ›
|
unified_name2codepoint[canonical_name] = ord(char)
|
||||||
'rsaquo': ('\u203A', '›'), # Закрывающая французская угловая кавычка -- ‹
|
|
||||||
}
|
|
||||||
|
|
||||||
# Символы валют
|
# Теперь у нас есть полный и консистентный словарь unified_name2codepoint.
|
||||||
CURRENCY_ENTITIES = {
|
# На его основе строим нашу карту для кодирования.
|
||||||
'dollar': ('\u0024', '$'), # Доллар
|
encode_map = {}
|
||||||
'cent': ('\u00A2', '¢'), # Цент
|
|
||||||
'pound': ('\u00A3', '£'), # Фунт стерлингов
|
|
||||||
'curren': ('\u00A4', '¤'), # Знак валюты (обычно используется для обозначения "без конкретной валюты")
|
|
||||||
'yen': ('\u00A5', '¥'), # Йена
|
|
||||||
'euro': ('\u20AC', '€'), # Евро -- кажется нет в RFC
|
|
||||||
'ruble': ('\u20BD', '₽'), # Российский рубль (₽)
|
|
||||||
}
|
|
||||||
|
|
||||||
# Математические символы
|
# ШАГ 2: Высший приоритет. Загружаем наши кастомные правила.
|
||||||
KEY_LT = 'lt'
|
encode_map.update(CUSTOM_ENCODE_MAP)
|
||||||
KEY_GT = 'gt'
|
|
||||||
MATH_ENTITIES = {
|
|
||||||
KEY_LT: ('\u003C', '<'), # Меньше (<)
|
|
||||||
KEY_GT: ('\u003E', '>'), # Больше (>)
|
|
||||||
'plus': ('\u002B', '+'), # Плюс (+)
|
|
||||||
'minus': ('\u2212', '−'), # Минус (−)
|
|
||||||
'times': ('\u00D7', '×'), # Умножение (×)
|
|
||||||
'divide': ('\u00F7', '÷'), # Деление (÷)
|
|
||||||
'equals': ('\u003D', '='), # Равно (=)
|
|
||||||
'ne': ('\u2260', '≠'), # Не равно (≠)
|
|
||||||
'plusmn': ('\u00B1', '±'), # Плюс-минус (±)
|
|
||||||
'not': ('\u00AC', '¬'), # Знак отрицания (¬)
|
|
||||||
'deg': ('\u00B0', '°'), # Знак градуса (°)
|
|
||||||
'sup1': ('\u00B9', '¹'), # Верхний индекс 1 (¹)
|
|
||||||
'sup2': ('\u00B2', '²'), # Верхний индекс 2 (²)
|
|
||||||
'sup3': ('\u00B3', '³'), # Верхний индекс 3 (³)
|
|
||||||
'fnof': ('\u0192', 'ƒ'), # Латинская строчная буква «f» с хвостиком или знак флорина (ƒ)
|
|
||||||
'percnt': ('\u0025', '%'), # Знак процента (%)
|
|
||||||
'permil': ('\u0089', '‰'), # Знак промилле (‰)
|
|
||||||
'pertenk': ('\u2031', '‱'), # Знак на десять тысяч (‱)
|
|
||||||
'forall': ('\u2200', '∀'), # Для всех (∀)
|
|
||||||
'comp': ('\u2201', '∁'), # Дополнение (∁)
|
|
||||||
'part': ('\u2202', '∂'), # Частный дифференциал (∂)
|
|
||||||
'exist': ('\u2203', '∃'), # Существует (∃)
|
|
||||||
'nexist': ('\u2204', '∄'), # Не существует (∄)
|
|
||||||
'empty': ('\u2205', '∅'), # Пустое множество (∅)
|
|
||||||
'nabla': ('\u2207', '∇'), # Набла (∇)
|
|
||||||
'isin': ('\u2208', '∈'), # Принадлежит (∈)
|
|
||||||
'notin': ('\u2209', '∉'), # Не принадлежит (∉)
|
|
||||||
'ni': ('\u220B', '∋'), # Содержит как член (∋)
|
|
||||||
'notni': ('\u220C', '∌'), # Не содержит как член (∌)
|
|
||||||
'prod': ('\u220F', '∏'), # N-арное произведение (∏)
|
|
||||||
'coprod' : ('\u2210', '∐'), # N-арный сомножитель (∐)
|
|
||||||
'sum': ('\u2211', '∑'), # N-арная сумма (∑)
|
|
||||||
'mnplus': ('\u2213', '∓'), # Минус-плюс (∓)
|
|
||||||
'minusd': ('\u2238', '∸'), # Минус с точкой (∸)
|
|
||||||
'plusdo': ('\u2214', '∔'), # Плюс с точкой (∔)
|
|
||||||
'setminus': ('\u2216', '∖'), # Разность множеств (∖)
|
|
||||||
'lowast': ('\u2217', '∗'), # Оператор звездочка (∗)
|
|
||||||
'compfn': ('\u2218', '∘'), # Кольцевой оператор (∘)
|
|
||||||
'radic': ('\u221A', '√'), # Квадратный корень (√)
|
|
||||||
'prop': ('\u221D', '∝'), # Пропорционально (∝)
|
|
||||||
'infin': ('\u221E', '∞'), # Бесконечность (∞)
|
|
||||||
'ang': ('\u2220', '∠'), # Угол (∠)
|
|
||||||
'angrt': ('\u221F', '∟'), # Правый угол (∟)
|
|
||||||
'angmsd': ('\u2221', '∡'), # Измеримый угол (∡)
|
|
||||||
'angsph': ('\u2222', '∢'), # Сферический угол (∢)
|
|
||||||
'mid': ('\u2223', '∣'), # Делит (∣)
|
|
||||||
'nmid': ('\u2224', '∤'), # Не делит (∤)
|
|
||||||
'parallel': ('\u2225', '∥'), # Параллельно (∥)
|
|
||||||
'npar': ('\u2226', '∦'), # Не параллельно (∦)
|
|
||||||
'and': ('\u2227', '∧'), # Логическое И (∧)
|
|
||||||
'or': ('\u2228', '∨'), # Логическое ИЛИ (∨)
|
|
||||||
'cap': ('\u2229', '∩'), # Пересечение (∩)
|
|
||||||
'cup': ('\u222A', '∪'), # Объединение (∪)
|
|
||||||
'int': ('\u222B', '∫'), # Интеграл (∫)
|
|
||||||
'int2': ('\u222C', '∬'), # Двойной интеграл (∬)
|
|
||||||
'int3': ('\u222D', '∭'), # Тройной интеграл (∭)
|
|
||||||
'conint': ('\u222E', '∮'), # Интеграл по контуру (∮)
|
|
||||||
'Conint': ('\u222F', '∯'), # Поверхностный интеграл (∯)
|
|
||||||
'Cconint': ('\u2230', '∰'), # Интеграл по объёму (∰)
|
|
||||||
'cwint': ('\u2231', '∱'), # Круговой интеграл (∱)
|
|
||||||
'cwconint': ('\u2232', '∲'), # Круговой интеграл по контуру (∲)
|
|
||||||
'awconint': ('\u2233', '∳'), # Антикруговой интеграл по контуру (∳)
|
|
||||||
'there4': ('\u2234', '∴'), # Следовательно (∴)
|
|
||||||
'because': ('\u2235', '∵'), # Поскольку (∵)
|
|
||||||
'ratio': ('\u2236', '∶'), # Отношение (∶)
|
|
||||||
'Colon': ('\u2237', '∷'), # Пропорция (∷)
|
|
||||||
'mDDot': ('\u223A', '∺'), # Геометрическая пропорция (∺)
|
|
||||||
'homtht': ('\u223B', '∻'), # Гомотетия (∻)
|
|
||||||
'sim': ('\u223C', '∼'), # Оператор тильда (∼)
|
|
||||||
'bsim': ('\u223D', '∽'), # Обратная тильда (∽)
|
|
||||||
'ac': ('\u223E', '∾'), # Перевернутая плавная s (∾)
|
|
||||||
'acd': ('\u223F', '∿'), # Синусоидальная волна (∿)
|
|
||||||
'wreath': ('\u2240', '≀'), # Скрученное произведение (≀)
|
|
||||||
'nsim': ('\u2241', '≁'), # Не эквивалентно (≁)
|
|
||||||
'esim': ('\u2242', '≂'), # Тильда с минусом (≂)
|
|
||||||
'sime': ('\u2243', '≃'), # Асимптотически равно (≃)
|
|
||||||
'nsime': ('\u2244', '≄'), # Не асимптотически равно (≄)
|
|
||||||
'cong': ('\u2245', '≅'), # Конгруэнтность (≅)
|
|
||||||
'asymp': ('\u2248', '≈'), # Приблизительно равно (≈)
|
|
||||||
'simne': ('\u2246', '≆'), # Приблизительно, но не точно равно (≆)
|
|
||||||
'ncong': ('\u2247', '≇'), # Не приблизительно, не фактически равно (≇)
|
|
||||||
'nap': ('\u2249', '≉'), # Не почти равный (≉)
|
|
||||||
'approxeq': ('\u224A', '≊'), # Почти равный или равный (≊)
|
|
||||||
'apid': ('\u224B', '≋'), # Тройная тильда (≋)
|
|
||||||
'bcong': ('\u224C', '≌'), # Все равны (≌)
|
|
||||||
'asympeq': ('\u224D', '≍'), # Эквивалентный (≍)
|
|
||||||
'bump': ('\u224E', '≎'), # Геометрически эквивалентный (≎)
|
|
||||||
'bumpe': ('\u224F', '≏'), # Различие между (≏)
|
|
||||||
'esdot': ('\u2250', '≐'), # Приближается к пределу (≐)
|
|
||||||
'eDot': ('\u2251', '≑'), # Точка в пределах, Геометрически равный (≑)
|
|
||||||
'efDot': ('\u2252', '≒'), # Приблизительно равный или образ (≒)
|
|
||||||
'erDot': ('\u2253', '≓'), # Образ или приблизительно равный (≓)
|
|
||||||
'colone': ('\u2254', '≔'), # Двоеточие равно (≔)
|
|
||||||
'ecolon': ('\u2255', '≕'), # Равно двоеточие (≕)
|
|
||||||
'ecir': ('\u2256', '≖'), # Кольцо в равно (≖)
|
|
||||||
'cire': ('\u2257', '≗'), # Кольцо равно (≗)
|
|
||||||
'wedgeq': ('\u2259', '≙'), # Оценка, Равно с вектором (≙)
|
|
||||||
'veeeq': ('\u225A', '≚'), # Равноугольный (≚)
|
|
||||||
'trie': ('\u225C', '≜'), # Равно по определению (≜)
|
|
||||||
'equest': ('\u225F', '≟'), # Равно с вопросительным знаком (≟)
|
|
||||||
'equiv': ('\u2261', '≡'), # Тождественно равно (≡)
|
|
||||||
'nequiv': ('\u2262', '≢'), # Не тождественно равно (≢)
|
|
||||||
'le': ('\u2264', '≤'), # Меньше или равно (≤)
|
|
||||||
'ge': ('\u2265', '≥'), # Больше или равно (≥)
|
|
||||||
'lE': ('\u2266', '≦'), # Меньше над равно (≦)
|
|
||||||
'gE': ('\u2267', '≧'), # Больше над равно (≧)
|
|
||||||
'lnE': ('\u2268', '≨'), # Меньше, но не равно (≨)
|
|
||||||
'gnE': ('\u2269', '≩'), # Больше, но не равно (≩)
|
|
||||||
'Lt': ('\u226A', '≪'), # Много меньше (≪)
|
|
||||||
'Gt': ('\u226B', '≫'), # Много больше (≫)
|
|
||||||
'between': ('\u226C', '≬'), # Между (≬)
|
|
||||||
'NotCupCap': ('\u226D', '≭'), # Не эквивалентно (≭)
|
|
||||||
'nlt': ('\u226E', '≮'), # Не меньше (≮)
|
|
||||||
'ngt': ('\u226F', '≯'), # Не больше (≯)
|
|
||||||
'nle': ('\u2270', '≰'), # Не меньше, не равно (≰)
|
|
||||||
'nge': ('\u2271', '≱'), # Не больше, не равно (≱)
|
|
||||||
'lsim': ('\u2272', '≲'), # Меньше либо эквивалентно (≲)
|
|
||||||
'gsim': ('\u2273', '≳'), # Больше либо эквивалентно (≳)
|
|
||||||
'nlsim': ('\u2274', '≴'), # Ни меньше, ни эквивалентно (≴)
|
|
||||||
'ngsim': ('\u2275', '≵'), # Ни больше, ни эквивалентно (≵)
|
|
||||||
'lg': ('\u2276', '≶'), # Меньше либо больше (≶)
|
|
||||||
'gl': ('\u2277', '≷'), # Больше либо меньше (≷)
|
|
||||||
'ntlg': ('\u2278', '≸'), # Ни меньше, ни больше (≸)
|
|
||||||
'ntgl': ('\u2279', '≹'), # Ни больше, ни меньше (≹)
|
|
||||||
'pr': ('\u227A', '≺'), # Предшествует (≺)
|
|
||||||
'sc': ('\u227B', '≻'), # Следует за (≻)
|
|
||||||
'prcue': ('\u227C', '≼'), # Предшествует либо равно (≼)
|
|
||||||
'sccue': ('\u227D', '≽'), # Следует за либо равно (≽)
|
|
||||||
'prsim': ('\u227E', '≾'), # Предшествует либо эквивалентно (≾)
|
|
||||||
'scsim': ('\u227F', '≿'), # Следует за либо эквивалентно (≿)
|
|
||||||
'npr': ('\u2280', '⊀'), # Не предшествует (⊀)
|
|
||||||
'nsc': ('\u2281', '⊁'), # Не следует за (⊁)
|
|
||||||
'sub': ('\u2282', '⊂'), # Подмножество (⊂)
|
|
||||||
'sup': ('\u2283', '⊃'), # Надмножество (⊃)
|
|
||||||
'nsub': ('\u2284', '⊄'), # Не подмножество (⊄)
|
|
||||||
'nsup': ('\u2285', '⊅'), # Не надмножество (⊅)
|
|
||||||
'sube': ('\u2286', '⊆'), # Подмножество либо совпадает (⊆)
|
|
||||||
'supe': ('\u2287', '⊇'), # Надмножество либо совпадает (⊇)
|
|
||||||
'nsube': ('\u2288', '⊈'), # Ни подмножество, ни совпадает (⊈)
|
|
||||||
'nsupe': ('\u2289', '⊉'), # Ни надмножество, ни совпадает (⊉)
|
|
||||||
'subne': ('\u228A', '⊊'), # Подмножество и не совпадает (⊊)
|
|
||||||
'supne': ('\u228B', '⊋'), # Надмножество и не совпадает (⊋)
|
|
||||||
'cupdot': ('\u228D', '⊍'), # Умножение мультимножеств (⊍)
|
|
||||||
'uplus': ('\u228E', '⊎'), # Объединение мультимножеств, Подмножество с плюсом (⊎)
|
|
||||||
'sqsub': ('\u228F', '⊏'), # Образ в квадрате (⊏)
|
|
||||||
'sqsup': ('\u2290', '⊐'), # Прообраз в квадрате (⊐)
|
|
||||||
'sqsube': ('\u2291', '⊑'), # Образ в квадрате либо равно (⊑)
|
|
||||||
'sqsupe': ('\u2292', '⊒'), # Прообраз в квадрате либо равно (⊒)
|
|
||||||
'sqcap': ('\u2293', '⊓'), # Пересечение в квадрате (⊓)
|
|
||||||
'sqcup': ('\u2294', '⊔'), # Объединение в квадрате (⊔)
|
|
||||||
'oplus': ('\u2295', '⊕'), # Плюс в круге (⊕)
|
|
||||||
'ominus': ('\u2296', '⊖'), # Минус в круге (⊖)
|
|
||||||
'otimes': ('\u2297', '⊗'), # Произведение в круге (⊗)
|
|
||||||
'osol': ('\u2298', '⊘'), # Дробная черта в круге (⊘)
|
|
||||||
'odot': ('\u2299', '⊙'), # Точка в круге (⊙)
|
|
||||||
'ocir': ('\u229A', '⊚'), # Кольцевой оператор в круге (⊚)
|
|
||||||
'oast': ('\u229B', '⊛'), # Оператор звёздочка в круге (⊛)
|
|
||||||
'odash': ('\u229D', '⊝'), # Дефис в круге (⊝)
|
|
||||||
'plusb': ('\u229E', '⊞'), # Плюс в квадрате (⊞)
|
|
||||||
'minusb': ('\u229F', '⊟'), # Минус в квадрате (⊟)
|
|
||||||
'timesb': ('\u22A0', '⊠'), # Произведение в квадрате (⊠)
|
|
||||||
'sdotb': ('\u22A1', '⊡'), # Точка в квадрате (⊡)
|
|
||||||
'vdash': ('\u22A2', '⊢'), # Шеврон вправо (⊢)
|
|
||||||
'dashv': ('\u22A3', '⊣'), # Шеврон влево (⊣)
|
|
||||||
'top': ('\u22A4', '⊤'), # Истина, Шеврон вниз (⊤)
|
|
||||||
'bot': ('\u22A5', '⊥'), # Ложь, Шеврон вверх (⊥)
|
|
||||||
'models': ('\u22A7', '⊧'), # Моделирует (⊧)
|
|
||||||
'vDash': ('\u22A8', '⊨'), # Истина (⊨)
|
|
||||||
'Vdash': ('\u22A9', '⊩'), # Влечёт (⊩)
|
|
||||||
'Vvdash': ('\u22AA', '⊪'), # Тройная вертикальная черта с перекладиной справа (⊪)
|
|
||||||
'VDash': ('\u22AB', '⊫'), # Двойная вертикальная черта с двойной перекладиной справа (⊫)
|
|
||||||
'nvdash': ('\u22AC', '⊬'), # Не доказано (⊬)
|
|
||||||
'nvDash': ('\u22AD', '⊭'), # Не истина (⊭)
|
|
||||||
'nVdash': ('\u22AE', '⊮'), # Не влечёт (⊮)
|
|
||||||
'nVDash': ('\u22AF', '⊯'), # Двойная вертикальная черта с двойной перекладиной справа с отрицанием (⊯)
|
|
||||||
'prurel': ('\u22B0', '⊰'), # Предшествует относительно (⊰)
|
|
||||||
'vltri': ('\u22B2', '⊲'), # Нормальная подгруппа (⊲)
|
|
||||||
'vrtri': ('\u22B3', '⊳'), # Содержит как нормальную подгруппу (⊳)
|
|
||||||
'ltrie': ('\u22B4', '⊴'), # Нормальная подгруппа либо совпадает (⊴)
|
|
||||||
'rtrie': ('\u22B5', '⊵'), # Содержит как нормальную подгруппу либо совпадает (⊵)
|
|
||||||
'origof': ('\u22B6', '⊶'), # Прообраз (⊶)
|
|
||||||
'imof': ('\u22B7', '⊷'), # Образ, Импликация (⊷)
|
|
||||||
'mumap': ('\u22B8', '⊸'), # Многозначное отображение (⊹)
|
|
||||||
'hercon': ('\u22B9', '⊹'), # Эрмитово сопряжение матрицы (⊹)
|
|
||||||
'intcal': ('\u22BA', '⊺'), # Включение (⊺)
|
|
||||||
'veebar': ('\u22BB', '⊻'), # Исключающее ИЛИ (⊻)
|
|
||||||
'barvee': ('\u22BD', '⊽'), # Логическое ИЛИ с отрицанием (⊽)
|
|
||||||
'angrtvb': ('\u22BE', '⊾'), # Правый угол с дугой (⊾)
|
|
||||||
'lrtri': ('\u22BF', '⊿'), # Треугольник вершиной вправо (⊿)
|
|
||||||
'xwedge': ('\u22C0', '⋀'), # N-арное логическое И (⋀)
|
|
||||||
'xvee': ('\u22C1', '⋁'), # N-арное логическое ИЛИ (⋁)
|
|
||||||
'xcap': ('\u22C2', '⋂'), # N-арное пересечение (⋂)
|
|
||||||
'xcup': ('\u22C3', '⋃'), # N-арное объединение (⋃)
|
|
||||||
'diamond': ('\u22C4', '⋄'), # Ромб (⋄)
|
|
||||||
'sdot': ('\u22C5', '⋅'), # Оператор точка (⋅)
|
|
||||||
'Star': ('\u22C6', '⋆'), # Оператор звёздочка (⋆)
|
|
||||||
'divonx': ('\u22C7', '⋇'), # Деление с умножением, Кратность деления (⋇)
|
|
||||||
'bowtie': ('\u22C8', '⋈'), # Бабочка (⋈)
|
|
||||||
'ltimes': ('\u22C9', '⋉'), # Полупрямое произведение с нормальным фактором слева (⋉)
|
|
||||||
'rtimes': ('\u22CA', '⋊'), # Полупрямое произведение с нормальным фактором справа (⋊)
|
|
||||||
'lthree': ('\u22CB', '⋋'), # Левое полупрямое произведение (⋋)
|
|
||||||
'rthree': ('\u22CC', '⋌'), # Правое полупрямое произведение (⋌)
|
|
||||||
'bsime': ('\u22CD', '⋍'), # Обратное волнистое равно (⋍)
|
|
||||||
'cuvee': ('\u22CE', '⋎'), # Волнистое логическое ИЛИ (⋎)
|
|
||||||
'cuwed': ('\u22CF', '⋏'), # Волнистое логическое И (⋏)
|
|
||||||
'Sub': ('\u22D0', '⋐'), # Двойное подмножество (⋐)
|
|
||||||
'Sup': ('\u22D1', '⋑'), # Двойное надмножество (⋑)
|
|
||||||
'Cap': ('\u22D2', '⋒'), # Двойное пересечение (⋒)
|
|
||||||
'Cup': ('\u22D3', '⋓'), # Двойное объединение (⋓)
|
|
||||||
'fork': ('\u22D4', '⋔'), # Вилка (⋔)
|
|
||||||
'epar': ('\u22D5', '⋕'), # Равно и параллельно (⋕)
|
|
||||||
'ltdot': ('\u22D6', '⋖'), # Меньше с точкой (⋖)
|
|
||||||
'gtdot': ('\u22D7', '⋗'), # Больше с точкой (⋗)
|
|
||||||
'Ll': ('\u22D8', '⋘'), # Очень много меньше (⋘)
|
|
||||||
'Gg': ('\u22D9', '⋙'), # Очень много больше (⋙)
|
|
||||||
'leg': ('\u22DA', '⋚'), # Меньше, равно либо больше (⋚)
|
|
||||||
'gel': ('\u22DB', '⋛'), # Больше, равно либо меньше (⋛)
|
|
||||||
'cuepr': ('\u22DE', '⋞'), # Равно либо предшествует (⋞)
|
|
||||||
'cuesc': ('\u22DF', '⋟'), # Равно либо следует за (⋟)
|
|
||||||
'nprcue': ('\u22E0', '⋠'), # Не предшествует либо равно (⋠)
|
|
||||||
'nsccue': ('\u22E1', '⋡'), # Не следует за либо равно (⋡)
|
|
||||||
'nsqsube': ('\u22E2', '⋢'), # Не образ в квадрате либо равно (⋢)
|
|
||||||
'nsqsupe': ('\u22E3', '⋣'), # Не прообраз в квадрате либо равно (⋣)
|
|
||||||
'lnapprox': ('\u2a89', '⪉'), # Меньше, но не приблизительно равно (⋤)
|
|
||||||
'gnapprox': ('\u2a8a', '⪊'), # Больше, но не приблизительно равно (⋥)
|
|
||||||
'lnsim': ('\u22e6', '⋦'), # Меньше, но не эквивалентно (⋦)
|
|
||||||
'gnsim': ('\u22E7', '⋧'), # Больше, но не эквивалентно (⋧)
|
|
||||||
'prnsim': ('\u22E8', '⋨'), # Предшествует, но не эквивалентно (⋨)
|
|
||||||
'scnsim': ('\u22E9', '⋩'), # Следует за, но не эквивалентно (⋩)
|
|
||||||
'nltri': ('\u22EA', '⋪'), # Не содержится как нормальная подгруппа (⋪
|
|
||||||
'nrtri': ('\u22EB', '⋫'), # Не содержит как нормальную подгруппу (⋫)
|
|
||||||
'nltrie': ('\u22EC', '⋬'), # Не содержится как нормальная подгруппа либо совпадает (⋬)
|
|
||||||
'nrtrie': ('\u22ED', '⋭'), # Не содержит как нормальную подгруппу либо совпадает (⋭)
|
|
||||||
'vellip': ('\u22EE', '⋮'), # Вертикальное многоточие (⋮)
|
|
||||||
'ctdot': ('\u22EF', '⋯'), # Внутристрочное горизонтальное многоточие (⋯)
|
|
||||||
'utdot': ('\u22F0', '⋰'), # Диагональное многоточие сверху вправо (⋰)
|
|
||||||
'dtdot': ('\u22F1', '⋱'), # Диагональное многоточие снизу вправо (⋱)
|
|
||||||
'disin': ('\u22F2', '⋲'), # Принадлежит с длинным горизонтальным штрихом (⋲)
|
|
||||||
'isinsv': ('\u22F3', '⋳'), # Принадлежит с вертикальной чертой в конце горизонтального штриха (⋳)
|
|
||||||
'isins': ('\u22F4', '⋴'), # Малое принадлежит с вертикальной чертой в конце горизонтального штриха (⋴)
|
|
||||||
'isindot': ('\u22F5', '⋵'), # Принадлежит с точкой сверху (⋵)
|
|
||||||
'notinvc': ('\u22F6', '⋶'), # Принадлежит с чертой сверху (⋶)
|
|
||||||
'notinvb': ('\u22F7', '⋷'), # Малое принадлежит с чертой сверху (⋷)
|
|
||||||
'isinE': ('\u22F8', '⋹'), # Принадлежит с двумя горизонтальными штрихами (⋸)
|
|
||||||
'nisd': ('\u22FA', '⋺'), # Содержит с длинным горизонтальным штрихом (⋹)
|
|
||||||
'xnis': ('\u22FB', '⋻'), # Содержит с вертикальной чертой в конце горизонтального штриха (⋺)
|
|
||||||
'nis': ('\u22FC', '⋼'), # Малое содержит с вертикальной чертой в конце горизонтального штриха (⋼)
|
|
||||||
'notnivc': ('\u22FD', '⋽'), # Содержит с чертой сверху (⋽)
|
|
||||||
'notnivb': ('\u22FE', '⋾'), # Малое содержит с чертой сверху (⋾)
|
|
||||||
'barwed': ('\u2305', '⌅'), # Вертикальная черта с горизонтальной чертой (⌅)
|
|
||||||
'Barwed': ('\u2306', '⌆'), # Двойная вертикальная черта с горизонтальной чертой (⌆)
|
|
||||||
'lceil': ('\u2308', '⌈'), # Потолок числа, левая скобка (⌈)
|
|
||||||
'rceil': ('\u2309', '⌉'), # Потолок числа, правая скобка (⌉)
|
|
||||||
'lfloor': ('\u230A', '⌊'), # Пол числа, левая скобка (⌊)
|
|
||||||
'rfloor': ('\u230B', '⌋'), # Пол числа, правая скобка (⌋)
|
|
||||||
'lang': ('\u2329', '⟨'), # Левая угловая скобка (〈)
|
|
||||||
'rang': ('\u232A', '⟩'), # Правая угловая скобка (〉)
|
|
||||||
}
|
|
||||||
|
|
||||||
# Другие символы
|
# ШАГ 3: Следующий приоритет. Добавляем числовое кодирование.
|
||||||
SYMBOL_ENTITIES = {
|
for char in ALWAYS_ENCODE_TO_NUMERIC_CHARS:
|
||||||
'copy': ('\u00A9', '©'), # Копирайт (©)
|
if char not in encode_map:
|
||||||
'reg': ('\u00AE', '®'), # Зарегистрированный товарный знак (®)
|
encode_map[char] = f'&#{ord(char)};'
|
||||||
'trade': ('\u2122', '™'), # Знак торговой марки (™)
|
|
||||||
'copysr': ('\u2117', '℗'), # Авторское право звукозаписи, продакшн (℗)
|
|
||||||
'commat': ('\u0040', '@'), # Коммерческое at, `собака` (@)
|
|
||||||
'Copf': ('\u2102', 'ℂ'), # Дважды начерченная заглавная С (ℂ)
|
|
||||||
'incare': ('\u2105', '℅'), # Забота о (℅)
|
|
||||||
'gscr': ('\u210A', 'ℊ'), # Каллиграфическая строчная g (ℊ)
|
|
||||||
'hamilt': ('\u210B', 'ℋ'), # Каллиграфическая заглавная H (ℋ)
|
|
||||||
'Hfr': ('\u210C', 'ℌ'), # Готическая заглавная H (ℌ)
|
|
||||||
'Hopf': ('\u210D', 'ℍ'), # Дважды начерченная заглавная H (ℍ)
|
|
||||||
'planckh': ('\u210E', 'ℎ'), # Постоянная Планка (ℎ)
|
|
||||||
'planck': ('\u210F', 'ℏ'), # Постоянная Планка делённая на два пи, константа Дирака (ℏ)
|
|
||||||
'Iscr': ('\u2110', 'ℐ'), # Каллиграфическая заглавная I (ℐ)
|
|
||||||
'image': ('\u2111', 'ℑ'), # Готическая заглавная I (ℑ)
|
|
||||||
'Lscr': ('\u2112', 'ℒ'), # Каллиграфическая заглавная L (ℒ)
|
|
||||||
'ell': ('\u2113', 'ℓ'), # Каллиграфическая строчная l (ℓ)
|
|
||||||
'Nopf': ('\u2115', 'ℕ'), # Дважды начерченная заглавная N (ℕ)
|
|
||||||
'numero': ('\u2116', '№'), # Знак номера (№)
|
|
||||||
'weierp': ('\u2118', '℘'), # Каллиграфическая заглавная P (℘)
|
|
||||||
'Popf': ('\u2119', 'ℙ'), # Дважды начерченная заглавная P (ℙ)
|
|
||||||
'Qopf': ('\u211A', 'ℚ'), # Дважды начерченная заглавная Q (ℚ)
|
|
||||||
'Rscr': ('\u211B', 'ℛ'), # Каллиграфическая заглавная R (ℜ)
|
|
||||||
'real': ('\u211C', 'ℜ'), # Готическая заглавная R (ℝ)
|
|
||||||
'Ropf': ('\u211D', 'ℝ'), # Дважды начерченная заглавная R (ℝ)
|
|
||||||
'rx': ('\u211E', '℞'), # Символ рецепта (℞)
|
|
||||||
'Zopf': ('\u2124', 'ℤ'), # Дважды начерченная заглавная Z (ℤ)
|
|
||||||
'mho': ('\u2127', '℧'), # Перевёрнутый знак ома (℧)
|
|
||||||
'Zfr': ('\u2128', 'ℨ'), # Готическая заглавная Z (ℨ)
|
|
||||||
'iiota': ('\u2129', '℩'), # Перевернутая греческая строчная буква йота (℩)
|
|
||||||
'bernou': ('\u212C', 'ℬ'), # Каллиграфическая заглавная B (ℬ)
|
|
||||||
'Cfr': ('\u212D', 'ℭ'), # Готическая заглавная C (ℭ)
|
|
||||||
'escr': ('\u212F', 'ℯ'), # Каллиграфическая строчная буква e (ℯ)
|
|
||||||
'Escr': ('\u2130', 'ℰ'), # Каллиграфическая заглавная E (ℰ)
|
|
||||||
'Fscr': ('\u2131', 'ℱ'), # Каллиграфическая заглавная F (ℱ)
|
|
||||||
'Mscr': ('\u2133', 'ℳ'), # Каллиграфическая заглавная M (ℳ)
|
|
||||||
'oscr': ('\u2134', 'ℴ'), # Каллиграфическая строчная буква o (ℴ)
|
|
||||||
'alefsym': ('\u2135', 'ℵ'), # Символ алеф (ℵ)
|
|
||||||
'beth': ('\u2136', 'ℶ'), # Символ бет (ℶ)
|
|
||||||
'gimel': ('\u2137', 'ℷ'), # Символ гимел (ℷ)
|
|
||||||
'daleth': ('\u2138', 'ℸ'), # Символ далет (ℸ)
|
|
||||||
'DD': ('\u2145', 'ⅅ'), # Дважды начерченная курсивная заглавная D (ⅅ)
|
|
||||||
'dd': ('\u2146', 'ⅆ'), # Дважды начерченная курсивная строчная d (ⅆ)
|
|
||||||
'ee': ('\u2147', 'ⅇ'), # Дважды начерченная курсивная строчная e (ⅇ)
|
|
||||||
'ii': ('\u2148', 'ⅈ'), # Дважды начерченная курсивная строчная i (ⅈ)
|
|
||||||
'ffilig': ('\uFB03', 'ffi'), # Лигатура "ffi" (ffi)
|
|
||||||
'fflig': ('\uFB00', 'ff'), # Лигатура "ff" (ff)
|
|
||||||
'filig': ('\uFB01', 'fi'), # Лигатура "fi" (fi)
|
|
||||||
'fllig': ('\uFB02', 'fl'), # Лигатура "fl" (fl)
|
|
||||||
'starf': ('\u2605', '★'), # Закрашенная звезда (★)
|
|
||||||
'star': ('\u2606', '☆'), # Незакрашенная звезда (☆)
|
|
||||||
'phone': ('\u260E', '☎'), # Значок телефона (☎)
|
|
||||||
'female': ('\u2640', '♀'), # Венера (женский знак) (♀)
|
|
||||||
'male': ('\u2642', '♂'), # Марс (мужской знак) (♂)
|
|
||||||
'spades': ('\u2660', '♠'), # Пики закрашенные (♠)
|
|
||||||
'clubs': ('\u2663', '♣'), # Трефы закрашенные (♣)
|
|
||||||
'hearts': ('\u2665', '♥'), # Черви закрашенные (♥)
|
|
||||||
'diams': ('\u2666', '♦'), # Бубны закрашенные (♦)
|
|
||||||
'loz': ('\u25CA', '◊'), # Ромб (◊)
|
|
||||||
'sung': ('\u266A', '♪'), # Музыкальная восьмая нота (♪)
|
|
||||||
'flat': ('\u266D', '♭'), # Музыкальный знак бемоль (♭)
|
|
||||||
'natural': ('\u266E', '♮'), # Музыкальный знак бекар (♮)
|
|
||||||
'sharp': ('\u266F', '♯'), # Музыкальный знак диез (♯)
|
|
||||||
'check': ('\u2713', '✓'), # Галочка (✓)
|
|
||||||
'cross': ('\u2717', '✗'), # Крестик (✗)
|
|
||||||
'malt': ('\u2720', '✠'), # Мальтийский крест (✠)
|
|
||||||
'sext': ('\u2736', '✶'), # Шестиконечная закрашенная звезда (✶)
|
|
||||||
'VerticalSeparator': ('\u2758', '❘'), # Тонкая вертикальная черта (❘)
|
|
||||||
'lbbrk': ('\u2772', '❲'), # Тонкая левая скобка панцерообразной формы (❲)
|
|
||||||
'rbbrk': ('\u2773', '❳'), # Тонкая правая скобка панцерообразной формы (❳)
|
|
||||||
}
|
|
||||||
|
|
||||||
# Знаки препинания
|
# ШАГ 4: Низший приоритет. Заполняем все остальное из нашей
|
||||||
KEY_AMP = 'amp'
|
# объединенной и нормализованной карты unified_name2codepoint.
|
||||||
SYMBOL_PUNCTUATION = {
|
for name, codepoint in unified_name2codepoint.items():
|
||||||
# 'excl': ('\u0021', '!'), # Восклицательный знак (!)
|
char = chr(codepoint)
|
||||||
# 'num': ('\u0023', '#'), # Решётка (#)
|
if char not in encode_map and char not in NEVER_ENCODE_CHARS:
|
||||||
# 'percnt': ('\u0025', '%'), # Знак процента (%)
|
# Теперь 'name' - это уже каноническое имя без ';',
|
||||||
KEY_AMP: ('\u0026', '&'), # Амперсанд (&)
|
# поэтому дополнительная нормализация не нужна. Код стал проще!
|
||||||
# 'lpar': ('\u0028', '('), # Левая круглая скобка (()
|
encode_map[char] = f'&{name};'
|
||||||
# 'rpar': ('\u0029', ')'), # Правая круглая скобка ())
|
|
||||||
# 'ast': ('\u002A', '*'), # Звёздочка (*)
|
|
||||||
# 'comma': ('\u002C', ','), # Запятая (,)
|
|
||||||
# 'period': ('\u002E', '.'), # Точка (.)
|
|
||||||
# 'sol': ('\u002F', '/'), # Косая черта (/)
|
|
||||||
# 'colon': ('\u003A', ':'), # Двоеточие (:)
|
|
||||||
# 'semi': ('\u003B', ';'), # Точка с запятой (;)
|
|
||||||
# 'quest': ('\u003F', '?'), # Знак вопроса (?)
|
|
||||||
# 'lbrack': ('\u005B', '['), # Левая квадратная скобка ([)
|
|
||||||
# 'bsol': ('\u005C', '\'), # Обратная косая черта (\)
|
|
||||||
# 'rbrack': ('\u005D', ']'), # Правая квадратная скобка (])
|
|
||||||
# 'Hat': ('\u005E', '^'), # Циркумфлекс (^) -- знак вставки, карет
|
|
||||||
# 'lowbar': ('\u005F', '_'), # Нижнее подчёркивание (_)
|
|
||||||
# 'grave': ('\u0060', '`'), # Гравис, Апостроф (обратная кавычка) (`)
|
|
||||||
# 'lbrace': ('\u007B', '{'), # Левая фигурная скобка ({)
|
|
||||||
# 'vert': ('\u007C', '|'), # Вертикальная черта (|)
|
|
||||||
# 'rbrace': ('\u007D', '}'), # Правая фигурная скобка (})
|
|
||||||
# 'tilde': ('\u007E', '˜'), # Тильда (~)
|
|
||||||
'circ': ('\u02C6', 'ˆ'), # Модификатор буквы циркумфлекс, ударение (ˆ)
|
|
||||||
'lrm': ('\u200E', '‎'), # Метка слева направо (Left-to-Right Mark)
|
|
||||||
'rlm': ('\u200F', '‏'), # Метка справа налево (Right-to-Left Mark)
|
|
||||||
'iexcl': ('\u00A1', '¡'), # Перевернутый восклицательный знак (¡)
|
|
||||||
'brvbar': ('\u00A6', '¦'), # Изломанная вертикальная черта (¦)
|
|
||||||
'sect': ('\u00A7', '§'), # Знак параграфа (§)
|
|
||||||
'uml': ('\u00A8', '¨'), # Диэрезис (¨)
|
|
||||||
'ordf': ('\u00AA', 'ª'), # Женский порядковый индикатор (ª)
|
|
||||||
'not': ('\u00AC', '¬'), # Знак отрицания (¬)
|
|
||||||
'macr': ('\u00AF', '¯'), # Макрон (¯)
|
|
||||||
'acute': ('\u00B4', '´'), # Знак ударения (´)
|
|
||||||
'micro': ('\u00B5', 'µ'), # Знак микро (µ)
|
|
||||||
'para': ('\u00B6', '¶'), # Знак абзаца (¶)
|
|
||||||
'middot': ('\u00B7', '·'), # Точка по центру (·)
|
|
||||||
'cedil': ('\u00B8', '¸'), # Седиль (¸)
|
|
||||||
'ordm': ('\u00BA', 'º'), # Мужской порядковый индикатор (º)
|
|
||||||
'iquest': ('\u00BF', '¿'), # Перевернутый вопросительный знак (¿)
|
|
||||||
'Vert': ('\u2016', '‖'), # Двойная вертикальная черта (‖)
|
|
||||||
'dagger': ('\u2020', '†'), # Крестик (†)
|
|
||||||
'Dagger': ('\u2021', '‡'), # Двойной крестик (‡)
|
|
||||||
'bull': ('\u2022', '•'), # Маркер списка (•)
|
|
||||||
'nldr': ('\u2025', '‥'), # Двухточечный пунктир (‥)
|
|
||||||
'hellip': ('\u2026', '…'), # Многоточие (…)
|
|
||||||
'permil': ('\u2030', '‰'), # Знак промилле (‰)
|
|
||||||
'pertenk': ('\u2031', '‱'), # Знак на десять тысяч (‱)
|
|
||||||
'prime': ('\u2032', '′'), # Знак штриха (одинарная минута) (′)
|
|
||||||
'Prime': ('\u2033', '″'), # Двойной штрих (двойная минута) (″)
|
|
||||||
'tprime': ('\u2034', '‴'), # Тройной штрих (тройная минута) (‴)
|
|
||||||
'bprime': ('\u2035', '‵'), # Обратный штрих (обратная минута) (‵)
|
|
||||||
'oline': ('\u203E', '‾'), # Надчёркивание (длинная черта над текстом) (‾)
|
|
||||||
'caret': ('\u2041', '⁁'), # Знак вставки точки ввода (⁁)
|
|
||||||
'hybull': ('\u2043', '⁃'), # Маркер списка дефис (⁃)
|
|
||||||
'frasl': ('\u2044', '⁄'), # Дробная наклонная черта (Fraction Slash) (⁄)
|
|
||||||
'bsemi': ('\u204F', '⁏'), # Инвертированная точка с запятой (⁏)
|
|
||||||
'qprime': ('\u2057', '⁗'), # Четырехкратный штрих (⁗)
|
|
||||||
}
|
|
||||||
|
|
||||||
# Дробные символы и знаки
|
return encode_map
|
||||||
SYMBOL_FRACTIONS = {
|
|
||||||
'frac12': ('\u00BD', '½'), # Обычная дробь 1/2 (½)
|
|
||||||
'frac13': ('\u2153', '⅓'), # Обычная дробь 1/3 (⅓)
|
|
||||||
'frac14': ('\u00BC', '¼'), # Обычная дробь 1/4 (¼)
|
|
||||||
'frac15': ('\u2155', '⅕'), # Обычная дробь 1/5 (⅕)
|
|
||||||
'frac16': ('\u2159', '⅙'), # Обычная дробь 1/6 (⅙)
|
|
||||||
# 'frac17': ('\u215A', '&frac17;'), # Обычная дробь 1/7 (⅐)
|
|
||||||
'frac18': ('\u215B', '⅛'), # Обычная дробь 1/8 (⅛)
|
|
||||||
# 'frac19': ('\u215C', '&frac19;'), # Обычная дробь 1/9 (⅑)
|
|
||||||
# 'frac110': ('\u215D', '&frac110;'), # Обычная дробь 1/10 (⅒)
|
|
||||||
'frac23': ('\u2154', '⅔'), # Обычная дробь 2/3 (⅔)
|
|
||||||
'frac25': ('\u2156', '⅖'), # Обычная дробь 2/5 (⅖)
|
|
||||||
'frac34': ('\u00BE', '¾'), # Обычная дробь 3/4 (¾)
|
|
||||||
'frac35': ('\u2157', '⅗'), # Обычная дробь 3/5 (⅗)
|
|
||||||
'frac38': ('\u215A', '⅜'), # Обычная дробь 3/8 (⅜)
|
|
||||||
'frac45': ('\u2158', '⅘'), # Обычная дробь 4/5 (⅘)
|
|
||||||
'frac56': ('\u215A', '⅚'), # Обычная дробь 5/6 (⅚)
|
|
||||||
'frac58': ('\u215B', '⅝'), # Обычная дробь 5/8 (⅝)
|
|
||||||
'frac78': ('\u215B', '⅞'), # Обычная дробь 7/8 (⅞)
|
|
||||||
}
|
|
||||||
|
|
||||||
# Греческие символы
|
|
||||||
GREEK_ENTITIES = {
|
|
||||||
'Alpha': ('\u0391', 'Α'), # Греческая заглавная буква Альфа (Α)
|
|
||||||
'Beta': ('\u0392', 'Β'), # Греческая заглавная буква Бета (Β)
|
|
||||||
'Gamma': ('\u0393', 'Γ'), # Греческая заглавная буква Гамма (Γ)
|
|
||||||
'Delta': ('\u0394', 'Δ'), # Греческая заглавная буква Дельта (Δ)
|
|
||||||
'Epsilon': ('\u0395', 'Ε'), # Греческая заглавная буква Эпсилон (Ε)
|
|
||||||
'Zeta': ('\u0396', 'Ζ'), # Греческая заглавная буква Зета (Ζ)
|
|
||||||
'Eta': ('\u0397', 'Η'), # Греческая заглавная буква Эта (Η)
|
|
||||||
'Theta': ('\u0398', 'Θ'), # Греческая заглавная буква Тета (Θ)
|
|
||||||
'Iota': ('\u0399', 'Ι'), # Греческая заглавная буква Иота (Ι)
|
|
||||||
'Kappa': ('\u039A', 'Κ'), # Греческая заглавная буква Каппа (Κ)
|
|
||||||
'Lambda': ('\u039B', 'Λ'), # Греческая заглавная буква Лямбда (Λ)
|
|
||||||
'Mu': ('\u039C', 'Μ'), # Греческая заглавная буква Мю (Μ)
|
|
||||||
'Nu': ('\u039D', 'Ν'), # Греческая заглавная буква Ню (Ν)
|
|
||||||
'Xi': ('\u039E', 'Ξ'), # Греческая з<><D0B7>главная буква Кси (Ξ)
|
|
||||||
'Omicron': ('\u039F', 'Ο'), # Греческая заглавная буква Омикрон (Ο)
|
|
||||||
'Pi': ('\u03A0', 'Π'), # Греческая заглавная буква Пи (Π)
|
|
||||||
'Rho': ('\u03A1', 'Ρ'), # Греческая заглавная буква Ро (Ρ)
|
|
||||||
'Sigma': ('\u03A3', 'Σ'), # Греческая заглавная буква Сигма (Σ)
|
|
||||||
'Tau': ('\u03A4', 'Τ'), # Греческая заглавная буква Тау (Τ)
|
|
||||||
'Upsilon': ('\u03A5', 'Υ'), # Греческая заглавная буква Упсилон (Υ)
|
|
||||||
'Phi': ('\u03A6', 'Φ'), # Греческая заглавная буква Фи (Φ)
|
|
||||||
'Chi': ('\u03A7', 'Χ'), # Греческая заглавная буква Хи (Χ)
|
|
||||||
'Psi': ('\u03A8', 'Ψ'), # Греческая заглавная буква Пси (Ψ)
|
|
||||||
'Omega': ('\u03A9', 'Ω'), # Греческая заглавная буква Омега (Ω)
|
|
||||||
'alpha': ('\u03B1', 'α'), # Греческая строчная буква Альфа (α)
|
|
||||||
'beta': ('\u03B2', 'β'), # Греческая строчная буква Бета (β)
|
|
||||||
'gamma': ('\u03B3', 'γ'), # Греческая строчная буква Гамма (γ)
|
|
||||||
'delta': ('\u03B4', 'δ'), # Греческая строчная буква Дельта (δ)
|
|
||||||
'epsilon': ('\u03B5', 'ε'), # Греческая строчная буква Эпсилон (ε)
|
|
||||||
'zeta': ('\u03B6', 'ζ'), # Греческая строчная буква Зета (ζ)
|
|
||||||
'eta': ('\u03B7', 'η'), # Греческая строчная буква Эта (η)
|
|
||||||
'theta': ('\u03B8', 'θ'), # Греческая строчная буква Тета (θ)
|
|
||||||
'iota': ('\u03B9', 'ι'), # Греческая строчная буква Иота (ι)
|
|
||||||
'kappa': ('\u03BA', 'κ'), # Греческая строчная буква Каппа (κ)
|
|
||||||
'lambda': ('\u03BB', 'λ'), # Греческая строчная буква Лямбда (λ)
|
|
||||||
'mu': ('\u03BC', 'μ'), # Греческая строчная буква Мю (μ)
|
|
||||||
'nu': ('\u03BD', 'ν'), # Греческая строчная буква Ню (ν)
|
|
||||||
'xi': ('\u03BE', 'ξ'), # Греческая строчная буква Кси (ξ)
|
|
||||||
'omicron': ('\u03BF', 'ο'), # Греческая строчная буква Омикрон (ο)
|
|
||||||
'pi': ('\u03C0', 'π'), # Греческая строчная буква Пи (π)
|
|
||||||
'rho': ('\u03C1', 'ρ'), # Греческая строчная буква Ро (ρ)
|
|
||||||
'sigma': ('\u03C3', 'σ'), # Греческая строчная буква Сигма (σ)
|
|
||||||
'tau': ('\u03C4', 'τ'), # Греческая строчная буква Тау (τ)
|
|
||||||
'upsilon': ('\u03C5', 'υ'), # Греческая строчная буква Упсилон (υ)
|
|
||||||
'phi': ('\u03C6', 'φ'), # Греческая строчная буква Фи (φ)
|
|
||||||
'chi': ('\u03C7', 'χ'), # Греческая строчная буква Хи (χ)
|
|
||||||
'psi': ('\u03C8', 'ψ'), # Греческая строчная буква Пси (ψ)
|
|
||||||
'omega': ('\u03C9', 'ω'), # Греческая строчная буква Омега (ω)
|
|
||||||
'thetasym': ('\u03D1', 'ϑ'), # Греческая строчная буква пи (ϖ)
|
|
||||||
'upsih': ('\u03D2', 'ϒ'), # Греческая строчная буква ро (ϱ)
|
|
||||||
'piv': ('\u03D6', 'ϖ'), # Греческая строчная буква пи (ϖ)
|
|
||||||
}
|
|
||||||
|
|
||||||
# Латинские буквы и символы (умляуты, акценты и т.д.)
|
# Создаем карту один раз при импорте модуля.
|
||||||
LATIN_SPECIAL_ENTITIES = {
|
ENCODE_MAP = _build_translation_maps()
|
||||||
'Agrave': ('\u00C0', 'À'), # Латинская заглавная буква A с грависом (À)
|
|
||||||
'Aacute': ('\u00C1', 'Á'), # Латинская заглавная буква A с акутом (Á)
|
|
||||||
'Acirc': ('\u00C2', 'Â'), # Латинская заглавная буква A с циркумфлексом (Â)
|
|
||||||
'Atilde': ('\u00C3', 'Ã'), # Латинская заглавная буква A с тильдой (Ã)
|
|
||||||
'Auml': ('\u00C4', 'Ä'), # Латинская заглавная буква A с диэризисом/умляутом (Ä)
|
|
||||||
'Aring': ('\u00C5', 'Å'), # Латинская заглавная буква A с кружочком сверху (Å)
|
|
||||||
'AElig': ('\u00C6', 'Æ'), # Лигатура, латинская заглавная буква AE (Æ)
|
|
||||||
'Ccedil': ('\u00C7', 'Ç'), # Латинская заглавная буква C с седилью (Ç)
|
|
||||||
'Egrave': ('\u00C8', 'È'), # Латинская заглавная буква E с грависом (È)
|
|
||||||
'Eacute': ('\u00C9', 'É'), # Латинская заглавная буква E с акутом (É)
|
|
||||||
'Ecirc': ('\u00CA', 'Ê'), # Латинская заглавная буква E с циркумфлексом (Ê)
|
|
||||||
'Euml': ('\u00CB', 'Ë'), # Латинская заглавная буква E с диэризисом/умляутом (Ë)
|
|
||||||
'Igrave': ('\u00CC', 'Ì'), # Латинская заглавная буква I с грависом (Ì)
|
|
||||||
'Iacute': ('\u00CD', 'Í'), # Латинская заглавная буква I с акутом (Í)
|
|
||||||
'Icirc': ('\u00CE', 'Î'), # Латинская заглавная буква I с циркумфлексом (Î)
|
|
||||||
'Iuml': ('\u00CF', 'Ï'), # Латинская заглавная буква I с диэризисом/умляутом (Ï)
|
|
||||||
'ETH': ('\u00D0', 'Ð'), # Латинская заглавная буква Eth (Ð)
|
|
||||||
'Ntilde': ('\u00D1', 'Ñ'), # Латинская заглавная буква N с тильдой (Ñ)
|
|
||||||
'Ograve': ('\u00D2', 'Ò'), # Латинская заглавная буква O с грависом (Ò)
|
|
||||||
'Oacute': ('\u00D3', 'Ó'), # Латинская заглавная буква O с акутом (Ó)
|
|
||||||
'Ocirc': ('\u00D4', 'Ô'), # Латинская заглавная буква O с циркумфлексом (Ô)
|
|
||||||
'Otilde': ('\u00D5', 'Õ'), # Латинская заглавная буква O с тильдой (Õ)
|
|
||||||
'Ouml': ('\u00D6', 'Ö'), # Латинская заглавная буква O с диэризисом/умляутом (Ö)
|
|
||||||
'Oslash': ('\u00D8', 'Ø'), # Латинская заглавная буква O с чертой (Ø)
|
|
||||||
'Ugrave': ('\u00DD', 'Ù'), # Латинская заглавная буква U с грависом (Ù)
|
|
||||||
'Uacute': ('\u00DA', 'Ú'), # Латинская заглавная буква U с акутом (Ú)
|
|
||||||
'Ucirc': ('\u00DB', 'Û'), # Латинская заглавная буква U с циркумфлексом (Û)
|
|
||||||
'Uuml': ('\u00DC', 'Ü'), # Латинская заглавная буква U с диэризисом/умляутом (Ü)
|
|
||||||
'Yacute': ('\u00DD', 'Ý'), # Латинская заглавная буква Y с акутом (Ý)
|
|
||||||
'THORN': ('\u00DE', 'Þ'), # Латинская заглавная буква Thorn (Þ)
|
|
||||||
'szlig': ('\u00DF', 'ß'), # Латинская строчная буква Eszett (ß)
|
|
||||||
'agrave': ('\u00E0', 'à'), # Латинская строчная буква a с грависом (à)
|
|
||||||
'aacute': ('\u00E1', 'á'), # Латинская строчная буква a с акутом (á)
|
|
||||||
'acirc': ('\u00E2', 'â'), # Латинская строчная буква a с циркумфлексом (â)
|
|
||||||
'atilde': ('\u00E3', 'ã'), # Латинская строчная буква a с тильдой (ã)
|
|
||||||
'auml': ('\u00E4', 'ä'), # Латинская строчная буква a с диэризисом/умляутом (ä)
|
|
||||||
'aring': ('\u00E5', 'å'), # Латинская строчная буква a с кружочком сверху (å)
|
|
||||||
'aelig': ('\u00E6', 'æ'), # Лигатура, латинская строчная буква ae (æ)
|
|
||||||
'ccedil': ('\u00E7', 'ç'), # Латинская строчная буква c с седилью (ç)
|
|
||||||
'egrave': ('\u00E8', 'è'), # Латинская строчная буква e с грависом (è)
|
|
||||||
'eacute': ('\u00E9', 'é'), # Латинская строчная буква e с акутом (é)
|
|
||||||
'ecirc': ('\u00EA', 'ê'), # Латинская строчная буква e с циркумфлексом (ê)
|
|
||||||
'euml': ('\u00EB', 'ë'), # Латинская строчная буква e с диэризисом/умляутом (ë)
|
|
||||||
'igrave': ('\u00EC', 'ì'), # Латинская строчная буква i с грависом (ì)
|
|
||||||
'iacute': ('\u00ED', 'í'), # Латинская строчная буква i с акутом (í)
|
|
||||||
'icirc': ('\u00EE', 'î'), # Латинская строчная буква i с циркумфлексом (î)
|
|
||||||
'iuml': ('\u00EF', 'ï'), # Латинская строчная буква i с диэризисом/умляутом (ï)
|
|
||||||
'eth': ('\u00F0', 'ð'), # Латинская строчная буква eth (ð)
|
|
||||||
'ntilde': ('\u00F1', 'ñ'), # Латинская строчная буква n с тильдой (ñ)
|
|
||||||
'ograve': ('\u00F2', 'ò'), # Латинская строчная буква o с грависом (ò)
|
|
||||||
'oacute': ('\u00F3', 'ó'), # Латинская строчная буква o с акутом (ó)
|
|
||||||
'ocirc': ('\u00F4', 'ô'), # Латинская строчная буква o с циркумфлексом (ô)
|
|
||||||
'otilde': ('\u00F5', 'õ'), # Латинская строчная буква o с тильдой (õ)
|
|
||||||
'ouml': ('\u00F6', 'ö'), # Латинская строчная буква o с диэризисом/умляутом (ö)
|
|
||||||
'oslash': ('\u00F8', 'ø'), # Латинская строчная буква o с чертой (ø)
|
|
||||||
'ugrave': ('\u00F9', 'ù'), # Латинская строчная буква u с грависом (ù)
|
|
||||||
'uacute': ('\u00FA', 'ú'), # Латинская строчная буква u с акутом (ú)
|
|
||||||
'ucirc': ('\u00FB', 'û'), # Латинская строчная буква u с циркумфлексом (û)
|
|
||||||
'uuml': ('\u00FC', 'ü'), # Латинская строчная буква u с диэризисом/умляутом (ü)
|
|
||||||
'yacute': ('\u00FD', 'ý'), # Латинская строчная буква y с акутом (ý)
|
|
||||||
'thorn': ('\u00FE', 'þ'), # Латинская строчная буква thorn (þ)
|
|
||||||
'yuml': ('\u00FF', 'ÿ'), # Латинская строчная буква y с диэризисом/умляутом (ÿ)
|
|
||||||
'Amacr': ('\u0100', 'Ā'), # Латинская строчная буква a с макроном (Ā)
|
|
||||||
'amacr': ('\u0101', 'ā'), # Латинская строчная буква a с макроном (ā)
|
|
||||||
'Abreve': ('\u0102', 'Ă'), # Латинская заглавная буква A с бревисом (Ă)
|
|
||||||
'abreve': ('\u0103', 'ă'), # Латинская строчная буква a с бревисом (ă)
|
|
||||||
'Aogon': ('\u0104', 'Ą'), # Латинская заглавная буква A с огонеком (Ą)
|
|
||||||
'aogon': ('\u0105', 'ą'), # Латинская строчная буква a с огонеком (ą)
|
|
||||||
'Cacute': ('\u0106', 'Ć'), # Латинская заглавная буква C с акутом (Ć)
|
|
||||||
'cacute': ('\u0107', 'ć'), # Латинская строчная буква c с акутом (ć)
|
|
||||||
'Ccirc': ('\u0108', 'Ĉ'), # Латинская заглавная буква C с циркумфлексом (Ĉ)
|
|
||||||
'ccirc': ('\u0109', 'ĉ'), # Латинская строчная буква c с циркумфлексом (ĉ)
|
|
||||||
'Cdot': ('\u010A', 'Ċ'), # Латинская заглавная буква C с точкой сверху (Ċ)
|
|
||||||
'cdot': ('\u010B', 'ċ'), # Латинская строчная буква c с точкой сверху (ċ)
|
|
||||||
'Ccaron': ('\u010C', 'Č'), # Латинская заглавная буква C с гачеком/карон (Č)
|
|
||||||
'ccaron': ('\u010D', 'č'), # Латинская строчная буква c с гачеком/карон (č)
|
|
||||||
'Dcaron': ('\u010E', 'Ď'), # Латинская заглавная буква D с гачеком/карон (Ď)
|
|
||||||
'dcaron': ('\u010F', 'ď'), # Латинская строчная буква d с гачеком/карон (ď)
|
|
||||||
'Dstrok': ('\u0110', 'Đ'), # Латинская заглавная буква D с чертой (Đ)
|
|
||||||
'dstrok': ('\u0111', 'đ'), # Латинская строчная буква d с чертой (đ)
|
|
||||||
'Emacr': ('\u0112', 'Ē'), # Латинская заглавная буква E с макроном (Ē)
|
|
||||||
'emacr': ('\u0113', 'ē'), # Латинская строчная буква e с макроном (ē)
|
|
||||||
'Ebreve': ('\u0114', '&Ebreve;'), # Латинская заглавная буква E с бревисом (Ĕ)
|
|
||||||
'ebreve': ('\u0115', '&ebreve;'), # Латинская строчная буква e с бревисом (ĕ)
|
|
||||||
'Edot': ('\u0116', 'Ė'), # Латинская заглавная буква E с точкой сверху (Ė)
|
|
||||||
'edot': ('\u0117', 'ė'), # Латинская строчная буква e с точкой сверху (ė)
|
|
||||||
'Eogon': ('\u0118', 'Ę'), # Латинская заглавная буква E с огонеком (Ę)
|
|
||||||
'eogon': ('\u0119', 'ę'), # Латинская строчная буква e с огонеком (ę)
|
|
||||||
'Ecaron': ('\u011A', 'Ě'), # Латинская заглавная буква E с гачеком/карон (Ě)
|
|
||||||
'ecaron': ('\u011B', 'ě'), # Латинская строчная буква e с гачеком/карон (ě)
|
|
||||||
'Gcirc': ('\u011C', 'Ĝ'), # Латинская заглавная буква G с циркумфлексом (Ĝ)
|
|
||||||
'gcirc': ('\u011D', 'ĝ'), # Латинская строчная буква g с циркумфлексом (ĝ)
|
|
||||||
'Gbreve': ('\u011E', 'Ğ'), # Латинская заглавная буква G с бревисом (Ğ)
|
|
||||||
'gbreve': ('\u011F', 'ğ'), # Латинская строчная буква g с бревисом (ğ)
|
|
||||||
'Gdot': ('\u0120', 'Ġ'), # Латинская заглавная буква G с точкой сверху (Ġ)
|
|
||||||
'gdot': ('\u0121', 'ġ'), # Латинская строчная буква g с точкой сверху (ġ)
|
|
||||||
'Hcirc': ('\u0124', 'Ĥ'), # Латинская заглавная буква H с циркумфлексом (Ĥ)
|
|
||||||
'hcirc': ('\u0125', 'ĥ'), # Латинская строчная буква h с циркумфлексом (ĥ)
|
|
||||||
'Hstrok': ('\u0126', 'Ħ'), # Латинская заглавная буква H с чертой (Ħ)
|
|
||||||
'hstrok': ('\u0127', 'ħ'), # Латинская строчная буква h с чертой (ħ)
|
|
||||||
'Itilde': ('\u0128', 'Ĩ'), # Латинская заглавная буква I с тильдой (Ĩ)
|
|
||||||
'itilde': ('\u0129', 'ĩ'), # Латинская строчная буква i с тильдой (ĩ)
|
|
||||||
'Imacr': ('\u012A', 'Ī'), # Латинская заглавная буква I с макроном (Ī)
|
|
||||||
'imacr': ('\u012B', 'ī'), # Латинская строчная буква i с макроном (ī)
|
|
||||||
'Ibreve': ('\u012C', '&Ibreve;'), # Латинская заглавная буква I с бревисом (Ĭ) -- кажется нет в RFC
|
|
||||||
'ibreve': ('\u012D', '&ibreve;'), # Латинская строчная буква i с бревисом (ĭ) -- кажется нет в RFC
|
|
||||||
'Iogon': ('\u012E', 'Į'), # Латинская заглавная буква I с огонеком (Į)
|
|
||||||
'iogon': ('\u012F', 'į'), # Латинская строчная буква i с огонеком (į)
|
|
||||||
'Idot': ('\u0130', 'İ'), # Латинская заглавная буква I с точкой сверху (İ)
|
|
||||||
'dotlessi': ('\u0131', '&dotlessi;'), # Латинская строчная буква i без точки (ı)
|
|
||||||
'IJlig': ('\u0132', 'IJ'), # Лигатура, латинская заглавная буква IJ (IJ)
|
|
||||||
'ijlig': ('\u0133', 'ij'), # Лигатура, латинская строчная буква ij (ij)
|
|
||||||
'Jcirc': ('\u0134', 'Ĵ'), # Латинская заглавная буква J с циркумфлексом (Ĵ)
|
|
||||||
'jcirc': ('\u0135', 'ĵ'), # Латинская строчная буква j с циркумфлексом (ĵ)
|
|
||||||
'Kcedil': ('\u0136', 'Ķ'), # Латинская заглавная буква K с седилью (Ķ)
|
|
||||||
'kcedil': ('\u0137', 'ķ'), # Латинская строчная буква k с седилью (ķ)
|
|
||||||
'kgreen': ('\u0138', 'ĸ'), # Латинская строчная буква кра / k с гачеком/карон (ĸ)
|
|
||||||
'Lacute': ('\u0139', 'Ĺ'), # Латинская заглавная буква L с акутом (Ĺ) -- кажется нет в RFC
|
|
||||||
'lacute': ('\u013A', 'ĺ'), # Латинская строчная буква l с акутом (ĺ)
|
|
||||||
'Lcedil': ('\u013B', 'Ļ'), # Латинская заглавная буква L с седилью (Ļ)
|
|
||||||
'lcedil': ('\u013C', 'ļ'), # Латинская строчная буква l с седилью (ļ)
|
|
||||||
'Lcaron': ('\u013D', 'Ľ'), # Латинская заглавная буква L с гачеком/карон (Ľ)
|
|
||||||
'lcaron': ('\u013E', 'ľ'), # Латинская строчная буква l с гачеком/карон (ľ)
|
|
||||||
'Lmidot': ('\u013F', 'Ŀ'), # Латинская заглавная буква L с внутристрочной точкой (Ŀ)
|
|
||||||
'lmidot': ('\u0140', 'ŀ'), # Латинская строчная буква l с внутристрочной точкой (ŀ)
|
|
||||||
'Lstrok': ('\u0141', 'Ł'), # Латинская заглавная буква L с чертой, символ Лайткоина (Ł)
|
|
||||||
'lstrok': ('\u0142', 'ł'), # Латинская строчная буква l с чертой (ł)
|
|
||||||
'Nacute': ('\u0143', 'Ń'), # Латинская заглавная буква N с акутом (Ń)
|
|
||||||
'nacute': ('\u0144', 'ń'), # Латинская строчная буква n с акутом (ń)
|
|
||||||
'Ncedil': ('\u0145', 'Ņ'), # Латинская заглавная буква N с седилью (Ņ)
|
|
||||||
'ncedil': ('\u0146', 'ņ'), # Латинская строчная буква n с седилью (ņ)
|
|
||||||
'Ncaron': ('\u0147', 'Ň'), # Латинская заглавная буква N с гачеком/карон (Ň)
|
|
||||||
'ncaron': ('\u0148', 'ň'), # Латинская строчная буква n с гачеком/карон (ň)
|
|
||||||
'napos': ('\u0149', 'ʼn'), # Латинская строчная буква n предшествующим апострофом (ʼn)
|
|
||||||
'ENG': ('\u014A', 'Ŋ'), # Латинская заглавная буква Eng (Ŋ)
|
|
||||||
'eng': ('\u014B', 'ŋ'), # Латинская строчная буква eng (ŋ)
|
|
||||||
'Omacr': ('\u014C', 'Ō'), # Латинская заглавная буква O с макроном (Ō)
|
|
||||||
'omacr': ('\u014D', 'ō'), # Латинская строчная буква o с макроном (ō)
|
|
||||||
'Obreve': ('\u014E', '&Obreve;'), # Латинская заглавная буква O с бревисом (Ŏ) -- кажется нет в RFC
|
|
||||||
'obreve': ('\u014F', '&obreve;'), # Латинская строчная буква o с бревисом (ŏ) -- кажется нет в RFC
|
|
||||||
'Odblac': ('\u0150', 'Ő'), # Латинская заглавная буква O с двойным акутом (Ő)
|
|
||||||
'odblac': ('\u0151', 'ő'), # Латинская строчная буква o с двойным акутом (ő)
|
|
||||||
'OElig': ('\u0152', 'Œ'), # Лигатура, латинская заглавная буква OE (Œ)
|
|
||||||
'oelig': ('\u0153', 'œ'), # Лигатура, латинская строчная буква oe (œ)
|
|
||||||
'Racute': ('\u0154', 'Ŕ'), # Латинская заглавная буква R с акутом (Ŕ)
|
|
||||||
'racute': ('\u0155', 'ŕ'), # Латинская строчная буква r с акутом (ŕ)
|
|
||||||
'Rcedil': ('\u0156', 'Ŗ'), # Латинская заглавная буква R с седилью (Ŗ)
|
|
||||||
'rcedil': ('\u0157', 'ŗ'), # Латинская строчная буква r с седилью (ŗ)
|
|
||||||
'Rcaron': ('\u0158', 'Ř'), # Латинская заглавная буква R с гачеком/карон (Ř)
|
|
||||||
'rcaron': ('\u0159', 'ř'), # Латинская строчная буква r с гачеком/карон (ř)
|
|
||||||
'Sacute': ('\u015A', 'Ś'), # Латинская заглавная буква S с акутом (Ś)
|
|
||||||
'sacute': ('\u015B', 'ś'), # Латинская строчная буква s с акутом (ś)
|
|
||||||
'Scirc': ('\u015C', 'Ŝ'), # Латинская заглавная буква S с циркумфлексом (Ŝ)
|
|
||||||
'scirc': ('\u015D', 'ŝ'), # Латинская строчная буква s с циркумфлексом (ŝ)
|
|
||||||
'Scedil': ('\u015E', 'Ş'), # Латинская заглавная буква S с седилью (Ş)
|
|
||||||
'scedil': ('\u015F', 'ş'), # Латинская строчная буква s с седилью (ş)
|
|
||||||
'Scaron': ('\u0160', 'Š'), # Латинская заглавная буква S с гачеком/карон (Š)
|
|
||||||
'scaron': ('\u0161', 'š'), # Латинская строчная буква s с гачеком/карон (š)
|
|
||||||
'Tcedil': ('\u0162', 'Ţ'), # Латинская заглавная буква T с седилью (Ţ)
|
|
||||||
'tcedil': ('\u0163', 'ţ'), # Латинская строчная буква t с седилью (ţ)
|
|
||||||
'Tcaron': ('\u0164', 'Ť'), # Латинская заглавная буква T с гачеком/карон (Ť)
|
|
||||||
'tcaron': ('\u0165', 'ť'), # Латинская строчная буква t с гачеком/карон (ť)
|
|
||||||
'Tstrok': ('\u0166', 'Ŧ'), # Латинская заглавная буква T с чертой (Ŧ)
|
|
||||||
'tstrok': ('\u0167', 'ŧ'), # Латинская строчная буква t с чертой (ŧ)
|
|
||||||
'Utilde': ('\u0168', 'Ũ'), # Латинская заглавная буква U с тильдой (Ũ)
|
|
||||||
'utilde': ('\u0169', 'ũ'), # Латинская строчная буква u с тильдой (ũ)
|
|
||||||
'Umacr': ('\u016A', 'Ū'), # Латинская заглавная буква U с макроном (Ū)
|
|
||||||
'umacr': ('\u016B', 'ū'), # Латинская строчная буква u с макроном (ū)
|
|
||||||
'Ubreve': ('\u016C', 'Ŭ'), # Латинская заглавная буква U с бревисом (Ŭ)
|
|
||||||
'ubreve': ('\u016D', 'ŭ'), # Латинская строчная буква u с бревисом (ŭ)
|
|
||||||
'Uring': ('\u016E', 'Ů'), # Латинская заглавная буква U с кружочком сверху (Ů)
|
|
||||||
'uring': ('\u016F', 'ů'), # Латинская строчная буква u с кружочком сверху (ů)
|
|
||||||
'Udblac': ('\u0170', 'Ű'), # Латинская заглавная буква U с двойным акутом (Ű)
|
|
||||||
'udblac': ('\u0171', 'ű'), # Латинская строчная буква u с двойным акутом (ű)
|
|
||||||
'Uogon': ('\u0172', 'Ų'), # Латинская заглавная буква U с огонеком (Ų)
|
|
||||||
'uogon': ('\u0173', 'ų'), # Латинская строчная буква u с огонеком (ų)
|
|
||||||
'Wcirc': ('\u0174', 'Ŵ'), # Латинская заглавная буква W с циркумфлексом (Ŵ)
|
|
||||||
'wcirc': ('\u0175', 'ŵ'), # Латинская строчная буква w с циркумфлексом (ŵ)
|
|
||||||
'Ycirc': ('\u0176', 'Ŷ'), # Латинская заглавная буква Y с циркумфлексом (Ŷ)
|
|
||||||
'ycirc': ('\u0177', 'ŷ'), # Латинская строчная буква y с циркумфлексом (ŷ)
|
|
||||||
'Yuml': ('\u0178', 'Ÿ'), # Латинская заглавная буква Y с диэризисом/умляутом (Ÿ)
|
|
||||||
'Zacute': ('\u0179', 'Ź'), # Латинская заглавная буква Z с акутом (Ź)
|
|
||||||
'zacute': ('\u017A', 'ź'), # Латинская строчная буква z с акутом (ź)
|
|
||||||
'Zdot': ('\u017B', 'Ż'), # Латинская заглавная буква Z с точкой сверху (Ż)
|
|
||||||
'zdot': ('\u017C', 'ż'), # Латинская строчная буква z с точкой сверху (ż)
|
|
||||||
'Zcaron': ('\u017D', 'Ž'), # Латинская заглавная буква Z с гачеком/карон (Ž)
|
|
||||||
'zcaron': ('\u017E', 'ž'), # Латинская строчная буква z с гачеком/карон (ž)
|
|
||||||
'DownBreve': ('\u0311', '̑'), # Комбинируемая перевернутая бреве (круглая шапочка)
|
|
||||||
}
|
|
||||||
|
|
||||||
# Стрелки и другие символы
|
|
||||||
ARROW_ENTITIES = {
|
|
||||||
'larr': ('\u2190', '←'), # Левый указатель (←)
|
|
||||||
'uarr': ('\u2191', '↑'), # Верхний указатель (↑)
|
|
||||||
'rarr': ('\u2192', '→'), # Правый указатель (→)
|
|
||||||
'darr': ('\u2193', '↓'), # Нижний указатель (↓)
|
|
||||||
'harr': ('\u2194', '↔'), # Двусторонний указатель (↔)
|
|
||||||
'crarr': ('\u21B5', '↵'), # Указатель возврата каретки, угловая стрелка вниз-влево (↵)
|
|
||||||
'olarr': ('\u21BA', '↺'), # Левый круговой указатель, по часовой стрелке (↺)
|
|
||||||
'orarr': ('\u21BB', '↻'), # Правый круговой указатель, против часовой стрелки (↻)
|
|
||||||
'lharu': ('\u21BC', '↼'), # Гарпун влево с зубцом вверх (↼)
|
|
||||||
'lhard': ('\u21BD', '↽'), # Гарпун влево с зубцом вниз (↽)
|
|
||||||
'uharr': ('\u21BE', '↾'), # Гарпун вверх с зубцом вправо (↾)
|
|
||||||
'uharl': ('\u21BF', '↿'), # Гарпун вверх с зубцом влево (↿)
|
|
||||||
'rharu': ('\u21C0', '⇀'), # Гарпун вправо с зубцом вверх (⇀)
|
|
||||||
'rhard': ('\u21C1', '⇁'), # Гарпун вправо с зубцом вниз (⇁)
|
|
||||||
'dharr': ('\u21C2', '⇂'), # Гарпун вниз с зубцом вправо (⇂)
|
|
||||||
'dharl': ('\u21C3', '⇃'), # Гарпун вниз с зубцом влево (⇃)
|
|
||||||
'rlarr': ('\u21C4', '⇄'), # Стрелка вправо над стрелкой влево (⇄)
|
|
||||||
'udarr': ('\u21C5', '⇅'), # Стрелка вверх и стрелка вниз (⇅)
|
|
||||||
'lrarr': ('\u21C6', '⇆'), # Стрелка влево над стрелкой вправо (⇆)
|
|
||||||
'llarr': ('\u21C7', '⇇'), # Двойная стрелка влево (⇇)
|
|
||||||
'uuarr': ('\u21C8', '⇈'), # Двойная стрелка вверх (⇈)
|
|
||||||
'rrarr': ('\u21C9', '⇉'), # Двойная стрелка вправо (⇉)
|
|
||||||
'ddarr': ('\u21CA', '⇊'), # Двойная стрелка вниз (⇊)
|
|
||||||
'lrhar': ('\u21CB', '⇋'), # Двойной гарпун влево и вправо (⇋)
|
|
||||||
'rlhar': ('\u21CC', '⇌'), # Двойной гарпун вправо и влево (⇌)
|
|
||||||
'nlArr': ('\u21CD', '⇍'), # Перечёркнутая двойная стрелка влево (⇍)
|
|
||||||
'nhArr': ('\u21CE', '⇎'), # Перечёркнутая двойная стрелка влево-вправо (⇎)
|
|
||||||
'nrArr': ('\u21CF', '⇏'), # Перечёркнутая двойная стрелка вправо (⇏)
|
|
||||||
'lArr': ('\u21D0', '⇐'), # Двойная стрелка влево (⇐)
|
|
||||||
'uArr': ('\u21D1', '⇑'), # Двойная стрелка вверх (⇑)
|
|
||||||
'rArr': ('\u21D2', '⇒'), # Двойная стрелка вправо (⇒)
|
|
||||||
'dArr': ('\u21D3', '⇓'), # Двойная стрелка вниз (⇓)
|
|
||||||
'hArr': ('\u21D4', '⇔'), # Двойная стрелка влево-вправо (⇔)
|
|
||||||
'vArr': ('\u21D5', '⇕'), # Двойная стрелка вверх-вниз (⇕)
|
|
||||||
'nwArr': ('\u21D6', '⇖'), # Двойная стрелка влево-вверх (⇖)
|
|
||||||
'neArr': ('\u21D7', '⇗'), # Двойная стрелка вправо-вверх (⇗)
|
|
||||||
'seArr': ('\u21D8', '⇘'), # Двойная стрелка вправо-вниз (⇘)
|
|
||||||
'swArr': ('\u21D9', '⇙'), # Двойная стрелка влево-вниз (⇙)
|
|
||||||
'lAarr': ('\u21DA', '⇚'), # Тройная стрелка влево (⇚)
|
|
||||||
'rAarr': ('\u21DB', '⇛'), # Тройная стрелка вправо (⇛)
|
|
||||||
'zigrarr': ('\u21DC', '⇝'), # Стрелка влево с тремя изгибами (⇜)
|
|
||||||
'zigrarr': ('\u21DD', '⇝'), # Стрелка вправо с тремя изгибами (⇝)
|
|
||||||
'larrb': ('\u21E4', '⇤'), # Стрелка влево, упирающаяся в планку (⇤)
|
|
||||||
'rarrb': ('\u21E5', '⇥'), # Стрелка вправо, упирающаяся в планку (⇥)
|
|
||||||
'duarr': ('\u21F5', '⇵'), # Двойная стрелка вверх-вниз (⇵)
|
|
||||||
'loarr': ('\u21FD', '⇽'), # Стрелка влево с полым наконечником (⇽)
|
|
||||||
'roarr': ('\u21FE', '⇾'), # Стрелка вправо с полым наконечником (⇾)
|
|
||||||
'hoarr': ('\u21FF', '⇿'), # Стрелка влево-вправо с полым наконечником (⇿)
|
|
||||||
'xlarr': ('\u27F5', '⟵'), # Длинная стрелка влево (⟵)
|
|
||||||
'xrarr': ('\u27F6', '⟶'), # Длинная стрелка вправо (⟶)
|
|
||||||
'xharr': ('\u27F7', '⟷'), # Длинная стрелка влево-вправо (⟷)
|
|
||||||
'xlArr': ('\u27F8', '⟸'), # Длинная двойная стрелка влево (⟸)
|
|
||||||
'xrArr': ('\u27F9', '⟹'), # Длинная двойная стрелка вправо (⟹)
|
|
||||||
'xhArr': ('\u27FA', '⟺'), # Длинная двойная стрелка влево-вправо (⟺)
|
|
||||||
'dzigrarr': ('\u27FF', '⟿'), # Длинная стрелка-пружина, направленная вправо (⟿)
|
|
||||||
'xmap': ('\u27FC', '⟼'), # Длинная направленная вправо от чёрточки стрелка (⟼)
|
|
||||||
'nvlArr': ('\u2902', '⤂'), # Двойная стрелка с вертикальной чертой, направленная влево (⤂)
|
|
||||||
'nvrArr': ('\u2903', '⤃'), # Двойная стрелка с вертикальной чертой, направленная вправо (⤃)
|
|
||||||
'nvHarr': ('\u2904', '⤄'), # Двойная стрелка с вертикальной чертой, направленная вправо и влево (⤄)
|
|
||||||
'Map': ('\u2905', '⤅'), # Стрелка с двумя наконечниками направленная вправо от чёрточки стрелка (⤅)
|
|
||||||
'lbarr': ('\u290C', '⤌'), # Стрелка с двойным штрихом, направленная влево (⤌)
|
|
||||||
'rbarr': ('\u290D', '⤍'), # Стрелка с двойным штрихом, направленная вправо (⤍)
|
|
||||||
'lBarr': ('\u290E', '⤎'), # Стрелка с тройным штрихом, направленная влево (⤎)
|
|
||||||
'rBarr': ('\u290F', '⤏'), # Стрелка с тройным штрихом, направленная вправо (⤏)
|
|
||||||
'RBarr': ('\u2910', '⤐'), # Стрелка с тройным штрихом с двумя наконечниками, направленная вправо (⤐)
|
|
||||||
'DDotrahd': ('\u2911', '⤑'), # Стрелка с точечным стрежнем, направленная вправо
|
|
||||||
'UpArrowBar': ('\u2912', '⤒'), # Стрелка вверх, направленная к чёрточке (⤒)
|
|
||||||
'DownArrowBar': ('\u2913', '⤓'), # Стрелка вниз, направленная к чёрточке (⤓)
|
|
||||||
'Rarrtl': ('\u2916', '⤖'), # Стрелка с двумя наконечниками и хвостиком, направленная вправо (⤖)
|
|
||||||
'latail': ('\u2919', '⤙'), # Направленный влево хвост стрелы (⤙)
|
|
||||||
'ratail': ('\u291A', '⤚'), # Направленный вправо хвост стрелы (⤚)
|
|
||||||
'lAtail': ('\u291B', '⤛'), # Направленный влево хвост стрелы с двумя наконечниками (⤛)
|
|
||||||
'rAtail': ('\u291C', '⤜'), # Направленный вправо хвост стрелы с двумя наконечниками (⤜)
|
|
||||||
'larrfs': ('\u291D', '⤝'), # Стрелка, направленная влево к закрашенному ромбу (⤝)
|
|
||||||
'rarrfs': ('\u291E', '⤞'), # Стрелка, направленная вправо к закрашенному ромбу (⤞)
|
|
||||||
'larrbfs': ('\u291F', '⤟'), # Стрелка, направленная влево от чёрточки к закрашенному ромбу (⤟)
|
|
||||||
'rarrbfs': ('\u2920', '⤠'), # Стрелка, направленная вправо от чёрточки к закрашенному ромбу (⤠)
|
|
||||||
'nwarhk': ('\u2923', '⤣'), # Стрелка, направленная на северо-запад с крючком на конце (⤣)
|
|
||||||
'nearhk': ('\u2924', '⤤'), # Стрелка, направленная на северо-восток с крючком на конце (⤤)
|
|
||||||
'searhk': ('\u2925', '⤥'), # Стрелка, направленная на юго-восток с крючком на конце (⤥)
|
|
||||||
'swarhk': ('\u2926', '⤦'), # Стрелка, направленная на юго-запад с крючком на конце (⤦)
|
|
||||||
'nwnear': ('\u2927', '⤧'), # Стрелка, направленная на северо-запад и стрелка, направленная на северо-восток (⤧)
|
|
||||||
'nesear': ('\u2928', '⤨'), # Стрелка, направленная на северо-восток и стрелка, направленная на юго-восток (⤨)
|
|
||||||
'seswar': ('\u2929', '⤩'), # Стрелка, направленная на юго-восток и стрелка, направленная на юго-запад (⤩)
|
|
||||||
'swnwar': ('\u292A', '⤪'), # Стрелка, направленная на юго-запад и стрелка, направленная на северо-запад (⤪)
|
|
||||||
'urca': ('\u2934', '&urca;'), # Стрелка, направленная вправо и изогнутая вверх (⤴)
|
|
||||||
'drca': ('\u2935', '&drca;'), # Стрелка, направленная вправо и изогнутая вниз (⤵)
|
|
||||||
# 'ldca': ('\u2936', '⤶'), # Стрелка, направленная влево, затем изогнутая вниз (⤶)
|
|
||||||
# 'rdca': ('\u2937', '⤷'), # Стрелка, направленная вправо, затем изогнутая вверх (⤷)
|
|
||||||
# 'dlca': ('\u2939', '&dlca;'), # Стрелка, направленная вправо к закрашенному ромбу (⤹)
|
|
||||||
# Есть еще много стрелок, кажется для них есть мета-коды в HTML:
|
|
||||||
# https://symbl.cc/ru/html-entities/
|
|
||||||
# Но, кажется, по ссылке путаница в мета-кодах
|
|
||||||
|
|
||||||
# Очень жаль, что нет треугольников. Они и как стрелки очень удобны.
|
|
||||||
# \u25B2 - ▲ \u25BC - ▼ \u25BA - ► \u25C4 - ◄
|
|
||||||
}
|
|
||||||
|
|
||||||
# --- Сборка и валидация ---
|
|
||||||
|
|
||||||
# 1. Создаем единый словарь всех сущностей для удобного доступа
|
|
||||||
ALL_ENTITIES = {
|
|
||||||
**SHY_ENTITIES,
|
|
||||||
**SPACE_ENTITIES,
|
|
||||||
**DASH_ENTITIES,
|
|
||||||
**MATH_ENTITIES,
|
|
||||||
**GREEK_ENTITIES,
|
|
||||||
**LATIN_SPECIAL_ENTITIES,
|
|
||||||
**QUOTE_ENTITIES,
|
|
||||||
**CURRENCY_ENTITIES,
|
|
||||||
**SYMBOL_ENTITIES,
|
|
||||||
**SYMBOL_PUNCTUATION,
|
|
||||||
**SYMBOL_FRACTIONS,
|
|
||||||
**ARROW_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])
|
|
||||||
|
|
||||||
|
# --- Публичный API модуля ---
|
||||||
|
def get_encode_map():
|
||||||
|
"""Возвращает готовую карту для кодирования."""
|
||||||
|
return ENCODE_MAP
|
@@ -6,24 +6,21 @@
|
|||||||
|
|
||||||
import regex
|
import regex
|
||||||
import logging
|
import logging
|
||||||
from etpgrf.config import LANG_RU, LANG_RU_OLD, LANG_EN, KEY_SHY, ALL_ENTITIES
|
import html
|
||||||
|
from etpgrf.config import (
|
||||||
|
LANG_RU, LANG_RU_OLD, LANG_EN,
|
||||||
|
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
|
||||||
|
)
|
||||||
from etpgrf.defaults import etpgrf_settings
|
from etpgrf.defaults import etpgrf_settings
|
||||||
from etpgrf.comutil import parse_and_validate_langs, is_inside_unbreakable_segment
|
from etpgrf.comutil import parse_and_validate_langs, is_inside_unbreakable_segment
|
||||||
|
|
||||||
_RU_VOWELS_UPPER = frozenset(['А', 'О', 'И', 'Е', 'Ё', 'Э', 'Ы', 'У', 'Ю', 'Я'])
|
|
||||||
_RU_CONSONANTS_UPPER = frozenset(['Б', 'В', 'Г', 'Д', 'Ж', 'З', 'К', 'Л', 'М', 'Н', 'П', 'Р', 'С', 'Т', 'Ф', 'Х',
|
|
||||||
'Ц', 'Ч', 'Ш', 'Щ'])
|
|
||||||
_RU_J_SOUND_UPPER = frozenset(['Й'])
|
|
||||||
_RU_SIGNS_UPPER = frozenset(['Ь', 'Ъ'])
|
|
||||||
_RU_OLD_VOWELS_UPPER = frozenset(['І', # И-десятеричное (гласная)
|
_RU_OLD_VOWELS_UPPER = frozenset(['І', # И-десятеричное (гласная)
|
||||||
'Ѣ', # Ять (гласная)
|
'Ѣ', # Ять (гласная)
|
||||||
'Ѵ']) # Ижица (может быть и гласной, и согласной - сложный случай!)
|
'Ѵ']) # Ижица (может быть и гласной, и согласной - сложный случай!)
|
||||||
_RU_OLD_CONSONANTS_UPPER = frozenset(['Ѳ',],) # Фита (согласная)
|
_RU_OLD_CONSONANTS_UPPER = frozenset(['Ѳ',],) # Фита (согласная)
|
||||||
|
|
||||||
|
|
||||||
_EN_VOWELS_UPPER = frozenset(['A', 'E', 'I', 'O', 'U', 'Æ', 'Œ'])
|
|
||||||
_EN_CONSONANTS_UPPER = frozenset(['B', 'C', 'D', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T',
|
|
||||||
'V', 'W', 'X', 'Y', 'Z'])
|
|
||||||
_EN_SUFFIXES_WITHOUT_HYPHENATION_UPPER = frozenset([
|
_EN_SUFFIXES_WITHOUT_HYPHENATION_UPPER = frozenset([
|
||||||
"ATION", "ITION", "UTION", "OSITY", # 5-символьные, типа: creation, position, solution, generosity
|
"ATION", "ITION", "UTION", "OSITY", # 5-символьные, типа: creation, position, solution, generosity
|
||||||
"ABLE", "IBLE", "MENT", "NESS", # 4-символьные, типа: readable, visible, development, kindness
|
"ABLE", "IBLE", "MENT", "NESS", # 4-символьные, типа: readable, visible, development, kindness
|
||||||
@@ -71,7 +68,10 @@ class Hyphenator:
|
|||||||
# Загружает наборы символов на основе self.langs
|
# Загружает наборы символов на основе self.langs
|
||||||
self._load_language_resources_for_hyphenation()
|
self._load_language_resources_for_hyphenation()
|
||||||
# Так как внутри типографа кодировка html, то символ переноса независим от режима
|
# Так как внутри типографа кодировка html, то символ переноса независим от режима
|
||||||
self._split_code: str = ALL_ENTITIES[KEY_SHY][0]
|
# self._split_code: str = ALL_ENTITIES[KEY_SHY][0]
|
||||||
|
# Получаем символ неразрывного пробела напрямую из стандартной библиотеки
|
||||||
|
self._split_code = chr(html.entities.name2codepoint['shy']) # <--- ИЗМЕНИТЬ
|
||||||
|
|
||||||
# ...
|
# ...
|
||||||
logger.debug(f"Hyphenator `__init__`. Langs: {self.langs},"
|
logger.debug(f"Hyphenator `__init__`. Langs: {self.langs},"
|
||||||
f" Max unhyphenated_len: {self.max_unhyphenated_len},"
|
f" Max unhyphenated_len: {self.max_unhyphenated_len},"
|
||||||
@@ -80,21 +80,21 @@ class Hyphenator:
|
|||||||
def _load_language_resources_for_hyphenation(self):
|
def _load_language_resources_for_hyphenation(self):
|
||||||
# Определяем наборы гласных, согласных и т.д. в зависимости языков.
|
# Определяем наборы гласных, согласных и т.д. в зависимости языков.
|
||||||
if LANG_RU in self.langs:
|
if LANG_RU in self.langs:
|
||||||
self._vowels |= _RU_VOWELS_UPPER
|
self._vowels |= RU_VOWELS_UPPER
|
||||||
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 |= self._vowels | self._consonants | self._j_sound_upper | self._signs_upper
|
self._ru_alphabet_upper |= self._vowels | self._consonants | self._j_sound_upper | self._signs_upper
|
||||||
if LANG_RU_OLD in self.langs:
|
if LANG_RU_OLD in self.langs:
|
||||||
self._vowels |= _RU_VOWELS_UPPER | _RU_OLD_VOWELS_UPPER
|
self._vowels |= RU_VOWELS_UPPER | _RU_OLD_VOWELS_UPPER
|
||||||
self._consonants |= _RU_CONSONANTS_UPPER | _RU_OLD_CONSONANTS_UPPER
|
self._consonants |= RU_CONSONANTS_UPPER | _RU_OLD_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 |= self._vowels | self._consonants | self._j_sound_upper | self._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
|
||||||
self._en_alphabet_upper |= _EN_VOWELS_UPPER | _EN_CONSONANTS_UPPER
|
self._en_alphabet_upper |= EN_VOWELS_UPPER | EN_CONSONANTS_UPPER
|
||||||
# ... и для других языков, если они поддерживаются переносами
|
# ... и для других языков, если они поддерживаются переносами
|
||||||
|
|
||||||
|
|
||||||
|
@@ -14,97 +14,39 @@ STRINGS_FOR_DECODE = [
|
|||||||
("­", "\u00AD"), # Мягкий перенос
|
("­", "\u00AD"), # Мягкий перенос
|
||||||
("    ‍‌", "\u00A0\u2002\u2003\u2009\u200D\u200C"), # Набор пробелов и невидимых символов
|
("    ‍‌", "\u00A0\u2002\u2003\u2009\u200D\u200C"), # Набор пробелов и невидимых символов
|
||||||
("– — ‐ ―", "– — ‐ ―"), # Набор тире и дефисов
|
("– — ‐ ―", "– — ‐ ―"), # Набор тире и дефисов
|
||||||
("' « »", "' « »"), # Апостроф и ёлочки
|
|
||||||
("“ ” „", "“ ” „"), # Двойные кавычки
|
|
||||||
("‘ ’ ‚", "‘ ’ ‚"), # Одиночные кавычки
|
|
||||||
("‹ ›", "‹ ›"), # Французские угловые кавычки
|
|
||||||
("$ ¢ £ ¤ ¥ € ₽", "$ ¢ £ ¤ ¥ € ₽"), # Валютные символы
|
("$ ¢ £ ¤ ¥ € ₽", "$ ¢ £ ¤ ¥ € ₽"), # Валютные символы
|
||||||
("+ − × ÷ = ≠", "+ − × ÷ = ≠"), # Математические символы
|
# Набор из html.entities.name2codepoint
|
||||||
("± ¬ ° ¹ ² ³", "± ¬ ° ¹ ² ³"),
|
("Æ Á Â À Α Å Ã Ä Ä", "Æ Á Â À Α Å Ã Ä Ä"),
|
||||||
("ƒ % ‰ ‱", "ƒ % ‰ ‱"),
|
("Β Ç Χ ‡ Δ Ð É Ê È", "Β Ç Χ ‡ Δ Ð É Ê È"),
|
||||||
("∀ ∁ ∂ ∃ ∄", "∀ ∁ ∂ ∃ ∄"),
|
("Ε Η Ë Γ Í Î Ì Ι Ï", "Ε Η Ë Γ Í Î Ì Ι Ï"),
|
||||||
("∅ ∇ ∈ ∉ ∋ ∌", "∅ ∇ ∈ ∉ ∋ ∌"),
|
("Κ Λ Μ Ñ Ν Œ Ó Ô Ò Ö", "Κ Λ Μ Ñ Ν Œ Ó Ô Ò Ö"),
|
||||||
("∏ ∐ ∑ ∓ ∸", "∏ ∐ ∑ ∓ ∸"),
|
("Ω Ο Ø Õ Φ Π ″ Ψ Ρ Š", "Ω Ο Ø Õ Φ Π ″ Ψ Ρ Š"),
|
||||||
("∔ ∖ ∗ ∘ √", "∔ ∖ ∗ ∘ √"),
|
("Σ Þ Τ Θ Ú Û Ù Υ Ü", "Σ Þ Τ Θ Ú Û Ù Υ Ü"),
|
||||||
("∝ ∞ ∠ ∟ ∡ ∣", "∝ ∞ ∠ ∟ ∡ ∣"),
|
("Ξ Ý Ÿ Ζ á â ´ æ à", "Ξ Ý Ÿ Ζ á â ´ æ à"),
|
||||||
("∢ ∤ ∥ ∦ ∧ ∨", "∢ ∤ ∥ ∦ ∧ ∨"),
|
("ℵ α & ∧ ∠ ' å ≈ ã ä", "ℵ α & ∧ ∠ ' å ≈ ã ä"),
|
||||||
("∩ ∪ ∫ ∬ ∭ ∮", "∩ ∪ ∫ ∬ ∭ ∮"),
|
("„ β ¦ • ∩ ç ¸ ¢ χ ˆ", "„ β ¦ • ∩ ç ¸ ¢ χ ˆ"),
|
||||||
("∯ ∰ ∱ ∲", "∯ ∰ ∱ ∲"),
|
("♣ ≅ © ↵ ∪ ¤ ⇓ † ↓ °", "♣ ≅ © ↵ ∪ ¤ ⇓ † ↓ °"),
|
||||||
("∳ ∴ ∵ ∶ ∷", "∳ ∴ ∵ ∶ ∷"),
|
("δ ♦ ÷ é ê è ∅    ", "δ ♦ ÷ é ê è ∅ \u2003 \u2002"),
|
||||||
("∺ ∻ ∼ ∽ ∾ ∿", "∺ ∻ ∼ ∽ ∾ ∿"),
|
("ε ≡ η ð ë € ∃ ƒ ∀ ½", "ε ≡ η ð ë € ∃ ƒ ∀ ½"),
|
||||||
("≀ ≁ ≂ ≃ ≄ ≅", "≀ ≁ ≂ ≃ ≄ ≅"),
|
("¼ ¾ ⁄ γ ≥ > ⇔ ↔ ♥ …", "¼ ¾ ⁄ γ ≥ > ⇔ ↔ ♥ …"),
|
||||||
("≈ ≆ ≇ ≉ ≊ ≋", "≈ ≆ ≇ ≉ ≊ ≋"),
|
("í î ¡ ì ℑ ∞ ∫ ι ¿ ∈", "í î ¡ ì ℑ ∞ ∫ ι ¿ ∈"),
|
||||||
("≌ ≍ ≎ ≏ ≐ ≑", "≌ ≍ ≎ ≏ ≐ ≑"),
|
("ï κ ⇐ λ ⟨ « ← ⌈ “ ≤", "ï κ ⇐ λ ⟨ « ← ⌈ “ ≤"),
|
||||||
("≒ ≓ ≔ ≕ ≖ ≗", "≒ ≓ ≔ ≕ ≖ ≗"),
|
("⌊ ∗ ◊ ‎ ‹ ‘ < ¯ — µ", "⌊ ∗ ◊ \u200e ‹ ‘ < ¯ — µ"),
|
||||||
("≙ ≚ ≜ ≟ ≡", "≙ ≚ ≜ ≟ ≡"),
|
("· − μ ∇ – ≠ ∋ ¬ ∉", "· − μ ∇ \u00A0 – ≠ ∋ ¬ ∉"),
|
||||||
("≢ ≤ ≥ ≦ ≧ ≨ ≩", "≢ ≤ ≥ ≦ ≧ ≨ ≩"),
|
("⊄ ñ ν ó ô œ ò ‾ ω", "⊄ ñ ν ó ô œ ò ‾ ω"),
|
||||||
("≪ ≫ ≬ ≭ ≮ ≯", "≪ ≫ ≬ ≭ ≮ ≯"),
|
("ο ⊕ ∨ ª º ø õ ⊗ ö", "ο ⊕ ∨ ª º ø õ ⊗ ö"),
|
||||||
("≰ ≱ ≲ ≳ ≴ ≵", "≰ ≱ ≲ ≳ ≴ ≵"),
|
("¶ ∂ ‰ ⊥ φ π ϖ ± £ ′ ∏", "¶ ∂ ‰ ⊥ φ π ϖ ± £ ′ ∏"),
|
||||||
("≶ ≷ ≸ ≹ ≺ ≻", "≶ ≷ ≸ ≹ ≺ ≻"),
|
("∝ ψ " ⇒ √ ⟩ » → ⌉ ”", "∝ ψ \" ⇒ √ ⟩ » → ⌉ ”"),
|
||||||
("≼ ≽ ≾ ≿ ⊀ ⊁", "≼ ≽ ≾ ≿ ⊀ ⊁"),
|
("ℜ ® ⌋ ρ ‏ › ’ ‚ š", "ℜ ® ⌋ ρ \u200f › ’ ‚ š"),
|
||||||
("⊂ ⊃ ⊄ ⊅ ⊆ ⊇", "⊂ ⊃ ⊄ ⊅ ⊆ ⊇"),
|
("⋅ § ­ σ ς ∼ ♠ ⊂ ⊆ ∑", "⋅ § \u00AD σ ς ∼ ♠ ⊂ ⊆ ∑"),
|
||||||
("⊈ ⊉ ⊊ ⊋ ⊍", "⊈ ⊉ ⊊ ⊋ ⊍"),
|
("⊃ ¹ ² ³ ⊇ ß τ ∴ θ ϑ", "⊃ ¹ ² ³ ⊇ ß τ ∴ θ ϑ"),
|
||||||
("⊎ ⊏ ⊐ ⊑ ⊒", "⊎ ⊏ ⊐ ⊑ ⊒"),
|
("  þ ˜ × ™ ⇑ ú ↑ û", "\u2009 þ ˜ × ™ ⇑ ú ↑ û"),
|
||||||
("⊓ ⊔ ⊕ ⊖ ⊗", "⊓ ⊔ ⊕ ⊖ ⊗"),
|
("ù ¨ ϒ υ ü ℘ ξ ý ¥ ÿ", "ù ¨ ϒ υ ü ℘ ξ ý ¥ ÿ"),
|
||||||
("⊘ ⊙ ⊚ ⊛ ⊝ ⊞", "⊘ ⊙ ⊚ ⊛ ⊝ ⊞"),
|
("ζ ‍ ‌ + = %", "ζ \u200D \u200C + = %"),
|
||||||
("⊟ ⊠ ⊡ ⊢ ⊣ ⊤", "⊟ ⊠ ⊡ ⊢ ⊣ ⊤"),
|
# Набор из html.entities.html5
|
||||||
("⊥ ⊧ ⊨ ⊩ ⊪", "⊥ ⊧ ⊨ ⊩ ⊪"),
|
("", ""),
|
||||||
("⊫ ⊬ ⊭ ⊮ ⊯", "⊫ ⊬ ⊭ ⊮ ⊯"),
|
|
||||||
("⊰ ⊲ ⊳ ⊴ ⊵", "⊰ ⊲ ⊳ ⊴ ⊵"),
|
|
||||||
("⊶ ⊷ ⊸ ⊹ ⊺", "⊶ ⊷ ⊸ ⊹ ⊺"),
|
|
||||||
("⊻ ⊽ ⊾ ⊿ ⋀", "⊻ ⊽ ⊾ ⊿ ⋀"),
|
|
||||||
("⋁ ⋂ ⋃ ⋄ ⋅ ⋆", "⋁ ⋂ ⋃ ⋄ ⋅ ⋆"),
|
|
||||||
("⋇ ⋈ ⋉ ⋊ ⋋", "⋇ ⋈ ⋉ ⋊ ⋋"),
|
|
||||||
("⋌ ⋍ ⋎ ⋏ ⋐ ⋑", "⋌ ⋍ ⋎ ⋏ ⋐ ⋑"),
|
|
||||||
("⋒ ⋓ ⋔ ⋕ ⋖ ⋗", "⋒ ⋓ ⋔ ⋕ ⋖ ⋗"),
|
|
||||||
("⋘ ⋙ ⋚ ⋛ ⋞ ⋟", "⋘ ⋙ ⋚ ⋛ ⋞ ⋟"),
|
|
||||||
("⋠ ⋡ ⋢ ⋣", "⋠ ⋡ ⋢ ⋣"),
|
|
||||||
("⪉ ⪊ ⋦ ⋧ ⋨", "⪉ ⪊ ⋦ ⋧ ⋨"),
|
|
||||||
("⋩ ⋪ ⋫ ⋬ ⋭", "⋩ ⋪ ⋫ ⋬ ⋭"),
|
|
||||||
("⋮ ⋯ ⋰ ⋱ ⋲", "⋮ ⋯ ⋰ ⋱ ⋲"),
|
|
||||||
("⋳ ⋴ ⋵ ⋶ ⋷", "⋳ ⋴ ⋵ ⋶ ⋷"),
|
|
||||||
("⋹ ⋺ ⋻ ⋼ ⋽", "⋹ ⋺ ⋻ ⋼ ⋽"),
|
|
||||||
("⋾ ⌅ ⌆ ⌈ ⌈", "⋾ ⌅ ⌆ ⌈ ⌈"),
|
|
||||||
("⌉ ⌊ ⌋ ⟨ ⟩", "⌉ ⌊ ⌋ ⟨ ⟩"),
|
|
||||||
# ("© ® ™ ℗ @", "© ® ™ ℗ @"), # Другие символы
|
|
||||||
# ("ℂ ℅ ℊ ℋ ℌ ℍ", "ℂ ℅ ℊ ℋ ℌ ℍ"),
|
|
||||||
# ("ℎ ℏ ℐ ℑ ℒ ℓ", "ℎ ℏ ℐ ℑ ℒ ℓ"),
|
|
||||||
# ("ℕ № ℘ ℙ ℚ ℛ", "ℕ № ℘ ℙ ℚ ℛ"),
|
|
||||||
# ("ℝ ℞ ℤ ℧ ℨ ℩", "ℝ ℞ ℤ ℧ ℨ ℩"),
|
|
||||||
# ("ℬ ℭ ℯ ℰ ℱ ℳ", "ℬ ℭ ℯ ℰ ℱ ℳ"),
|
|
||||||
# ("ℴ ℵ ℶ ℷ ℸ", "ℴ ℵ ℶ ℷ ℸ"),
|
|
||||||
# ("ⅅ ⅆ ⅇ ⅈ ffi ff", "ⅅ ⅆ ⅇ ⅈ ffi ff"),
|
|
||||||
# ("fi fl ★ ☆ ☎", "fi fl ★ ☆ ☎"),
|
|
||||||
# ("♀ ♂ ♠ ♣ ♥ ♦", "♀ ♂ ♠ ♣ ♥ ♦"),
|
|
||||||
# ("◊ ♪ ♭ ♮ ♯ ✓", "◊ ♪ ♭ ♮ ♯ ✓"),
|
|
||||||
# ("✗ ✠ ✶ ❘", "✗ ✠ ✶ ❘"),
|
|
||||||
# ("❲ ❳", "❲ ❳"),
|
|
||||||
# ("! # % ( ) *", "! # % ( ) *"), # Знаки препинания
|
|
||||||
# (", . / : ;", ", . / : ;"),
|
|
||||||
# ("? [ \ ] ^ _", "? [ \\ ] ^ _"),
|
|
||||||
# ("` { | } ˜", "` { | } ˜"),
|
|
||||||
# ("ˆ ‎ ‏ ¡ ¦ §", "ˆ \u200e \u200f ¡ ¦ §"),
|
|
||||||
# ("¨ ª ¬ ¯ ´ µ ‵", "¨ ª ¬ ¯ ´ µ ‵"),
|
|
||||||
# ("¶ · ¸ º ¿ ‖", "¶ · ¸ º ¿ ‖"),
|
|
||||||
# ("† ‡ • ‥ …", "† ‡ • ‥ …"),
|
|
||||||
# ("‰ ‱ ′ ″ ‴", "‰ ‱ ′ ″ ‴"),
|
|
||||||
# ("‾ ⁁ ⁃ ⁄ ⁏ ⁗", "‾ ⁁ ⁃ ⁄ ⁏ ⁗"),
|
|
||||||
# ("½ ⅓ ¼ ⅕ ⅙", "½ ⅓ ¼ ⅕ ⅙"), # Дробные символы и знаки
|
|
||||||
# ("⅛ ⅔ ⅖ ¾ ⅗", "⅛ ⅔ ⅖ ¾ ⅗"),
|
|
||||||
# ("⅜ ⅘ ⅚ ⅝ ⅞", "⅜ ⅘ ⅚ ⅝ ⅞"),
|
|
||||||
# ("Α Β Γ Δ Ε Ζ", "Α Β Γ Δ Ε Ζ"), # Греческие символы
|
|
||||||
# ("Η Θ Ι Κ Λ Μ", "Η Θ Ι Κ Λ Μ"),
|
|
||||||
# ("Ν Ξ Ο Π Ρ Σ Τ", "Ν Ξ Ο Π Ρ Σ Τ"),
|
|
||||||
# ("Υ Φ Χ Ψ Ω α", "Υ Φ Χ Ψ Ω α"),
|
|
||||||
# ("β γ δ ε ζ η", "β γ δ ε ζ η"),
|
|
||||||
# ("θ ι κ λ μ ν", "θ ι κ λ μ ν"),
|
|
||||||
# ("ξ ο π ρ σ τ", "ξ ο π ρ σ τ"),
|
|
||||||
# ("υ φ χ ψ ω", "υ φ χ ψ ω"),
|
|
||||||
# ("ϑ ϒ ϖ", "ϑ ϒ ϖ"),
|
|
||||||
("", ""),
|
("", ""),
|
||||||
|
|
||||||
|
|
||||||
("", ""),
|
|
||||||
]
|
]
|
||||||
|
|
||||||
@pytest.mark.parametrize("input_string, expected_output", STRINGS_FOR_DECODE)
|
@pytest.mark.parametrize("input_string, expected_output", STRINGS_FOR_DECODE)
|
||||||
@@ -118,8 +60,49 @@ def test_html_mnemo_to_utf(input_string, expected_output):
|
|||||||
assert actual_output == expected_output
|
assert actual_output == expected_output
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize("expected_output, input_string", STRINGS_FOR_DECODE)
|
STRINGS_FOR_ENCODE = [
|
||||||
def test_utf_to_html_mnemo(expected_output, input_string):
|
# Тестовые строки для декодирования html-метаккода в uft-8
|
||||||
|
("", ""), # Пустая строка
|
||||||
|
("Hello world!", "Hello world!"), # Строка
|
||||||
|
("Привет типограф!", "Привет типограф!"), # Строка русского текста
|
||||||
|
("< > & \"", "< > & ""), # Самый простой набор HTML-мнемоников
|
||||||
|
("\u00AD", "­"), # Мягкий перенос
|
||||||
|
("\u00A0\u2002\u2003\u2009\u200D\u200C", "    ‍‌"), # Набор пробелов и невидимых символов
|
||||||
|
("– — ‐ ―", "– — ‐ ―"), # Набор тире и дефисов
|
||||||
|
("$ ¢ £ ¤ ¥ € ₽", "$ ¢ £ ¤ ¥ € ₽"), # Валютные символы
|
||||||
|
# Набор из html.entities.name2codepoint
|
||||||
|
("Æ Á Â À Α Å Ã Ä Ä", "Æ Á Â À Α Å Ã Ä Ä"),
|
||||||
|
("Β Ç Χ ‡ Δ Ð É Ê È", "Β Ç Χ ‡ Δ Ð É Ê È"),
|
||||||
|
("Ε Η Ë Γ Í Î Ì Ι Ï", "Ε Η Ë Γ Í Î Ì Ι Ï"),
|
||||||
|
("Κ Λ Μ Ñ Ν Œ Ó Ô Ò Ö", "Κ Λ Μ Ñ Ν Œ Ó Ô Ò Ö"),
|
||||||
|
("Ω Ο Ø Õ Φ Π ″ Ψ Ρ Š", "Ω Ο Ø Õ Φ Π ″ Ψ Ρ Š"),
|
||||||
|
("Σ Þ Τ Θ Ú Û Ù Υ Ü", "Σ Þ Τ Θ Ú Û Ù Υ Ü"),
|
||||||
|
("Ξ Ý Ÿ Ζ á â ´ æ à", "Ξ Ý Ÿ Ζ á â ´ æ à"),
|
||||||
|
("ℵ α & ∧ ∠ ' å ≈ ã ä", "ℵ α & ∧ ∠ ' å ≈ ã ä"),
|
||||||
|
("„ β ¦ • ∩ ç ¸ ¢ χ ˆ", "„ β ¦ • ∩ ç ¸ ¢ χ ˆ"),
|
||||||
|
("♣ ≅ © ↵ ∪ ¤ ⇓ † ↓ °", "♣ ≅ © ↵ ∪ ¤ ⇓ † ↓ °"),
|
||||||
|
("δ ♦ ÷ é ê è ∅ \u2003 \u2002", "δ ♦ ÷ é ê è ∅    "),
|
||||||
|
("ε ≡ η ð ë € ∃ ƒ ∀ ½", "ε ≡ η ð ë € ∃ ƒ ∀ ½"),
|
||||||
|
("¼ ¾ ⁄ γ ≥ > ⇔ ↔ ♥ …", "¼ ¾ ⁄ γ ≥ > ⇔ ↔ ♥ …"),
|
||||||
|
("í î ¡ ì ℑ ∞ ∫ ι ¿ ∈", "í î ¡ ì ℑ ∞ ∫ ι ¿ ∈"),
|
||||||
|
("ï κ ⇐ λ ⟨ « ← ⌈ “ ≤", "ï κ ⇐ λ ⟨ « ← ⌈ “ ≤"),
|
||||||
|
("⌊ ∗ ◊ \u200e ‹ ‘ < ¯ — µ", "⌊ ∗ ◊ ‎ ‹ ‘ < ¯ — µ"),
|
||||||
|
("· − μ ∇ \u00A0 – ≠ ∋ ¬ ∉", "· − μ ∇ – ≠ ∋ ¬ ∉"),
|
||||||
|
("⊄ ñ ν ó ô œ ò ‾ ω", "⊄ ñ ν ó ô œ ò ‾ ω"),
|
||||||
|
("ο ⊕ ∨ ª º ø õ ⊗ ö", "ο ⊕ ∨ ª º ø õ ⊗ ö"),
|
||||||
|
("¶ ∂ ‰ ⊥ φ π ϖ ± £ ′ ∏", "¶ ∂ ‰ ⊥ φ π ϖ ± £ ′ ∏"),
|
||||||
|
("∝ ψ \" ⇒ √ ⟩ » → ⌉ ”", "∝ ψ " ⇒ √ ⟩ » → ⌉ ”"),
|
||||||
|
("ℜ ® ⌋ ρ \u200f › ’ ‚ š", "ℜ ® ⌋ ρ ‏ › ’ ‚ š"),
|
||||||
|
("⋅ § \u00AD σ ς ∼ ♠ ⊂ ⊆ ∑", "⋅ § ­ σ ς ∼ ♠ ⊂ ⊆ ∑"),
|
||||||
|
("⊃ ¹ ² ³ ⊇ ß τ ∴ θ ϑ", "⊃ ¹ ² ³ ⊇ ß τ ∴ θ ϑ"),
|
||||||
|
("\u2009 þ ˜ × ™ ⇑ ú ↑ û", "  þ ˜ × ™ ⇑ ú ↑ û"),
|
||||||
|
("ù ¨ ϒ υ ü ℘ ξ ý ¥ ÿ", "ù ¨ ϒ υ ü ℘ ξ ý ¥ ÿ"),
|
||||||
|
("ζ \u200D \u200C + = %", "ζ ‍ ‌ + = %"),
|
||||||
|
# Набор из html.entities.html5
|
||||||
|
]
|
||||||
|
|
||||||
|
@pytest.mark.parametrize("input_string, expected_output", STRINGS_FOR_ENCODE)
|
||||||
|
def test_utf_to_html_mnemo(input_string, expected_output):
|
||||||
"""
|
"""
|
||||||
Проверяет ПОВЕДЕНИЕ: кодирование Unicode-строк в HTML-мнемоники.
|
Проверяет ПОВЕДЕНИЕ: кодирование Unicode-строк в HTML-мнемоники.
|
||||||
"""
|
"""
|
||||||
|
Reference in New Issue
Block a user