1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
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;
}
|