aboutsummaryrefslogtreecommitdiff
path: root/src/features/parser.ts
blob: f1164d84ffc98afdb6853f6cfecbd1b806636bc6 (plain)
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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
import Lab from '@/models/Lab';
import PeerTeacher from '@/models/PeerTeacher';
import EventInfo from '../models/EventInfo';

export async function parseLabFile(file: File): Promise<Lab[]> {
  const validCourses = [
    '110',
    '111',
    '121',
    '206',
    '221',
    // '222',
    '312',
    '313',
    // '314',
    '315',
  ];
  const result: Lab[] = [];

  const text = await file.text();
  let jsonData;
  try {
    jsonData = JSON.parse(text);
  } catch (e) {
    throw new Error(e);
  }
  const labs = jsonData.data;

  labs.forEach((lab: any) => {
    if (validCourses.includes(lab.courseNumber)) {
      const newLab = new Lab(lab.courseNumber, lab.sequenceNumber);

      if (lab.instructionalMethod !== 'Web Based') {
        lab.meetingsFaculty.every((meeting: any) => {
          const { meetingTime } = meeting;

          if (meetingTime.meetingType === 'LAB') {
            let days = '';
            days += meetingTime.monday ? 'M' : '';
            days += meetingTime.tuesday ? 'T' : '';
            days += meetingTime.wednesday ? 'W' : '';
            days += meetingTime.thursday ? 'R' : '';
            days += meetingTime.friday ? 'F' : '';

            newLab.event.days = days;
            newLab.event.start = parseInt(meetingTime.beginTime, 10);
            newLab.event.end = parseInt(meetingTime.endTime, 10);

            return false;
          }

          return true;
        });
      }

      result.push(newLab);
    }
  });

  return result;
}

export async function parsePtSchedule(file: File): Promise<PeerTeacher> {
  const text = await file.text();
  const peerTeacher = new PeerTeacher();
  // 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 = text.split('\n').filter((line) => line.trim());

  lines.forEach((line) => {
    const ptName = line.match(namePattern);
    if (ptName) {
      [, peerTeacher.firstname, peerTeacher.lastname] = ptName;
      peerTeacher.uin = parseInt(ptName[3], 10);
    }

    const eventMatch = line.match(eventPattern);
    if (eventMatch) {
      const newEvent = new EventInfo(eventMatch[1]);
      newEvent.start = parseInt(eventMatch[2].replace(':', ''), 10);
      newEvent.end = parseInt(eventMatch[3].replace(':', ''), 10);
      peerTeacher.events.push(newEvent);
    }
  });

  return peerTeacher;
}

export async function parsePtDatabase(file: File): Promise<{
  labs: Map<string, Lab>,
  peerTeachers: Map<number, PeerTeacher>
}> {
  const text = await file.text();
  const jsonObj = JSON.parse(text);
  const result = {
    labs: new Map(),
    peerTeachers: new Map(),
  };

  Object.keys(jsonObj.labs).forEach((key) => {
    const { course, section, event: { days, start, end } } = jsonObj.labs[key];
    result.labs.set(key, new Lab(course,
      section, new EventInfo(days, start, end)));
  });

  Object.keys(jsonObj.peerTeachers).forEach((key) => {
    const pt = jsonObj.peerTeachers[key];
    const ptObj = new PeerTeacher(pt.firstname, pt.lastname, pt.uin);
    ptObj.events = pt.events.map((eventObj: any) => new EventInfo(eventObj.days,
      eventObj.start, eventObj.end));
    ptObj.assignedLabs = new Set();
    pt.assignedLabs.forEach((labId: string) => {
      ptObj.assignedLabs.add(labId);
    });
    result.peerTeachers.set(key, ptObj);
  });

  return result;
}