From d0975a6e7ee57de4debda94e823011d813fbf4a1 Mon Sep 17 00:00:00 2001 From: Furkan Sahin Date: Sun, 5 Sep 2021 21:39:24 -0500 Subject: Initial rewrite in svelte --- src/util/error.ts | 6 +++ src/util/parser.ts | 107 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 113 insertions(+) create mode 100644 src/util/error.ts create mode 100644 src/util/parser.ts (limited to 'src/util') 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..6d706d7 --- /dev/null +++ b/src/util/parser.ts @@ -0,0 +1,107 @@ +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 + } + }[] + }[] +}; + +/** + * Parses a peer teacher schedule + * @param schedule The schedule to parse + * @returns A peer teacher + */ +export function parsePTSchedule(schedule: string) { + // namePatter: + 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; +} \ No newline at end of file -- cgit v1.2.3