Oprava parsování pro TechTower

This commit is contained in:
Martin Berka 2023-10-23 12:24:32 +02:00
parent c5103f902d
commit 3021e6159d
2 changed files with 36 additions and 35 deletions

View File

@ -360,6 +360,7 @@ function App() {
<ul> <ul>
<li>Parsování jídelních lístků na celý týden</li> <li>Parsování jídelních lístků na celý týden</li>
<li>Oprava mizejícího Pizza day</li> <li>Oprava mizejícího Pizza day</li>
<li>Oprava parsování celého týdne pro TechTower</li>
</ul> </ul>
</Alert> </Alert>
{dayIndex != null && {dayIndex != null &&

View File

@ -235,46 +235,46 @@ export const getMenuTechTower = async (firstDayOfWeek: Date, mock: boolean = fal
if (!font) { if (!font) {
throw Error('Chyba: nenalezen <font> pro obědy v HTML Techtower.'); throw Error('Chyba: nenalezen <font> pro obědy v HTML Techtower.');
} }
const result: Food[][] = [];
// TODO validovat, že v textu nalezeného <font> je rozsah, do kterého spadá vstupní datum // TODO validovat, že v textu nalezeného <font> je rozsah, do kterého spadá vstupní datum
const siblings = $(font).parent().parent().siblings(); const siblings = $(font).parent().parent().siblings();
let parsing = false; let parsing = false;
const result: Food[][] = []; let currentDayIndex = 0;
// TODO toto je kvůli poslednímu "línému" refaktoru neoptimální, stačilo by to projít jedním cyklem for (let i = 0; i < siblings.length; i++) {
for (let dayIndex = 0; dayIndex < 5; dayIndex++) { const text = $(siblings.get(i)).text().trim().replace('\t', '').replace('\n', ' ');
if (!(dayIndex in result)) { if (DAYS_IN_WEEK.includes(text)) {
result[dayIndex] = []; if (text === DAYS_IN_WEEK[currentDayIndex]) {
} // Našli jsme dnešní den, odtud začínáme parsovat jídla
for (let i = 0; i < siblings.length; i++) { parsing = true;
const text = $(siblings.get(i)).text().trim().replace('\t', '').replace('\n', ' '); continue
if (DAYS_IN_WEEK.includes(text)) {
if (text === DAYS_IN_WEEK[dayIndex]) {
// Našli jsme dnešní den, odtud začínáme parsovat jídla
parsing = true;
continue
} else if (parsing) {
// Už parsujeme jídla, ale narazili jsme na následující den - končíme
break;
}
} else if (parsing) { } else if (parsing) {
if (text.length == 0) { // Už parsujeme jídla, ale narazili jsme na následující den - posouváme index
// Prázdná řádka - končíme (je za pátečním menu TechTower) currentDayIndex += 1;
break; continue;
}
let price = '? Kč';
let name = text;
if (text.toLowerCase().endsWith('kč')) {
const tmp = text.replace('\xA0', ' ').split(' ');
const split = [tmp.slice(0, -2).join(' ')].concat(tmp.slice(-2));
price = `${split.slice(1)[0]}\xA0Kč`
name = split[0]
}
result[dayIndex].push({
amount: '-',
name,
price,
isSoup: isTextSoupName(name),
})
} }
} else if (parsing) {
if (text.length == 0) {
// Prázdná řádka - končíme (je za pátečním menu TechTower)
break;
}
let price = '? Kč';
let name = text;
if (text.toLowerCase().endsWith('kč')) {
const tmp = text.replace('\xA0', ' ').split(' ');
const split = [tmp.slice(0, -2).join(' ')].concat(tmp.slice(-2));
price = `${split.slice(1)[0]}\xA0Kč`
name = split[0]
}
if (result[currentDayIndex] == null) {
result[currentDayIndex] = [];
}
result[currentDayIndex].push({
amount: '-',
name,
price,
isSoup: isTextSoupName(name),
})
} }
} }
return result; return result;