Cesta ven se dodává s ním

Díl 2 ze 9 — ./blog.sh v1.3

Engine, který ti nedokáže vrátit tvoje psaní, je hostingová služba s kroky navíc. Importéry vždy mířily jedním směrem – dvaadvacet zdrojů, všechno domů. ./blog.sh export je druhý směr a měl tu být jako první.

Co vyjde ven

Celý archiv jako strom markdownových souborů s hlavičkou YAML, v rozvržení, které čte Jekyll: _posts/2026-05-01-slug.md, _drafts/, stránky v kořeni, média pod assets/<rok>/<slug>/. Staré adresy cestují jako redirect_from, v tvaru, kterému plugin jekyll-redirect-from už rozumí, se sloučením obou druhů – kde příspěvek bydlel na platformě, ze které přišel, a kde bydlel tady před přejmenováním. Namiř na tu složku statický generátor a sestaví se.

./blog.sh export ~/my-blog-export        # všechno, včetně draftů
./blog.sh export ~/public-copy --no-drafts
./blog.sh export ~/somewhere --dry-run   # spočítá, nezapíše nic

Tento web, spočítaný, ne zapsaný:

Zapsalo by se do /tmp/bsexport — postů: 43, rozepsaných: 0, stránek: 0,
souborů médií: 24 (27.6 MB).
Bloků, pro které markdown nemá zápis: 9 — zapsaly se jako HTML (link (6),
audio (1), file (1), video (1)). Každý engine, který HTML propouští, je
vykreslí, a tenhle engine je přečte zpátky celé — každý si nad sebou nese
vlastní zápis v komentáři, který všichni ostatní ignorují.

Rozvržení je jekyllovské: _posts/, _drafts/, stránky v kořeni, média pod
assets/. Hugo, Eleventy i Astro ho přečtou po jednom řádku konfigurace;
./import.sh ho přečte tak, jak je.

Pro co markdown nemá slovo

Pro spoustu věcí. Příloha s popiskem a velikostí, video s náhledem, galerie, embed – markdown nemá zápis pro nic z toho. Ty bloky odcházejí jako HTML se svou definicí v komentáři nad sebou:

<!-- blogsh:block {"type":"file","label":"..."} -->

Každý jiný nástroj vidí obyčejné HTML a vykreslí ho. ./import.sh přečte komentář a dostane blok zpět celý. To je rozdíl mezi exportem, který tě nechá odejít, a exportem, který tě nechá přestěhovat se: export z jednoho stroje, import na druhém, a instalace dorazí s přílohami, které jsou pořád přílohy.

Čte archiv, ne web

Žádné sestavení, žádná síť, žádný env.sh. Projde content.nosync/ a zapíše. Což znamená, že funguje v den, kdy se konfigurace přestane dát rozebrat, na serveru, ze kterého tě vystěhovávají, na klonu, který jsi našel v záloze – ve chvílích, kdy potřeba exportu není hypotetická.

Jediná pojistka: adresář, ve kterém už něco je, se odmítne, dokud příkaz nezopakuješ s --force, které pak zapíše vedle toho, co tam je. Export nikdy nic nemaže, na žádném konci. Adresář držící jen soubory s tečkou se počítá jako neprázdný – čerstvě naklonovaný repozitář se dřív četl jako prázdný a zapisovalo se do něj bez --force, které ta pojistka existuje proto, aby vyžadovala.

Proč je to v enginu, a ne ve skriptu

Protože nástroj, který nikdo neudržuje, je slib, který nikdo nedodrží. Cesta tam a zpět – export, nový import, porovnání pole po poli – je v sadě testů a své místo si tam vysloužila okamžitě: první poctivý běh zjistil, že příloha se vrátila domů jako odstavec s odkazem v něm. Popisek pryč, velikost pryč, typ bloku pryč, soubor osiřelý ve stromu. Nic ztrátu nehlásilo, protože oba konce fixtury byly moje.

To je argument pro dodávání východu s enginem. Cesta ven, kterou nikdo nikdy neprojde, není cesta ven – a projít tuhle, pole po poli proti tomu, co vešlo, je jediný důvod, proč se ta vada kdy našla.

Komentáře