aboutsummaryrefslogtreecommitdiff
path: root/src/util
diff options
context:
space:
mode:
authorFurkan Sahin <furkan-dev@proton.me>2021-11-05 09:27:35 -0500
committerFurkan Sahin <furkan-dev@proton.me>2021-11-05 09:27:35 -0500
commit85380b4b60bf74507a01957b29bd6e3808e216db (patch)
treea43784660fdc29e5b95df3e358cf722eec2b092b /src/util
parentffef3a6be19d1139b6378c8119d444082dd0cbac (diff)
parent29fc563863f561cdc707485289c5580b4397a580 (diff)
Merge pull request #10 from cobraguy/rewrite
Update to Svelte app
Diffstat (limited to 'src/util')
-rw-r--r--src/util/error.ts6
-rw-r--r--src/util/parser.ts155
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