diff options
| author | Furkan Sahin <furkan-dev@proton.me> | 2021-11-05 09:27:35 -0500 |
|---|---|---|
| committer | Furkan Sahin <furkan-dev@proton.me> | 2021-11-05 09:27:35 -0500 |
| commit | 85380b4b60bf74507a01957b29bd6e3808e216db (patch) | |
| tree | a43784660fdc29e5b95df3e358cf722eec2b092b /src/util | |
| parent | ffef3a6be19d1139b6378c8119d444082dd0cbac (diff) | |
| parent | 29fc563863f561cdc707485289c5580b4397a580 (diff) | |
Merge pull request #10 from cobraguy/rewrite
Update to Svelte app
Diffstat (limited to 'src/util')
| -rw-r--r-- | src/util/error.ts | 6 | ||||
| -rw-r--r-- | src/util/parser.ts | 155 |
2 files changed, 161 insertions, 0 deletions
diff --git a/src/util/error.ts b/src/util/error.ts new file mode 100644 index 0000000..5380849 --- /dev/null +++ b/src/util/error.ts @@ -0,0 +1,6 @@ +export class PeerTeacherImportError extends Error { + constructor(message) { + super(message); + this.name = "PeerTeacherImportError"; + } +}
\ No newline at end of file diff --git a/src/util/parser.ts b/src/util/parser.ts new file mode 100644 index 0000000..2f1bdd4 --- /dev/null +++ b/src/util/parser.ts @@ -0,0 +1,155 @@ +import EventInfo from "../models/EventInfo"; +import Lab from "../models/Lab"; +import PeerTeacher from "../models/PeerTeacher"; +import { PeerTeacherImportError } from "./error"; + +interface LabSchedule { + data: { + courseNumber: string, + sequenceNumber: string, + meetingsFaculty: { + meetingTime: { + beginTime: string | null, + building: string, + endTime: string | null, + friday: boolean, + meetingType: string, + monday: boolean, + room: string, + thursday: boolean, + tuesday: boolean, + wednesday: boolean + } + }[] + }[] +}; + +interface DatabaseFile { + labs: { + id: number, + course: number, + section: number, + event: { + days: string, + start: number, + end: number + }, + building: string, + room: string + }[], + peerTeachers: { + id: number, + firstname: string, + lastname: string, + events: { + days: string, + start: number, + end: number + }[], + labs: number[] + }[] +} + +/** + * Parses a peer teacher schedule + * @param schedule The schedule to parse + * @returns A peer teacher + */ +export function parsePTSchedule(schedule: string) { + // namePatter: <firstname> <lastname> <uin> + const namePattern = /^(.*)\s(.*)\s(\d{9})/; + // eventPattern (24hr time): MTWRF hh:mm - hh:mm + const eventPattern = /^(M?T?W?R?F?)\s(\d{1,2}:\d{2})\s?-\s?(\d{1,2}:\d{2})/; + const lines = schedule.split("\n").filter(line => line.trim()); + + const nameLine = lines.find(line => line.match(namePattern)); + if(nameLine === undefined) { + throw new PeerTeacherImportError(`No peer teacher in schedule`); + } + + const [, firstname, lastname, uin] = nameLine.match(namePattern) as RegExpMatchArray; + const peerTeacher = new PeerTeacher(uin, firstname, lastname); + + const events = lines + .filter(line => line.match(eventPattern)) + .map(line => { + let [, days, start, end] = line.match(eventPattern) as RegExpMatchArray; + start = start.replace(":", ""); + end = end.replace(":", ""); + return new EventInfo(days, start, end); + }); + + peerTeacher.events = events; + return peerTeacher; +} + +/** + * Parses the course schedule into labs attended by PTs + * @param schedule The course schedule object from Howdy + * @returns An array of labs + */ +export function parseLabSchedule(schedule: LabSchedule) { + const taughtCourses = ['110', '111', '121', '206', '221', '312', '313', '315']; + const results: Lab[] = []; + + const courses = schedule.data; + for(const course of courses) { + if(!taughtCourses.includes(course.courseNumber)) { + continue; + } + + for(const meeting of course.meetingsFaculty) { + const { meetingTime } = meeting; + + if(meetingTime.meetingType !== "LAB") { + continue; + } + + let days = ""; + days += meetingTime.monday ? 'M' : ''; + days += meetingTime.tuesday ? 'T' : ''; + days += meetingTime.wednesday ? 'W' : ''; + days += meetingTime.thursday ? 'R' : ''; + days += meetingTime.friday ? 'F' : ''; + + const start = meetingTime.beginTime === null ? -1 : meetingTime.beginTime; + const end = meetingTime.endTime === null ? -1 : meetingTime.endTime; + const { courseNumber, sequenceNumber } = course; + const { building, room} = meetingTime; + + results.push( + new Lab( + courseNumber, + sequenceNumber, + new EventInfo(days, start, end), + building, + room + ) + ); + } + } + + return results; +} + +/** + * Parses a database file into maps of Lab and PeerTeacher objects + * @param database The database object from a database file + * @returns And object with lab and peer teacher maps + */ +export function parseDatabase(database: DatabaseFile) { + const result = { + labs: new Map<number, Lab>(), + peerTeachers: new Map<number, PeerTeacher>() + } + + database.labs.forEach(lab => { + result.labs.set(lab.id, Lab.fromJSON(lab)); + }); + + database.peerTeachers.forEach(pt => { + result.peerTeachers.set(pt.id, PeerTeacher.fromJSON(pt)); + }); + + return result; +}
\ No newline at end of file |
