From 8d9bcee279c0a82369acce2113cd776443f6cd97 Mon Sep 17 00:00:00 2001 From: minie4 Date: Sun, 4 Sep 2022 22:04:01 +0200 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20Only=20use=20substitutions=20of=20f?= =?UTF-8?q?irst=20day=20in=20file?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/parser/untis.js | 141 ++++++++++++++++++++++++----------------- 1 file changed, 82 insertions(+), 59 deletions(-) diff --git a/server/parser/untis.js b/server/parser/untis.js index 11b2fe1..dbba821 100644 --- a/server/parser/untis.js +++ b/server/parser/untis.js @@ -15,73 +15,96 @@ export function parseSubstitutionPlan(html) { const infos = {}; const $ = cheerio.load(html); - // Extract the date, weekday and a/b week from the title - const title = $(".mon_title").text().split(" "); - const rawDate = title[0]; - const date = rawDate - .split(".") - .reverse() - .map((e) => e.padStart(2, 0)) - .join("-"); - infos.date = new Date(date).setUTCHours(0, 0, 0, 0); - infos.week = title[3]; - - // Get the export timestamp - const rawTimestamp = $(".mon_head td") - .text() - .split("Stand: ")[1] - .replace(/[\s\n]*$/g, ""); - const exportDate = rawTimestamp.split(" ")[0].split(".").reverse().join("-"); - const timestamp = exportDate + " " + rawTimestamp.split(" ")[1]; - infos.updatedAt = new Date(timestamp).getTime(); - const data = []; + const tables = $("table.mon_list"); + tables.each((tableIndex, tableElement) => { + // Extract the date, weekday and a/b week from the title + const title = $(tableElement) + .parent() + .siblings(".mon_title") + .text() + .split(" "); + const rawDate = title[0]; + const date = rawDate + .split(".") + .reverse() + .map((e) => e.padStart(2, 0)) + .join("-"); - const titles = []; - const titleElements = $("table.mon_list tr.list th"); - titleElements.each((index, titleElement) => { - const title = $(titleElement).text(); - titles[index] = titleTranslations[title]; - }); + if (tableIndex == 0) { + infos.date = new Date(date).setUTCHours(0, 0, 0, 0); + infos.week = title[3]; - const subsitutionTable = $("table.mon_list tr.list"); - // Loop through each table row - subsitutionTable.each((_rowcnt, row) => { - const rowData = {}; + // Get the export timestamp + const rawTimestamp = $(tableElement) + .parent() + .parent() + .siblings(".mon_head") + .find("td") + .text() + .split("Stand: ")[1] + .replace(/[\s\n]*$/g, ""); + const exportDate = rawTimestamp + .split(" ")[0] + .split(".") + .reverse() + .join("-"); + const timestamp = exportDate + " " + rawTimestamp.split(" ")[1]; + infos.updatedAt = new Date(timestamp).getTime(); + } else { + // If there are multiple days in one file, + // ignore all except the first one + if (new Date(date).setUTCHours(0, 0, 0, 0) != infos.date) { + return; + } + } - // Find the columns and ignore empty ones - const columns = $(row).find("td"); - if (columns.text() == "") return; - // Ignore columns that include "Keine Vertretungen" - // to have an empty array if there are no substitutions - if (columns.text().includes("Keine Vertretungen")) return; - - columns.each((columncnt, column) => { - const text = $(column).text(); - // Clean the text by removing new lines, tabs, ... - var cleantext = text.replace(/^\n\s*/g, "").replace(/\s*$/, ""); - if (cleantext == "" || cleantext == "---") cleantext = null; - - const columntitle = titles[columncnt]; - rowData[columntitle] = cleantext; + const titles = []; + const titleElements = $(tableElement).find("tr.list th"); + titleElements.each((index, titleElement) => { + const title = $(titleElement).text(); + titles[index] = titleTranslations[title]; }); - // Split change if it spans over multiple lessons - const rawLesson = rowData.lesson; - const fromToLessons = rawLesson.match(/\d+/g).map(Number); - const from = fromToLessons[0]; - const to = fromToLessons[1] || fromToLessons[0]; + const subsitutionTable = $(tableElement).find("tr.list"); + // Loop through each table row + subsitutionTable.each((_rowcnt, row) => { + const rowData = {}; - // Generate numbers from `from` to `to` - const lessons = Array(to - from + 1) - .fill() - .map((_e, i) => i + from); + // Find the columns and ignore empty ones + const columns = $(row).find("td"); + if (columns.text() == "") return; + // Ignore columns that include "Keine Vertretungen" + // to have an empty array if there are no substitutions + if (columns.text().includes("Keine Vertretungen")) return; - // Create new change for each lesson the change spans over - for (const lesson of lessons) { - rowData.lesson = lesson; - data.push({ ...rowData }); - } + columns.each((columncnt, column) => { + const text = $(column).text(); + // Clean the text by removing new lines, tabs, ... + var cleantext = text.replace(/^\n\s*/g, "").replace(/\s*$/, ""); + if (cleantext == "" || cleantext == "---") cleantext = null; + + const columntitle = titles[columncnt]; + rowData[columntitle] = cleantext; + }); + + // Split change if it spans over multiple lessons + const rawLesson = rowData.lesson; + const fromToLessons = rawLesson.match(/\d+/g).map(Number); + const from = fromToLessons[0]; + const to = fromToLessons[1] || fromToLessons[0]; + + // Generate numbers from `from` to `to` + const lessons = Array(to - from + 1) + .fill() + .map((_e, i) => i + from); + + // Create new change for each lesson the change spans over + for (const lesson of lessons) { + rowData.lesson = lesson; + data.push({ ...rowData }); + } + }); }); infos.changes = data;