#!/usr/bin/env python3 """Самопроверка конвертера EPUB без сети: python3 test_epub2html.py""" import tempfile import zipfile from pathlib import Path import epub2html CONTAINER = """ """ OPF = """ """ CH1 = """ skip me

Chapter One

The lazy fox calls fetch_data() twice a day.

def main():
    x = 1  -  2
    return x
NameValue
alpha1

Broken markup that never closes.

figure

""" CH2 = """

Chapter Two

Second chapter body text.

""" CH3 = """

Chapter Three

Loose text outside any block tag.
""" NAV = """ """ PNG = bytes.fromhex("89504e470d0a1a0a") # достаточно как содержимое файла def build_epub(path): with zipfile.ZipFile(path, "w") as z: z.writestr("mimetype", "application/epub+zip") z.writestr("META-INF/container.xml", CONTAINER) z.writestr("OEBPS/content.opf", OPF) z.writestr("OEBPS/ch1.xhtml", CH1) z.writestr("OEBPS/ch2.xhtml", CH2) z.writestr("OEBPS/ch3.xhtml", CH3) z.writestr("OEBPS/nav.xhtml", NAV) z.writestr("OEBPS/img/fig.png", PNG) z.writestr("OEBPS/img/cover.png", PNG) def test_convert(tmp: Path): src = tmp / "book.epub" build_epub(src) out = tmp / "book.html" epub2html.convert(src, out) text = out.read_text(encoding="utf-8") lines = text.splitlines() # Листинг: переносы строк, отступы и минусы не тронуты pre = text[text.index("
"):text.index("
")] assert "def main():\n x = 1 - 2\n return x" in pre, pre assert "" not in pre, "внутри листинга инлайновая разметка не нужна" # Проза: инлайн переведён в наш набор тегов, сущности раскрыты para = next(l for l in lines if "fox" in l) assert "lazy" in para and "fetch_data()" in para, para assert " " not in para and " " not in para, para assert '

first item

' in lines assert '

Name | Value

' in lines assert '

alpha | 1

' in lines assert '' in text assert (out.parent / "images" / "cover.png").exists(), "обложка не извлечена" # Несбалансированная чужая разметка закрывается на границе блока broken = next(l for l in lines if "never closes" in l) assert broken.count("") == broken.count("") == 1, broken assert "noise" not in text, "