aboutsummaryrefslogtreecommitdiff
path: root/src/util
diff options
context:
space:
mode:
authorFurkan Sahin <furkan-dev@proton.me>2021-09-05 21:39:24 -0500
committerFurkan Sahin <furkan-dev@proton.me>2021-09-05 21:39:24 -0500
commitd0975a6e7ee57de4debda94e823011d813fbf4a1 (patch)
tree69d61bf6c29104434b9e3de4946e7d5dd549dec0 /src/util
parentffef3a6be19d1139b6378c8119d444082dd0cbac (diff)
Initial rewrite in svelte
Diffstat (limited to 'src/util')
-rw-r--r--src/util/error.ts6
-rw-r--r--src/util/parser.ts107
2 files changed, 113 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..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: <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;
+} \ No newline at end of file