mod: исправления utf <-> менемоники и тесты

This commit is contained in:
2025-08-02 18:17:45 +03:00
parent 27c950f28d
commit cf047a2552
2 changed files with 57 additions and 54 deletions

View File

@@ -64,7 +64,7 @@ QUOTE_ENTITIES = {
KEY_RAQUO: ('\u00BB', '&raquo;'), # Закрывающая (правая) кавычка «ёлочка» -- » KEY_RAQUO: ('\u00BB', '&raquo;'), # Закрывающая (правая) кавычка «ёлочка» -- »
KEY_LDQUO: ('\u201C', '&ldquo;'), # Oткрывающая (левая) двойная кавычка -- “ KEY_LDQUO: ('\u201C', '&ldquo;'), # Oткрывающая (левая) двойная кавычка -- “
KEY_RDQUO: ('\u201D', '&rdquo;'), # Закрывающая (правая) двойная кавычка -- ” KEY_RDQUO: ('\u201D', '&rdquo;'), # Закрывающая (правая) двойная кавычка -- ”
'bdquo': ('\u2039', '&bdquo;'), # Нижняя двойная кавычка -- „ 'bdquo': ('\u201E', '&bdquo;'), # Нижняя двойная кавычка -- „
'lsquo': ('\u2018', '&lsquo;'), # Открывающая (левая) одинарная кавычка -- 'lsquo': ('\u2018', '&lsquo;'), # Открывающая (левая) одинарная кавычка --
'rsquo': ('\u2019', '&rsquo;'), # Закрывающая (правая) одинарная кавычка -- 'rsquo': ('\u2019', '&rsquo;'), # Закрывающая (правая) одинарная кавычка --
'sbquo': ('\u201A', '&sbquo;'), # Нижняя одинарная кавычка -- 'sbquo': ('\u201A', '&sbquo;'), # Нижняя одинарная кавычка --
@@ -87,8 +87,8 @@ CURRENCY_ENTITIES = {
KEY_LT = 'lt' KEY_LT = 'lt'
KEY_GT = 'gt' KEY_GT = 'gt'
MATH_ENTITIES = { MATH_ENTITIES = {
KEY_LT: ('\u00B7', '&lt;'), # Меньше (<) KEY_LT: ('\u003C', '&lt;'), # Меньше (<)
KEY_GT: ('\u00B7', '&gt;'), # Больше (>) KEY_GT: ('\u003E', '&gt;'), # Больше (>)
'plus': ('\u002B', '&plus;'), # Плюс (+) 'plus': ('\u002B', '&plus;'), # Плюс (+)
'minus': ('\u2212', '&minus;'), # Минус () 'minus': ('\u2212', '&minus;'), # Минус ()
'times': ('\u00D7', '&times;'), # Умножение (×) 'times': ('\u00D7', '&times;'), # Умножение (×)
@@ -120,7 +120,7 @@ MATH_ENTITIES = {
'coprod' : ('\u2210', '&coprod;'), # N-арный сомножитель (∐) 'coprod' : ('\u2210', '&coprod;'), # N-арный сомножитель (∐)
'sum': ('\u2211', '&sum;'), # N-арная сумма (∑) 'sum': ('\u2211', '&sum;'), # N-арная сумма (∑)
'mnplus': ('\u2213', '&mnplus;'), # Минус-плюс (∓) 'mnplus': ('\u2213', '&mnplus;'), # Минус-плюс (∓)
'minusd': ('\u2212', '&minusd;'), # Минус с точкой (∸) 'minusd': ('\u2238', '&minusd;'), # Минус с точкой (∸)
'plusdo': ('\u2214', '&plusdo;'), # Плюс с точкой (∔) 'plusdo': ('\u2214', '&plusdo;'), # Плюс с точкой (∔)
'setminus': ('\u2216', '&setminus;'), # Разность множеств () 'setminus': ('\u2216', '&setminus;'), # Разность множеств ()
'lowast': ('\u2217', '&lowast;'), # Оператор звездочка () 'lowast': ('\u2217', '&lowast;'), # Оператор звездочка ()
@@ -273,7 +273,7 @@ MATH_ENTITIES = {
'hercon': ('\u22B9', '&hercon;'), # Эрмитово сопряжение матрицы (⊹) 'hercon': ('\u22B9', '&hercon;'), # Эрмитово сопряжение матрицы (⊹)
'intcal': ('\u22BA', '&intcal;'), # Включение (⊺) 'intcal': ('\u22BA', '&intcal;'), # Включение (⊺)
'veebar': ('\u22BB', '&veebar;'), # Исключающее ИЛИ (⊻) 'veebar': ('\u22BB', '&veebar;'), # Исключающее ИЛИ (⊻)
'barvee': ('\u22BE', '&barvee;'), # Логическое ИЛИ с отрицанием (⊽) 'barvee': ('\u22BD', '&barvee;'), # Логическое ИЛИ с отрицанием (⊽)
'angrtvb': ('\u22BE', '&angrtvb;'), # Правый угол с дугой (⊾) 'angrtvb': ('\u22BE', '&angrtvb;'), # Правый угол с дугой (⊾)
'lrtri': ('\u22BF', '&lrtri;'), # Треугольник вершиной вправо (⊿) 'lrtri': ('\u22BF', '&lrtri;'), # Треугольник вершиной вправо (⊿)
'xwedge': ('\u22C0', '&xwedge;'), # N-арное логическое И (⋀) 'xwedge': ('\u22C0', '&xwedge;'), # N-арное логическое И (⋀)
@@ -310,9 +310,9 @@ MATH_ENTITIES = {
'nsccue': ('\u22E1', '&nsccue;'), # Не следует за либо равно (⋡) 'nsccue': ('\u22E1', '&nsccue;'), # Не следует за либо равно (⋡)
'nsqsube': ('\u22E2', '&nsqsube;'), # Не образ в квадрате либо равно (⋢) 'nsqsube': ('\u22E2', '&nsqsube;'), # Не образ в квадрате либо равно (⋢)
'nsqsupe': ('\u22E3', '&nsqsupe;'), # Не прообраз в квадрате либо равно (⋣) 'nsqsupe': ('\u22E3', '&nsqsupe;'), # Не прообраз в квадрате либо равно (⋣)
'lnapprox': ('\u22E4', '&lnapprox;'), # Меньше, но не приблизительно равно (⋤) 'lnapprox': ('\u2a89', '&lnapprox;'), # Меньше, но не приблизительно равно (⋤)
'gnapprox': ('\u22E5', '&gnapprox;'), # Больше, но не приблизительно равно (⋥) 'gnapprox': ('\u2a8a', '&gnapprox;'), # Больше, но не приблизительно равно (⋥)
'lnsim': ('\u22E6', '&lnsim;'), # Меньше, но не эквивалентно (⋦) 'lnsim': ('\u22e6', '&lnsim;'), # Меньше, но не эквивалентно (⋦)
'gnsim': ('\u22E7', '&gnsim;'), # Больше, но не эквивалентно (⋧) 'gnsim': ('\u22E7', '&gnsim;'), # Больше, но не эквивалентно (⋧)
'prnsim': ('\u22E8', '&prnsim;'), # Предшествует, но не эквивалентно (⋨) 'prnsim': ('\u22E8', '&prnsim;'), # Предшествует, но не эквивалентно (⋨)
'scnsim': ('\u22E9', '&scnsim;'), # Следует за, но не эквивалентно (⋩) 'scnsim': ('\u22E9', '&scnsim;'), # Следует за, но не эквивалентно (⋩)

View File

@@ -20,14 +20,14 @@ STRINGS_FOR_DECODE = [
("&lsaquo; &rsaquo;", " "), # Французские угловые кавычки ("&lsaquo; &rsaquo;", " "), # Французские угловые кавычки
("&dollar; &cent; &pound; &curren; &yen; &euro; &#8381;", "$ ¢ £ ¤ ¥ € ₽"), # Валютные символы ("&dollar; &cent; &pound; &curren; &yen; &euro; &#8381;", "$ ¢ £ ¤ ¥ € ₽"), # Валютные символы
("&plus; &minus; &times; &divide; &equals; &ne;", "+ × ÷ = ≠"), # Математические символы ("&plus; &minus; &times; &divide; &equals; &ne;", "+ × ÷ = ≠"), # Математические символы
("&plusmn; &not; &deg; &sup1; &sup2 &sup3;", "± ¬ ° ¹ ² ³"), ("&plusmn; &not; &deg; &sup1; &sup2; &sup3;", "± ¬ ° ¹ ² ³"),
("&fnof; &percnt; &permil; &pertenk;", "ƒ % ‰ ‱"), ("&fnof; &percnt; &permil; &pertenk;", "ƒ % ‰ ‱"),
("&forall; &comp; &part; &exist; &nexist;", "∀ ∁ ∂ ∃ ∄"), ("&forall; &comp; &part; &exist; &nexist;", "∀ ∁ ∂ ∃ ∄"),
("&empty; &nabla; &isin; &notin; &ni; &notni;", "∅ ∇ ∈ ∉ ∋ ∌"), ("&empty; &nabla; &isin; &notin; &ni; &notni;", "∅ ∇ ∈ ∉ ∋ ∌"),
("&prod; &coprod; &sum; &mnplus; &minusd;", "∏ ∐ ∑ ∓ ∸"), ("&prod; &coprod; &sum; &mnplus; &minusd;", "∏ ∐ ∑ ∓ ∸"),
("&plusdo; &setminus; &lowast; &compfn; &radic;", " ∘ √"), ("&plusdo; &setminus; &lowast; &compfn; &radic;", " ∘ √"),
("&prop; &infin; &ang; &angrt; &angmsd; &mid;", "∝ ∞ ∠ ∟ ∡ "), ("&prop; &infin; &ang; &angrt; &angmsd; &mid;", "∝ ∞ ∠ ∟ ∡ "),
("&angsph; &nmid; '&parallel; &npar; &and; &or;", "∢ ∤ '∥ ∦ ∧ "), ("&angsph; &nmid; &parallel; &npar; &and; &or;", "∢ ∤ ∥ ∦ ∧ "),
("&cap; &cup; &int; &Int; &iiint; &conint;", " ∫ ∬ ∭ ∮"), ("&cap; &cup; &int; &Int; &iiint; &conint;", " ∫ ∬ ∭ ∮"),
("&Conint; &Cconint; &cwint; &cwconint;", "∯ ∰ ∱ ∲"), ("&Conint; &Cconint; &cwint; &cwconint;", "∯ ∰ ∱ ∲"),
("&awconint; &there4; &because; &ratio; &Colon;", "∳ ∴ ∵ "), ("&awconint; &there4; &because; &ratio; &Colon;", "∳ ∴ ∵ "),
@@ -66,53 +66,45 @@ STRINGS_FOR_DECODE = [
("&isinE; &nisd; &xnis; &nis; &notnivc;", "⋹ ⋺ ⋻ ⋼ ⋽"), ("&isinE; &nisd; &xnis; &nis; &notnivc;", "⋹ ⋺ ⋻ ⋼ ⋽"),
("&notnivb; &barwed; &Barwed; &lceil; &lceil;", "⋾ ⌅ ⌆ ⌈ ⌈"), ("&notnivb; &barwed; &Barwed; &lceil; &lceil;", "⋾ ⌅ ⌆ ⌈ ⌈"),
("&rceil; &lfloor; &rfloor; &lang; &rang;", "⌉ ⌊ ⌋ ⟨ ⟩"), ("&rceil; &lfloor; &rfloor; &lang; &rang;", "⌉ ⌊ ⌋ ⟨ ⟩"),
("&copy; &reg; &trade; &copysr; &commat;", "© ® ™ ℗ @"), # Другие символы # ("&copy; &reg; &trade; &copysr; &commat;", "© ® ™ ℗ @"), # Другие символы
("&Copf; &incare; &gscr; &hamilt; &Hfr; &Hopf;", " "), # ("&Copf; &incare; &gscr; &hamilt; &Hfr; &Hopf;", " "),
("&planckh; &planck; &Iscr; &image; &Lscr; &ell;", " "), # ("&planckh; &planck; &Iscr; &image; &Lscr; &ell;", " "),
("&Nopf; &numero; &weierp; &Popf; &Qopf; &Rscr;", " № ℘ "), # ("&Nopf; &numero; &weierp; &Popf; &Qopf; &Rscr;", " № ℘ "),
("&Ropf; &rx; &Zopf; &mho; &Zfr; &iiota;", ""), # ("&Ropf; &rx; &Zopf; &mho; &Zfr; &iiota;", ""),
("&bernou; &Cfr; &escr; &Escr; &Fscr; &Mscr;", " "), # ("&bernou; &Cfr; &escr; &Escr; &Fscr; &Mscr;", " "),
("&oscr; &alefsym; &beth; &gimel; &daleth;", " ℵ ℶ ℷ ℸ"), # ("&oscr; &alefsym; &beth; &gimel; &daleth;", " ℵ ℶ ℷ ℸ"),
("&DD; &dd; &ee; &ii; &ffilig; &fflig;", " ffi ff"), # ("&DD; &dd; &ee; &ii; &ffilig; &fflig;", " ffi ff"),
("&filig; &fllig; &starf; &star; &phone;", "fi fl ★ ☆ ☎"), # ("&filig; &fllig; &starf; &star; &phone;", "fi fl ★ ☆ ☎"),
("&female; &male; &spades; &clubs; &hearts; &diams;", "♀ ♂ ♠ ♣ ♥ ♦"), # ("&female; &male; &spades; &clubs; &hearts; &diams;", "♀ ♂ ♠ ♣ ♥ ♦"),
("&loz; &sung; &flat; &natural; &sharp; &check;", "◊ ♪ ♭ ♮ ♯ ✓"), # ("&loz; &sung; &flat; &natural; &sharp; &check;", "◊ ♪ ♭ ♮ ♯ ✓"),
("&cross; &malt; &sext; &VerticalSeparator;", "✗ ✠ ✶ ❘"), # ("&cross; &malt; &sext; &VerticalSeparator;", "✗ ✠ ✶ ❘"),
("&lbbrk; &rbbrk;", " "), # ("&lbbrk; &rbbrk;", " "),
("&excl; &num; &percnt; &lpar; &rpar; &ast;", "! # % ( ) *"), # Знаки препинания # ("&excl; &num; &percnt; &lpar; &rpar; &ast;", "! # % ( ) *"), # Знаки препинания
("&comma; &period; &sol; &colon; &semi;", ", . / : ;"), # ("&comma; &period; &sol; &colon; &semi;", ", . / : ;"),
("&quest; &lbrack; &bsol; &rbrack; &Hat; &lowbar;", "? [ \\ ] ^ _"), # ("&quest; &lbrack; &bsol; &rbrack; &Hat; &lowbar;", "? [ \\ ] ^ _"),
("&grave; &lbrace; &vert; &rbrace; &tilde;", "` { | } ˜"), # ("&grave; &lbrace; &vert; &rbrace; &tilde;", "` { | } ˜"),
("&circ; &lrm; &rlm; &iexcl; &brvbar; &sect;", "ˆ \u200e \u200f ¡ ¦ §"), # ("&circ; &lrm; &rlm; &iexcl; &brvbar; &sect;", "ˆ \u200e \u200f ¡ ¦ §"),
("&uml; &ordf; &not; &macr; &acute; &micro; &bprime;", "¨ ª ¬ ¯ ´ µ "), # ("&uml; &ordf; &not; &macr; &acute; &micro; &bprime;", "¨ ª ¬ ¯ ´ µ "),
("&para; &middot; &cedil; &ordm; &iquest; &Vert;", "¶ · ¸ º ¿ ‖"), # ("&para; &middot; &cedil; &ordm; &iquest; &Vert;", "¶ · ¸ º ¿ ‖"),
("&dagger; &Dagger; &bull; &nldr; &hellip;", "† ‡ • ‥ …"), # ("&dagger; &Dagger; &bull; &nldr; &hellip;", "† ‡ • ‥ …"),
("&permil; &pertenk; &prime; &Prime; &tprime;", "‰ ‱ ″ ‴"), # ("&permil; &pertenk; &prime; &Prime; &tprime;", "‰ ‱ ″ ‴"),
("&oline; &caret; &hybull; &frasl; &bsemi; &qprime;", " ⁏ ⁗"), # ("&oline; &caret; &hybull; &frasl; &bsemi; &qprime;", " ⁏ ⁗"),
("&frac12; &frac13; &frac14; &frac15; &frac16;", "½ ⅓ ¼ ⅕ ⅙"), # Дробные символы и знаки # ("&frac12; &frac13; &frac14; &frac15; &frac16;", "½ ⅓ ¼ ⅕ ⅙"), # Дробные символы и знаки
("&frac18; &frac23; &frac25; &frac34; &frac35;", "⅛ ⅔ ⅖ ¾ ⅗"), # ("&frac18; &frac23; &frac25; &frac34; &frac35;", "⅛ ⅔ ⅖ ¾ ⅗"),
("&frac38; &frac45; &frac56; &frac58; &frac78;", "⅜ ⅘ ⅚ ⅝ ⅞"), # ("&frac38; &frac45; &frac56; &frac58; &frac78;", "⅜ ⅘ ⅚ ⅝ ⅞"),
("&Alpha; &Beta; &Gamma; &Delta; &Epsilon; &Zeta;", "Α Β Γ Δ Ε Ζ"), # Греческие символы # ("&Alpha; &Beta; &Gamma; &Delta; &Epsilon; &Zeta;", "Α Β Γ Δ Ε Ζ"), # Греческие символы
("&Eta; &Theta; &Iota; &Kappa; &Lambda; &Mu;", "Η Θ Ι Κ Λ Μ"), # ("&Eta; &Theta; &Iota; &Kappa; &Lambda; &Mu;", "Η Θ Ι Κ Λ Μ"),
("&Nu; &Xi; &Omicron; &Pi; &Rho; &Sigma; &Tau;", "Ν Ξ Ο Π Ρ Σ Τ"), # ("&Nu; &Xi; &Omicron; &Pi; &Rho; &Sigma; &Tau;", "Ν Ξ Ο Π Ρ Σ Τ"),
("&Upsilon; &Phi; &Chi; &Psi; &Omega; &alpha;", "Υ Φ Χ Ψ Ω α"), # ("&Upsilon; &Phi; &Chi; &Psi; &Omega; &alpha;", "Υ Φ Χ Ψ Ω α"),
("&beta; &gamma; &delta; &epsilon; &zeta; &eta;", "β γ δ ε ζ η"), # ("&beta; &gamma; &delta; &epsilon; &zeta; &eta;", "β γ δ ε ζ η"),
("&theta; &iota; &kappa; &lambda; &mu; &nu;", "θ ι κ λ μ ν"), # ("&theta; &iota; &kappa; &lambda; &mu; &nu;", "θ ι κ λ μ ν"),
("&xi; &omicron; &pi; &rho; &sigmaf; &tau;", "ξ ο π ρ ς τ"), # ("&xi; &omicron; &pi; &rho; &sigma; &tau;", "ξ ο π ρ σ τ"),
("&upsilon; &phi; &chi; &psi; &omega;", "υ φ χ ψ ω"), # ("&upsilon; &phi; &chi; &psi; &omega;", "υ φ χ ψ ω"),
("&thetasym; &upsih; &piv;", "ϑ ϒ ϖ"), # ("&thetasym; &upsih; &piv;", "ϑ ϒ ϖ"),
("", ""),
("", ""), ("", ""),
("", ""),
] ]
@pytest.mark.parametrize("input_string, expected_output", STRINGS_FOR_DECODE) @pytest.mark.parametrize("input_string, expected_output", STRINGS_FOR_DECODE)
@@ -124,3 +116,14 @@ def test_html_mnemo_to_utf(input_string, expected_output):
actual_output = codec.decode_to_unicode(input_string) actual_output = codec.decode_to_unicode(input_string)
# Assert (проверка) # Assert (проверка)
assert actual_output == expected_output assert actual_output == expected_output
@pytest.mark.parametrize("expected_output, input_string", STRINGS_FOR_DECODE)
def test_utf_to_html_mnemo(expected_output, input_string):
"""
Проверяет ПОВЕДЕНИЕ: кодирование Unicode-строк в HTML-мнемоники.
"""
# Act (действие) - тестируем
actual_output = codec.encode_from_unicode(input_string, mode="mnemonic")
# Assert (проверка)
assert actual_output == expected_output