Cesta ven se dodává s ním
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