Coverage for src/epublib/nav/util.py: 85%
39 statements
« prev ^ index » next coverage.py v7.10.6, created at 2025-09-18 16:07 -0300
« prev ^ index » next coverage.py v7.10.6, created at 2025-09-18 16:07 -0300
1from dataclasses import dataclass
3import bs4
4from bs4.element import NamespacedAttribute
6from epublib.exceptions import warn
7from epublib.util import attr_to_str, parse_int
9epub_type = NamespacedAttribute(
10 prefix="epub",
11 name="type",
12 namespace="http://www.idpf.org/2007/ops",
13)
16def detect_page(tag: bs4.Tag):
17 page = None
18 if tag.string:
19 page = parse_int(tag.string)
20 if page is not None:
21 return page
23 if tag.get("title"):
24 page = parse_int(attr_to_str(tag["title"]))
26 if page is not None:
27 return page
29 if tag.get("id"):
30 page = parse_int(attr_to_str(tag["id"]))
31 if page is not None:
32 return page
34 warn(f"Can't determine page number of pagebreak element: {tag}")
35 return None
38@dataclass
39class PageBreakData:
40 """Data for a page break."""
42 id: str
43 filename: str
44 page: int
45 label: str = ""
47 def __post_init__(self):
48 if not self.label:
49 self.label = str(self.page)
52@dataclass
53class TOCEntryData:
54 """Data for a table of contents entry."""
56 filename: str
57 label: str
58 id: str | None = None
61@dataclass
62class LandmarkEntryData(TOCEntryData):
63 """Represents a landmark, a special navigation point in an EPUB file."""
65 epub_type: str | None = None