Přeskočit na obsah

A603 — Zola

Jak generátor rozhoduje o routách, co umí load_data a pět pastí šablonovacího jazyka, na které v tomhle repozitáři každý najede.

A603Inženýrství 12 minVývojář

Po téhle lekci

  • Vysvětlíte, jak vzniká routa a proč potřebuje soubor v content/.
  • Použijete load_data k načtení konfigurace do šablony.
  • Vyhnete se pěti známým pastím šablonovacího jazyka.

Zola je statický generátor. Podstatné pro tenhle projekt: routa vzniká ze souboru v content/. To je celý důvod, proč existují generované adaptéry — kanonická data jsou JSON a Zola z JSON routu neudělá.

Sekce a stránky

_index.md dělá sekci (má pages, subsections), ostatní soubory jsou stránky. Šablona sekce k nim přistupuje přes section.pages, stránka ke své sekci přes get_section(path=…).

load_data

Načte TOML/JSON přímo v šabloně:

{% set learning = load_data(path="data/learning.toml") %}

Díky tomu můžou být popisky, pořadí a ikony v datech, ne v markupu. Používá to navigace, metadata i tahle vzdělávací vrstva.

Pět pastí

Komponenty

Shortcodes od Zoly 0.23 neexistují. Nahradily je komponenty, které jdou volat v šablonách i uvnitř markdownu:

{% component callout(kind="poznamka", title="") -%}
  …markup…
{%- endcomponent %}

Volání bez těla je {{ <callout kind="priklad" /> }}, s tělem {% <callout kind="priklad"> %}…{% </callout> %} — tělo je uvnitř dostupné jako body a markdown v něm vykreslí filtr markdown.

Nestringový argument patří do složených závorek: poradi={3}, polozky={seznam}. Řetězcový literál je bez nich.

Soubor komponentu nikam neregistruje — jméno je globální, takže dvě komponenty stejného jména kolidují. Sdílené komponenty v macros/ proto nesou prefix podle role (ui_, table_, meta_, nav_, …); komponenty v components/, které volá autor obsahu z markdownu, zůstávají bez prefixu a krátké (callout, kontrola, prikaz).

Dvě věci, které při migraci tohohle webu ověřoval a na které nenarazil — aby je nikdo nemusel odvozovat znovu:

  • Volání bez těla nefunguje v markdownu. {% <prikaz a="1" /> %} skončí na «Found / but expected >». Beztělové volání jde jen ve výrazu uvnitř šablony ({{ <prikaz a={v} /> }}). Cokoli volá autor obsahu, musí proto brát svůj obsah jako tělo. V content/ tohohle webu není ani jedno beztělové volání — všechna jsou párová.
  • **| default(value=…) se nespustí, když volající pošle doslovné "".** Prázdný řetězec je hodnota, ne chybějící klíč, takže se vykreslí prázdno bez chyby. Prošlo se 46 komponent, z nichž 9 nějaký parametr přes defaultprotahuje; žádné volání jim""` nepředává. Tady to tedy neškrtlo — ale je to stejná třída chyby jako past 5.

Obsah stránek se navíc od 0.23 pouští přes Teru před parsováním markdownu. Doslovný příklad šablonového jazyka v textu proto musí být obalený blokem raw / endraw — starý escape {%/* … */%} už neexistuje. (Tenhle odstavec ho proto pojmenovává, místo aby ho ukazoval: raw uvnitř raw se ukončí tím prvním endraw, na který narazí.)

Ověř si, že to sedí

Přidáte novou stránku pod content/, ale na webu se neobjeví. Čím začít?

Zobrazit odpověď

Třemi věcmi, v tomhle pořadí:

  1. Šablona v hlavičce. Chybějící nebo překlepnutá template znamená, že se stránka vykreslí výchozí šablonou — nebo že sestavení spadne.
  2. Je nadřazená sekce sekcí? Bez _index.md v adresáři Zola stránky uvnitř nesbírá a section.pages je nenajde.
  3. Neskončila v generovaném rozsahu? Pokud jste ji položili pod content/dossiers/** nebo content/entities/, synchronizace ji při dalším sestavení smaže — tam patří jen generované adaptéry.

Když sestavení projde a stránka existuje v public/, ale není vidět v navigaci, je to jiný problém: navigační strom se generuje z dat a novou stránku musí zahrnout příslušný generátor.

Kanonické znění pojmů

Lekce pojem vysvětluje. Závazná definice je tady — když se rozejdou, platí tahle stránka.