UNPKG

@heknon/node-webtop

Version:

A Backend for an unofficial WebTop (SmartSchool - Israel) API.

72 lines (61 loc) 2.79 kB
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; }