mod: Отключена опция 'both' для висячей пунктуации
This commit is contained in:
@@ -19,60 +19,34 @@ HANGING_TEST_CASES = [
|
||||
# --- Режим 'left' (только левая пунктуация) ---
|
||||
('left', f'<p>{CHAR_RU_QUOT1_OPEN}Цитата{CHAR_RU_QUOT1_CLOSE}</p>',
|
||||
f'<p><span class="etp-laquo">{CHAR_RU_QUOT1_OPEN}</span>Цитата{CHAR_RU_QUOT1_CLOSE}</p>'),
|
||||
('left', f'<p>(Скобки)</p>',
|
||||
f'<p><span class="etp-lpar">(</span>Скобки)</p>'),
|
||||
# Правая пунктуация игнорируется
|
||||
('left', f'<p>Текст.</p>', f'<p>Текст.</p>'),
|
||||
('left', '<p>(Скобки)</p>', '<p><span class="etp-lpar">(</span>Скобки)</p>'),
|
||||
('left', '<p>Текст.</p>', '<p>Текст.</p>'),
|
||||
|
||||
# --- Режим 'right' (только правая пунктуация) ---
|
||||
('right', f'<p>{CHAR_RU_QUOT1_OPEN}Цитата{CHAR_RU_QUOT1_CLOSE}</p>',
|
||||
f'<p>{CHAR_RU_QUOT1_OPEN}Цитата<span class="etp-raquo">{CHAR_RU_QUOT1_CLOSE}</span></p>'),
|
||||
('right', f'<p>Текст.</p>',
|
||||
f'<p>Текст<span class="etp-r-dot">.</span></p>'),
|
||||
# Левая пунктуация игнорируется
|
||||
('right', f'<p>(Скобки)</p>', f'<p>(Скобки<span class="etp-rpar">)</span></p>'),
|
||||
|
||||
# --- Режим 'both' (и левая, и правая) ---
|
||||
('both', f'<p>{CHAR_RU_QUOT1_OPEN}Цитата{CHAR_RU_QUOT1_CLOSE}</p>',
|
||||
f'<p><span class="etp-laquo">{CHAR_RU_QUOT1_OPEN}</span>Цитата<span class="etp-raquo">{CHAR_RU_QUOT1_CLOSE}</span></p>'),
|
||||
('both', f'<p>Текст.</p>',
|
||||
f'<p>Текст<span class="etp-r-dot">.</span></p>'),
|
||||
# Последовательность символов (точка + кавычка)
|
||||
('both', f'<p>Текст.{CHAR_RU_QUOT1_CLOSE}</p>',
|
||||
f'<p>Текст<span class="etp-r-dot">.</span><span class="etp-raquo">{CHAR_RU_QUOT1_CLOSE}</span></p>'),
|
||||
# Вложенные теги
|
||||
('both', f'<p><b>{CHAR_RU_QUOT1_OPEN}Жирный{CHAR_RU_QUOT1_CLOSE}</b></p>',
|
||||
f'<p><b><span class="etp-laquo">{CHAR_RU_QUOT1_OPEN}</span>Жирный<span class="etp-raquo">{CHAR_RU_QUOT1_CLOSE}</span></b></p>'),
|
||||
# Смешанный контент
|
||||
('both', f'<p>{CHAR_RU_QUOT1_OPEN}Начало <i>курсив</i> конец.{CHAR_RU_QUOT1_CLOSE}</p>',
|
||||
f'<p><span class="etp-laquo">{CHAR_RU_QUOT1_OPEN}</span>Начало <i>курсив</i> конец<span class="etp-r-dot">.</span><span class="etp-raquo">{CHAR_RU_QUOT1_CLOSE}</span></p>'),
|
||||
('right', '<p>Текст.</p>', '<p>Текст<span class="etp-r-dot">.</span></p>'),
|
||||
('right', '<p>(Скобки)</p>', '<p>(Скобки<span class="etp-rpar">)</span></p>'),
|
||||
('right', '<p>3.14</p>', '<p>3.14</p>'),
|
||||
('right', '<p>End.</p>', '<p>End<span class="etp-r-dot">.</span></p>'),
|
||||
|
||||
# --- Режим None / False (отключено) ---
|
||||
(None, f'<p>{CHAR_RU_QUOT1_OPEN}Текст{CHAR_RU_QUOT1_CLOSE}</p>',
|
||||
f'<p>{CHAR_RU_QUOT1_OPEN}Текст{CHAR_RU_QUOT1_CLOSE}</p>'),
|
||||
(False, f'<p>{CHAR_RU_QUOT1_OPEN}Текст{CHAR_RU_QUOT1_CLOSE}</p>',
|
||||
f'<p>{CHAR_RU_QUOT1_OPEN}Текст{CHAR_RU_QUOT1_CLOSE}</p>'),
|
||||
]
|
||||
|
||||
# --- Отсутствие висячих символов ---
|
||||
('both', '<p>Простой текст без спецсимволов!</p>', '<p>Простой текст без спецсимволов!</p>'),
|
||||
|
||||
# --- Проверка контекста (пробелы) ---
|
||||
# 1. Левая кавычка внутри слова (не должна висеть)
|
||||
('both', f'<p>func{CHAR_RU_QUOT1_OPEN}arg{CHAR_RU_QUOT1_CLOSE}</p>',
|
||||
f'<p>func{CHAR_RU_QUOT1_OPEN}arg<span class="etp-raquo">{CHAR_RU_QUOT1_CLOSE}</span></p>'), # Правая висит, т.к. конец узла
|
||||
# 2. Правая кавычка внутри слова (не должна висеть)
|
||||
('both', f'<p>1{CHAR_RU_QUOT1_CLOSE}2</p>',
|
||||
f'<p>1{CHAR_RU_QUOT1_CLOSE}2</p>'),
|
||||
# 3. Левая кавычка после пробела (должна висеть)
|
||||
('both', f'<p>func {CHAR_RU_QUOT1_OPEN}arg</p>',
|
||||
f'<p>func <span class="etp-laquo">{CHAR_RU_QUOT1_OPEN}</span>arg</p>'),
|
||||
# 4. Правая кавычка перед пробелом (должна висеть)
|
||||
('both', f'<p>arg{CHAR_RU_QUOT1_CLOSE} next</p>',
|
||||
f'<p>arg<span class="etp-raquo">{CHAR_RU_QUOT1_CLOSE}</span> next</p>'),
|
||||
# 5. Точка внутри числа (не должна висеть)
|
||||
('both', '<p>3.14</p>', '<p>3.14</p>'),
|
||||
# 6. Точка в конце предложения (должна висеть)
|
||||
('both', '<p>End.</p>', '<p>End<span class="etp-r-dot">.</span></p>'),
|
||||
# --- Режим list[str] (список тегов с обеими сторонами) ---
|
||||
HANGING_LIST_MODE_CASES = [
|
||||
(['p'], f'<p>{CHAR_RU_QUOT1_OPEN}Цитата{CHAR_RU_QUOT1_CLOSE}</p>',
|
||||
f'<p><span class="etp-laquo">{CHAR_RU_QUOT1_OPEN}</span>Цитата<span class="etp-raquo">{CHAR_RU_QUOT1_CLOSE}</span></p>'),
|
||||
(['p'], f'<p>Текст.{CHAR_RU_QUOT1_CLOSE}</p>',
|
||||
f'<p>Текст<span class="etp-r-dot">.</span><span class="etp-raquo">{CHAR_RU_QUOT1_CLOSE}</span></p>'),
|
||||
(['p'], f'<p>func {CHAR_RU_QUOT1_OPEN}arg</p>',
|
||||
f'<p>func <span class="etp-laquo">{CHAR_RU_QUOT1_OPEN}</span>arg</p>'),
|
||||
(['p'], f'<p>arg{CHAR_RU_QUOT1_CLOSE} next</p>',
|
||||
f'<p>arg<span class="etp-raquo">{CHAR_RU_QUOT1_CLOSE}</span> next</p>'),
|
||||
]
|
||||
|
||||
|
||||
@@ -112,3 +86,13 @@ def test_hanging_punctuation_target_tags():
|
||||
processor.process(soup)
|
||||
|
||||
assert str(soup) == expected_html
|
||||
|
||||
|
||||
@pytest.mark.parametrize("mode, input_html, expected_html", HANGING_LIST_MODE_CASES)
|
||||
def test_hanging_punctuation_processor_list_mode(mode, input_html, expected_html):
|
||||
"""Проверяет, что list-режим работает и для левой, и для правой стороны внутри указанного тега."""
|
||||
processor = HangingPunctuationProcessor(mode=mode)
|
||||
soup = make_soup(input_html)
|
||||
|
||||
processor.process(soup)
|
||||
assert str(soup) == expected_html
|
||||
|
||||
Reference in New Issue
Block a user