Benutzer:Patrick Oberdoerfer/ZUM-Apps und H5P/Advanced Fill in the Blanks/

Aus ZUM Projektwiki

Einleitung

Im Rahmen der Arbeiten am Angebot Differenzierung bin ich ein großer Fan des Inhaltstypen Advanced Fill in the Blanks geworden.

Allerdings ist die Erstellung verhältnismäßig aufwendig, weshalb ich den Versuch gestartet habe, die Erstellung via CSV-Vorlage und Python zu optimieren.

Das Ergebnis scheint ganz erfolgreich zu sein.

Was brauchen wir hierfür auf dem PC

Python und es muss (z.B. via Windows PowerShell das Paket pandas installiert sein – das ist eine sehr beliebte Bibliothek, die zum Einlesen von CSV-Dateien verwendet wird.

Dann muss das Python-Skript und die CSV-Vorlage mit den aktuellen Eingaben in einen Ordner. Über die Windows-Eingabeaufforderung muss jetzt im passenden Ordner

dieser Befehl ausgeführt werden: python generate_content_json.py

Wie geht es weiter?

Erstelle eine H5P Advanced Fill in the Blank mit einer Lücke.

🧩 Schritt-für-Schritt: H5P-Datei mit deiner content.json

1. Deine vorhandene .h5p-Datei vorbereiten

  • Ändere die Dateiendung von .h5p auf .zip
  • Entpacke die Datei mit 7-Zip, Windows, o. Ä.

2. content.json ersetzen

  • Navigiere im entpackten Ordner zu content/
  • Ersetze dort die alte content.json durch deine neu erzeugte

3. Wieder zusammenpacken

  • Markiere alle Inhalte im Hauptordner (nicht den Ordner selbst!)
  • Erstelle daraus ein ZIP-Archiv
  • Benenne das ZIP in neue_h5p.h5p um

4. Testen!


Hier das Skript:

import pandas as pd
import json

# CSV-Datei laden
csv_path = "Eingabe Advanced Fill in the Blanks - Tabelle.CSV"  # ggf. Pfad anpassen
df = pd.read_csv(csv_path, sep=';', encoding='utf-8')

# Spalten bereinigen
df.columns = df.columns.str.strip()

# content.json Grundstruktur
content = {
    "blanksText": "",
    "blanksList": []
}

# Hilfsfunktion
def create_blanks_text(s):
    return s.replace("*", "____")

# Inhalte verarbeiten
blanks = []
texts = []

for _, row in df.iterrows():
    if pd.isna(row['Satz']):
        continue

    texts.append(f"<p>{create_blanks_text(row['Satz'])}</p>")

    correct = row['Lösung']
    hint = row.get('Tipp', None)

    incorrects = []
    for i in range(1, 5):
        wrong = row.get(f'Vom Nutzer eingegebene falsche Antwort {i}')
        feedback = row.get(f'Rückmeldung.{i-1}')
        if pd.notna(wrong):
            incorrects.append({
                "showHighlight": False,
                "highlight": "-1",
                "incorrectAnswerText": wrong,
                "incorrectAnswerFeedback": f"<div>{feedback or ''}</div>"
            })

    entry = {
        "correctAnswerText": correct,
        "incorrectAnswersList": incorrects
    }
    if pd.notna(hint):
        entry["hint"] = hint

    blanks.append(entry)

content["blanksText"] = "\n".join(texts)
content["blanksList"] = blanks

# H5P-Struktur komplett
full_data = {
    "content": content,
    "behaviour": {
        "mode": "selection",
        "selectAlternatives": "alternatives",
        "selectAlternativeRestriction": 1,
        "spellingErrorBehaviour": "mistake",
        "caseSensitive": False,
        "autoCheck": False,
        "enableSolutionsButton": False,
        "showSolutionsRequiresInput": True,
        "enableRetry": True,
        "enableCheckButton": True
    },
    "showSolutions": "Lösung anzeigen",
    "tryAgain": "Wiederholen",
    "checkAnswer": "Überprüfen",
    "notFilledOut": "Bitte fülle alle Lücken aus, um die Lösung zu sehen",
    "tipLabel": "Tipp",
    "scoreBarLabel": "Du hast :num von :total Punkten erreicht."
}

# Speichern
with open("content.json", "w", encoding="utf-8") as f:
    json.dump(full_data, f, ensure_ascii=False, indent=2)

print("✅ content.json wurde erfolgreich erzeugt!")

CSV-Vorlage

Satz Lösung Tipp Vom Nutzer eingegebene falsche Antwort 1 Rückmeldung Vom Nutzer eingegebene falsche Antwort 2 Rückmeldung Vom Nutzer eingegebene falsche Antwort 3 Rückmeldung Vom Nutzer eingegebene falsche Antwort 4 Rückmeldung
Der *Deutsche Bundestag* ist das Parlament der Bundesrepublik Deutschland und repräsentiert das Volk auf Bundesebene. Deutsche Bundestag D _ _ _ _ _ _ _ B _ _ _ _ _ t _ _ Deutscher Bundesrat Der Bundesrat ist die Länderkammer. Bayerische Landtag Das ist das Landesparlament des Freistaats Bayern. Deutsche Bundesversammlung Die Deutsche Bundesversammlung setzt sich aus dem Bundestag und der Vertretungen des Bundesrates zusammen.
Die Abgeordneten des Bundestages werden alle *vier* Jahre gewählt – in der Regel durch eine allgemeine, unmittelbare, freie, gleiche und geheime Wahl. vier Kürzer als fünf Jahre zwei Zwei Jahre sind zu wenig. drei Drei Jahre sind zu wenig. fünf Auf fünf Jahre wird der/die Bundespräsident:in gewählt.
Eine zentrale Aufgabe des Bundestages ist die *Gesetzgebung*, also das Beschließen neuer Gesetze oder das Ändern bestehender Gesetze. Gesetzgebung siehe Nebensatz Lobbyarbeit Nein, die Lobbyarbeit versucht Einfluss zu nehmen. Die Wahl der Verfassungsorgane. Dies sind auch Aufgaben, aber nicht die zentrale Aufgabe. Die Vertretung Deutschlands im Ausland. Nein, das macht das Auswertige Amt und der/die Bundespräsident:in
Der Bundestag wählt den/die *Bundeskanzler:in*, der bzw. die anschließend vom Bundespräsidenten ernannt wird. Bundeskanzler:in Diese Amt hat die Richtlinienkompetenz. Bundespräsident:in Nein, diese Verfassungsorgan wird durch die Bundesversammlung gewählt. Die Ministerpräsident:innen Nein, die werden durch die Landesparlamente gewählt. Die Bundesminster:innen Nein, diese werden durch die/den Bundespräsident:in ernannt.
Der Bundestag kontrolliert die *Regierung*, unter anderem durch Anfragen, Debatten und Untersuchungsausschüsse. Regierung Wird idR durch eine Koalition gebildet. Bundesversammlung Nein, diese wählt die/den Bundespräsident:in. Landesregierung Das ist die Aufgabe der Landesparlamente. Oppositon Die Hauptaufgabe der Opposition ist Kontrolle!