diff --git a/server/src/restaurants.ts b/server/src/restaurants.ts index f348cff..10ae5c0 100644 --- a/server/src/restaurants.ts +++ b/server/src/restaurants.ts @@ -100,7 +100,7 @@ export const getMenuSladovnicka = async (firstDayOfWeek: Date, mock: boolean = f const html = await getHtml(SLADOVNICKA_URL); const $ = load(html); - // Nejdříve zjistíme, které dny jsou k dispozici z tab elementů + // Zjistíme, které dny jsou k dispozici z tab elementů const tabElements = $('#daily-menu-tab-list').children('button[id^="daily-menu-tab-"]'); const availableDays: { [dayIndex: number]: number } = {}; // mapování dayIndex -> contentIndex @@ -112,7 +112,7 @@ export const getMenuSladovnicka = async (firstDayOfWeek: Date, mock: boolean = f } }); - const menuContentElements = $('#daily-menu-content-list').children('[id^="daily-menu-content-"]'); + const menuContentElements = $('#daily-menu-content-list').children('.daily-menu-content__content').not('.daily-menu-content__content--static'); const result: Food[][] = []; @@ -130,59 +130,32 @@ export const getMenuSladovnicka = async (firstDayOfWeek: Date, mock: boolean = f continue; // Přeskočíme, pokud content element neexistuje } - const dayChildren = $(menuContentElements[contentIndexNum]).children(); - - // Ověříme, že má element očekávanou strukturu - if (dayChildren.length < 2) { - console.warn(`Neočekávaný počet children v menu Sladovnické pro den ${dayIndexNum}: ${dayChildren.length}, očekávány alespoň 2 (polévka a hlavní jídlo)`); - continue; - } - - // Parsování polévky - const soupElement = dayChildren.get(0); - const soupTable = $(soupElement).find('table tbody tr'); - const soupCells = soupTable.children('td'); - if (soupCells.length !== 3) { - console.warn(`Neočekávaný počet buněk v tabulce polévky pro den ${dayIndexNum}: ${soupCells.length}, ale očekávány byly 3`); - continue; - } - - const soupAmount = sanitizeText($(soupCells.get(0)).text()); - const soupNameRaw = sanitizeText($(soupCells.get(1)).text()); - const soupPrice = sanitizeText($(soupCells.get(2)).text().replace(' ', '\xA0')); - const soupParsed = parseAllergens(soupNameRaw); - - // Parsování hlavních jídel - const mainCourseElement = dayChildren.get(1); - const mainCourseTable = $(mainCourseElement).find('table tbody'); - const mainCourseRows = mainCourseTable.children('tr'); + const contentElement = $(menuContentElements[contentIndexNum]); + const itemElement = contentElement.find('.daily-menu-content__item'); + const table = itemElement.find('table.daily-menu-content__table tbody'); + const rows = table.children('tr'); const currentDayFood: Food[] = []; - // Přidáme polévku do seznamu jídel - currentDayFood.push({ - amount: soupAmount, - name: soupParsed.cleanName, - price: soupPrice, - isSoup: true, - allergens: soupParsed.allergens.length > 0 ? soupParsed.allergens : undefined, - }); - - // Projdeme všechny řádky hlavních jídel - mainCourseRows.each((i, row) => { + // Projdeme všechny řádky - první je polévka, zbytek jsou hlavní jídla + rows.each((i, row) => { const cells = $(row).children('td'); + if (cells.length !== 3) { + return; // Přeskočíme řádky s nesprávnou strukturou + } + const amount = sanitizeText($(cells.get(0)).text()); const nameRaw = sanitizeText($(cells.get(1)).text()); const price = sanitizeText($(cells.get(2)).text().replace(' ', '\xA0')); const parsed = parseAllergens(nameRaw); - // Přeskočíme prázdné řádky (první řádek může být prázdný) + // Přeskočíme prázdné řádky if (parsed.cleanName.trim().length > 0) { currentDayFood.push({ amount, name: parsed.cleanName, price, - isSoup: false, + isSoup: i === 0, // První řádek je polévka allergens: parsed.allergens.length > 0 ? parsed.allergens : undefined, }); } @@ -351,6 +324,11 @@ export const getMenuTechTower = async (firstDayOfWeek: Date, mock: boolean = fal const split = [tmp.slice(0, -2).join(' ')].concat(tmp.slice(-2)); price = `${split.slice(1)[0]}\xA0Kč` nameRaw = split[0].replace('•', ''); + } else if (text.toLowerCase().endsWith(',-')) { + const tmp = text.replace('\xA0', ' ').split(' '); + const split = [tmp.slice(0, -1).join(' ')].concat(tmp.slice(-1)); + price = `${split.slice(1)[0].replace(',-', '')}\xA0Kč` + nameRaw = split[0].replace('•', ''); } if (nameRaw.endsWith('–')) { nameRaw = nameRaw.slice(0, -1).trim();