aboutsummaryrefslogtreecommitdiff
path: root/src/features/parser.js
blob: f91d926b0c149806e250f71727649cc147414366 (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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
import Lab from '@/models/Lab';
import PeerTeacher from '@/models/PeerTeacher';
import EventInfo from '../models/EventInfo';

export function parseLabFile(file) {
  const validCourses = [
    '110',
    '111',
    '121',
    '206',
    '221',
    // '222',
    '312',
    '313',
    // '314',
    '315',
  ];

  const reader = new FileReader();

  return new Promise((resolve, reject) => {
    const result = [];

    reader.onload = (event) => {
      let jsonData;
      try {
        jsonData = JSON.parse(event.target.result);
      } catch (e) {
        reject(new Error(e));
      }
      const labs = jsonData.data;

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

          if (lab.instructionalMethod !== 'Web Based') {
            lab.meetingsFaculty.every((meeting) => {
              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);
        }
      });

      resolve(result);
    };

    reader.readAsText(file);
  });
}

export function parsePtSchedule(file) {
  const reader = new FileReader();

  return new Promise((resolve) => {
    reader.onload = (event) => {
      const peerTeacher = new PeerTeacher();
      const namePattern = /^(.*)\s(.*)\s(\d{9})/;
      const eventPattern = /^(M?T?W?R?F?)\s(\d{1,2}:\d{2})\s?-\s?(\d{1,2}:\d{2})/;
      const lines = event.target.result.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);
        }
      });

      resolve(peerTeacher);
    };

    reader.readAsText(file);
  });
}

export function parsePtDatabase(file) {
  const reader = new FileReader();

  return new Promise((resolve) => {
    reader.onload = (event) => {
      const jsonObj = JSON.parse(event.target.result);
      const result = {
        labs: new Map(),
        peerTeachers: new Map(),
      };

      Object.keys(jsonObj.labs).forEach((key) => {
        const lab = jsonObj.labs[key];
        result.labs.set(key, new Lab(lab.course,
          lab.section, new EventInfo(lab.event.days, lab.event.start, lab.event.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) => new EventInfo(eventObj.days,
          eventObj.start, eventObj.end));
        ptObj.assignedLabs = new Set();
        pt.assignedLabs.forEach((labId) => {
          ptObj.assignedLabs.add(labId);
        });
        result.peerTeachers.set(key, ptObj);
      });

      resolve(result);
    };

    reader.readAsText(file);
  });
}