Skip to content

Commit

Permalink
a bit of refactoring for schedule export code
Browse files Browse the repository at this point in the history
  • Loading branch information
demetrios-koziris committed Jan 9, 2023
1 parent b550e99 commit 51225c6
Show file tree
Hide file tree
Showing 2 changed files with 67 additions and 73 deletions.
138 changes: 66 additions & 72 deletions src/js/addScheduleExporter.js
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ function validDays(schedDays, daySymbolTranslation) {
function exportSchedule() {

const mapData = getMapData();
const eventDaySymbols = ['SU', 'MO', 'TU', 'WE', 'TH', 'FR', 'SA'];
const daySymbolTranslation = {
'U': 'SU',
'M': 'MO',
Expand All @@ -83,86 +84,79 @@ function exportSchedule() {

for (let i = 0; i < courseTables.length-1; ) {

if (courseTables[i+1].getElementsByClassName('captiontext')[0].innerText === 'Scheduled Meeting Times') {
if (courseTables[i+1].getElementsByClassName('captiontext')[0].innerText !== 'Scheduled Meeting Times') {
i++
continue;
}

const courseInfoTable = courseTables[i].getElementsByClassName('dddefault');
if (courseInfoTable[2].innerText.indexOf('Waitlist') != -1) {
i+=2;
continue;
}
courseTerm = courseInfoTable[0].innerText.replace(/\s/g,'');

const courseInfoTableTitle = courseTables[i].getElementsByClassName('captiontext')[0].innerText.split(/\s-\s(.+)/);
const courseTitle = courseInfoTableTitle[0];
const courseName = courseInfoTableTitle[1].replace(/\s/g,'');
const courseInfoTableTitle = courseTables[i].getElementsByClassName('captiontext')[0].innerText.split(/\s-\s(.+)/);
const courseTitle = courseInfoTableTitle[0];
const courseName = courseInfoTableTitle[1].replace(/\s/g,'');

const courseInfoTable = courseTables[i].getElementsByClassName('dddefault');
const courseSchedTable = courseTables[i+1].getElementsByClassName('dddefault');
for (let j = 0; j < courseSchedTable.length; j+=6) {

if (courseInfoTable[2].innerText.indexOf('Waitlist') > -1) {
i+=2;
const schedTime = courseSchedTable[j+0].innerText.split(' - ');
const schedDays = courseSchedTable[j+1].innerText.trim().split('');
const schedLocation = courseSchedTable[j+2].innerText.split(/\s(?!.+\s)/);
const schedDateRange = courseSchedTable[j+3].innerText.split(' - ');
const schedType = courseSchedTable[j+4].innerText;

if (!validTimeAndDateRange(schedTime, schedDateRange) || !validDays(schedDays, daySymbolTranslation)) {
alert('A Scheduled Meeting Time for ' + courseName + ' contains invalid Time, Day, or Date Range data and cannot be included in the calendar export!');
continue;
}

const eventDays = schedDays.map((day) => daySymbolTranslation[day]);
const eventStartDate = new Date(schedDateRange[0]);

courseTerm = courseInfoTable[0].innerText.replace(/\s/g,'');

const courseSchedTable = courseTables[i+1].getElementsByClassName('dddefault');

for (let j = 0; j < courseSchedTable.length; j+=6) {

const schedTime = courseSchedTable[j+0].innerText.split(' - ');
const schedDays = courseSchedTable[j+1].innerText.trim().split('');
const schedLocation = courseSchedTable[j+2].innerText.split(/\s(?!.+\s)/);
const schedDateRange = courseSchedTable[j+3].innerText.split(' - ');
const schedType = courseSchedTable[j+4].innerText;

if (validTimeAndDateRange(schedTime, schedDateRange) && validDays(schedDays, daySymbolTranslation)) {

const eventDays = schedDays.map((day) => daySymbolTranslation[day]);
const eventStartDate = new Date(schedDateRange[0]);
const eventDaySymbols = ['SU', 'MO', 'TU', 'WE', 'TH', 'FR', 'SA'];
while (!eventDays.includes(eventDaySymbols[eventStartDate.getDay()])) {
eventStartDate.setDate(eventStartDate.getDate() + 1);
}
const eventStartDateValues = eventStartDate.toUTCString().split(' ');
const eventStartDateString = eventStartDateValues[2] + ' ' + eventStartDateValues[1] + ' ' + eventStartDateValues[3];
const eventStart = eventStartDateString + ' ' + schedTime[0];
const eventEnd = eventStartDateString + ' ' + schedTime[1];

const locationBuilding = schedLocation[0];
const locationRoom = schedLocation[1];
const locationMapData = mapData[locationBuilding];

let eventName = courseName + ' ' + schedType.slice(0,3).toUpperCase();
if (locationMapData) {
eventName += ' (' + locationMapData.minerva + ' ' + locationRoom + ')';
}

let eventDesc = courseTitle + '\\n' + schedType + ' in ' + locationBuilding + ' ' + locationRoom;
if (locationMapData) {
const mapIDs = locationMapData.map;
for (let m = 0; m < mapIDs.length; m++) {
eventDesc += '\\n' + 'http://maps.mcgill.ca/?campus=DWT&txt=EN&id=' + mapIDs[m];
}
}

let eventLocation = locationBuilding + ' ' + locationRoom;
if (locationMapData) {
eventLocation = locationBuilding + ' ' + locationMapData.address;
}

const rrule = {
freq: 'WEEKLY',
until: schedDateRange[1],
interval: 1,
byday: eventDays
};

calCourseSchedule.addEvent(eventName, eventDesc, eventLocation, eventStart, eventEnd, rrule);

}
else {
alert('A Scheduled Meeting Time for ' + courseName + ' contains invalid Time, Day, or Date Range data and cannot be included in the calendar export!');
}

while (!eventDays.includes(eventDaySymbols[eventStartDate.getDay()])) {
eventStartDate.setDate(eventStartDate.getDate() + 1);
}
i+=2;
}
else {
i++;
const eventStartDateValues = eventStartDate.toUTCString().split(' ');
const eventStartDateString = eventStartDateValues[2] + ' ' + eventStartDateValues[1] + ' ' + eventStartDateValues[3];
const eventStart = eventStartDateString + ' ' + schedTime[0];
const eventEnd = eventStartDateString + ' ' + schedTime[1];

const locationBuilding = schedLocation[0];
const locationRoom = schedLocation[1];
const locationMapData = mapData[locationBuilding];

let eventName = courseName + ' ' + schedType.slice(0,3).toUpperCase();
if (locationMapData) {
eventName += ' (' + locationMapData.minerva + ' ' + locationRoom + ')';
}

let eventDesc = courseTitle + '\\n' + schedType + ' in ' + locationBuilding + ' ' + locationRoom;
if (locationMapData) {
const mapIDs = locationMapData.map;
for (let m = 0; m < mapIDs.length; m++) {
eventDesc += '\\n' + 'http://maps.mcgill.ca/?campus=DWT&txt=EN&id=' + mapIDs[m];
}
}

let eventLocation = locationBuilding + ' ' + locationRoom;
if (locationMapData) {
eventLocation = locationBuilding + ' ' + locationMapData.address;
}

const rrule = {
freq: 'WEEKLY',
until: schedDateRange[1],
interval: 1,
byday: eventDays
};

calCourseSchedule.addEvent(eventName, eventDesc, eventLocation, eventStart, eventEnd, rrule);
}
i+=2;
}

if (courseTables.length > 0) {
Expand Down
2 changes: 1 addition & 1 deletion src/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"name": "McGill Enhanced",
"author": "kozirisdev",
"manifest_version": 2,
"version": "4.3.29",
"version": "4.3.30",
"description": "Enhance the functionality of McGill.ca",
"permissions": [
"storage",
Expand Down

0 comments on commit 51225c6

Please sign in to comment.