"""
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"""
"""
for s in page_sentences:
html += f"""
"""
if show_solutions:
html += f"""
| {s.english} |
|
"""
else:
html += """
|
|
"""
html += """
"""
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 = """
| Englisch |
Deutsch |
Korrektur |
"""
for v in page_vocab:
if show_solutions:
combined_html += f"""
| {v.english} |
{v.german} |
|
"""
else:
combined_html += f"""
| {v.english} |
|
|
"""
combined_html += f"""
{title} - Seite {page_num}
"""
# PAGE 2: SENTENCE PRACTICE
if page_sentences:
combined_html += f"""
"""
for s in page_sentences:
combined_html += f"""
"""
if show_solutions:
combined_html += f"""
| {s.english} |
|
"""
else:
combined_html += """
|
|
"""
combined_html += """
"""
combined_html += f"""
{title} - Seite {page_num}
"""
combined_html += """
"""
return combined_html