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

1from dataclasses import dataclass 

2 

3import bs4 

4from bs4.element import NamespacedAttribute 

5 

6from epublib.exceptions import warn 

7from epublib.util import attr_to_str, parse_int 

8 

9epub_type = NamespacedAttribute( 

10 prefix="epub", 

11 name="type", 

12 namespace="http://www.idpf.org/2007/ops", 

13) 

14 

15 

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 

22 

23 if tag.get("title"): 

24 page = parse_int(attr_to_str(tag["title"])) 

25 

26 if page is not None: 

27 return page 

28 

29 if tag.get("id"): 

30 page = parse_int(attr_to_str(tag["id"])) 

31 if page is not None: 

32 return page 

33 

34 warn(f"Can't determine page number of pagebreak element: {tag}") 

35 return None 

36 

37 

38@dataclass 

39class PageBreakData: 

40 """Data for a page break.""" 

41 

42 id: str 

43 filename: str 

44 page: int 

45 label: str = "" 

46 

47 def __post_init__(self): 

48 if not self.label: 

49 self.label = str(self.page) 

50 

51 

52@dataclass 

53class TOCEntryData: 

54 """Data for a table of contents entry.""" 

55 

56 filename: str 

57 label: str 

58 id: str | None = None 

59 

60 

61@dataclass 

62class LandmarkEntryData(TOCEntryData): 

63 """Represents a landmark, a special navigation point in an EPUB file.""" 

64 

65 epub_type: str | None = None