feat(vocab): add support for answer alternatives in core patterns and update related logic

This commit is contained in:
Torsten Schulz (local)
2026-08-18 15:11:43 +02:00
parent f66f150bdc
commit b98835d277
5 changed files with 155 additions and 7 deletions

View File

@@ -984,7 +984,10 @@ export default class VocabService {
corePatterns.forEach((entry) => {
const pattern = this._normalizeCorePatternEntry(entry);
const reference = String(pattern?.target || '').trim();
const learning = String(pattern?.gloss || '').trim();
const answers = [pattern?.gloss, ...(pattern?.alternatives || [])]
.map((answer) => String(answer || '').trim())
.filter(Boolean);
const learning = [...new Set(answers)].join(' / ');
if (!this._isTrainableSrsPair({ learning, reference })) return;
vocabMap.set(`${learning}-${reference}`, { learning, reference });
});
@@ -1009,8 +1012,9 @@ export default class VocabService {
}
/**
* Kernmuster: Zielsprachen-Phrase + optionale Glossierung (z. B. Deutsch).
* Unterstützt Legacy-Strings, "Phrase|Gloss" und Objekte { target, gloss } / { ceb, de }.
* Kernmuster: Zielsprachen-Phrase + optionale Glossierung und Antwortalternativen.
* Unterstützt Legacy-Strings, "Phrase|Gloss" und Objekte
* { target, gloss, alternatives } / { ceb, de }.
*/
_normalizeCorePatternEntry(entry) {
if (entry === null || entry === undefined || entry === '') {
@@ -1020,7 +1024,9 @@ export default class VocabService {
const target = String(entry.target ?? entry.ceb ?? entry.phrase ?? '').trim();
const gloss = String(entry.gloss ?? entry.de ?? entry.translation ?? '').trim();
if (!target) return null;
return { target, gloss };
const alternatives = this._normalizeStringList(entry.alternatives ?? entry.glossAlternatives)
.filter((alternative) => alternative !== gloss);
return { target, gloss, alternatives };
}
const s = String(entry).trim();
if (!s) return null;