Bisaya kurs korrekturen
This commit is contained in:
110
frontend/src/utils/numberAnswerVariants.js
Normal file
110
frontend/src/utils/numberAnswerVariants.js
Normal file
@@ -0,0 +1,110 @@
|
||||
const GERMAN_NUMBER_WORDS = new Map([
|
||||
['null', '0'],
|
||||
['ein', '1'],
|
||||
['eins', '1'],
|
||||
['eine', '1'],
|
||||
['einen', '1'],
|
||||
['einem', '1'],
|
||||
['einer', '1'],
|
||||
['zwei', '2'],
|
||||
['drei', '3'],
|
||||
['vier', '4'],
|
||||
['fuenf', '5'],
|
||||
['funf', '5'],
|
||||
['fünf', '5'],
|
||||
['sechs', '6'],
|
||||
['sieben', '7'],
|
||||
['acht', '8'],
|
||||
['neun', '9'],
|
||||
['zehn', '10'],
|
||||
['elf', '11'],
|
||||
['zwoelf', '12'],
|
||||
['zwolf', '12'],
|
||||
['zwölf', '12'],
|
||||
['dreizehn', '13'],
|
||||
['vierzehn', '14'],
|
||||
['fuenfzehn', '15'],
|
||||
['funfzehn', '15'],
|
||||
['fünfzehn', '15'],
|
||||
['sechzehn', '16'],
|
||||
['siebzehn', '17'],
|
||||
['achtzehn', '18'],
|
||||
['neunzehn', '19'],
|
||||
['zwanzig', '20'],
|
||||
['dreissig', '30'],
|
||||
['dreißig', '30'],
|
||||
['vierzig', '40'],
|
||||
['fuenfzig', '50'],
|
||||
['funfzig', '50'],
|
||||
['fünfzig', '50'],
|
||||
['sechzig', '60'],
|
||||
['siebzig', '70'],
|
||||
['achtzig', '80'],
|
||||
['neunzig', '90'],
|
||||
['hundert', '100'],
|
||||
['einhundert', '100'],
|
||||
['tausend', '1000'],
|
||||
['eintausend', '1000'],
|
||||
['zweitausend', '2000']
|
||||
]);
|
||||
|
||||
const GERMAN_ONES = [
|
||||
['', ''],
|
||||
['ein', 'eins'],
|
||||
['zwei'],
|
||||
['drei'],
|
||||
['vier'],
|
||||
['fuenf', 'funf', 'fünf'],
|
||||
['sechs'],
|
||||
['sieben'],
|
||||
['acht'],
|
||||
['neun']
|
||||
];
|
||||
|
||||
const GERMAN_TENS = {
|
||||
20: ['zwanzig'],
|
||||
30: ['dreissig', 'dreißig'],
|
||||
40: ['vierzig'],
|
||||
50: ['fuenfzig', 'funfzig', 'fünfzig'],
|
||||
60: ['sechzig'],
|
||||
70: ['siebzig'],
|
||||
80: ['achtzig'],
|
||||
90: ['neunzig']
|
||||
};
|
||||
|
||||
for (const [tensValue, tensWords] of Object.entries(GERMAN_TENS)) {
|
||||
const tens = Number(tensValue);
|
||||
for (let one = 1; one <= 9; one += 1) {
|
||||
for (const oneWord of GERMAN_ONES[one]) {
|
||||
for (const tenWord of tensWords) {
|
||||
GERMAN_NUMBER_WORDS.set(`${oneWord}und${tenWord}`, String(tens + one));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function stripGermanNumberSeparators(value) {
|
||||
return String(value || '')
|
||||
.replace(/[\s.-]+/g, '');
|
||||
}
|
||||
|
||||
export function canonicalizeNumberAnswer(value) {
|
||||
const raw = String(value || '').trim().toLowerCase();
|
||||
if (!raw) return '';
|
||||
|
||||
const compact = stripGermanNumberSeparators(raw);
|
||||
if (/^\d+$/.test(compact)) {
|
||||
return String(Number(compact));
|
||||
}
|
||||
|
||||
return GERMAN_NUMBER_WORDS.get(compact) || '';
|
||||
}
|
||||
|
||||
export function normalizeComparableWithNumberWords(value, baseNormalizer) {
|
||||
const rawCanonical = canonicalizeNumberAnswer(value);
|
||||
if (rawCanonical) return rawCanonical;
|
||||
|
||||
const normalized = baseNormalizer(String(value || ''));
|
||||
const normalizedCanonical = canonicalizeNumberAnswer(normalized);
|
||||
return normalizedCanonical || normalized;
|
||||
}
|
||||
Reference in New Issue
Block a user