mod: Отключена опция 'both' для висячей пунктуации

This commit is contained in:
2026-03-04 16:00:51 +03:00
parent 4b62564c6b
commit 9695fe80aa
5 changed files with 52 additions and 61 deletions

View File

@@ -690,6 +690,13 @@ PROTECTED_HTML_TAGS = ['style', 'script', 'pre', 'code', 'kbd', 'samp', 'math']
# === КОНСТАНТЫ ДЛЯ ВИСЯЧЕЙ ТИПОГРАФИКИ ===
HANGING_PUNCTUATION_MODE_LEFT = 'left'
HANGING_PUNCTUATION_MODE_RIGHT = 'right'
HANGING_PUNCTUATION_MODES = frozenset([
HANGING_PUNCTUATION_MODE_LEFT,
HANGING_PUNCTUATION_MODE_RIGHT,
])
# 1. Набор символов, которые могут "висеть" слева
HANGING_PUNCTUATION_LEFT_CHARS = frozenset([
CHAR_RU_QUOT1_OPEN, # «
@@ -722,4 +729,5 @@ HANGING_PUNCTUATION_CLASSES = {
'.': 'etp-r-dot',
',': 'etp-r-comma',
':': 'etp-r-colon',
}
}

View File

@@ -6,7 +6,9 @@ from bs4 import BeautifulSoup, NavigableString, Tag
from .config import (
HANGING_PUNCTUATION_LEFT_CHARS,
HANGING_PUNCTUATION_RIGHT_CHARS,
HANGING_PUNCTUATION_CLASSES
HANGING_PUNCTUATION_CLASSES,
HANGING_PUNCTUATION_MODE_LEFT,
HANGING_PUNCTUATION_MODE_RIGHT,
)
logger = logging.getLogger(__name__)
@@ -21,30 +23,27 @@ class HangingPunctuationProcessor:
"""
:param mode: Режим работы:
- None / False: отключено.
- 'left': только левая пунктуация.
- 'right': только правая пунктуация.
- 'both' / True: и левая, и правая.
- 'left': левая висячая пунктуация.
- 'right': правая висячая пунктуация.
- list[str]: список тегов (например, ['p', 'blockquote']),
внутри которых применять 'both'.
внутри которых применять висячую пунктуацию в обе стороны.
- True эквивалентно 'left'.
"""
self.mode = mode
self.target_tags = None
self.active_chars = set()
# Определяем, какие символы будем обрабатывать
if isinstance(mode, list):
self.target_tags = set(t.lower() for t in mode)
# Если передан список тегов, включаем полный режим ('both') внутри них
self.active_chars.update(HANGING_PUNCTUATION_LEFT_CHARS)
self.active_chars.update(HANGING_PUNCTUATION_RIGHT_CHARS)
elif mode == 'left':
self.active_chars.update(HANGING_PUNCTUATION_LEFT_CHARS)
elif mode == 'right':
self.active_chars.update(HANGING_PUNCTUATION_RIGHT_CHARS)
elif mode == 'both' or mode is True:
self.active_chars.update(HANGING_PUNCTUATION_LEFT_CHARS)
self.active_chars.update(HANGING_PUNCTUATION_RIGHT_CHARS)
else:
normalized_mode = HANGING_PUNCTUATION_MODE_LEFT if mode is True else mode
if normalized_mode == HANGING_PUNCTUATION_MODE_LEFT:
self.active_chars.update(HANGING_PUNCTUATION_LEFT_CHARS)
elif normalized_mode == HANGING_PUNCTUATION_MODE_RIGHT:
self.active_chars.update(HANGING_PUNCTUATION_RIGHT_CHARS)
# Предварительно фильтруем карту классов, оставляя только активные символы
self.char_to_class = {
char: cls