From f4a4b40914f1c18d0479130e3aaadee5ff5ec64d Mon Sep 17 00:00:00 2001 From: admin Date: Sun, 26 Apr 2026 11:02:15 +0200 Subject: [PATCH] =?UTF-8?q?Mehrw=C3=B6rtige=20Wort-Eintr=C3=A4ge=20verhind?= =?UTF-8?q?ern=20+=20orange=20highlighten?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Backend: _sanitize_word() splittet Komma-Listen und filtert Mehrwörter raus - Frontend: Chips mit Leerzeichen/Komma werden orange markiert (Tooltip) Co-Authored-By: Claude Sonnet 4.6 --- app.py | 26 ++++++++++++++++++++------ frontend/src/pages/GenerateIt.tsx | 9 ++++++--- 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/app.py b/app.py index 114c6a9..abb1bc1 100644 --- a/app.py +++ b/app.py @@ -1044,14 +1044,28 @@ def generate_questions(obj_id: str): "questions_linked": 0, } + def _sanitize_word(raw: str) -> list[str]: + """Zerlegt kommagetrennte Einträge und gibt nur echte Einzelwörter zurück.""" + tokens = [] + for part in raw.replace(";", ",").split(","): + part = part.strip().strip("\"'") + if not part: + continue + words_in_part = part.split() + if len(words_in_part) == 1: + tokens.append(words_in_part[0]) + # Mehrwortige Einträge → überspringen (KI-Fehler) + return tokens + # Alle eindeutigen Wörter aus allen Leveln vorab sammeln und einmalig laden all_words_by_level: dict[str, int] = {} # title_de → first level seen for lvl in levels: level = int(lvl.get("level") or 1) - for w in lvl.get("words", []) + lvl.get("distractor_words", []) + [lvl.get("short_answer", "")]: - w = str(w).strip() - if w and w not in all_words_by_level: - all_words_by_level[w] = level + raw_words = lvl.get("words", []) + lvl.get("distractor_words", []) + [lvl.get("short_answer", "")] + for raw in raw_words: + for w in _sanitize_word(str(raw)): + if w and w not in all_words_by_level: + all_words_by_level[w] = level # Wörter einmalig anlegen / finden (globaler Cache über alle Level) global_word_map: dict[str, str] = {} # title_de → id @@ -1074,8 +1088,8 @@ def generate_questions(obj_id: str): q_de = (lvl.get("question") or "").strip() a_de = (lvl.get("answer") or "").strip() short_text = (lvl.get("short_answer") or "").strip() - words_list = [str(w).strip() for w in lvl.get("words", []) if str(w).strip()] - distractor_list = [str(w).strip() for w in lvl.get("distractor_words", []) if str(w).strip()] + words_list = [t for raw in lvl.get("words", []) for t in _sanitize_word(str(raw))] + distractor_list = [t for raw in lvl.get("distractor_words", []) for t in _sanitize_word(str(raw))] if not q_de: continue diff --git a/frontend/src/pages/GenerateIt.tsx b/frontend/src/pages/GenerateIt.tsx index b131809..7e5bc43 100644 --- a/frontend/src/pages/GenerateIt.tsx +++ b/frontend/src/pages/GenerateIt.tsx @@ -443,8 +443,10 @@ export default function GenerateIt() {
) : (
- {objWords.map(w => ( - + {objWords.map(w => { + const isInvalid = /[\s,;]/.test(w.title_de) + return ( + {w.title_de} - ))} + ) + })}
)}