""" HTML generation functions for dreader UI. Generates HTML strings programmatically for library view, reader view, and various overlays (settings, TOC, etc.) that can be passed to a HAL for rendering. """ from pathlib import Path from typing import List, Dict, Optional import base64 from io import BytesIO def generate_library_html(books: List[Dict[str, str]], save_covers_to_disk: bool = False) -> str: """ Generate HTML for the library view showing all books in a simple table. Args: books: List of book dictionaries with keys: - title: Book title - author: Book author - filename: EPUB filename - cover_data: Optional base64 encoded cover image - cover_path: Optional path to saved cover image (if save_covers_to_disk=True) save_covers_to_disk: If True, expect cover_path instead of cover_data Returns: Complete HTML string for library view """ # Build table rows rows = [] for book in books: # Add cover image cell if available if save_covers_to_disk and book.get('cover_path'): cover_cell = f'' elif book.get('cover_data'): cover_cell = f'' else: cover_cell = '[No cover]' # Add book info cell info_cell = f'{book["title"]}
{book["author"]}' rows.append(f'{cover_cell}{info_cell}') table_html = '\n'.join(rows) return f''' Library

My Library

{len(books)} books

{table_html}
''' def generate_reader_html(book_title: str, book_author: str, page_image_data: str) -> str: """ Generate HTML for the reader view with page display. Args: book_title: Title of current book book_author: Author of current book page_image_data: Base64 encoded page image Returns: Complete HTML string for reader view (page layer only) """ html = f''' {book_title}
{book_title}
{book_author}
Page
''' return html def generate_settings_overlay() -> str: """ Generate HTML for the settings overlay. Returns: HTML string for settings overlay """ html = ''' Settings
Settings
Font Size
Line Spacing
Brightness
WiFi
''' return html def generate_toc_overlay(chapters: List[Dict], page_size: tuple = (800, 1200)) -> str: """ Generate HTML for the table of contents overlay. Args: chapters: List of chapter dictionaries with keys: - index: Chapter index - title: Chapter title page_size: Page dimensions (width, height) for sizing the overlay Returns: HTML string for TOC overlay (60% popup with transparent background) """ # Build chapter list items with clickable links for pyWebLayout query chapter_items = [] for i, chapter in enumerate(chapters): title = chapter["title"] # Wrap each row in a paragraph with an inline link # For very short titles (I, II), pad the link text to ensure it's clickable link_text = f'{i+1}. {title}' if len(title) <= 2: # Add extra padding spaces inside the link to make it easier to click link_text = f'{i+1}. {title} ' # Extra spaces for padding chapter_items.append( f'

' f'' f'{link_text}

' ) # Render simple white panel - compositing will be done by OverlayManager html = f''' Table of Contents

Table of Contents

{len(chapters)} chapters

{"".join(chapter_items)}

Tap a chapter to navigate • Tap outside to close

''' return html def generate_bookmarks_overlay(bookmarks: List[Dict]) -> str: """ Generate HTML for the bookmarks overlay. Args: bookmarks: List of bookmark dictionaries with keys: - name: Bookmark name - position: Position info Returns: HTML string for bookmarks overlay """ bookmark_rows = [] for bookmark in bookmarks: bookmark_rows.append(f'''
{bookmark['name']}
{bookmark.get('position', '')}
''') html = f''' Bookmarks
Bookmarks
{"".join(bookmark_rows)}
''' return html