mod: Отключена опция 'both' для висячей пунктуации
This commit is contained in:
@@ -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',
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user