add: ++кодировки и мнемоники

This commit is contained in:
2025-08-12 15:35:22 +03:00
parent ca88f2da3c
commit 32e4b852a1

View File

@@ -4,7 +4,7 @@
# Типограф для Web # Типограф для Web
Экранная типографика для веба -- способствует повышению читабельности текста в интернете, Экранная типографика для веба способствует повышению читабельности текста в интернете,
приближая его к печатной типографике. приближая его к печатной типографике.
### Кодировки и html-мнемоники ### Кодировки и html-мнемоники
@@ -15,36 +15,36 @@
html-мнемоники (например, `—` для длинного тире, `«` для открывающей кавычки-ёлочки и т.д.). html-мнемоники (например, `—` для длинного тире, `«` для открывающей кавычки-ёлочки и т.д.).
tpgrf имеет три режима работы с кодировками: tpgrf имеет три режима работы с кодировками:
- Режим `unicode` -- весь вывод осуществляется в кодировке UTF-8. ВЕСЬ! Включая невидимые символы, типа неразрывных и нулевых - Режим `unicode` весь вывод осуществляется в кодировке UTF-8. ВЕСЬ! Включая невидимые символы, типа неразрывных и нулевых
пробелов, мягких переносов и т.д. Это не всегда удобно зато типографированый текст (строки) будет максимально пробелов, мягких переносов и т.д. Это не всегда удобно зато типографированый текст (строки) будет максимально
компактен и занимать меньше места в памяти. В этом режиме в html-мнемоники преобразуются только опасные символы: компактен и занимать меньше места в памяти. В этом режиме в html-мнемоники преобразуются только опасные символы:
* `&lt;` -- знак меньше `<`; * `&lt;` знак меньше `<`;
* `&gt;` -- знак больше `>`; * `&gt;` знак больше `>`;
* `&amp;` -- амперсанд `&`; * `&amp;` амперсанд `&`;
* `&quot;` -- двойные кавычки `"`; * `&quot;` двойные кавычки `"`;
* `&apos;` -- одинарные кавычки (апостроф) `'`. * `&apos;` одинарные кавычки (апостроф) `'`.
- Режим `mixed` -- вывод осуществляется в кодировке UTF-8, но наиболее критичные символы заменяются на html-мнемоники. - Режим `mixed` вывод осуществляется в кодировке UTF-8, но наиболее критичные символы заменяются на html-мнемоники.
Они невидимы или неотличимы друг от друга на экране: Они невидимы или неотличимы друг от друга на экране:
* `&shy;` -- мягкий перенос (Soft Hyphen); * `&shy;` мягкий перенос (Soft Hyphen);
* `&nbsp;` -- неразрывный пробел (Non-Breaking Space); * `&nbsp;` неразрывный пробел (Non-Breaking Space);
* `&ensp;` -- полужирный пробел (En Space) * `&ensp;` полужирный пробел (En Space)
* `&emsp;` -- широкий пробел (Em Space) * `&emsp;` широкий пробел (Em Space)
* `&numsp;` -- цифровой пробел; * `&numsp;` цифровой пробел;
* `&puncsp;` -- пунктуационный пробел; * `&puncsp;` пунктуационный пробел;
* `&thinsp;` -- межсимвольный пробел; * `&thinsp;` межсимвольный пробел;
* `&hairsp;` -- пробел "толщина волоса" (Hair Space); * `&hairsp;` пробел "толщина волоса" (Hair Space);
* `&NegativeThinSpace;` -- негативный пробел (Negative Space); * `&NegativeThinSpace;` негативный пробел (Negative Space);
* `&zwj;` -- пробел нулевой ширины (без объединения) (Zero Width Non-Joiner); * `&zwj;` пробел нулевой ширины (без объединения) (Zero Width Non-Joiner);
* `&zwnj;` -- нулевая ширина (с объединением) (Zero Width Joiner); * `&zwnj;` нулевая ширина (с объединением) (Zero Width Joiner);
* `&lrm;` -- изменение направления текста на слева-направо (Left-to-Right Mark); * `&lrm;` изменение направления текста на слева-направо (Left-to-Right Mark);
* `&rlm;` -- изменение направления текста на направо-налево (Right-to-Left Mark); * `&rlm;` изменение направления текста на направо-налево (Right-to-Left Mark);
* `&dash;` -- дефис (Hyphen); * `&dash;` дефис (Hyphen);
* `&MediumSpace;` -- средний пробел (Medium Mathematical Space); * `&MediumSpace;` средний пробел (Medium Mathematical Space);
* `&NoBreak;` -- неразрывный пробел (No-Break Space); * `&NoBreak;` неразрывный пробел (No-Break Space);
* `&InvisibleTimes;` -- невидимый знак умножения (Invisible Times) для семантической разметки математических * `&InvisibleTimes;` невидимый знак умножения (Invisible Times) для семантической разметки математических
выражений; выражений;
* `&InvisibleComma;` -- невидимая запятая (Invisible Comma) для семантической разметки математических выражений. * `&InvisibleComma;` невидимая запятая (Invisible Comma) для семантической разметки математических выражений.
- Режим `mnemonic` -- применяются все возможные html-мнемоники (кроме русских букв) и символов первой половины ASCII - Режим `mnemonic` применяются все возможные html-мнемоники (кроме русских букв) и символов первой половины ASCII
(плюс, минус, знак равенства, знаки препинания и т.д.). (плюс, минус, знак равенства, знаки препинания и т.д.).
Переключение режимов осуществляется с помощью параметра `mode` при конфигурировании типографа: Переключение режимов осуществляется с помощью параметра `mode` при конфигурировании типографа:
@@ -55,10 +55,26 @@ typo_mixed_mode = etpgrf.Typographer(mode='mixed')
result = typo_mixed_mode.process(text="Этот текст будет обработан в режиме mixed.") result = typo_mixed_mode.process(text="Этот текст будет обработан в режиме mixed.")
``` ```
**ВАЖНО!** _Некоторым символам соответствуют несколько html-мнемоник. Например, `→` (стрелочка влево) может кодироваться ### ВАЖНО:
как `&rarr;`, `&srarr;`, `&rightarrow`, `&RightArrow;` и `&ShortRightArrow;`. Типограф будет использовать самое короткое
из них (для компактности), что может немного "испортить" код если мнемоники использовались, в том числе, и как 1. Если в тексте уже есть html-мнемоники, они будут преобразованы в unicode, и после обработки типографом
семантическая разметка._ будут заменены на html-мнемоники, соответствующие текущему режиму работы типографа.
2. Некоторым символам соответствуют несколько html-мнемоник. Например, `→` (стрелочка влево) может кодироваться
как `&rarr;`, `&srarr;`, `&rightarrow`, `&RightArrow;` и `&ShortRightArrow;`. Типограф будет использовать самое
короткое из них (для компактности), а значит:
* если в исходном тексте были html-мнемоники, то они будут заменены на более короткие;
* если html-мнемоники использовались как элементы семантической разметки (например, для математических выражений),
то после замены на более короткие html-мнемоники, текст может потерять такую семантику. Например _F = A ⋂ B_:
`F = A &Intersection; B` будет преобразовано в `F = A &xcap; B`;
3. Мнемоники для русских букв не используются в типографе. Все мнемоники русских букв будут преобразованы в русские
буквы и останутся в тексте в виде русских букв.
4. Все исходные html-мнемоники, которые превращаются в два unicode-символа будут превращены обратно в мнемоники каждый
как отдельный символ. Например, множество собственное другого подмножества `&varsubsetneq;` в unicode отображается
двумя символами `\u228a\ufe00` и превратится в `&subne;\ufe00`. Символ `\ufe00` — это невидимый символ, cелектор
варианта начертания (Variant Selector), который изменяет начертание предыдущего символа и для него нет
html-мнемоники. К счастью, в стандарте таких мнемоник (превращающихся в два символа) исчезающе мало и они крайне
редко применяются в тексте, поэтому это не должно вызывать проблем.
### Переносы слов ### Переносы слов
@@ -98,3 +114,9 @@ result = typo_hyp.process(text="Электрофоретическое иссл
### Кавычки ### Кавычки
Теперь хочу обсудить модуль работы с кавычками. Большинство изсестных мне типографов разибают праные кавчки и превращают их в спец-сиволы. Мне каежтся это неверно, ведь ковычки моут быть не парными и вложенность может быть произвольной. Мне кажется нужен другой подход. Обнаруживать только конструкции `"слово` или `слово"` и преобразовывать только их. Соответсвнно в елочки или лапки в зависимоати от языка. При этом если уже в тескте есть лапки, елочки или другие типы кавычек — ничего не менять (автор текстьа сам знает, какие кавычки лучшк). Кавычки окруженные пробелами или буквать с дрвух сторон превоащать в &quot; ...
Как считаешь, это рабочий подход??
1.Надежность (Robustness): Вы правильно заметили, что символ " используется не только для кавычек. Это могут быть дюймы (17"), секунды (3' 25"), обозначения в коде (print("Hello")) и т.д. Ваш метод, который ищет кавычку рядом со словом ("слово или слово"), с гораздо меньшей вероятностью сломает такие конструкции.2.Уважение к авторскому замыслу: Правило "если уже есть ёлочки или лапки — ничего не менять" — это золотой стандарт. Типограф не должен "исправлять" то, что уже было отформатировано автором вручную. Это предотвращает двойное преобразование и сохраняет особые случаи, задуманные автором.3.Простота и производительность: Вместо сложного и медленного парсера, который отслеживает уровни вложенности (и часто ошибается), ваш подход можно реализовать с помощью нескольких быстрых регулярных выражений.4.Безопасность: Идея превращать оставшиеся "одинокие" кавычки в &quot; — это отличный механизм защиты. Он гарантирует, что на выходе не останется "сырых" кавычек, которые могут сломать HTML-разметку.