""" NRU Worksheet HTML — HTML generation for vocabulary worksheets. Extracted from nru_worksheet_generator.py for modularity. """ import logging from typing import List, Dict from nru_worksheet_models import VocabEntry, SentenceEntry, separate_vocab_and_sentences logger = logging.getLogger(__name__) def generate_nru_html( vocab_list: List[VocabEntry], sentence_list: List[SentenceEntry], page_number: int, title: str = "Vokabeltest", show_solutions: bool = False, line_height_px: int = 28 ) -> str: """ Generate HTML for NRU-format worksheet. Returns HTML for 2 pages: - Page 1: Vocabulary table (3 columns) - Page 2: Sentence practice (full width) """ # Filter by page page_vocab = [v for v in vocab_list if v.source_page == page_number] page_sentences = [s for s in sentence_list if s.source_page == page_number] html = f""" """ # ========== PAGE 1: VOCABULARY TABLE ========== if page_vocab: html += f"""

{title} - Vokabeln (Seite {page_number})

Name: _________________________ Datum: _____________
""" for v in page_vocab: if show_solutions: html += f""" """ else: html += f""" """ html += """
Englisch Deutsch Korrektur
{v.english} {v.german}
{v.english}
Vokabeln aus Unit
""" # ========== PAGE 2: SENTENCE PRACTICE ========== if page_sentences: html += f"""

{title} - Lernsaetze (Seite {page_number})

Name: _________________________ Datum: _____________
""" for s in page_sentences: html += f""" """ if show_solutions: html += f""" """ else: html += """ """ html += """
{s.german}
{s.english}
""" html += """
Lernsaetze aus Unit
""" html += """ """ return html def generate_nru_worksheet_html( entries: List[Dict], title: str = "Vokabeltest", show_solutions: bool = False, specific_pages: List[int] = None ) -> str: """ Generate complete NRU worksheet HTML for all pages. Args: entries: List of vocabulary entries with source_page title: Worksheet title show_solutions: Whether to show answers specific_pages: List of specific page numbers to include (1-indexed) Returns: Complete HTML document """ # Separate into vocab and sentences vocab_list, sentence_list = separate_vocab_and_sentences(entries) # Get unique page numbers all_pages = set() for v in vocab_list: all_pages.add(v.source_page) for s in sentence_list: all_pages.add(s.source_page) # Filter to specific pages if requested if specific_pages: all_pages = all_pages.intersection(set(specific_pages)) pages_sorted = sorted(all_pages) logger.info(f"Generating NRU worksheet for pages {pages_sorted}") logger.info(f"Total vocab: {len(vocab_list)}, Total sentences: {len(sentence_list)}") # Generate HTML for each page combined_html = """ """ for page_num in pages_sorted: page_vocab = [v for v in vocab_list if v.source_page == page_num] page_sentences = [s for s in sentence_list if s.source_page == page_num] # PAGE 1: VOCABULARY TABLE if page_vocab: combined_html += f"""

{title} - Vokabeln (Seite {page_num})

Name: _________________________ Datum: _____________
""" for v in page_vocab: if show_solutions: combined_html += f""" """ else: combined_html += f""" """ combined_html += f"""
Englisch Deutsch Korrektur
{v.english} {v.german}
{v.english}
{title} - Seite {page_num}
""" # PAGE 2: SENTENCE PRACTICE if page_sentences: combined_html += f"""

{title} - Lernsaetze (Seite {page_num})

Name: _________________________ Datum: _____________
""" for s in page_sentences: combined_html += f""" """ if show_solutions: combined_html += f""" """ else: combined_html += """ """ combined_html += """
{s.german}
{s.english}
""" combined_html += f"""
{title} - Seite {page_num}
""" combined_html += """ """ return combined_html