@heknon/node-webtop
Version:
A Backend for an unofficial WebTop (SmartSchool - Israel) API.
72 lines (61 loc) • 2.79 kB
text/typescript
import { load as cheerioLoad } from 'cheerio';
import { TimeTableDay, TimeTable } from './DataObjects';
import { SchoolHour, Lesson } from '../DataObjects';
import { isStringNumber, dayNumberToString, constructTime } from '../utils';
/**
* construct timetable type @see {TimeTable}
* @param timetableHtml the timetable html of webtop from https://www.webtop.co.il/pupilCardData.aspx?viewID=10&id=0&year=0
*/
export function constructTimeTable(timetableHtml: string, removeEmptyHours: boolean): TimeTable {
const $: CheerioStatic = cheerioLoad(timetableHtml);
const tt: TimeTable = [null!, null!, null!, null!, null!, null!];
const days = $('.scheduale-day-wrapper');
const hourMap = getHourMap($);
days.each((dayNum, day) => {
const ttDay = {} as TimeTableDay;
const todayClasses = [] as Lesson[];
let currHour = {} as Lesson;
let hourNum = 0;
day.children.forEach((hourData, i) => {
const hour = hourMap[hourNum];
if ((i & 1) === 1) {
if (hourData.children.length == 1) {
if (!removeEmptyHours) todayClasses.push(currHour);
currHour = {} as Lesson;
} else {
const details = $(hourData.children[0]).text().split(',');
currHour.subjectName = details[0];
currHour.teacherName = details[1].trimLeft();
const room = details[2].slice(5, details[2].length);
currHour.room = isStringNumber(room) ? Number.parseInt(room) : room.trimLeft();
todayClasses.push(currHour);
currHour = {} as Lesson;
}
++hourNum;
} else {
currHour.lessonSchoolBeginHour = hourNum;
currHour.lessonStartTime = hour.from;
currHour.lessonEndTime = hour.to;
}
});
ttDay.day = dayNumberToString(dayNum + 1);
ttDay.dayNum = dayNum + 1;
ttDay.todayClasses = todayClasses;
tt[dayNum] = ttDay;
});
return tt;
}
const getHourMap = ($: CheerioStatic): SchoolHour[] => {
const times = Array<SchoolHour>();
$("#day_1").children('.scheduale-hour-name').each((i, elem) => {
const hoursStr = $(elem.children[1]).text();
let hours = hoursStr.length <= 2 ? null : hoursStr.match(/\d{1,2}:\d{1,2}\d/g);
if (hours === null && i === 12) hours = ['17:10', '17:55'];
else if (hours === null && i === 13) hours = ['18:00', '18:45'];
times.push({
from: constructTime(hours![0]),
to: constructTime(hours![1])
});
});
return times;
}