45 lines
1.4 KiB
JavaScript
45 lines
1.4 KiB
JavaScript
function parseAbsence(str, teacherMap) {
|
|
str = str.trim().replace(/\s+/g, " ");
|
|
|
|
const result = {
|
|
teacher: null, // String or null
|
|
teacherCode: null, // String or null
|
|
type: null, // "wholeDay" | "range" | "single" | "invalid"
|
|
hours: null // { from: number, to: number } or number
|
|
};
|
|
|
|
// Regex patterns (with flexible spaces)
|
|
const wholeDayPattern = /^([A-Za-z]+)$/;
|
|
const rangePattern = /^(\d+)\s*-\s*(\d+)\s+([A-Za-z]+)$/;
|
|
const singleHourPattern = /^(\d+)\s+([A-Za-z]+)$/;
|
|
|
|
if (rangePattern.test(str)) {
|
|
const [, from, to, teacherCode] = str.match(rangePattern);
|
|
result.teacher = teacherMap[teacherCode.toLowerCase()];
|
|
result.teacherCode = teacherCode;
|
|
result.type = "range";
|
|
result.hours = { from: parseInt(from), to: parseInt(to) };
|
|
}
|
|
else if (singleHourPattern.test(str)) {
|
|
const [, hour, teacherCode] = str.match(singleHourPattern);
|
|
result.teacher = teacherMap[teacherCode.toLowerCase()];
|
|
result.teacherCode = teacherCode;
|
|
result.type = "single";
|
|
result.hours = parseInt(hour);
|
|
}
|
|
else if (wholeDayPattern.test(str)) {
|
|
const [, teacherCode] = str.match(wholeDayPattern);
|
|
result.teacher = teacherMap[teacherCode.toLowerCase()];
|
|
result.teacherCode = teacherCode;
|
|
result.type = "wholeDay";
|
|
}
|
|
else {
|
|
result.type = "invalid";
|
|
result.original = str;
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
module.exports = parseAbsence;
|