update
This commit is contained in:
@@ -33,24 +33,26 @@ const st = computed(() => props.status || { gute_antworten: 0, streak: 0, absolv
|
|||||||
const MODI = ['quiz_leicht', 'quiz_schwer', 'lueck_leicht', 'lueck_schwer', 'erklaeren']
|
const MODI = ['quiz_leicht', 'quiz_schwer', 'lueck_leicht', 'lueck_schwer', 'erklaeren']
|
||||||
const score = computed(() => st.value.gute_antworten || 0)
|
const score = computed(() => st.value.gute_antworten || 0)
|
||||||
const schwerWahl = ref(false) // leicht/schwer in den Bändern unter 19 (ALT+E)
|
const schwerWahl = ref(false) // leicht/schwer in den Bändern unter 19 (ALT+E)
|
||||||
// Form wechselt NACH dem Meilenstein (>): Quiz 0–6, Lückentext 7–12, Erklären 13–18,
|
// Band aus einem Score: Lückentext ab 6, Erklären ab 12, Zufall ab 18 (Meilenstein-inklusiv).
|
||||||
// Zufall 19–30 (jede Frage ein zufälliger Modus). 'zufall' = Platzhalter; das gezogene
|
function bandFuer(s) {
|
||||||
// Objekt trägt die echte Form/Schwierigkeit.
|
if (s >= GEMEISTERT) return 'zufall'
|
||||||
const aktiverModus = computed(() => {
|
if (s >= VERSTANDEN) return 'erklaeren'
|
||||||
if (!musterModus.value) return 'erklaeren'
|
if (s >= ABSOLVIERT) return 'lueckentext'
|
||||||
if (score.value > GEMEISTERT) return 'zufall'
|
|
||||||
if (score.value > VERSTANDEN) return 'erklaeren'
|
|
||||||
if (score.value > ABSOLVIERT) return schwerWahl.value ? 'lueck_schwer' : 'lueck_leicht'
|
|
||||||
return schwerWahl.value ? 'quiz_schwer' : 'quiz_leicht'
|
|
||||||
})
|
|
||||||
const imZufall = computed(() => aktiverModus.value === 'zufall')
|
|
||||||
// Reines Band aus dem aktuellen Score (ohne Schwierigkeit) — für den Abschnittswechsel.
|
|
||||||
const aktuellesBand = computed(() => {
|
|
||||||
if (score.value > GEMEISTERT) return 'zufall'
|
|
||||||
if (score.value > VERSTANDEN) return 'erklaeren'
|
|
||||||
if (score.value > ABSOLVIERT) return 'lueckentext'
|
|
||||||
return 'quiz'
|
return 'quiz'
|
||||||
|
}
|
||||||
|
// Am Format-Max: Score eingefroren („Max"). Gilt auch bei cap 30 (FullGuide, endgültig).
|
||||||
|
const amDeckel = computed(() => score.value >= props.cap)
|
||||||
|
// Aktuelles Band: am Deckel bleibt das Band des erreichten Formats (cap−1), sonst score-basiert.
|
||||||
|
// Ohne Frage-Muster (alter Baustein) gibt es nur Erklären.
|
||||||
|
const aktuellesBand = computed(() => musterModus.value ? bandFuer(amDeckel.value ? props.cap - 1 : score.value) : 'erklaeren')
|
||||||
|
// 'zufall' = Platzhalter; das gezogene Objekt trägt die echte Form/Schwierigkeit.
|
||||||
|
const aktiverModus = computed(() => {
|
||||||
|
const b = aktuellesBand.value
|
||||||
|
if (b === 'lueckentext') return schwerWahl.value ? 'lueck_schwer' : 'lueck_leicht'
|
||||||
|
if (b === 'quiz') return schwerWahl.value ? 'quiz_schwer' : 'quiz_leicht'
|
||||||
|
return b // 'erklaeren' | 'zufall'
|
||||||
})
|
})
|
||||||
|
const imZufall = computed(() => aktuellesBand.value === 'zufall')
|
||||||
const aktiveForm = computed(() => {
|
const aktiveForm = computed(() => {
|
||||||
const m = aktiverModus.value
|
const m = aktiverModus.value
|
||||||
if (m === 'zufall') return 'quiz' // Platzhalter fürs idle-Widget; Objekt überschreibt
|
if (m === 'zufall') return 'quiz' // Platzhalter fürs idle-Widget; Objekt überschreibt
|
||||||
@@ -76,15 +78,13 @@ const modusRegel = computed(() => {
|
|||||||
if (zeigeForm.value === 'lueckentext') return aktSchwer.value ? 'frei tippen · +3/−1' : 'Begriff aus 4 · +1/−1'
|
if (zeigeForm.value === 'lueckentext') return aktSchwer.value ? 'frei tippen · +3/−1' : 'Begriff aus 4 · +1/−1'
|
||||||
return '+1/+2/+3 · Nachfragen max +1 · schwach −1'
|
return '+1/+2/+3 · Nachfragen max +1 · schwach −1'
|
||||||
})
|
})
|
||||||
// Ende des aktuellen Bands (nächster Meilenstein) und ob der Score am Format-Deckel klebt.
|
// Ende des aktuellen Bands (nächster Meilenstein).
|
||||||
const bandZiel = computed(() => {
|
const bandZiel = computed(() => {
|
||||||
if (score.value > GEMEISTERT) return VOLL
|
if (score.value >= GEMEISTERT) return VOLL
|
||||||
if (score.value > VERSTANDEN) return GEMEISTERT
|
if (score.value >= VERSTANDEN) return GEMEISTERT
|
||||||
if (score.value > ABSOLVIERT) return VERSTANDEN
|
if (score.value >= ABSOLVIERT) return VERSTANDEN
|
||||||
return ABSOLVIERT
|
return ABSOLVIERT
|
||||||
})
|
})
|
||||||
// Am Format-Max: Score eingefroren („Max"). Gilt auch bei cap 30 (FullGuide, endgültig).
|
|
||||||
const amDeckel = computed(() => score.value >= props.cap)
|
|
||||||
const FORM_NAME = { quiz: 'Quiz', lueckentext: 'Lückentext', erklaeren: 'Erklären' }
|
const FORM_NAME = { quiz: 'Quiz', lueckentext: 'Lückentext', erklaeren: 'Erklären' }
|
||||||
const NAECHSTES_FORMAT = { 6: 'Guide', 12: 'ProGuide', 18: 'FullGuide' }
|
const NAECHSTES_FORMAT = { 6: 'Guide', 12: 'ProGuide', 18: 'FullGuide' }
|
||||||
|
|
||||||
@@ -207,7 +207,15 @@ function objText(o) { return (o && (o.frage || o.satz)) || '' }
|
|||||||
// Lückensatz rendern: an „___" splitten, Teile inline (mit $…$-Mathe), Lücke als Span.
|
// Lückensatz rendern: an „___" splitten, Teile inline (mit $…$-Mathe), Lücke als Span.
|
||||||
// So bleibt die Lücke erhalten und Markdown fasst die Unterstriche nicht an.
|
// So bleibt die Lücke erhalten und Markdown fasst die Unterstriche nicht an.
|
||||||
function lueckSatzHtml(satz) {
|
function lueckSatzHtml(satz) {
|
||||||
return String(satz || '').split('___').map((t) => renderMarkdownInline(t)).join('<span class="bp-luecke">______</span>')
|
satz = String(satz || '')
|
||||||
|
const m = satz.match(/_{3,}/) // erste Lücke (drei oder mehr Unterstriche)
|
||||||
|
if (!m) return renderMarkdownInline(satz)
|
||||||
|
// Liegt die Lücke INNERHALB einer $…$-Formel (ungerade Zahl $ davor)? Dann nicht splitten
|
||||||
|
// (das zerreißt die Formel) — stattdessen durch eine KaTeX-Linie ersetzen, Satz am Stück rendern.
|
||||||
|
const inFormel = ((satz.slice(0, m.index).match(/\$/g) || []).length % 2) === 1
|
||||||
|
if (inFormel) return renderMarkdownInline(satz.replace(/_{3,}/, '\\rule{2.5em}{0.4pt}'))
|
||||||
|
// Lücke im Text: splitten + Lücken-Span.
|
||||||
|
return satz.split(/_{3,}/).map((t) => renderMarkdownInline(t)).join('<span class="bp-luecke">______</span>')
|
||||||
}
|
}
|
||||||
|
|
||||||
function istBekannt(o) {
|
function istBekannt(o) {
|
||||||
|
|||||||
@@ -12,6 +12,9 @@ KOMPAKTE FASSUNG (Merksätze, falls vorhanden):
|
|||||||
AUFGABE:
|
AUFGABE:
|
||||||
- Schreibe EINEN kurzen Aussagesatz (höchstens ~15 Wörter, keine Nebensatz-Kaskade).
|
- Schreibe EINEN kurzen Aussagesatz (höchstens ~15 Wörter, keine Nebensatz-Kaskade).
|
||||||
- Ersetze den **Schlüsselbegriff** durch `___` (genau eine Lücke).
|
- Ersetze den **Schlüsselbegriff** durch `___` (genau eine Lücke).
|
||||||
|
- Die Lücke ist ein **Fachbegriff als Wort** (z. B. „Alphabet", „polynomiell") — KEIN
|
||||||
|
mathematisches Symbol oder Formelteil (nicht `L_2`, nicht `f(w)`). Sie steht **außerhalb**
|
||||||
|
von `$…$` (nie innerhalb einer Formel).
|
||||||
- Die Lücke prüft aktives Abrufen — sie steht für einen zentralen Fachbegriff, nicht für ein Füllwort.
|
- Die Lücke prüft aktives Abrufen — sie steht für einen zentralen Fachbegriff, nicht für ein Füllwort.
|
||||||
- Der Satz gibt genug Kontext, dass die Lösung eindeutig ist (keine Raterei).
|
- Der Satz gibt genug Kontext, dass die Lösung eindeutig ist (keine Raterei).
|
||||||
- Fachbegriffe/Formeln dürfen als $…$ gesetzt werden (z. B. $V(w,c)$).
|
- Fachbegriffe/Formeln dürfen als $…$ gesetzt werden (z. B. $V(w,c)$).
|
||||||
|
|||||||
@@ -11,6 +11,8 @@ KOMPAKTE FASSUNG (Merksätze, falls vorhanden):
|
|||||||
|
|
||||||
AUFGABE:
|
AUFGABE:
|
||||||
- Schreibe EINEN kurzen Aussagesatz (höchstens ~15 Wörter). Ersetze den **Schlüsselbegriff** durch `___` (genau eine Lücke).
|
- Schreibe EINEN kurzen Aussagesatz (höchstens ~15 Wörter). Ersetze den **Schlüsselbegriff** durch `___` (genau eine Lücke).
|
||||||
|
- Die Lücke ist ein **Fachbegriff als Wort** — KEIN mathematisches Symbol/Formelteil
|
||||||
|
(nicht `L_2`, nicht `f(w)`). Sie steht **außerhalb** von `$…$` (nie innerhalb einer Formel).
|
||||||
- Biete GENAU VIER Begriffe als Optionen — **genau einer** passt in die Lücke.
|
- Biete GENAU VIER Begriffe als Optionen — **genau einer** passt in die Lücke.
|
||||||
- Die drei falschen sind plausibel, aber klar falsch (Verwechslung, verwandter Begriff) — keine Albernheiten.
|
- Die drei falschen sind plausibel, aber klar falsch (Verwechslung, verwandter Begriff) — keine Albernheiten.
|
||||||
- Optionen kurz (Begriff oder kurzer Halbsatz), ähnlich lang.
|
- Optionen kurz (Begriff oder kurzer Halbsatz), ähnlich lang.
|
||||||
|
|||||||
Reference in New Issue
Block a user