""" AI Processing - Print Version Generator: Cloze (Lueckentext). Generates printable HTML for cloze/fill-in-the-blank worksheets. """ from pathlib import Path import json import random import logging from .core import BEREINIGT_DIR logger = logging.getLogger(__name__) def generate_print_version_cloze(cloze_path: Path, include_answers: bool = False) -> Path: """ Generiert eine druckbare HTML-Version der Lueckentexte. Args: cloze_path: Pfad zur *_cloze.json Datei include_answers: True fuer Loesungsblatt (fuer Eltern) Returns: Pfad zur generierten HTML-Datei """ if not cloze_path.exists(): raise FileNotFoundError(f"Cloze-Datei nicht gefunden: {cloze_path}") cloze_data = json.loads(cloze_path.read_text(encoding="utf-8")) items = cloze_data.get("cloze_items", []) metadata = cloze_data.get("metadata", {}) title = metadata.get("source_title", "Arbeitsblatt") subject = metadata.get("subject", "") grade = metadata.get("grade_level", "") total_gaps = metadata.get("total_gaps", 0) html_parts = [] html_parts.append(""" """ + title + """ - Lueckentext """) # Header version_text = "Loesungsblatt" if include_answers else "Lueckentext" html_parts.append(f"

{title} - {version_text}

") meta_parts = [] if subject: meta_parts.append(f"Fach: {subject}") if grade: meta_parts.append(f"Klasse: {grade}") meta_parts.append(f"Luecken gesamt: {total_gaps}") html_parts.append(f"
{' | '.join(meta_parts)}
") # Sammle alle Lueckenwoerter fuer Wortbank all_words = [] # Lueckentexte for idx, item in enumerate(items, 1): html_parts.append("
") html_parts.append(f"
{idx}.
") gaps = item.get("gaps", []) sentence = item.get("sentence_with_gaps", "") if include_answers: # Loesungsblatt: Luecken mit Antworten fuellen for gap in gaps: word = gap.get("word", "") sentence = sentence.replace("___", f"{word}", 1) else: # Fragenblatt: Luecken als Linien sentence = sentence.replace("___", " ") # Woerter fuer Wortbank sammeln for gap in gaps: all_words.append(gap.get("word", "")) html_parts.append(f"
{sentence}
") # Uebersetzung anzeigen translation = item.get("translation", {}) if translation: lang_name = translation.get("language_name", "Uebersetzung") full_sentence = translation.get("full_sentence", "") if full_sentence: html_parts.append("
") html_parts.append(f"
{lang_name}:
") html_parts.append(full_sentence) html_parts.append("
") html_parts.append("
") # Wortbank (nur fuer Fragenblatt) if not include_answers and all_words: random.shuffle(all_words) # Mische die Woerter html_parts.append("
") html_parts.append("
Wortbank (diese Woerter fehlen):
") for word in all_words: html_parts.append(f"{word}") html_parts.append("
") html_parts.append("") # Speichern suffix = "_cloze_solutions.html" if include_answers else "_cloze_print.html" out_name = cloze_path.stem.replace("_cloze", "") + suffix out_path = BEREINIGT_DIR / out_name out_path.write_text("\n".join(html_parts), encoding="utf-8") logger.info(f"Cloze Print-Version gespeichert: {out_path.name}") return out_path