Keď sa učíme nové veci, zo začiatku to vždy ide pomaly a postupne sa tempo zvyšuje spolu s napredovaním na krivke učenia. Nakoniec každý ďalší nástroj vo výbave vývojára pomáha z dlhodobého hľadiska. Dnes som sa ponoril hlbšie do ďalšieho šablónovacieho enginu nazvaného Tera.
Tera je šablónovací engine pre Rust inšpirovaný jinja, ktorý bol pôvodne vytvorený pre Python. O jinja som písal pred niekoľkými mesiacmi, prevažne pod tagom ansible, keďže ansible používa jinja ako svoj šablónovací engine. Jinja a Tera sú si dosť podobné, hoci Tera nie je prezentovaná ako plne kompatibilná s predchodcom, jinja. V každom prípade, pre môj cieľ postupne preniknúť do Rustu sa učenie Tera javí ako zmysluplná vec. Zatiaľ som nenašiel žiadnu prekážku, prečo by Zola nemohla byť mojím hlavným SSG nástrojom pre blog, a vyzerá to tak, že niektorí ľudia si začínajú všímať moju prácu, čo sú ďalšie dôvody pokračovať.
Čo je archív #
Archív je zoznam všetkých príspevkov, zvyčajne zoskupených podľa nejakého časového obdobia, napríklad roka alebo mesiaca. Takýto zoznam je podľa mňa dosť dôležitý, keďže mi umožňuje jednoducho zmerať, čo som urobil, a navyše uľahčuje vizuálne vyhľadávanie. Bohužiaľ, nevedel som, ako hľadať návod na implementáciu takejto funkcie, hoci by to mohlo byť celkom zrejmé.
Zvyčajne prechádzam issues repozitára podľa kľúčových slov. Keďže som
nevedel, že hľadám kľúčové slovo archive, najlepšie, čo som našiel, bolo
v
#435.
Riešenie som tam nenašiel. Po niekoľkých dňoch ticha som náhodou objavil
dokumentáciu archívu Zola,
ktorá ma posunula ďalej. Najdôležitejšia časť kódu je táto:
{% for year, posts in section.pages | group_by(attribute="year") %}
...
{% endfor %}
Nebol to hotový snippet na priame použitie, niektoré časti chýbali, ale aspoň som vedel, čo hľadať.
Získanie správnych stránok #
Keďže môj hlavný _index.md už zobrazoval stránkované výsledky, musel som
nájsť iný spôsob, ako získať všetky príspevky a vytvoriť ich zoznam. Ďalšiu
nápovedu som našiel v
#628 v
podobe get_section(), konkrétne:
{% set s = get_section(path="posts/_index.md") %}
Konečne som mal spôsob, ako získať všetky stránky a niečo s nimi urobiť.
Triedenie výsledkov #
Stránky získané týmto spôsobom však neboli zoradené. Nastavenie
sort_by = "date" v archive/_index.md nemalo žiadny efekt, čo som
nečakal. Podarilo sa mi ich zoradiť pomocou filtrov Tera, konkrétne cez
sort(attribute="date"). Kompletná funkčná šablóna
templates/archive.html vyzerá takto:
{% extends "index.html" %}
{% block content %}
{% set section = get_section(path="blog/_index.md") %}
{% for year, posts in section.pages
| sort(attribute="date")
| reverse
| group_by(attribute="year") %}
<div class="archive">
<h2>{{ year }}</h2>
<ul>
{% for post in posts %}
<li>
<time>{{ post.date | date(format="%d-%h") }}</time>
<a href="{{ post.permalink }}">{{ post.title }}</a>
</li>
{% endfor %}
</ul>
</div>
{% endfor %}
{% endblock content %}
Aby ste výsledky skutočne videli, spomínaný archive/_index.md funguje
odkazom na túto šablónu:
+++
template = "archive.html"
+++
Žiadny iný kód nie je striktne potrebný, hoci nejaké štýlovanie určite pomôže. Výsledok je možné pozrieť v Archíve.