Mehrwörtige Wort-Einträge verhindern + orange highlighten
- 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 <noreply@anthropic.com>
This commit is contained in:
26
app.py
26
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
|
||||
|
||||
Reference in New Issue
Block a user