#!/usr/bin/env python3 """ Comprehensive demo of the EbookReader functionality. This script demonstrates all features of the pyWebLayout EbookReader: - Loading EPUB files - Page navigation (forward/backward) - Position saving/loading - Chapter navigation - Font size and spacing adjustments - Getting book and position information Usage: python ereader_demo.py path/to/book.epub """ import sys import os from pathlib import Path from pyweblayout_ereader import EbookReader def print_separator(): """Print a visual separator.""" print("\n" + "="*70 + "\n") def demo_basic_navigation(reader: EbookReader): """Demonstrate basic page navigation.""" print("DEMO: Basic Navigation") print_separator() # Get current page print("Getting first page...") page = reader.get_current_page() if page: print(f"✓ Current page rendered: {page.size}") reader.render_to_file("demo_page_001.png") print(" Saved to: demo_page_001.png") # Navigate forward print("\nNavigating to next page...") page = reader.next_page() if page: print(f"✓ Next page rendered: {page.size}") reader.render_to_file("demo_page_002.png") print(" Saved to: demo_page_002.png") # Navigate backward print("\nNavigating to previous page...") page = reader.previous_page() if page: print(f"✓ Previous page rendered: {page.size}") print_separator() def demo_position_management(reader: EbookReader): """Demonstrate position save/load functionality.""" print("DEMO: Position Management") print_separator() # Navigate a few pages forward print("Navigating forward 3 pages...") for i in range(3): reader.next_page() # Save position print("Saving current position as 'demo_bookmark'...") success = reader.save_position("demo_bookmark") if success: print("✓ Position saved successfully") # Get position info pos_info = reader.get_position_info() print(f"\nCurrent position info:") print(f" Chapter: {pos_info.get('chapter', {}).get('title', 'N/A')}") print(f" Block index: {pos_info['position']['block_index']}") print(f" Word index: {pos_info['position']['word_index']}") print(f" Progress: {pos_info['progress']*100:.1f}%") # Navigate away print("\nNavigating forward 5 more pages...") for i in range(5): reader.next_page() # Load saved position print("Loading saved position 'demo_bookmark'...") page = reader.load_position("demo_bookmark") if page: print("✓ Position restored successfully") reader.render_to_file("demo_restored_position.png") print(" Saved to: demo_restored_position.png") # List all saved positions positions = reader.list_saved_positions() print(f"\nAll saved positions: {positions}") print_separator() def demo_chapter_navigation(reader: EbookReader): """Demonstrate chapter navigation.""" print("DEMO: Chapter Navigation") print_separator() # Get all chapters chapters = reader.get_chapters() print(f"Found {len(chapters)} chapters:") for title, idx in chapters[:5]: # Show first 5 print(f" [{idx}] {title}") if len(chapters) > 5: print(f" ... and {len(chapters) - 5} more") # Jump to a chapter by index if len(chapters) > 1: print(f"\nJumping to chapter 1...") page = reader.jump_to_chapter(1) if page: print("✓ Jumped to chapter successfully") reader.render_to_file("demo_chapter_1.png") print(" Saved to: demo_chapter_1.png") # Get current chapter info chapter_info = reader.get_current_chapter_info() if chapter_info: print(f" Current chapter: {chapter_info['title']}") # Jump to a chapter by title (if we have chapters) if len(chapters) > 0: first_chapter_title = chapters[0][0] print(f"\nJumping to chapter by title: '{first_chapter_title}'...") page = reader.jump_to_chapter(first_chapter_title) if page: print("✓ Jumped to chapter by title successfully") print_separator() def demo_font_size_adjustment(reader: EbookReader): """Demonstrate font size adjustments.""" print("DEMO: Font Size Adjustment") print_separator() # Save current page for comparison print("Rendering page at normal font size (1.0x)...") page = reader.get_current_page() if page: reader.render_to_file("demo_font_normal.png") print("✓ Saved to: demo_font_normal.png") # Increase font size print("\nIncreasing font size...") page = reader.increase_font_size() if page: print(f"✓ Font size increased to {reader.get_font_size():.1f}x") reader.render_to_file("demo_font_larger.png") print(" Saved to: demo_font_larger.png") # Increase again print("\nIncreasing font size again...") page = reader.increase_font_size() if page: print(f"✓ Font size increased to {reader.get_font_size():.1f}x") reader.render_to_file("demo_font_largest.png") print(" Saved to: demo_font_largest.png") # Decrease font size print("\nDecreasing font size...") page = reader.decrease_font_size() if page: print(f"✓ Font size decreased to {reader.get_font_size():.1f}x") # Set specific font size print("\nResetting to normal font size (1.0x)...") page = reader.set_font_size(1.0) if page: print("✓ Font size reset to 1.0x") print_separator() def demo_spacing_adjustment(reader: EbookReader): """Demonstrate line and block spacing adjustments.""" print("DEMO: Spacing Adjustment") print_separator() # Save current page print("Rendering page with default spacing...") page = reader.get_current_page() if page: reader.render_to_file("demo_spacing_default.png") print("✓ Saved to: demo_spacing_default.png") # Increase line spacing print("\nIncreasing line spacing to 10px...") page = reader.set_line_spacing(10) if page: print("✓ Line spacing increased") reader.render_to_file("demo_spacing_lines_10.png") print(" Saved to: demo_spacing_lines_10.png") # Increase inter-block spacing print("\nIncreasing inter-block spacing to 25px...") page = reader.set_inter_block_spacing(25) if page: print("✓ Inter-block spacing increased") reader.render_to_file("demo_spacing_blocks_25.png") print(" Saved to: demo_spacing_blocks_25.png") # Reset to defaults print("\nResetting spacing to defaults (line: 5px, block: 15px)...") reader.set_line_spacing(5) page = reader.set_inter_block_spacing(15) if page: print("✓ Spacing reset to defaults") print_separator() def demo_book_information(reader: EbookReader): """Demonstrate getting book information.""" print("DEMO: Book Information") print_separator() # Get book info book_info = reader.get_book_info() print("Book Information:") print(f" Title: {book_info['title']}") print(f" Author: {book_info['author']}") print(f" Document ID: {book_info['document_id']}") print(f" Total blocks: {book_info['total_blocks']}") print(f" Total chapters: {book_info['total_chapters']}") print(f" Page size: {book_info['page_size']}") print(f" Font scale: {book_info['font_scale']}") # Get reading progress progress = reader.get_reading_progress() print(f"\nReading Progress: {progress*100:.1f}%") # Get detailed position info pos_info = reader.get_position_info() print("\nDetailed Position:") print(f" Chapter index: {pos_info['position']['chapter_index']}") print(f" Block index: {pos_info['position']['block_index']}") print(f" Word index: {pos_info['position']['word_index']}") chapter = pos_info.get('chapter', {}) if chapter.get('title'): print(f" Current chapter: {chapter['title']}") print_separator() def main(): """Main function to run all demos.""" if len(sys.argv) < 2: print("Usage: python ereader_demo.py path/to/book.epub") print("\nExample EPUBs to try:") print(" - tests/data/test.epub") print(" - tests/data/test2.epub") sys.exit(1) epub_path = sys.argv[1] if not os.path.exists(epub_path): print(f"Error: File not found: {epub_path}") sys.exit(1) print("="*70) print(" EbookReader Demo - pyWebLayout") print("="*70) print(f"\nLoading EPUB: {epub_path}") # Create reader with context manager with EbookReader(page_size=(800, 1000)) as reader: # Load the EPUB if not reader.load_epub(epub_path): print("Error: Failed to load EPUB file") sys.exit(1) print("✓ EPUB loaded successfully") # Run all demos try: demo_basic_navigation(reader) demo_position_management(reader) demo_chapter_navigation(reader) demo_font_size_adjustment(reader) demo_spacing_adjustment(reader) demo_book_information(reader) print("\n" + "="*70) print(" Demo Complete!") print("="*70) print("\nGenerated demo images:") demo_files = [ "demo_page_001.png", "demo_page_002.png", "demo_restored_position.png", "demo_chapter_1.png", "demo_font_normal.png", "demo_font_larger.png", "demo_font_largest.png", "demo_spacing_default.png", "demo_spacing_lines_10.png", "demo_spacing_blocks_25.png" ] for filename in demo_files: if os.path.exists(filename): print(f" ✓ {filename}") print("\nAll features demonstrated successfully!") except Exception as e: print(f"\nError during demo: {e}") import traceback traceback.print_exc() sys.exit(1) if __name__ == "__main__": main()