1
0

feat: Another fucking teacher absence format
All checks were successful
Remote Deploy / deploy (push) Successful in 7s

This commit is contained in:
2026-01-13 08:42:44 +01:00
parent 1f30cda90a
commit 4da178d227
2 changed files with 70 additions and 57 deletions

View File

@@ -100,7 +100,7 @@ export default function parseAbsence(input, teacherMap = {}) {
// 1. Teachers with specific hours (e.g. "Ab 1-4") // 1. Teachers with specific hours (e.g. "Ab 1-4")
const teacherListThenSpecRe = const teacherListThenSpecRe =
/([A-Za-z]+(?:[,;]\s?[A-Za-z]+)*)(?:\s*)(\d+(?:\+|-\d+|,\d+)?)(?![A-Za-z])/g; /([A-Za-z]+(?:[,;]\s?[A-Za-z]+)*)(?:\s*)(\d+(?:\+|-\d+|,\d+)?)(?:\.\s*h)?(?![A-Za-z])/g;
let m; let m;
while ((m = teacherListThenSpecRe.exec(s)) !== null) { while ((m = teacherListThenSpecRe.exec(s)) !== null) {

View File

@@ -12,19 +12,18 @@
* GNU General Public License for more details. * GNU General Public License for more details.
*/ */
import fs from "fs" import fs from "fs";
import parseAbsence from "../scrape/utils/parseAbsence.js"; import parseAbsence from "../scrape/utils/parseAbsence.js";
const teachermap = JSON.parse(fs.readFileSync("./teachermap.json")) const teachermap = JSON.parse(fs.readFileSync("./teachermap.json"));
test("Me", [ test("Me", [
{ {
teacher: "Michaela Meitnerová", teacher: "Michaela Meitnerová",
teacherCode: "me", teacherCode: "me",
type: "wholeDay", type: "wholeDay",
hours: null hours: null,
} },
]); ]);
test("ad", [ test("ad", [
@@ -32,8 +31,8 @@ test("ad", [
teacher: "Bc. Daniel Adámek", teacher: "Bc. Daniel Adámek",
teacherCode: "ad", teacherCode: "ad",
type: "wholeDay", type: "wholeDay",
hours: null hours: null,
} },
]); ]);
test("me ad", [ test("me ad", [
@@ -41,14 +40,14 @@ test("me ad", [
teacher: "Michaela Meitnerová", teacher: "Michaela Meitnerová",
teacherCode: "me", teacherCode: "me",
type: "wholeDay", type: "wholeDay",
hours: null hours: null,
}, },
{ {
teacher: "Bc. Daniel Adámek", teacher: "Bc. Daniel Adámek",
teacherCode: "ad", teacherCode: "ad",
type: "wholeDay", type: "wholeDay",
hours: null hours: null,
} },
]); ]);
test("me 3", [ test("me 3", [
@@ -56,8 +55,8 @@ test("me 3", [
teacher: "Michaela Meitnerová", teacher: "Michaela Meitnerová",
teacherCode: "me", teacherCode: "me",
type: "single", type: "single",
hours: 3 hours: 3,
} },
]); ]);
test("ad 1", [ test("ad 1", [
@@ -65,8 +64,8 @@ test("ad 1", [
teacher: "Bc. Daniel Adámek", teacher: "Bc. Daniel Adámek",
teacherCode: "ad", teacherCode: "ad",
type: "single", type: "single",
hours: 1 hours: 1,
} },
]); ]);
test("me 2-4", [ test("me 2-4", [
@@ -74,8 +73,8 @@ test("me 2-4", [
teacher: "Michaela Meitnerová", teacher: "Michaela Meitnerová",
teacherCode: "me", teacherCode: "me",
type: "range", type: "range",
hours: { from: 2, to: 4 } hours: { from: 2, to: 4 },
} },
]); ]);
test("ad 5,6", [ test("ad 5,6", [
@@ -83,8 +82,8 @@ test("ad 5,6", [
teacher: "Bc. Daniel Adámek", teacher: "Bc. Daniel Adámek",
teacherCode: "ad", teacherCode: "ad",
type: "range", type: "range",
hours: { from: 5, to: 6 } hours: { from: 5, to: 6 },
} },
]); ]);
test("me 7+", [ test("me 7+", [
@@ -92,8 +91,8 @@ test("me 7+", [
teacher: "Michaela Meitnerová", teacher: "Michaela Meitnerová",
teacherCode: "me", teacherCode: "me",
type: "range", type: "range",
hours: { from: 7, to: 10 } hours: { from: 7, to: 10 },
} },
]); ]);
test("me,ad 3-5", [ test("me,ad 3-5", [
@@ -101,14 +100,14 @@ test("me,ad 3-5", [
teacher: "Michaela Meitnerová", teacher: "Michaela Meitnerová",
teacherCode: "me", teacherCode: "me",
type: "range", type: "range",
hours: { from: 3, to: 5 } hours: { from: 3, to: 5 },
}, },
{ {
teacher: "Bc. Daniel Adámek", teacher: "Bc. Daniel Adámek",
teacherCode: "ad", teacherCode: "ad",
type: "range", type: "range",
hours: { from: 3, to: 5 } hours: { from: 3, to: 5 },
} },
]); ]);
test("me;ad 4", [ test("me;ad 4", [
@@ -116,14 +115,14 @@ test("me;ad 4", [
teacher: "Michaela Meitnerová", teacher: "Michaela Meitnerová",
teacherCode: "me", teacherCode: "me",
type: "wholeDay", type: "wholeDay",
hours: null hours: null,
}, },
{ {
teacher: "Bc. Daniel Adámek", teacher: "Bc. Daniel Adámek",
teacherCode: "ad", teacherCode: "ad",
type: "single", type: "single",
hours: 4 hours: 4,
} },
]); ]);
test("me;ad;bo 2-3", [ test("me;ad;bo 2-3", [
@@ -131,20 +130,20 @@ test("me;ad;bo 2-3", [
teacher: "Michaela Meitnerová", teacher: "Michaela Meitnerová",
teacherCode: "me", teacherCode: "me",
type: "wholeDay", type: "wholeDay",
hours: null hours: null,
}, },
{ {
teacher: "Bc. Daniel Adámek", teacher: "Bc. Daniel Adámek",
teacherCode: "ad", teacherCode: "ad",
type: "wholeDay", type: "wholeDay",
hours: null hours: null,
}, },
{ {
teacher: "Ing. Anna Bodnárová", teacher: "Ing. Anna Bodnárová",
teacherCode: "bo", teacherCode: "bo",
type: "range", type: "range",
hours: { from: 2, to: 3 } hours: { from: 2, to: 3 },
} },
]); ]);
test("me 2 ad 4-5", [ test("me 2 ad 4-5", [
@@ -152,14 +151,14 @@ test("me 2 ad 4-5", [
teacher: "Michaela Meitnerová", teacher: "Michaela Meitnerová",
teacherCode: "me", teacherCode: "me",
type: "single", type: "single",
hours: 2 hours: 2,
}, },
{ {
teacher: "Bc. Daniel Adámek", teacher: "Bc. Daniel Adámek",
teacherCode: "ad", teacherCode: "ad",
type: "range", type: "range",
hours: { from: 4, to: 5 } hours: { from: 4, to: 5 },
} },
]); ]);
test("3", [ test("3", [
@@ -168,8 +167,8 @@ test("3", [
teacher: null, teacher: null,
teacherCode: null, teacherCode: null,
hours: null, hours: null,
original: "3" original: "3",
} },
]); ]);
test("2-4", [ test("2-4", [
@@ -178,8 +177,8 @@ test("2-4", [
teacher: null, teacher: null,
teacherCode: null, teacherCode: null,
hours: null, hours: null,
original: "2-4" original: "2-4",
} },
]); ]);
test("me Xx 3", [ test("me Xx 3", [
@@ -187,9 +186,9 @@ test("me Xx 3", [
teacher: "Michaela Meitnerová", teacher: "Michaela Meitnerová",
teacherCode: "me", teacherCode: "me",
type: "wholeDay", type: "wholeDay",
hours: null hours: null,
}, },
{ teacher: null, teacherCode: 'xx', type: 'single', hours: 3 }, { teacher: null, teacherCode: "xx", type: "single", hours: 3 },
]); ]);
test("me,ad;bo 1-2 ad 5+", [ test("me,ad;bo 1-2 ad 5+", [
@@ -197,26 +196,26 @@ test("me,ad;bo 1-2 ad 5+", [
teacher: "Michaela Meitnerová", teacher: "Michaela Meitnerová",
teacherCode: "me", teacherCode: "me",
type: "wholeDay", type: "wholeDay",
hours: null hours: null,
}, },
{ {
teacher: "Bc. Daniel Adámek", teacher: "Bc. Daniel Adámek",
teacherCode: "ad", teacherCode: "ad",
type: "wholeDay", type: "wholeDay",
hours: null hours: null,
}, },
{ {
teacher: "Ing. Anna Bodnárová", teacher: "Ing. Anna Bodnárová",
teacherCode: "bo", teacherCode: "bo",
type: "range", type: "range",
hours: { from: 1, to: 2 } hours: { from: 1, to: 2 },
}, },
{ {
teacher: "Bc. Daniel Adámek", teacher: "Bc. Daniel Adámek",
teacherCode: "ad", teacherCode: "ad",
type: "range", type: "range",
hours: { from: 5, to: 10 } hours: { from: 5, to: 10 },
} },
]); ]);
test("Me-exk", [ test("Me-exk", [
@@ -224,9 +223,9 @@ test("Me-exk", [
teacher: "Michaela Meitnerová", teacher: "Michaela Meitnerová",
teacherCode: "me", teacherCode: "me",
type: "exkurze", type: "exkurze",
hours: null hours: null,
} },
]) ]);
test("za Vn zastupuje Jk", [ test("za Vn zastupuje Jk", [
{ {
@@ -235,10 +234,19 @@ test("za Vn zastupuje Jk", [
type: "zastoupen", type: "zastoupen",
zastupuje: { zastupuje: {
teacher: "David Janoušek", teacher: "David Janoušek",
teacherCode: "jk" teacherCode: "jk",
}, },
} },
]) ]);
test("Vc 1. h", [
{
teacher: "Ing. Antonín Vobecký",
teacherCode: "vc",
type: "single",
hours: 1,
},
]);
function test(input, expectedOutput) { function test(input, expectedOutput) {
const res = parseAbsence(input, teachermap); const res = parseAbsence(input, teachermap);
@@ -254,7 +262,12 @@ function test(input, expectedOutput) {
function deepEqual(a, b) { function deepEqual(a, b) {
if (a === b) return true; if (a === b) return true;
if (typeof a !== "object" || a === null || typeof b !== "object" || b === null) { if (
typeof a !== "object" ||
a === null ||
typeof b !== "object" ||
b === null
) {
return false; return false;
} }
@@ -264,7 +277,7 @@ function deepEqual(a, b) {
const used = new Array(b.length).fill(false); const used = new Array(b.length).fill(false);
return a.every(itemA => return a.every((itemA) =>
b.some((itemB, i) => { b.some((itemB, i) => {
if (used[i]) return false; // don't reuse elements if (used[i]) return false; // don't reuse elements
if (deepEqual(itemA, itemB)) { if (deepEqual(itemA, itemB)) {
@@ -272,7 +285,7 @@ function deepEqual(a, b) {
return true; return true;
} }
return false; return false;
}) }),
); );
} }
@@ -283,5 +296,5 @@ function deepEqual(a, b) {
if (keysA.length !== keysB.length) return false; if (keysA.length !== keysB.length) return false;
return keysA.every(key => keysB.includes(key) && deepEqual(a[key], b[key])); return keysA.every((key) => keysB.includes(key) && deepEqual(a[key], b[key]));
} }