This commit is contained in:
2026-09-14 10:54:55 +03:00
parent 3eb0d24e7f
commit 458571576e
6 changed files with 307 additions and 51 deletions

View File

@@ -0,0 +1,22 @@
<!DOCTYPE html>
<html>
<head><meta charset="utf-8"></head>
<body>
<p class="Title"><b>NESPERTCAM Launcher - Пълно ръководство на потребителя</b></p>
<p><b>Съдържание</b></p>
<ol>
<li><a href="#1">1. Преглед на приложението</a></li>
<li><a href="#2">2. Инсталация и настройка</a></li>
<li><a href="#3">3. Конфигурация и настройки</a></li>
<li><a href="#4">4. Използване и функции</a></li>
<li><a href="#5">5. Описание на интерфейса</a></li>
<li><a href="#6">6. Решаване на проблеми</a></li>
<li><a href="#7">7. Разширени функции</a></li>
<li><a href="#8">8. Технически детайли</a></li>
<li><a href="#9">9. Поддръжка и контакти</a></li>
</ol>
<h1>1. Преглед на приложението</h1>
<p><b>Какво е NESPERTCAM Launcher?</b></p>
<p>NESPERTCAM Launcher е специализирано Windows приложение, предназначено за лесно и удобно стартиране на NESPERTCAM64.exe и свързаните с него модули от едно място.</p>
</body>
</html>

View File

@@ -0,0 +1,80 @@
"""Корица + Съдържание + глава 1 → 2 секции (не 4)."""
from pathlib import Path
from help_processor import (
merge_preamble_sections,
merge_short_sections,
parse_html,
Section,
)
FIXTURE = Path(__file__).parent / "fixtures" / "nespertcam_launcher_preamble.html"
def _titles(sections):
return [s.title for s in sections]
def test_nespertcam_preamble_yields_two_sections():
sections = merge_preamble_sections(merge_short_sections(parse_html(FIXTURE)))
assert len(sections) == 2
assert sections[0].title == "NESPERTCAM Launcher - Пълно ръководство на потребителя"
assert sections[1].title == "1. Преглед на приложението"
assert "Съдържание" in sections[0].text
assert "1. Преглед на приложението" in sections[0].text
assert "Какво е NESPERTCAM Launcher?" in sections[1].text
assert "NESPERTCAM64.exe" in sections[1].text
def test_h2_and_bold_do_not_split_inside_chapter():
html = Path(__file__).parent / "fixtures" / "_tmp_h2.html"
html.write_text(
"""<!DOCTYPE html><html><body>
<h1>Глава А</h1>
<h2>Подточка</h2>
<p>Текст под подточката с достатъчно думи за тяло.</p>
<p><b>Още едно bold подзаглавие</b></p>
<p>Още текст в същата секция.</p>
<h1>Глава Б</h1>
<p>Тяло на втората глава.</p>
</body></html>""",
encoding="utf-8",
)
try:
sections = merge_preamble_sections(merge_short_sections(parse_html(html)))
assert _titles(sections) == ["Глава А", "Глава Б"]
assert "Подточка" in sections[0].text
assert "Още едно bold подзаглавие" in sections[0].text
finally:
html.unlink(missing_ok=True)
def test_toc_heading_as_h1_merges_into_cover():
"""Ако „Съдържание“ е H1, merge_preamble го залепва към корицата."""
secs = [
Section("Ръководство X", "", 1),
Section("Съдържание", "1. Увод\n2. Край", 1),
Section("1. Увод", "Текст на увода.", 1),
]
merged = merge_preamble_sections(secs)
assert len(merged) == 2
assert merged[0].title == "Ръководство X"
assert "Съдържание" in merged[0].text
assert merged[1].title == "1. Увод"
def test_heading1_chapters_still_split():
html = Path(__file__).parent / "fixtures" / "_tmp_chapters.html"
html.write_text(
"""<!DOCTYPE html><html><body>
<h1>1. Първа</h1><p>Аа аа аа.</p>
<h1>2. Втора</h1><p>Бб бб бб.</p>
<h1>3. Трета</h1><p>Вв вв вв.</p>
</body></html>""",
encoding="utf-8",
)
try:
sections = merge_preamble_sections(merge_short_sections(parse_html(html)))
assert _titles(sections) == ["1. Първа", "2. Втора", "3. Трета"]
finally:
html.unlink(missing_ok=True)