Compare commits
2
Commits
791ccc1af6
...
9a03dd1e5e
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9a03dd1e5e
|
||
|
|
c3a8900283
|
No files matched your search
+1
-1
@@ -513,7 +513,7 @@ function App() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const handleChangeDepartureTime = async (event: React.ChangeEvent<HTMLSelectElement>) => {
|
const handleChangeDepartureTime = async (event: React.ChangeEvent<HTMLSelectElement>) => {
|
||||||
if (foodChoiceList?.length && choiceRef.current?.value) {
|
if (choiceRef.current?.value) {
|
||||||
await changeDepartureTime({ body: { time: event.target.value as DepartureTime, dayIndex } });
|
await changeDepartureTime({ body: { time: event.target.value as DepartureTime, dayIndex } });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,4 @@
|
|||||||
|
[
|
||||||
|
"Oprava: uložení preferovaného času odchodu i u podniku bez načteného menu",
|
||||||
|
"Oprava: načítání denního menu podniku TechTower po změně jejich webu"
|
||||||
|
]
|
||||||
+96
-56
@@ -283,7 +283,7 @@ export const getMenuTechTower = async (firstDayOfWeek: Date, mock: boolean = fal
|
|||||||
let thirdTry = false;
|
let thirdTry = false;
|
||||||
// První pokus - varianta "Obědy"
|
// První pokus - varianta "Obědy"
|
||||||
let fonts = $('font.wsw-41');
|
let fonts = $('font.wsw-41');
|
||||||
let font = undefined;
|
let font: any = undefined;
|
||||||
fonts.each((i, f) => {
|
fonts.each((i, f) => {
|
||||||
if ($(f).text().trim().startsWith('Obědy')) {
|
if ($(f).text().trim().startsWith('Obědy')) {
|
||||||
font = f;
|
font = f;
|
||||||
@@ -309,12 +309,83 @@ export const getMenuTechTower = async (firstDayOfWeek: Date, mock: boolean = fal
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
// Pátý pokus - formát z 07/2026: hlavička "Jídelní lístek" je v libovolném <font>
|
||||||
|
// (typicky wsw-31), jednotlivé položky jsou v samostatných <p> uvnitř vnořeného
|
||||||
|
// <div><font class="wsw-31">, den a jeho první položka mohou být ve stejném <p>
|
||||||
|
// oddělené <br>. Třída wsw-41 nyní obsahuje otevírací dobu, nikoli menu.
|
||||||
|
let fifthTry = false;
|
||||||
|
if (!font) {
|
||||||
|
$('font').each((_, f) => {
|
||||||
|
if (font) return;
|
||||||
|
if ($(f).text().trim().startsWith('Jídelní lístek')) {
|
||||||
|
font = f;
|
||||||
|
fifthTry = true;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
if (!font) {
|
if (!font) {
|
||||||
throw new Error('Chyba: nenalezen <font> pro obědy v HTML Techtower.');
|
throw new Error('Chyba: nenalezen <font> pro obědy v HTML Techtower.');
|
||||||
}
|
}
|
||||||
|
|
||||||
const result: Food[][] = [];
|
const result: Food[][] = [];
|
||||||
|
|
||||||
|
// Z textu jedné položky odvodí název, cenu a alergeny (sdíleno napříč formáty).
|
||||||
|
const buildFoodItem = (text: string): Food => {
|
||||||
|
let price = 'na\xA0váhu';
|
||||||
|
let nameRaw = text.replace('•', '');
|
||||||
|
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č`;
|
||||||
|
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.endsWith('—')) {
|
||||||
|
nameRaw = nameRaw.slice(0, -1).trim();
|
||||||
|
}
|
||||||
|
const parsed = parseAllergens(nameRaw);
|
||||||
|
return {
|
||||||
|
amount: '-',
|
||||||
|
name: parsed.cleanName,
|
||||||
|
price,
|
||||||
|
isSoup: isTextSoupName(parsed.cleanName),
|
||||||
|
allergens: parsed.allergens.length > 0 ? parsed.allergens : undefined,
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
// Pátý pokus (parsing): projdeme všechny <p> ve společném kontejneru, každý rozdělíme
|
||||||
|
// podle <br> na jednotlivé řádky. Řádek s názvem dne přepne aktuální den, ostatní řádky
|
||||||
|
// jsou položky. Zvládne tak i den a první položku ve stejném <p>.
|
||||||
|
if (fifthTry) {
|
||||||
|
let parsing = false;
|
||||||
|
let currentDayIndex = 0;
|
||||||
|
const container = $(font).parent().parent();
|
||||||
|
container.find('p').each((_, p) => {
|
||||||
|
const pHtml = $(p).html() ?? '';
|
||||||
|
const lines = pHtml.split(/<br\s*\/?>/i)
|
||||||
|
.map(part => $(`<span>${part}</span>`).text().trim())
|
||||||
|
.filter(line => line.length > 0);
|
||||||
|
for (const text of lines) {
|
||||||
|
const lower = text.toLocaleLowerCase();
|
||||||
|
if (DAYS_IN_WEEK.includes(lower)) {
|
||||||
|
currentDayIndex = DAYS_IN_WEEK.indexOf(lower);
|
||||||
|
parsing = true;
|
||||||
|
result[currentDayIndex] ??= [];
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (!parsing) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
result[currentDayIndex].push(buildFoodItem(text));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return finalizeTechTower(result, $(font).text().trim(), firstDayOfWeek);
|
||||||
|
}
|
||||||
|
|
||||||
// Čtvrtý pokus (detekce): thirdTry našel <font>, ale nový formát má každý den v jednom <p>
|
// Čtvrtý pokus (detekce): thirdTry našel <font>, ale nový formát má každý den v jednom <p>
|
||||||
// s položkami oddělenými <br> místo separátních <p> pro každou položku
|
// s položkami oddělenými <br> místo separátních <p> pro každou položku
|
||||||
const fourthTry = thirdTry && $(font).parent().siblings('p').toArray().some(el => {
|
const fourthTry = thirdTry && $(font).parent().siblings('p').toArray().some(el => {
|
||||||
@@ -345,31 +416,7 @@ export const getMenuTechTower = async (firstDayOfWeek: Date, mock: boolean = fal
|
|||||||
.filter(line => line.length > 0);
|
.filter(line => line.length > 0);
|
||||||
|
|
||||||
for (const text of itemLines) {
|
for (const text of itemLines) {
|
||||||
let price = 'na\xA0váhu';
|
result[dayIndex].push(buildFoodItem(text));
|
||||||
let nameRaw = text.replace('•', '');
|
|
||||||
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č`;
|
|
||||||
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.endsWith('—')) {
|
|
||||||
nameRaw = nameRaw.slice(0, -1).trim();
|
|
||||||
}
|
|
||||||
|
|
||||||
const parsed = parseAllergens(nameRaw);
|
|
||||||
result[dayIndex].push({
|
|
||||||
amount: '-',
|
|
||||||
name: parsed.cleanName,
|
|
||||||
price,
|
|
||||||
isSoup: isTextSoupName(parsed.cleanName),
|
|
||||||
allergens: parsed.allergens.length > 0 ? parsed.allergens : undefined,
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
@@ -389,47 +436,40 @@ export const getMenuTechTower = async (firstDayOfWeek: Date, mock: boolean = fal
|
|||||||
// Prázdná řádka - bývá na zcela náhodných místech ¯\_(ツ)_/¯
|
// Prázdná řádka - bývá na zcela náhodných místech ¯\_(ツ)_/¯
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
let price = 'na\xA0váhu';
|
|
||||||
let nameRaw = text.replace('•', '');
|
|
||||||
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č`
|
|
||||||
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.endsWith('—')) {
|
|
||||||
nameRaw = nameRaw.slice(0, -1).trim();
|
|
||||||
}
|
|
||||||
|
|
||||||
const parsed = parseAllergens(nameRaw);
|
|
||||||
result[currentDayIndex] ??= [];
|
result[currentDayIndex] ??= [];
|
||||||
result[currentDayIndex].push({
|
result[currentDayIndex].push(buildFoodItem(text));
|
||||||
amount: '-',
|
|
||||||
name: parsed.cleanName,
|
|
||||||
price,
|
|
||||||
isSoup: isTextSoupName(parsed.cleanName),
|
|
||||||
allergens: parsed.allergens.length > 0 ? parsed.allergens : undefined,
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Validace, zda text hlavičky obsahuje datum odpovídající požadovanému týdnu
|
return finalizeTechTower(result, $(font).text().trim(), firstDayOfWeek);
|
||||||
const headerText = $(font).text().trim();
|
}
|
||||||
const dateMatch = headerText.match(/(\d{1,2})\.(\d{1,2})\./);
|
|
||||||
|
/**
|
||||||
|
* Ověří, že datum v hlavičce TechTower spadá do požadovaného týdne, jinak vyhodí StaleWeekError.
|
||||||
|
*
|
||||||
|
* Datum v hlavičce nemusí být přesně pondělí (např. je-li pondělí svátek, začíná hlavička
|
||||||
|
* úterým), proto stačí, aby první nalezené datum padlo do libovolného dne požadovaného týdne.
|
||||||
|
* Toleruje i mezery za tečkami (formát "7. 7.-10. 7.").
|
||||||
|
*/
|
||||||
|
const finalizeTechTower = (result: Food[][], headerText: string, firstDayOfWeek: Date): Food[][] => {
|
||||||
|
const dateMatch = headerText.match(/(\d{1,2})\.\s*(\d{1,2})\./);
|
||||||
if (dateMatch) {
|
if (dateMatch) {
|
||||||
const foundDay = parseInt(dateMatch[1]);
|
const foundDay = parseInt(dateMatch[1]);
|
||||||
const foundMonth = parseInt(dateMatch[2]) - 1; // JS months are 0-based
|
const foundMonth = parseInt(dateMatch[2]) - 1; // JS months are 0-based
|
||||||
if (foundDay !== firstDayOfWeek.getDate() || foundMonth !== firstDayOfWeek.getMonth()) {
|
let matchesWeek = false;
|
||||||
|
for (let d = 0; d < 7; d++) {
|
||||||
|
const day = new Date(firstDayOfWeek);
|
||||||
|
day.setDate(firstDayOfWeek.getDate() + d);
|
||||||
|
if (day.getDate() === foundDay && day.getMonth() === foundMonth) {
|
||||||
|
matchesWeek = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!matchesWeek) {
|
||||||
throw new StaleWeekError(result);
|
throw new StaleWeekError(result);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+305
@@ -0,0 +1,305 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html class="no-js" prefix="og: https://ogp.me/ns#" lang="cs">
|
||||||
|
<head><link rel="preconnect" href="https://duyn491kcolsw.cloudfront.net" crossorigin><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><meta charset="utf-8"><link rel="shortcut icon" href="https://duyn491kcolsw.cloudfront.net/files/1x/1xh/1xh0pi.ico?ph=59d3cce388"><link rel="apple-touch-icon" href="https://duyn491kcolsw.cloudfront.net/files/1x/1xh/1xh0pi.ico?ph=59d3cce388"><link rel="icon" href="https://duyn491kcolsw.cloudfront.net/files/1x/1xh/1xh0pi.ico?ph=59d3cce388">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
<title>Restaurace :: Equifarm</title>
|
||||||
|
<meta name="viewport" content="width=device-width,initial-scale=1">
|
||||||
|
<meta name="msapplication-tap-highlight" content="no">
|
||||||
|
|
||||||
|
<link href="https://duyn491kcolsw.cloudfront.net/files/0r/0rk/0rklmm.css?ph=59d3cce388" media="print" rel="stylesheet">
|
||||||
|
<link href="https://duyn491kcolsw.cloudfront.net/files/4f/4fk/4fkxao.css?ph=59d3cce388" media="screen and (min-width:100000em)" rel="stylesheet" data-type="cq" disabled>
|
||||||
|
<link rel="stylesheet" href="https://duyn491kcolsw.cloudfront.net/files/33/33q/33q7ax.css?ph=59d3cce388"><link rel="stylesheet" href="https://duyn491kcolsw.cloudfront.net/files/0k/0k1/0k1ucs.css?ph=59d3cce388" media="screen and (min-width:37.5em)"><link rel="stylesheet" href="https://duyn491kcolsw.cloudfront.net/files/0o/0on/0onzbj.css?ph=59d3cce388" data-wnd_color_scheme_file=""><link rel="stylesheet" href="https://duyn491kcolsw.cloudfront.net/files/34/34q/34qmjb.css?ph=59d3cce388" data-wnd_color_scheme_desktop_file="" media="screen and (min-width:37.5em)" disabled=""><link rel="stylesheet" href="https://duyn491kcolsw.cloudfront.net/files/1j/1jo/1jorv9.css?ph=59d3cce388" data-wnd_additive_color_file=""><link rel="stylesheet" href="https://duyn491kcolsw.cloudfront.net/files/48/48g/48gira.css?ph=59d3cce388" data-wnd_typography_file=""><link rel="stylesheet" href="https://duyn491kcolsw.cloudfront.net/files/2b/2b9/2b9a9p.css?ph=59d3cce388" data-wnd_typography_desktop_file="" media="screen and (min-width:37.5em)" disabled=""><script>(()=>{let e=!1;const t=()=>{if(!e&&window.innerWidth>=600){for(let e=0,t=document.querySelectorAll('head > link[href*="css"][media="screen and (min-width:37.5em)"]');e<t.length;e++)t[e].removeAttribute("disabled");e=!0}};t(),window.addEventListener("resize",t),"container"in document.documentElement.style||fetch(document.querySelector('head > link[data-type="cq"]').getAttribute("href")).then((e=>{e.text().then((e=>{const t=document.createElement("style");document.head.appendChild(t),t.appendChild(document.createTextNode(e)),import("https://duyn491kcolsw.cloudfront.net/client/js.polyfill/container-query-polyfill.modern.js").then((()=>{let e=setInterval((function(){document.body&&(document.body.classList.add("cq-polyfill-loaded"),clearInterval(e))}),100)}))}))}))})()</script>
|
||||||
|
<link rel="preload stylesheet" href="https://duyn491kcolsw.cloudfront.net/files/2m/2m8/2m8msc.css?ph=59d3cce388" as="style"><meta name="description" content="Otevírací dobapo – pá 10.00 - 14.00obědy 10.00 - 13:45"><meta name="keywords" content=""><meta name="generator" content="Webnode 2"><meta name="apple-mobile-web-app-capable" content="no"><meta name="apple-mobile-web-app-status-bar-style" content="black"><meta name="format-detection" content="telephone=no">
|
||||||
|
|
||||||
|
<meta property="og:url" content="https://www.equifarm.cz/restaurace-techtower/"><meta property="og:title" content="Restaurace :: Equifarm"><meta property="og:type" content="article"><meta property="og:description" content="Otevírací dobapo – pá 10.00 - 14.00obědy 10.00 - 13:45"><meta property="og:site_name" content="Equifarm"><meta property="og:article:published_time" content="2026-07-06T00:00:00+0200"><meta name="robots" content="index,follow"><link rel="canonical" href="https://www.equifarm.cz/restaurace-techtower/"><script>window.checkAndChangeSvgColor=function(c){try{var a=document.getElementById(c);if(a){c=[["border","borderColor"],["outline","outlineColor"],["color","color"]];for(var h,b,d,f=[],e=0,m=c.length;e<m;e++)if(h=window.getComputedStyle(a)[c[e][1]].replace(/\s/g,"").match(/^rgb[a]?\(([0-9]{1,3}),([0-9]{1,3}),([0-9]{1,3})/i)){b="";for(var g=1;3>=g;g++)b+=("0"+parseInt(h[g],10).toString(16)).slice(-2);"0"===b.charAt(0)&&(d=parseInt(b.substr(0,2),16),d=Math.max(16,d),b=d.toString(16)+b.slice(-4));f.push(c[e][0]+"="+b)}if(f.length){var k=a.getAttribute("data-src"),l=k+(0>k.indexOf("?")?"?":"&")+f.join("&");a.src!=l&&(a.src=l,a.outerHTML=a.outerHTML)}}}catch(n){}};</script></head>
|
||||||
|
<body class="l wt-page ac-i l-default l-d-none b-btn-sq b-btn-s-l b-btn-dn b-btn-bw-1 img-d-n img-t-o img-h-z line-solid b-e-ds lbox-d c-s-s wnd-fe"><noscript>
|
||||||
|
<iframe
|
||||||
|
src="https://www.googletagmanager.com/ns.html?id=GTM-542MMSL"
|
||||||
|
height="0"
|
||||||
|
width="0"
|
||||||
|
style="display:none;visibility:hidden"
|
||||||
|
>
|
||||||
|
</iframe>
|
||||||
|
</noscript>
|
||||||
|
|
||||||
|
<div class="wnd-page l-page cs-gray ac-none t-t-fs-l t-t-fw-l t-t-sp-n t-t-d-n t-s-fs-m t-s-fw-l t-s-sp-n t-s-d-n t-p-fs-s t-p-fw-m t-p-sp-n t-h-fs-m t-h-fw-l t-h-sp-n t-bq-fs-s t-bq-fw-l t-bq-sp-n t-bq-d-q t-btn-fw-l t-nav-fw-l t-pd-fw-s t-nav-tt-u">
|
||||||
|
<div class="l-w t cf t-30">
|
||||||
|
<div class="l-bg cf">
|
||||||
|
<div class="s-bg-l">
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<header class="l-h cf">
|
||||||
|
<div class="sw cf">
|
||||||
|
<div class="sw-c cf"><section data-space="true" class="s s-hn s-hn-default wnd-mt-classic wnd-na-c logo-classic sc-ml wnd-background-pattern wnd-w-wider wnd-nh-m hm-hidden wnd-nav-border menu-default-underline">
|
||||||
|
<div class="s-w">
|
||||||
|
<div class="s-o">
|
||||||
|
|
||||||
|
<div class="s-bg">
|
||||||
|
<div class="s-bg-l wnd-background-pattern bgpos-center-center bgatt-scroll" style="background-image:url('https://duyn491kcolsw.cloudfront.net/files/17/17i/17ib2g.png?ph=59d3cce388')">
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="h-w h-f wnd-fixed">
|
||||||
|
|
||||||
|
<div class="n-l">
|
||||||
|
<div class="s-c menu-nav">
|
||||||
|
<div class="logo-block">
|
||||||
|
<div class="b b-l logo logo-default logo-nb proxima-nova logo-32 wnd-logo-with-text wnd-iar-1-1 b-ls-l" id="wnd_LogoBlock_193721444" data-wnd_mvc_type="wnd.fe.LogoBlock">
|
||||||
|
<div class="b-l-c logo-content">
|
||||||
|
<a class="b-l-link logo-link" href="/">
|
||||||
|
|
||||||
|
<div class="b-l-image logo-image">
|
||||||
|
<div class="b-l-image-w logo-image-cell">
|
||||||
|
<picture><source type="image/webp" srcset="https://59d3cce388.clvaw-cdnwnd.com/bd8e4bd40b5bb1412d0aee3843c4e306/200000384-5e4ab5e4ae/450/EQF_Logo%20%28orig.%29.webp?ph=59d3cce388 366w, https://59d3cce388.clvaw-cdnwnd.com/bd8e4bd40b5bb1412d0aee3843c4e306/200000384-5e4ab5e4ae/700/EQF_Logo%20%28orig.%29.webp?ph=59d3cce388 366w, https://59d3cce388.clvaw-cdnwnd.com/bd8e4bd40b5bb1412d0aee3843c4e306/200000384-5e4ab5e4ae/EQF_Logo%20%28orig.%29.webp?ph=59d3cce388 366w" sizes="(min-width: 600px) 450px, (min-width: 360px) calc(100vw * 0.8), 100vw" ><img src="https://59d3cce388.clvaw-cdnwnd.com/bd8e4bd40b5bb1412d0aee3843c4e306/200000003-2ad852ad86/EQF_Logo%20%28orig.%29.png?ph=59d3cce388" alt="" width="366" height="356" class="wnd-logo-img" ></picture>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<div class="b-l-br logo-br"></div>
|
||||||
|
|
||||||
|
<div class="b-l-text logo-text-wrapper">
|
||||||
|
<div class="b-l-text-w logo-text">
|
||||||
|
<span class="b-l-text-c logo-text-cell">Equifarm, s.r.o.</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="menu-slider">
|
||||||
|
<div id="menu-block">
|
||||||
|
<nav id="menu"><div class="menu-font menu-wrapper">
|
||||||
|
<a href="#" class="menu-close" rel="nofollow" title="Close Menu"></a>
|
||||||
|
<ul role="menubar" aria-label="Menu" class="level-1">
|
||||||
|
<li role="none" class="wnd-homepage">
|
||||||
|
<a class="menu-item" role="menuitem" href="/"><span class="menu-item-text">Úvod</span></a>
|
||||||
|
|
||||||
|
</li><li role="none" class="wnd-with-submenu">
|
||||||
|
<a class="menu-item" role="menuitem" href="/firemni-stravovani/"><span class="menu-item-text">Firemní stravování</span></a>
|
||||||
|
<ul role="menubar" aria-label="Menu" class="level-2">
|
||||||
|
<li role="none">
|
||||||
|
<a class="menu-item" role="menuitem" href="/specialiste-na-japonskou-kuchyni/"><span class="menu-item-text">Specialisté na japonskou kuchyni</span></a>
|
||||||
|
|
||||||
|
</li><li role="none">
|
||||||
|
<a class="menu-item" role="menuitem" href="/vlastni-cukrarska-vyroba/"><span class="menu-item-text">Vlastní cukrářská výroba</span></a>
|
||||||
|
|
||||||
|
</li><li role="none">
|
||||||
|
<a class="menu-item" role="menuitem" href="/reference/"><span class="menu-item-text">Reference</span></a>
|
||||||
|
|
||||||
|
</li><li role="none">
|
||||||
|
<a class="menu-item" role="menuitem" href="/kontakty2/"><span class="menu-item-text">Kontakty </span></a>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</li><li role="none">
|
||||||
|
<a class="menu-item" role="menuitem" href="/catering-a-eventy/"><span class="menu-item-text">Catering</span></a>
|
||||||
|
|
||||||
|
</li><li role="none" class="wnd-with-submenu">
|
||||||
|
<a class="menu-item" role="menuitem" href="/rekreacni-areal2/"><span class="menu-item-text">Rekreační areál</span></a>
|
||||||
|
<ul role="menubar" aria-label="Menu" class="level-2">
|
||||||
|
<li role="none">
|
||||||
|
<a class="menu-item" role="menuitem" href="/areal/"><span class="menu-item-text">Areál</span></a>
|
||||||
|
|
||||||
|
</li><li role="none">
|
||||||
|
<a class="menu-item" role="menuitem" href="/kontakty/"><span class="menu-item-text">Kontakty</span></a>
|
||||||
|
|
||||||
|
</li><li role="none">
|
||||||
|
<a class="menu-item" role="menuitem" href="/cenik/"><span class="menu-item-text">Ceník</span></a>
|
||||||
|
|
||||||
|
</li><li role="none">
|
||||||
|
<a class="menu-item" role="menuitem" href="/kalendar/"><span class="menu-item-text">Kalendář</span></a>
|
||||||
|
|
||||||
|
</li><li role="none">
|
||||||
|
<a class="menu-item" role="menuitem" href="/fotogalerie/"><span class="menu-item-text">Fotogalerie</span></a>
|
||||||
|
|
||||||
|
</li><li role="none">
|
||||||
|
<a class="menu-item" role="menuitem" href="/vylety-do-okoli/"><span class="menu-item-text">Výlety do okolí</span></a>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</li><li role="none" class="wnd-active-path wnd-with-submenu">
|
||||||
|
<a class="menu-item" role="menuitem" href="/techtower/"><span class="menu-item-text">TechTower</span></a>
|
||||||
|
<ul role="menubar" aria-label="Menu" class="level-2">
|
||||||
|
<li role="none">
|
||||||
|
<a class="menu-item" role="menuitem" href="/kavarna-techtower/"><span class="menu-item-text">SeedUp Space</span></a>
|
||||||
|
|
||||||
|
</li><li role="none" class="wnd-active wnd-active-path">
|
||||||
|
<a class="menu-item" role="menuitem" href="/restaurace-techtower/"><span class="menu-item-text">Restaurace </span></a>
|
||||||
|
|
||||||
|
</li><li role="none">
|
||||||
|
<a class="menu-item" role="menuitem" href="/coffee-breaks/"><span class="menu-item-text">Coffee breaks</span></a>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</li><li role="none">
|
||||||
|
<a class="menu-item" role="menuitem" href="/kontakt/"><span class="menu-item-text">Kontakt</span></a>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<span class="more-text">Více</span>
|
||||||
|
</div></nav>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="cart-and-mobile">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<div id="menu-mobile">
|
||||||
|
<a href="#" id="menu-submit"><span></span>Menu</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section></div>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
<main class="l-m cf">
|
||||||
|
<div class="sw cf">
|
||||||
|
<div class="sw-c cf"><section class="s s-hm s-hm-hidden wnd-h-hidden cf sc-w hn-default"><div></div></section><section class="s s-basic cf sc-w wnd-w-default wnd-s-normal wnd-h-auto">
|
||||||
|
<div class="s-w cf">
|
||||||
|
<div class="s-o s-fs cf">
|
||||||
|
<div class="s-bg cf">
|
||||||
|
<div class="s-bg-l">
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="s-c s-fs cf">
|
||||||
|
<div class="ez cf wnd-no-cols">
|
||||||
|
<div class="ez-c"><div class="b b-text cf">
|
||||||
|
<div class="b-c b-text-c b-s b-s-t60 b-s-b60 b-cs cf"><h1 class="wnd-align-center"><strong><font class="wsw-31">Restaurace </font></strong></h1>
|
||||||
|
</div>
|
||||||
|
</div><div class="b b-text cf">
|
||||||
|
<div class="b-c b-text-c b-s b-s-t60 b-s-b60 b-cs cf"></div>
|
||||||
|
</div><div class="b b-s b-hr-line line-auto">
|
||||||
|
<hr class="line-style line-color">
|
||||||
|
</div><div class="b b-text cf">
|
||||||
|
<div class="b-c b-text-c b-s b-s-t60 b-s-b60 b-cs cf"><h3 class="wnd-align-center"><font class="wsw-02"><p class=""><strong>Otevírací doba</strong><br></p><p class="">po – pá 10.00 - 14.00</p></font><p class=""><font class="wsw-41">obědy 10.00 - 13:45</font></p></h3></div>
|
||||||
|
</div><div class="b b-text cf">
|
||||||
|
<div class="b-c b-text-c b-s b-s-t60 b-s-b60 b-cs cf"><p class="wnd-align-center"><font class="wsw-31 wnd-font-size-120"><strong>Jídelní lístek 7. 7.-10. 7.</strong></font><strong><br></strong></p><p class="wnd-align-center"><br></p><div><font class="wsw-31"><p class="wnd-align-center"><font class="wsw-02"><strong>Pondělí</strong><br>SVÁTEK</font></p><p class="wnd-align-center"><font class="wsw-02"><br></font></p><p class="wnd-align-center"><font class="wsw-02"><strong>Úterý</strong></font></p><p class="wnd-align-center"><font class="wsw-02">Brokolicový krém 1,7 — 45 Kč</font></p><p class="wnd-align-center"><font class="wsw-02">Rizoto s kuřecím masem, hráškem, paprikou a sýrem 7 — 140 Kč</font></p><p class="wnd-align-center"><font class="wsw-02">Špagety s bazalkovým pestem, grilovanými cherry rajčaty a trhanou burratou 1,7,8</font></p><p class="wnd-align-center"><font class="wsw-02">Kuřecí placičky s bylinkami a kurkumou, hranolky, řecký salát, bylinková majonéza 1,3,7</font></p><p class="wnd-align-center"><font class="wsw-02">Krkovička na česneku, jasmínová rýže 1</font></p><p class="wnd-align-center"><font class="wsw-02"><br></font></p><p class="wnd-align-center"><font class="wsw-02"><strong>Středa</strong></font></p><p class="wnd-align-center"><font class="wsw-02">Boršč 1,7,9 — 45 Kč</font></p><p class="wnd-align-center"><font class="wsw-02">Halušky s uzeným masem a zelím, restovaná cibulka 1 — 140 Kč</font></p><p class="wnd-align-center"><font class="wsw-02">Cheddarové kuličky s jalapeños, vařené brambory, tatarská omáčka 1,3,7</font></p><p class="wnd-align-center"><font class="wsw-02">Zvěřinové ragú se zeleninou, karlovarský knedlík 1,3,7,9</font></p><p class="wnd-align-center"><font class="wsw-02">Africký sumeček na grilu, pečená zelenina s brambůrky 4</font></p><p class="wnd-align-center"><font class="wsw-02"><br></font></p><p class="wnd-align-center"><font class="wsw-02"><strong>Čtvrtek</strong><br>Thajská polévka s chilli a kokosovým mlékem 1,7 — 45 Kč</font></p><p class="wnd-align-center"><font class="wsw-02">Vepřová plec na smetaně, houskový knedlík 1,3,7,9 — 140 Kč</font></p><p class="wnd-align-center"><font class="wsw-02">Buchtičky s vanilkovým krémem a ovocem 1,3,7</font></p><p class="wnd-align-center"><font class="wsw-02">Vepřové medailonky s omáčkou z pečených paprik, jasmínová rýže 1</font></p><p class="wnd-align-center"><font class="wsw-02">Kachní stehýnko se silnou omáčkou, gratinované brambory 1,3,7</font></p><p class="wnd-align-center"><font class="wsw-02"><br></font></p><p class="wnd-align-center"><font class="wsw-02"><strong>Pátek</strong></font></p><p class="wnd-align-center"><font class="wsw-02">Hovězí vývar s drožďovou zavářkou a zeleninou 1,3,7,9 — 45 Kč</font></p><p class="wnd-align-center"><font class="wsw-02">Vepřové výpečky, špenát, bramborový knedlík 1,3,7 — 140 Kč</font></p><p class="wnd-align-center"><font class="wsw-02">Cuketové placičky s nivou, salát coleslaw 1,3,7</font></p><p class="wnd-align-center"><font class="wsw-02">Flank steak se sladkokyselou omáčkou, jasmínová rýže 1,6,11</font></p><p class="wnd-align-center"><font class="wsw-02">Sekaný řízek s mozzarellou a bazalkou, bramborové pyré</font></p></font></div><p class="wnd-align-center"><br></p></div>
|
||||||
|
</div><div class="b b-text cf">
|
||||||
|
<div class="b-c b-text-c b-s b-s-t60 b-s-b60 b-cs cf"><p id="wnd_TextBlock_76217_inner_1" data-wnd_is_separable="1" data-wnd_separable_index="1" data-wnd_separable_id="wnd_TextBlock_76217"></p></div>
|
||||||
|
</div><div class="b b-text cf">
|
||||||
|
<div class="b-c b-text-c b-s b-s-t60 b-s-b60 b-cs cf"><p class="wnd-align-center"><a href="https://www.equifarm.cz" target="_blank">www.equifarm.cz</a></p><p class="wnd-align-center"><font class="wsw-31">techtower@equifarm.cz</font></p><p class="wnd-align-center">+420 608 180 311</p></div>
|
||||||
|
</div></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section></div>
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
<footer class="l-f cf">
|
||||||
|
<div class="sw cf">
|
||||||
|
<div class="sw-c cf"><section data-wn-border-element="s-f-border" class="s s-f s-f-basic s-f-simple sc-w wnd-w-default wnd-s-higher">
|
||||||
|
<div class="s-w">
|
||||||
|
<div class="s-o">
|
||||||
|
<div class="s-bg">
|
||||||
|
<div class="s-bg-l">
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="s-c s-f-l-w s-f-border">
|
||||||
|
<div class="s-f-l b-s b-s-t0 b-s-b0">
|
||||||
|
<div class="s-f-l-c s-f-l-c-first">
|
||||||
|
<div class="s-f-cr"><span class="it b link">
|
||||||
|
<span class="it-c">© 2022 Equifarm, s.r.o. Všechna práva vyhrazena.</span>
|
||||||
|
</span></div>
|
||||||
|
<div class="s-f-sf">
|
||||||
|
<span class="sf b">
|
||||||
|
<span class="sf-content sf-c link">Vytvořeno službou <a href="https://www.webnode.cz?utm_source=text&utm_medium=footer&utm_campaign=free3&utm_content=wnd2" rel="nofollow noopener" target="_blank">Webnode</a></span>
|
||||||
|
</span>
|
||||||
|
<span class="sf-cbr link">
|
||||||
|
<a href="#" rel="nofollow">Cookies</a>
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="s-f-l-c s-f-l-c-last">
|
||||||
|
<div class="s-f-lang lang-select cf">
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="s-f-l-c s-f-l-c-currency">
|
||||||
|
<div class="s-f-ccy ccy-select cf">
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section></div>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<section class="cb cb-dark" id="cookiebar" style="display:none;" id="cookiebar" style="display:none;">
|
||||||
|
<div class="cb-bar cb-scrollable">
|
||||||
|
<div class="cb-bar-c">
|
||||||
|
<div class="cb-bar-text">Používáme cookies, abychom zajistili správné fungování a bezpečnost našich stránek. Tím vám můžeme zajistit tu nejlepší zkušenost při jejich návštěvě.</div>
|
||||||
|
<div class="cb-bar-buttons">
|
||||||
|
<button class="cb-button cb-close-basic" data-action="accept-necessary">
|
||||||
|
<span class="cb-button-content">Přijmout nezbytné</span>
|
||||||
|
</button>
|
||||||
|
<button class="cb-button cb-close-basic" data-action="accept-all">
|
||||||
|
<span class="cb-button-content">Přijmout vše</span>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="cb-close cb-close-basic" data-action="accept-necessary"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="cb-popup cb-light close">
|
||||||
|
<div class="cb-popup-c">
|
||||||
|
<div class="cb-popup-head">
|
||||||
|
<h3 class="cb-popup-title">Pokročilá nastavení</h3>
|
||||||
|
<p class="cb-popup-text">Zde můžete upravit své preference ohledně cookies. Následující kategorie můžete povolit či zakázat a svůj výběr uložit.</p>
|
||||||
|
</div>
|
||||||
|
<div class="cb-popup-options cb-scrollable">
|
||||||
|
<div class="cb-option">
|
||||||
|
<input class="cb-option-input" type="checkbox" id="necessary" name="necessary" readonly="readonly" disabled="disabled" checked="checked">
|
||||||
|
<div class="cb-option-checkbox"></div>
|
||||||
|
<label class="cb-option-label" for="necessary">Nezbytné krátkodobé cookies</label>
|
||||||
|
<div class="cb-option-text"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="cb-popup-footer">
|
||||||
|
<button class="cb-button cb-save-popup" data-action="advanced-save">
|
||||||
|
<span class="cb-button-content">Uložit</span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div class="cb-close cb-close-popup" data-action="close"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<script src="https://duyn491kcolsw.cloudfront.net/files/20/20i/20ikxy.js?ph=59d3cce388" crossorigin="anonymous" type="module"></script><script>document.querySelector(".wnd-fe")&&[...document.querySelectorAll(".c")].forEach((e=>{const t=e.querySelector(".b-text:only-child");t&&""===t.querySelector(".b-text-c").innerText&&e.classList.add("column-empty")}))</script>
|
||||||
|
|
||||||
|
|
||||||
|
<script src="https://duyn491kcolsw.cloudfront.net/client.fe/js.compiled/lang.cz.0e4d422db27b5ab8.js?ph=59d3cce388" crossorigin="anonymous"></script><script src="https://duyn491kcolsw.cloudfront.net/client.fe/js.compiled/compiled.multi.bfbcd10b0877d2a2.js?ph=59d3cce388" crossorigin="anonymous"></script><script>var wnd = wnd || {};wnd.$data = {"image_content_items":{"wnd_ThumbnailBlock_1":{"id":"wnd_ThumbnailBlock_1","type":"wnd.pc.ThumbnailBlock"},"wnd_HeaderSection_header_main_412360230":{"id":"wnd_HeaderSection_header_main_412360230","type":"wnd.pc.HeaderSection"},"wnd_ImageBlock_793396992":{"id":"wnd_ImageBlock_793396992","type":"wnd.pc.ImageBlock"},"wnd_Section_default_762442558":{"id":"wnd_Section_default_762442558","type":"wnd.pc.Section"},"wnd_LogoBlock_193721444":{"id":"wnd_LogoBlock_193721444","type":"wnd.pc.LogoBlock"},"wnd_FooterSection_footer_306617015":{"id":"wnd_FooterSection_footer_306617015","type":"wnd.pc.FooterSection"}},"svg_content_items":{"wnd_ImageBlock_793396992":{"id":"wnd_ImageBlock_793396992","type":"wnd.pc.ImageBlock"},"wnd_LogoBlock_193721444":{"id":"wnd_LogoBlock_193721444","type":"wnd.pc.LogoBlock"}},"content_items":[],"eshopSettings":{"ESHOP_SETTINGS_DISPLAY_PRICE_WITHOUT_VAT":false,"ESHOP_SETTINGS_DISPLAY_ADDITIONAL_VAT":false,"ESHOP_SETTINGS_DISPLAY_SHIPPING_COST":false},"project_info":{"isMultilanguage":false,"isMulticurrency":false,"eshop_tax_enabled":"1","country_code":"","contact_state":null,"eshop_tax_type":"VAT","eshop_discounts":false,"graphQLURL":"https:\/\/equifarm.cz\/servers\/graphql\/","iubendaSettings":{"cookieBarCode":"","cookiePolicyCode":"","privacyPolicyCode":"","termsAndConditionsCode":""}}};</script><script>wnd.$system = {"fileSystemType":"aws_s3","localFilesPath":"https:\/\/www.equifarm.cz\/_files\/","awsS3FilesPath":"https:\/\/59d3cce388.clvaw-cdnwnd.com\/bd8e4bd40b5bb1412d0aee3843c4e306\/","staticFiles":"https:\/\/duyn491kcolsw.cloudfront.net\/files","isCms":false,"staticCDNServers":["https:\/\/duyn491kcolsw.cloudfront.net\/"],"fileUploadAllowExtension":["jpg","jpeg","jfif","png","gif","bmp","ico","svg","webp","tiff","pdf","doc","docx","ppt","pptx","pps","ppsx","odt","xls","xlsx","txt","rtf","mp3","wma","wav","ogg","amr","flac","m4a","3gp","avi","wmv","mov","mpg","mkv","mp4","mpeg","m4v","swf","gpx","stl","csv","xml","txt","dxf","dwg","iges","igs","step","stp"],"maxUserFormFileLimit":4194304,"frontendLanguage":"cz","backendLanguage":"cz","frontendLanguageId":"1","page":{"id":200005054,"identifier":"restaurace-techtower","template":{"id":200000047,"styles":{"typography":"t-30_new","scheme":"cs-gray","additiveColor":"ac-none","acHeadings":false,"acSubheadings":false,"acIcons":true,"acOthers":false,"acMenu":false,"imageStyle":"img-d-n","imageHover":"img-h-z","imageTitle":"img-t-o","buttonStyle":"b-btn-sq","buttonSize":"b-btn-s-l","buttonDecoration":"b-btn-dn","buttonBorders":"b-btn-bw-1","lineStyle":"line-solid","eshopGridItemStyle":"b-e-ds","formStyle":"default","menuType":"","menuStyle":"menu-default-underline","lightboxStyle":"lbox-d","columnSpaces":"c-s-s","sectionWidth":"wnd-w-default","sectionSpace":"wnd-s-normal","layoutType":"l-default","layoutDecoration":"l-d-none","background":{"default":null},"backgroundSettings":{"default":""},"typoTitleSizes":"t-t-fs-l","typoTitleWeights":"t-t-fw-l","typoTitleSpacings":"t-t-sp-n","typoTitleDecorations":"t-t-d-n","typoHeadingSizes":"t-h-fs-m","typoHeadingWeights":"t-h-fw-l","typoHeadingSpacings":"t-h-sp-n","typoSubtitleSizes":"t-s-fs-m","typoSubtitleWeights":"t-s-fw-l","typoSubtitleSpacings":"t-s-sp-n","typoSubtitleDecorations":"t-s-d-n","typoParagraphSizes":"t-p-fs-s","typoParagraphWeights":"t-p-fw-m","typoParagraphSpacings":"t-p-sp-n","typoBlockquoteSizes":"t-bq-fs-s","typoBlockquoteWeights":"t-bq-fw-l","typoBlockquoteSpacings":"t-bq-sp-n","typoBlockquoteDecorations":"t-bq-d-q","buttonWeight":"t-btn-fw-l","menuWeight":"t-nav-fw-l","productWeight":"t-pd-fw-s","menuTextTransform":"t-nav-tt-u"}},"layout":"default","name":"Restaurace ","html_title":"","language":"cz","langId":1,"isHomepage":false,"meta_description":"","meta_keywords":"","header_code":"","footer_code":"","styles":{"pageBased":{"navline":{"style":{"sectionWidth":"wnd-w-wider","sectionHeight":"wnd-nh-m","sectionPosition":"wnd-na-c"}}}},"countFormsEntries":[]},"listingsPrefix":"\/l\/","productPrefix":"\/p\/","cartPrefix":"\/cart\/","checkoutPrefix":"\/checkout\/","searchPrefix":"\/search\/","isCheckout":false,"isEshop":false,"hasBlog":false,"isProductDetail":false,"isListingDetail":false,"listing_page":[],"hasEshopAnalytics":false,"gTagId":null,"gAdsId":null,"format":{"be":{"DATE_TIME":{"mask":"%d.%m.%Y %H:%M","regexp":"^(((0?[1-9]|[1,2][0-9]|3[0,1])\\.(0?[1-9]|1[0-2])\\.[0-9]{1,4})(( [0-1][0-9]| 2[0-3]):[0-5][0-9])?|(([0-9]{4}(0[1-9]|1[0-2])(0[1-9]|[1,2][0-9]|3[0,1])(0[0-9]|1[0-9]|2[0-3])[0-5][0-9][0-5][0-9])))?$"},"DATE":{"mask":"%d.%m.%Y","regexp":"^((0?[1-9]|[1,2][0-9]|3[0,1])\\.(0?[1-9]|1[0-2])\\.[0-9]{1,4})$"},"CURRENCY":{"mask":{"point":",","tLine truncated
|
||||||
|
events: {"error":{"name":"Error"},"publish":{"name":"Publish page"},"open_premium_popup":{"name":"Open premium popup"},"publish_from_premium_popup":{"name":"Publish from premium content popup"},"upgrade_your_plan":{"name":"Upgrade your plan"},"ml_lock_page":{"name":"Lock access to page"},"ml_unlock_page":{"name":"Unlock access to page"},"ml_start_add_page_member_area":{"name":"Start - add page Member Area"},"ml_end_add_page_member_area":{"name":"End - add page Member Area"},"ml_show_activation_popup":{"name":"Show activation popup"},"ml_activation":{"name":"Member Login Activation"},"ml_deactivation":{"name":"Member Login Deactivation"},"ml_enable_require_approval":{"name":"Enable approve registration manually"},"ml_disable_require_approval":{"name":"Disable approve registration manually"},"ml_fe_member_registration":{"name":"Member Registration on FE"},"ml_fe_member_login":{"name":"Login Member"},"ml_fe_member_recovery":{"name":"Sent recovery email"},"ml_fe_member_change_password":{"name":"Change Password"},"undoredo_click_undo":{"name":"Undo\/Redo - click Undo"},"undoredo_click_redo":{"name":"Undo\/Redo - click Redo"},"add_anchor":{"name":"Anchor adding completed"},"add_page":{"name":"Page adding completed"},"change_page_order":{"name":"Change of page order"},"delete_page":{"name":"Page deleted"},"background_options_change":{"name":"Background setting completed"},"add_content":{"name":"Content adding completed"},"delete_content":{"name":"Content deleting completed"},"change_text":{"name":"Editing of text completed"},"add_image":{"name":"Image adding completed"},"add_photo":{"name":"Adding photo to galery completed"},"change_logo":{"name":"Logo changing completed"},"open_pages":{"name":"Open Pages"},"show_page_cms":{"name":"Show Page - CMS"},"new_section":{"name":"New section completed"},"delete_section":{"name":"Section deleting completed"},"add_video":{"name":"Video adding completed"},"add_maps":{"name":"Maps adding completed"},"add_button":{"name":"Button adding completed"},"add_file":{"name":"File adding completed"},"add_hr":{"name":"Horizontal line adding completed"},"delete_cell":{"name":"Cell deleting completed"},"delete_microtemplate":{"name":"Microtemplate deleting completed"},"add_blog_page":{"name":"Blog page adding completed"},"new_blog_post":{"name":"New blog post created"},"new_blog_recent_posts":{"name":"Blog recent posts list created"},"e_show_products_popup":{"name":"Show products popup"},"e_show_add_product":{"name":"Show add product popup"},"e_show_edit_product":{"name":"Show edit product popup"},"e_show_collections_popup":{"name":"Show collections manager popup"},"e_show_eshop_settings":{"name":"Show eshop settings popup"},"e_add_product":{"name":"Add product"},"e_edit_product":{"name":"Edit product"},"e_remove_product":{"name":"Remove product"},"e_bulk_show":{"name":"Bulk show products"},"e_bulk_hide":{"name":"Bulk hide products"},"e_bulk_remove":{"name":"Bulk remove products"},"e_move_product":{"name":"Order products"},"e_add_collection":{"name":"Add collection"},"e_rename_collection":{"name":"Rename collection"},"e_remove_collection":{"name":"Remove collection"},"e_add_product_to_collection":{"name":"Assign product to collection"},"e_remove_product_from_collection":{"name":"Unassign product from collection"},"e_move_collection":{"name":"Order collections"},"e_add_products_page":{"name":"Add products page"},"e_add_procucts_section":{"name":"Add products list section"},"e_add_products_content":{"name":"Add products list content block"},"e_change_products_zone_style":{"name":"Change style in products list"},"e_change_products_zone_collection":{"name":"Change collection in products list"},"e_show_products_zone_collection_filter":{"name":"Show collection filter in products list"},"e_hide_products_zone_collection_filter":{"name":"Hide collection filter in products list"},"e_show_product_detail_page":{"name":"Show product detail page"},"e_add_to_cart":{"name":"Add product to cart"},"e_remove_from_cart":{"name":"Remove product from cart"},"e_checkout_step":{"name":"From cart to checkout"},"e_finish_checkout":{"name":"Finish order"},"welcome_window_play_video":{"name":"Welcome window - play video"},"e_import_file":{"name":"Eshop - products import - file info"},"e_import_upload_time":{"name":"Eshop - products import - upload file duration"},"e_import_result":{"name":"Eshop - products import result"},"e_import_error":{"name":"Eshop - products import - errors"},"e_promo_blogpost":{"name":"Eshop promo - blogpost"},"e_promo_activate":{"name":"Eshop promo - activate"},"e_settings_activate":{"name":"Online store - activate"},"e_promo_hide":{"name":"Eshop promo - close"},"e_activation_popup_step":{"name":"Eshop activation popup - step"},"e_activation_popup_activate":{"name":"Eshop activation popup - activate"},"e_activation_popup_hide":{"name":"Eshop activation popup - close"},"e_deactivation":{"name":"Eshop deactivation"},"e_reactivation":{"name":"Eshop reactivation"},"e_variant_create_first":Line truncated
|
||||||
|
data: {"user":{"u":0,"p":44019905,"lc":"CZ","t":"1"},"action":{"identifier":"","name":"","category":"project","platform":"WND2"},"browser":{"url":"https:\/\/www.equifarm.cz\/restaurace-techtower\/","ua":"Mozilla\/5.0 (Macintosh; Intel Mac OS X 10_11_1) AppleWebKit\/601.2.4 (KHTML, like Gecko) Version\/9.0.1 Safari\/601.2.4 facebookexternalhit\/1.1 Facebot Twitterbot\/1.0","referer_url":"","resolution":"","ip":"172.225.104.230"}},
|
||||||
|
urlPrefix: "https://events.webnode.com/projects/-/events/",
|
||||||
|
collection: "PROD",
|
||||||
|
}</script></body>
|
||||||
|
</html>
|
||||||
@@ -87,6 +87,48 @@ describe('TechTower parser', () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('TechTower parser – nový formát 07/2026', () => {
|
||||||
|
// Pondělí 6.7.2026 (pondělí je svátek, hlavička začíná úterým "7. 7.-10. 7.")
|
||||||
|
const MONDAY_2026 = new Date('2026-07-06');
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
mockedAxios.get = jest.fn().mockResolvedValue({ data: loadFixture('techtower-2026-07.html') });
|
||||||
|
});
|
||||||
|
|
||||||
|
test('vrátí pole o délce 5', async () => {
|
||||||
|
const menu = await getMenuTechTower(MONDAY_2026);
|
||||||
|
expect(menu).toHaveLength(5);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('středeční menu obsahuje polévku a hlavní jídla s cenou', async () => {
|
||||||
|
const menu = await getMenuTechTower(MONDAY_2026);
|
||||||
|
// index 2 = středa (Boršč + hlavní jídla)
|
||||||
|
expect(menu[2].some(f => f.isSoup)).toBe(true);
|
||||||
|
expect(menu[2].some(f => !f.isSoup && f.price.includes('Kč'))).toBe(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('cena i alergeny jsou správně odděleny od názvu jídla', async () => {
|
||||||
|
const menu = await getMenuTechTower(MONDAY_2026);
|
||||||
|
const polevka = menu[2].find(f => f.isSoup);
|
||||||
|
expect(polevka).toBeDefined();
|
||||||
|
// "Boršč 1,7,9 — 45 Kč" → název bez ceny a bez alergenů, cena a alergeny zvlášť
|
||||||
|
expect(polevka!.name).not.toMatch(/Kč/);
|
||||||
|
expect(polevka!.name).not.toMatch(/\d/);
|
||||||
|
expect(polevka!.price).toContain('Kč');
|
||||||
|
expect(Array.isArray(polevka!.allergens)).toBe(true);
|
||||||
|
expect(polevka!.allergens!.length).toBeGreaterThan(0);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('nehodí StaleWeekError pro aktuální týden, i když pondělí je svátek', async () => {
|
||||||
|
await expect(getMenuTechTower(MONDAY_2026)).resolves.toHaveLength(5);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('hodí StaleWeekError pro jiný týden', async () => {
|
||||||
|
const jinyTyden = new Date('2026-06-01');
|
||||||
|
await expect(getMenuTechTower(jinyTyden)).rejects.toBeInstanceOf(StaleWeekError);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
describe('SenkSerikova parser', () => {
|
describe('SenkSerikova parser', () => {
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
// SenkSerikova parsuje arraybuffer – musíme vrátit Buffer, ne string
|
// SenkSerikova parsuje arraybuffer – musíme vrátit Buffer, ne string
|
||||||
|
|||||||
Reference in new issue
Block a user