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

@@ -6,7 +6,8 @@
import regex
import logging
from etpgrf.config import LANG_RU, LANG_RU_OLD, LANG_EN, SPACE_ENTITIES, MODE_UNICODE
from etpgrf.config import LANG_RU, LANG_RU_OLD, LANG_EN, KEY_NBSP, ALL_ENTITIES
from etpgrf.comutil import parse_and_validate_langs
from etpgrf.defaults import etpgrf_settings
# --- Наборы коротких слов для разных языков ---
@@ -17,7 +18,7 @@ _RU_UNBREAKABLE_WORDS = frozenset([
# Предлоги (только короткие... длинные, типа `ввиду`, `ввиду` и т.п., могут быть "висячими")
'в', 'без', 'до', 'из', 'к', 'на', 'по', 'о', 'от', 'перед', 'при', 'через', 'с', 'у', 'за', 'над',
'об', 'под', 'про', 'для', 'ко', 'со', 'без', 'то', 'во', 'из-за', 'из-под', 'как'
# Союзы (без сложных, тип 'как будто', 'как если бы', `за то` и т.п.)
# Союзы (без сложных, тип `как будто`, `как если бы`, `за то` и т.п.)
'и', 'а', 'но', 'да', 'как',
# Частицы
'не', 'ни',
@@ -62,15 +63,11 @@ class Unbreakables:
от последующих слов.
"""
def __init__(self,
langs: str | list[str] | tuple[str, ...] | frozenset[str] | None = None,
mode: str = None):
from etpgrf.comutil import parse_and_validate_mode, parse_and_validate_langs
def __init__(self, langs: str | list[str] | tuple[str, ...] | frozenset[str] | None = None):
self.langs = parse_and_validate_langs(langs)
self.mode = parse_and_validate_mode(mode)
# Определяем символ неразрывного пробела в зависимости от режима
self._nbsp_char = SPACE_ENTITIES['NBSP'][0] if self.mode == MODE_UNICODE else SPACE_ENTITIES['NBSP'][1]
# Так как внутри типографа кодировка html, то символ неразрывного пробела независим от режима
self._nbsp_char = ALL_ENTITIES[KEY_NBSP][0]
# --- 1. Собираем наборы слов для обработки ---
pre_words = set()
@@ -104,7 +101,7 @@ class Unbreakables:
# Паттерн для слов, ПЕРЕД которыми нужен nbsp.
self._post_pattern = regex.compile(r"(?i)(\s)\b(" + "|".join(map(regex.escape, sorted_particles)) + r")\b")
logger.debug(f"Unbreakables `__init__`. Langs: {self.langs}, Mode: {self.mode}, "
logger.debug(f"Unbreakables `__init__`. Langs: {self.langs}, "
f"Pre-words: {len(pre_words)}, Post-words: {len(post_words)}")