Spaces:
Running
Running
SilverElixir commited on
Commit ·
1dfad36
1
Parent(s): e04f308
Presplit glued bullets before chunking so lists survive cutting
Browse files- lumen_formatting.py +3 -0
- tests/test_lumen_formatting.py +13 -0
lumen_formatting.py
CHANGED
|
@@ -779,6 +779,9 @@ def _split_text_chunks(text: str, max_len: int = 4096) -> list[str]:
|
|
| 779 |
if is_fence:
|
| 780 |
md_chunks.extend(_chunk_fence_block(seg, max_len))
|
| 781 |
else:
|
|
|
|
|
|
|
|
|
|
| 782 |
md_chunks.extend(_chunk_plain(seg, max_len))
|
| 783 |
out: list[str] = []
|
| 784 |
for chunk in md_chunks:
|
|
|
|
| 779 |
if is_fence:
|
| 780 |
md_chunks.extend(_chunk_fence_block(seg, max_len))
|
| 781 |
else:
|
| 782 |
+
# Слипшиеся буллеты разносим ДО резки: иначе чанкер рвёт список
|
| 783 |
+
# по ". " и куски с 1 маркером мимо порога сплиттера (прод 07.10.2026).
|
| 784 |
+
seg = _split_inline_numbered(_split_inline_bullets(seg))
|
| 785 |
md_chunks.extend(_chunk_plain(seg, max_len))
|
| 786 |
out: list[str] = []
|
| 787 |
for chunk in md_chunks:
|
tests/test_lumen_formatting.py
CHANGED
|
@@ -127,6 +127,19 @@ def test_split_chunks_merge_short_fenced_message_back():
|
|
| 127 |
assert chunks == [text]
|
| 128 |
|
| 129 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 130 |
def test_md_to_html_link_with_inline_code_has_no_placeholder_leak():
|
| 131 |
# Код внутри метки ссылки: плейсхолдер не протекает, оба тега на месте.
|
| 132 |
html = lumen_formatting._md_to_html("[`code` текст](https://example.com)")
|
|
|
|
| 127 |
assert chunks == [text]
|
| 128 |
|
| 129 |
|
| 130 |
+
def test_split_chunks_presplit_inline_bullets_before_cutting():
|
| 131 |
+
# Прод 07.10.2026: чанкер резал слипшийся список по ". " до сплиттера,
|
| 132 |
+
# куски с 1 маркером не делились и в чат уходила каша.
|
| 133 |
+
text = (
|
| 134 |
+
"Лучше проприетарные системы, когда: • Требуется гарантированная поддержка "
|
| 135 |
+
"с длинным пояснением для набора длины строки. • Важна интеграция из коробки "
|
| 136 |
+
"с длинным пояснением для набора длины строки. • Нужна безопасность за счет "
|
| 137 |
+
"сокрытия с длинным пояснением для набора длины строки."
|
| 138 |
+
)
|
| 139 |
+
chunks = lumen_formatting._split_text_chunks(text, 4096)
|
| 140 |
+
assert any("\n• " in c for c in chunks)
|
| 141 |
+
|
| 142 |
+
|
| 143 |
def test_md_to_html_link_with_inline_code_has_no_placeholder_leak():
|
| 144 |
# Код внутри метки ссылки: плейсхолдер не протекает, оба тега на месте.
|
| 145 |
html = lumen_formatting._md_to_html("[`code` текст](https://example.com)")
|