""" AI Processor - Worksheet Export Generate printable worksheet versions. """ from pathlib import Path import json import logging logger = logging.getLogger(__name__) def generate_print_version_worksheet(analysis_path: Path) -> str: """ Generate a print-optimized HTML version of the worksheet. Features: - Large, readable font (16pt) - Black and white / grayscale compatible - Clear structure for printing - No interactive elements Args: analysis_path: Path to *_analyse.json file Returns: HTML string for direct delivery """ if not analysis_path.exists(): raise FileNotFoundError(f"Analysedatei nicht gefunden: {analysis_path}") try: data = json.loads(analysis_path.read_text(encoding="utf-8")) except json.JSONDecodeError as e: raise RuntimeError(f"Analyse-Datei enthaelt kein gueltiges JSON: {analysis_path}\n{e}") from e title = data.get("title") or "Arbeitsblatt" subject = data.get("subject") or "" grade_level = data.get("grade_level") or "" instructions = data.get("instructions") or "" tasks = data.get("tasks", []) or [] canonical_text = data.get("canonical_text") or "" printed_blocks = data.get("printed_blocks") or [] html_parts = [] html_parts.append(_get_worksheet_html_header(title)) # Print button html_parts.append('') # Title html_parts.append(f"

{title}

") # Meta information meta_parts = [] if subject: meta_parts.append(f"Fach: {subject}") if grade_level: meta_parts.append(f"Klasse: {grade_level}") if meta_parts: html_parts.append(f"
{''.join(meta_parts)}
") # Instructions if instructions: html_parts.append("
") html_parts.append("
Arbeitsanweisung:
") html_parts.append(f"
{instructions}
") html_parts.append("
") # Main text / printed blocks has_text_content = False if printed_blocks: html_parts.append("
") for block in printed_blocks: role = (block.get("role") or "body").lower() text = (block.get("text") or "").strip() if not text: continue has_text_content = True if role == "title": html_parts.append(f"
{text}
") else: html_parts.append(f"
{text}
") html_parts.append("
") elif canonical_text: html_parts.append("
") paragraphs = [ p.strip() for p in canonical_text.replace("\r\n", "\n").split("\n\n") if p.strip() ] for p in paragraphs: has_text_content = True html_parts.append(f"
{p}
") html_parts.append("
") # Tasks if tasks: html_parts.append("
") html_parts.append("

Aufgaben

") for idx, task in enumerate(tasks, start=1): t_type = task.get("type") or "Aufgabe" desc = task.get("description") or "" text_with_gaps = task.get("text_with_gaps") html_parts.append("
") # Task header type_label = { "fill_in_blank": "Lueckentext", "multiple_choice": "Multiple Choice", "free_text": "Freitext", "matching": "Zuordnung", "labeling": "Beschriftung", "calculation": "Rechnung", "other": "Aufgabe" }.get(t_type, t_type) html_parts.append(f"
Aufgabe {idx}: {type_label}
") if desc: html_parts.append(f"
{desc}
") if text_with_gaps: rendered = text_with_gaps.replace("___", " ") html_parts.append(f"
{rendered}
") # Answer lines for free text tasks if t_type in ["free_text", "other"] or (not text_with_gaps and not desc): html_parts.append("
") for _ in range(3): html_parts.append("
") html_parts.append("
") html_parts.append("
") html_parts.append("
") # Footer html_parts.append("") html_parts.append("") return "\n".join(html_parts) def _get_worksheet_html_header(title: str) -> str: """Get HTML header for worksheet print version.""" return f""" {title} """