""" Erwartungshorizont Templates for Vorabitur Mode Provides pre-defined templates based on German Abitur text analysis types: - Textanalyse (pragmatische Texte) - Sachtextanalyse - Gedichtanalyse / Lyrikinterpretation - Dramenanalyse - Epische Textanalyse / Prosaanalyse - Eroerterung (textgebunden / frei) - Literarische Eroerterung - Materialgestuetztes Schreiben Each template includes: - Structured criteria with weights - Typical expectations per section - NiBiS-aligned evaluation points """ from typing import Dict, List, Optional from dataclasses import dataclass, field, asdict from datetime import datetime import uuid # ============================================= # TEMPLATE TYPES # ============================================= AUFGABENTYPEN = { "textanalyse_pragmatisch": { "name": "Textanalyse (pragmatische Texte)", "description": "Analyse von Sachtexten, Reden, Kommentaren, Essays", "category": "analyse" }, "sachtextanalyse": { "name": "Sachtextanalyse", "description": "Analyse von informativen und appellativen Sachtexten", "category": "analyse" }, "gedichtanalyse": { "name": "Gedichtanalyse / Lyrikinterpretation", "description": "Analyse und Interpretation lyrischer Texte", "category": "interpretation" }, "dramenanalyse": { "name": "Dramenanalyse", "description": "Analyse dramatischer Texte und Szenen", "category": "interpretation" }, "prosaanalyse": { "name": "Epische Textanalyse / Prosaanalyse", "description": "Analyse von Romanauszuegen, Kurzgeschichten, Novellen", "category": "interpretation" }, "eroerterung_textgebunden": { "name": "Textgebundene Eroerterung", "description": "Eroerterung auf Basis eines Sachtextes", "category": "argumentation" }, "eroerterung_frei": { "name": "Freie Eroerterung", "description": "Freie Eroerterung zu einem Thema", "category": "argumentation" }, "eroerterung_literarisch": { "name": "Literarische Eroerterung", "description": "Eroerterung zu literarischen Fragestellungen", "category": "argumentation" }, "materialgestuetzt": { "name": "Materialgestuetztes Schreiben", "description": "Verfassen eines Textes auf Materialbasis", "category": "produktion" } } # ============================================= # TEMPLATE STRUCTURES # ============================================= @dataclass class EHKriterium: """Single criterion in an Erwartungshorizont.""" id: str name: str beschreibung: str gewichtung: int # Percentage weight (0-100) erwartungen: List[str] # Expected points/elements max_punkte: int = 100 def to_dict(self): return asdict(self) @dataclass class EHTemplate: """Complete Erwartungshorizont template.""" id: str aufgabentyp: str name: str beschreibung: str kriterien: List[EHKriterium] einleitung_hinweise: List[str] hauptteil_hinweise: List[str] schluss_hinweise: List[str] sprachliche_aspekte: List[str] created_at: datetime = field(default_factory=lambda: datetime.now()) def to_dict(self): d = { 'id': self.id, 'aufgabentyp': self.aufgabentyp, 'name': self.name, 'beschreibung': self.beschreibung, 'kriterien': [k.to_dict() for k in self.kriterien], 'einleitung_hinweise': self.einleitung_hinweise, 'hauptteil_hinweise': self.hauptteil_hinweise, 'schluss_hinweise': self.schluss_hinweise, 'sprachliche_aspekte': self.sprachliche_aspekte, 'created_at': self.created_at.isoformat() } return d # ============================================= # PRE-DEFINED TEMPLATES # ============================================= def get_textanalyse_template() -> EHTemplate: """Template for pragmatic text analysis.""" return EHTemplate( id="template_textanalyse_pragmatisch", aufgabentyp="textanalyse_pragmatisch", name="Textanalyse pragmatischer Texte", beschreibung="Vorlage fuer die Analyse von Sachtexten, Reden, Kommentaren und Essays", kriterien=[ EHKriterium( id="inhalt", name="Inhaltliche Leistung", beschreibung="Erfassung und Wiedergabe des Textinhalts", gewichtung=40, erwartungen=[ "Korrekte Erfassung der Textaussage/These", "Vollstaendige Wiedergabe der Argumentationsstruktur", "Erkennen von Intention und Adressatenbezug", "Einordnung in den historischen/gesellschaftlichen Kontext", "Beruecksichtigung aller relevanten Textaspekte" ] ), EHKriterium( id="struktur", name="Aufbau und Struktur", beschreibung="Logischer Aufbau und Gliederung der Analyse", gewichtung=15, erwartungen=[ "Sinnvolle Einleitung mit Basisinformationen", "Logische Gliederung des Hauptteils", "Stringente Gedankenfuehrung", "Angemessener Schluss mit Fazit/Wertung", "Absatzgliederung und Ueberlaenge" ] ), EHKriterium( id="analyse", name="Analytische Qualitaet", beschreibung="Tiefe und Qualitaet der Analyse", gewichtung=15, erwartungen=[ "Erkennen rhetorischer Mittel", "Funktionale Deutung der Stilmittel", "Analyse der Argumentationsweise", "Beruecksichtigung von Wortwahl und Satzbau", "Verknuepfung von Form und Inhalt" ] ), EHKriterium( id="rechtschreibung", name="Sprachliche Richtigkeit (Rechtschreibung)", beschreibung="Orthografische Korrektheit", gewichtung=15, erwartungen=[ "Korrekte Rechtschreibung", "Korrekte Gross- und Kleinschreibung", "Korrekte Getrennt- und Zusammenschreibung", "Korrekte Fremdwortschreibung" ] ), EHKriterium( id="grammatik", name="Sprachliche Richtigkeit (Grammatik)", beschreibung="Grammatische Korrektheit und Zeichensetzung", gewichtung=15, erwartungen=[ "Korrekter Satzbau", "Korrekte Flexion", "Korrekte Zeichensetzung", "Korrekte Bezuege und Kongruenz" ] ) ], einleitung_hinweise=[ "Nennung von Autor, Titel, Textsorte, Erscheinungsjahr", "Benennung des Themas", "Formulierung der Kernthese/Hauptaussage", "Ggf. Einordnung in den Kontext" ], hauptteil_hinweise=[ "Systematische Analyse der Argumentationsstruktur", "Untersuchung der sprachlichen Gestaltung", "Funktionale Deutung der Stilmittel", "Beruecksichtigung von Adressatenbezug und Intention", "Textbelege durch Zitate" ], schluss_hinweise=[ "Zusammenfassung der Analyseergebnisse", "Bewertung der Ueberzeugungskraft", "Ggf. aktuelle Relevanz", "Persoenliche Stellungnahme (wenn gefordert)" ], sprachliche_aspekte=[ "Fachsprachliche Begriffe korrekt verwenden", "Konjunktiv fuer indirekte Rede", "Praesens als Tempus der Analyse", "Sachlicher, analytischer Stil" ] ) def get_gedichtanalyse_template() -> EHTemplate: """Template for poetry analysis.""" return EHTemplate( id="template_gedichtanalyse", aufgabentyp="gedichtanalyse", name="Gedichtanalyse / Lyrikinterpretation", beschreibung="Vorlage fuer die Analyse und Interpretation lyrischer Texte", kriterien=[ EHKriterium( id="inhalt", name="Inhaltliche Leistung", beschreibung="Erfassung und Deutung des Gedichtinhalts", gewichtung=40, erwartungen=[ "Korrekte Erfassung des lyrischen Ichs und der Sprechsituation", "Vollstaendige inhaltliche Erschliessung aller Strophen", "Erkennen der zentralen Motive und Themen", "Epochenzuordnung und literaturgeschichtliche Einordnung", "Deutung der Bildlichkeit und Symbolik" ] ), EHKriterium( id="struktur", name="Aufbau und Struktur", beschreibung="Logischer Aufbau der Interpretation", gewichtung=15, erwartungen=[ "Einleitung mit Basisinformationen", "Systematische strophenweise oder aspektorientierte Analyse", "Verknuepfung von Form- und Inhaltsanalyse", "Schluessige Gesamtdeutung im Schluss" ] ), EHKriterium( id="formanalyse", name="Formale Analyse", beschreibung="Analyse der lyrischen Gestaltungsmittel", gewichtung=15, erwartungen=[ "Bestimmung von Metrum und Reimschema", "Analyse der Klanggestaltung", "Erkennen von Enjambements und Zaesuren", "Deutung der formalen Mittel", "Verknuepfung von Form und Inhalt" ] ), EHKriterium( id="rechtschreibung", name="Sprachliche Richtigkeit (Rechtschreibung)", beschreibung="Orthografische Korrektheit", gewichtung=15, erwartungen=[ "Korrekte Rechtschreibung", "Korrekte Gross- und Kleinschreibung", "Korrekte Getrennt- und Zusammenschreibung" ] ), EHKriterium( id="grammatik", name="Sprachliche Richtigkeit (Grammatik)", beschreibung="Grammatische Korrektheit und Zeichensetzung", gewichtung=15, erwartungen=[ "Korrekter Satzbau", "Korrekte Flexion", "Korrekte Zeichensetzung" ] ) ], einleitung_hinweise=[ "Autor, Titel, Entstehungsjahr/Epoche", "Thema/Motiv des Gedichts", "Erste Deutungshypothese", "Formale Grunddaten (Strophen, Verse)" ], hauptteil_hinweise=[ "Inhaltliche Analyse (strophenweise oder aspektorientiert)", "Formale Analyse (Metrum, Reim, Klang)", "Sprachliche Analyse (Stilmittel, Bildlichkeit)", "Funktionale Verknuepfung aller Ebenen", "Textbelege durch Zitate mit Versangabe" ], schluss_hinweise=[ "Zusammenfassung der Interpretationsergebnisse", "Bestaetigung/Modifikation der Deutungshypothese", "Einordnung in Epoche/Werk des Autors", "Aktualitaetsbezug (wenn sinnvoll)" ], sprachliche_aspekte=[ "Fachbegriffe der Lyrikanalyse verwenden", "Zwischen lyrischem Ich und Autor unterscheiden", "Praesens als Analysetempus", "Deutende statt beschreibende Formulierungen" ] ) def get_eroerterung_template() -> EHTemplate: """Template for textgebundene Eroerterung.""" return EHTemplate( id="template_eroerterung_textgebunden", aufgabentyp="eroerterung_textgebunden", name="Textgebundene Eroerterung", beschreibung="Vorlage fuer die textgebundene Eroerterung auf Basis eines Sachtextes", kriterien=[ EHKriterium( id="inhalt", name="Inhaltliche Leistung", beschreibung="Qualitaet der Argumentation", gewichtung=40, erwartungen=[ "Korrekte Wiedergabe der Textposition", "Differenzierte eigene Argumentation", "Vielfaeltige und ueberzeugende Argumente", "Beruecksichtigung von Pro und Contra", "Sinnvolle Beispiele und Belege", "Eigenstaendige Schlussfolgerung" ] ), EHKriterium( id="struktur", name="Aufbau und Struktur", beschreibung="Logischer Aufbau der Eroerterung", gewichtung=15, erwartungen=[ "Problemorientierte Einleitung", "Klare Gliederung der Argumentation", "Logische Argumentationsfolge", "Sinnvolle Ueberlaetze", "Begruendetes Fazit" ] ), EHKriterium( id="textbezug", name="Textbezug", beschreibung="Verknuepfung mit dem Ausgangstext", gewichtung=15, erwartungen=[ "Angemessene Textwiedergabe", "Kritische Auseinandersetzung mit Textposition", "Korrekte Zitierweise", "Verknuepfung eigener Argumente mit Text" ] ), EHKriterium( id="rechtschreibung", name="Sprachliche Richtigkeit (Rechtschreibung)", beschreibung="Orthografische Korrektheit", gewichtung=15, erwartungen=[ "Korrekte Rechtschreibung", "Korrekte Gross- und Kleinschreibung" ] ), EHKriterium( id="grammatik", name="Sprachliche Richtigkeit (Grammatik)", beschreibung="Grammatische Korrektheit und Zeichensetzung", gewichtung=15, erwartungen=[ "Korrekter Satzbau", "Korrekte Zeichensetzung", "Variationsreicher Ausdruck" ] ) ], einleitung_hinweise=[ "Hinfuehrung zum Thema", "Nennung des Ausgangstextes", "Formulierung der Leitfrage/These", "Ueberleitung zum Hauptteil" ], hauptteil_hinweise=[ "Kurze Wiedergabe der Textposition", "Systematische Argumentation (dialektisch oder linear)", "Jedes Argument: These - Begruendung - Beispiel", "Gewichtung der Argumente", "Verknuepfung mit Textposition" ], schluss_hinweise=[ "Zusammenfassung der wichtigsten Argumente", "Eigene begruendete Stellungnahme", "Ggf. Ausblick oder Appell" ], sprachliche_aspekte=[ "Argumentative Konnektoren verwenden", "Sachlicher, ueberzeugender Stil", "Eigene Meinung kennzeichnen", "Konjunktiv fuer Textpositionen" ] ) def get_prosaanalyse_template() -> EHTemplate: """Template for prose/narrative text analysis.""" return EHTemplate( id="template_prosaanalyse", aufgabentyp="prosaanalyse", name="Epische Textanalyse / Prosaanalyse", beschreibung="Vorlage fuer die Analyse von Romanauszuegen, Kurzgeschichten und Novellen", kriterien=[ EHKriterium( id="inhalt", name="Inhaltliche Leistung", beschreibung="Erfassung und Deutung des Textinhalts", gewichtung=40, erwartungen=[ "Korrekte Erfassung der Handlung", "Charakterisierung der Figuren", "Erkennen der Erzaehlsituation", "Deutung der Konflikte und Motive", "Einordnung in den Gesamtzusammenhang" ] ), EHKriterium( id="struktur", name="Aufbau und Struktur", beschreibung="Logischer Aufbau der Analyse", gewichtung=15, erwartungen=[ "Informative Einleitung", "Systematische Analyse im Hauptteil", "Verknuepfung der Analyseergebnisse", "Schluessige Gesamtdeutung" ] ), EHKriterium( id="erzaehltechnik", name="Erzaehltechnische Analyse", beschreibung="Analyse narrativer Gestaltungsmittel", gewichtung=15, erwartungen=[ "Bestimmung der Erzaehlperspektive", "Analyse von Zeitgestaltung", "Raumgestaltung und Atmosphaere", "Figurenrede und Bewusstseinsdarstellung", "Funktionale Deutung" ] ), EHKriterium( id="rechtschreibung", name="Sprachliche Richtigkeit (Rechtschreibung)", beschreibung="Orthografische Korrektheit", gewichtung=15, erwartungen=[ "Korrekte Rechtschreibung", "Korrekte Gross- und Kleinschreibung" ] ), EHKriterium( id="grammatik", name="Sprachliche Richtigkeit (Grammatik)", beschreibung="Grammatische Korrektheit und Zeichensetzung", gewichtung=15, erwartungen=[ "Korrekter Satzbau", "Korrekte Zeichensetzung" ] ) ], einleitung_hinweise=[ "Autor, Titel, Textsorte, Erscheinungsjahr", "Einordnung des Auszugs in den Gesamttext", "Thema und Deutungshypothese" ], hauptteil_hinweise=[ "Kurze Inhaltsangabe des Auszugs", "Analyse der Handlungsstruktur", "Figurenanalyse mit Textbelegen", "Erzaehltechnische Analyse", "Sprachliche Analyse", "Verknuepfung aller Ebenen" ], schluss_hinweise=[ "Zusammenfassung der Analyseergebnisse", "Bestaetigung der Deutungshypothese", "Bedeutung fuer Gesamtwerk", "Ggf. Aktualitaetsbezug" ], sprachliche_aspekte=[ "Fachbegriffe der Erzaehltextanalyse", "Zwischen Erzaehler und Autor unterscheiden", "Praesens als Analysetempus", "Deutende Formulierungen" ] ) def get_dramenanalyse_template() -> EHTemplate: """Template for drama analysis.""" return EHTemplate( id="template_dramenanalyse", aufgabentyp="dramenanalyse", name="Dramenanalyse", beschreibung="Vorlage fuer die Analyse dramatischer Texte und Szenen", kriterien=[ EHKriterium( id="inhalt", name="Inhaltliche Leistung", beschreibung="Erfassung und Deutung des Szeneninhalts", gewichtung=40, erwartungen=[ "Korrekte Erfassung der Handlung", "Analyse der Figurenkonstellation", "Erkennen des dramatischen Konflikts", "Einordnung in den Handlungsverlauf", "Deutung der Szene im Gesamtzusammenhang" ] ), EHKriterium( id="struktur", name="Aufbau und Struktur", beschreibung="Logischer Aufbau der Analyse", gewichtung=15, erwartungen=[ "Einleitung mit Kontextualisierung", "Systematische Szenenanalyse", "Verknuepfung der Analyseergebnisse", "Schluessige Deutung" ] ), EHKriterium( id="dramentechnik", name="Dramentechnische Analyse", beschreibung="Analyse dramatischer Gestaltungsmittel", gewichtung=15, erwartungen=[ "Analyse der Dialoggestaltung", "Regieanweisungen und Buehnenraum", "Dramatische Spannung", "Monolog/Dialog-Formen", "Funktionale Deutung" ] ), EHKriterium( id="rechtschreibung", name="Sprachliche Richtigkeit (Rechtschreibung)", beschreibung="Orthografische Korrektheit", gewichtung=15, erwartungen=[ "Korrekte Rechtschreibung" ] ), EHKriterium( id="grammatik", name="Sprachliche Richtigkeit (Grammatik)", beschreibung="Grammatische Korrektheit und Zeichensetzung", gewichtung=15, erwartungen=[ "Korrekter Satzbau", "Korrekte Zeichensetzung" ] ) ], einleitung_hinweise=[ "Autor, Titel, Uraufführungsjahr, Dramenform", "Einordnung der Szene in den Handlungsverlauf", "Thema und Deutungshypothese" ], hauptteil_hinweise=[ "Situierung der Szene", "Analyse des Dialogverlaufs", "Figurenanalyse im Dialog", "Sprachliche Analyse", "Dramentechnische Mittel", "Bedeutung fuer den Konflikt" ], schluss_hinweise=[ "Zusammenfassung der Analyseergebnisse", "Funktion der Szene im Drama", "Bedeutung fuer die Gesamtdeutung" ], sprachliche_aspekte=[ "Fachbegriffe der Dramenanalyse", "Praesens als Analysetempus", "Korrekte Zitierweise mit Akt/Szene/Zeile" ] ) # ============================================= # TEMPLATE REGISTRY # ============================================= TEMPLATES: Dict[str, EHTemplate] = {} def initialize_templates(): """Initialize all pre-defined templates.""" global TEMPLATES TEMPLATES = { "textanalyse_pragmatisch": get_textanalyse_template(), "gedichtanalyse": get_gedichtanalyse_template(), "eroerterung_textgebunden": get_eroerterung_template(), "prosaanalyse": get_prosaanalyse_template(), "dramenanalyse": get_dramenanalyse_template(), } def get_template(aufgabentyp: str) -> Optional[EHTemplate]: """Get a template by Aufgabentyp.""" if not TEMPLATES: initialize_templates() return TEMPLATES.get(aufgabentyp) def list_templates() -> List[Dict]: """List all available templates.""" if not TEMPLATES: initialize_templates() return [ { "aufgabentyp": typ, "name": AUFGABENTYPEN.get(typ, {}).get("name", typ), "description": AUFGABENTYPEN.get(typ, {}).get("description", ""), "category": AUFGABENTYPEN.get(typ, {}).get("category", "other"), } for typ in TEMPLATES.keys() ] def get_aufgabentypen() -> Dict: """Get all Aufgabentypen definitions.""" return AUFGABENTYPEN # Initialize on import initialize_templates()