mod: Конвейер типографа с рекурсивным обходом DOM
This commit is contained in:
90
tests/test_typograph.py
Normal file
90
tests/test_typograph.py
Normal file
@@ -0,0 +1,90 @@
|
||||
# tests/test_typograph.py
|
||||
# Тестирует основной класс Typographer и его конвейер обработки.
|
||||
|
||||
import pytest
|
||||
from etpgrf import Typographer
|
||||
from etpgrf.config import CHAR_NBSP, CHAR_THIN_SP
|
||||
|
||||
TYPOGRAPHER_HTML_TEST_CASES = [
|
||||
# --- Базовая обработка без HTML ---
|
||||
('mnemonic', 'Простой текст с "кавычками".', f'Простой текст с «кавычками».'),
|
||||
('mixed', 'Простой текст с "кавычками".', f'Простой текст с «кавычками».'),
|
||||
('unicode', 'Простой текст с "кавычками".', f'Простой текст с{CHAR_NBSP}«кавычками».'),
|
||||
# --- Базовая обработка с HTML ---
|
||||
('mnemonic', '<p>Простой параграф с «кавычками».</p>', '<p>Простой параграф с «кавычками».</p>'),
|
||||
('mixed', '<p>Простой параграф с "кавычками".</p>', '<p>Простой параграф с «кавычками».</p>'),
|
||||
('unicode', '<p>Простой параграф с "кавычками".</p>', f'<p>Простой параграф с{CHAR_NBSP}«кавычками».</p>'),
|
||||
# --- Рекурсивный обход ---
|
||||
('mnemonic', '<div><p>Текст, а внутри <b>для проверки "жирный"</b> текст.</p></div>',
|
||||
'<div><p>Текст, а внутри <b>для проверки «жирный»</b> текст.</p></div>'),
|
||||
('mixed', '<div><p>Текст, а внутри <b>для проверки "жирный"</b> текст.</p></div>',
|
||||
'<div><p>Текст, а внутри <b>для проверки «жирный»</b> текст.</p></div>'),
|
||||
('unicode', '<div><p>Текст, а внутри <b>для проверки "жирный"</b> текст.</p></div>',
|
||||
f'<div><p>Текст, а{CHAR_NBSP}внутри <b>для{CHAR_NBSP}проверки «жирный»</b> текст.</p></div>'),
|
||||
# --- Вложенные теги с предлогом в тексте ---
|
||||
('mnemonic', '<div><p>Текст с предлогом <b>в <i>доме</i></b>.</p></div>',
|
||||
'<div><p>Текст с предлогом <b>в <i>доме</i></b>.</p></div>'),
|
||||
('mixed', '<div><p>Текст с предлогом <b>в <i>доме</i></b>.</p></div>',
|
||||
'<div><p>Текст с предлогом <b>в <i>доме</i></b>.</p></div>'),
|
||||
('unicode', '<div><p>Текст с предлогом <b>в <i>доме</i></b>.</p></div>',
|
||||
f'<div><p>Текст с{CHAR_NBSP}предлогом <b>в{CHAR_NBSP}<i>доме</i></b>.</p></div>'),
|
||||
# --- Обработка соседних текстовых узлов ---
|
||||
('mnemonic', '<p>Союз и <b>слово</b> и еще один союз а <span>текст</span>.</p>',
|
||||
'<p>Союз и <b>слово</b> и еще один союз а <span>текст</span>.</p>'),
|
||||
('mnemonic', '<p>Союз а <b>слово</b> а еще один союз а <span>текст</span>.</p>',
|
||||
'<p>Союз а <b>слово</b> а еще один союз а <span>текст</span>.</p>'),
|
||||
|
||||
|
||||
|
||||
# # --- Обработка соседних текстовых узлов ---
|
||||
# (
|
||||
# 'Несколько текстовых узлов в одном родителе.',
|
||||
# '<p>Союз и <b>слово</b> и еще один союз а <span>текст</span>.</p>',
|
||||
# f'<p>Союз и{CHAR_NBSP}<b>слово</b> и{CHAR_NBSP}еще один союз а{CHAR_NBSP}<span>текст</span>.</p>'
|
||||
# ),
|
||||
# # --- Проверка "небезопасных" тегов ---
|
||||
# (
|
||||
# 'Небезопасные теги не должны обрабатываться.',
|
||||
# '<p>Текст "до".</p><script>var text = "не трогать";</script><pre> - 10</pre><code>"тоже не трогать"</code>',
|
||||
# '<p>Текст «до».</p><script>var text = "не трогать";</script><pre> - 10</pre><code>"тоже не трогать"</code>'
|
||||
# ),
|
||||
# # --- Проверка атрибутов ---
|
||||
# (
|
||||
# 'Атрибуты тегов не должны обрабатываться.',
|
||||
# '<a href="/a-b" title="Текст в кавычках \'внутри\' атрибута">Текст "снаружи"</a>',
|
||||
# '<a href="/a-b" title="Текст в кавычках \'внутри\' атрибута">Текст «снаружи»</a>'
|
||||
# ),
|
||||
# # --- Комплексный интеграционный тест ---
|
||||
# (
|
||||
# 'Все правила вместе в HTML.',
|
||||
# '<p>Он сказал: "В 1941-1945 гг. -- было 100 тыс. руб. и т. д."</p>',
|
||||
# f'<p>Он сказал: «В 1941–1945{CHAR_NBSP}гг.{CHAR_NBSP}— было 100{CHAR_NBSP}тыс.{CHAR_THIN_SP}руб. и{CHAR_NBSP}т.{CHAR_THIN_SP}д.»</p>'
|
||||
# ),
|
||||
# # --- Проверка пустого текста и узлов с пробелами ---
|
||||
# (
|
||||
# 'Пустые и пробельные узлы.',
|
||||
# '<p> </p><div>\n\t</div><p>Слово</p>',
|
||||
# '<p> </p><div>\n\t</div><p>Слово</p>'
|
||||
# ),
|
||||
]
|
||||
|
||||
|
||||
@pytest.mark.parametrize("mode, input_html, expected_html", TYPOGRAPHER_HTML_TEST_CASES)
|
||||
def test_typographer_html_processing(mode, input_html, expected_html):
|
||||
"""
|
||||
Проверяет полный конвейер Typographer при обработке HTML.
|
||||
"""
|
||||
typo = Typographer(langs='ru', process_html=True, mode=mode)
|
||||
actual_html = typo.process(input_html)
|
||||
assert actual_html == expected_html
|
||||
|
||||
|
||||
def test_typographer_plain_text_processing():
|
||||
"""
|
||||
Проверяет, что в режиме process_html=False типограф маскирует HTML-теги и обрабатывает весь текст.
|
||||
"""
|
||||
typo = Typographer(langs='ru', process_html=False)
|
||||
input_text = '<i>Текст "без" <b>HTML</b>, но с предлогом в доме.</i>'
|
||||
expected_text = '<i>Текст «без» <b>HTML</b>, но с предлогом в доме.</i>'
|
||||
actual_text = typo.process(input_text)
|
||||
assert actual_text == expected_text
|
Reference in New Issue
Block a user