Série./blog.sh v1.39

./blog.sh 1.3

./blog.sh v1.3 — díl 1 z 9

./blog.sh 1.3 je venku.

Obléci web už neznamená upravovat engine: vlastní stylesheet, menu, postranní panel a úvodní obrázky jsou teď nastavení. Příspěvky se seskupují do sérií, stránky vystupují z proudu a každá úprava si nechává verzi před sebou.

A tři příkazy, které čtou celý archiv: check hlásí, co je rozbité, stats počítá, co tam je, a export to všechno zabalí do rozvržení Jekyllu. Cesta ven se dodává s ním.

#blogsh #ruby #staticsite

Cesta ven se dodává s ním

./blog.sh v1.3 — díl 2 z 9

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ě konceptů
./blog.sh export ~/public-copy --no-drafts
./blog.sh export ~/somewhere --dry-run   # spočítá, nezapíše nic

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

Číst dál

Ohvězdičkuj to a zveřejní se to

./blog.sh v1.3 — díl 3 z 9

Komentáře pod těmihle příspěvky jsou odpovědi na toot. To byl celý systém od začátku a jeho jediné slabé místo bylo vždy to, že je to všechno, nebo nic: objeví se každá odpověď, nebo jsou komentáře vypnuté.

comments.approval: fav je třetí odpověď. Odpověď se pod článkem objeví, jakmile ji označím jako oblíbenou, z kteréhokoli klienta, který mám zrovna otevřený.

Žádná fronta, žádný panel

To je smysl toho dělat to takhle. Moderační fronta je druhé rozhraní, s druhým přihlášením, kam chodíš zvlášť – což znamená, že tam chodíš pozdě, nebo vůbec. Tady je rozhraním aplikace, ve které komentáře už bydlí. Odpověď čtu tam, kde bych ji četl tak jako tak, a schválení je jedno ťuknutí na témže místě.

Dvě pravidla drží výsledek čitelný, ne jen přefiltrovaný. Moje vlastní odpovědi hvězdičku nepotřebují, protože nikdo si nehvězdičkuje sám sebe a polovina každé výměny by jinak zmizela. A odpověď se ukáže, jen když se ukáže i všechno mezi ní a oznámením – schválená odpověď na zamítnutý komentář neodpovídá na nic.

Co to stojí, a ty ceny jsou skutečné

Číst dál

Co potichu hnije

./blog.sh v1.3 — díl 4 z 9

./blog.sh doctor se ptá, jestli je instalace v pořádku, a trvá to vteřinu. Nemá co říci k archivu čtyř tisíc příspěvků, ve kterém se jeden obrázek nikdy nestáhl, tři trvalé odkazy nikam nevedou a dva příspěvky si nárokují tutéž starou adresu.

./blog.sh check to všechno projde a řekne.

Co hledá

Každý nález pojmenuje příspěvek a slug – něco, kam jít a co opravit – a nese řádek, co s tím udělat.

Číst dál

Skin, který přežije git pull

./blog.sh v1.3 — díl 5 z 9

Obléci web jinak dřív znamenalo upravit soubor, který vlastní engine. Fungovalo to, přesně do příštího git pull, což je chvíle, kdy zjistíš, že přizpůsobení a aktualizace byly celou dobu týž soubor.

Čtyři věci, které potřebovaly upravenou šablonu, jsou teď nastavení.

Oba tyhle weby jsou tento engine, sestavený z téhož commitu téhož večera:

Číst dál

Import jen a pouze přidává

./blog.sh v1.3 — díl 6 z 9

Nový import archivu býval věc, kterou jsi dělal opatrně, v noci, po záloze. Běh šel a stáhl každý obrázek znovu – obrázky, které archiv už držel, bajt po bajtu – a každé z těch stažení dopadlo na soubor, který už byl správně.

To je opraveno a oprava je jedna věta: identita souboru médií je adresa, ze které přišel.

Archiv už to ví

Každá položka médií si zapisuje svůj src. Nový import porovná, co zdroj nabízí, s tím, co archiv drží, a stáhne jen to, co chybí. Nad úplným archivem to není vůbec nic – druhý běh téhož importu nestáhne jediný obrázek a v souhrnu to řekne.

Zdroj sám se pořád čte, a to je poctivá hranice toho tvrzení: export ležící na tvém disku nestojí nic, zatímco feed nebo API se stahuje pokaždé, protože jinak nejde zjistit, jestli se něco změnilo.

Tady je skutečný import z Ghostu spuštěný podruhé nad archivem, který ho už drží:

Číst dál

Deset verzí zpět

./blog.sh v1.3 — díl 7 z 9

Engine nikdy neměl krok zpět. Úprava příspěvku přepsala jeho soubor a to, co příspěvek říkal před hodinou, bylo pryč – ne proto, že by se něco pokazilo, ale protože uložení je uložení.

Teď se předchozí text před každým přepsáním uchová a [v] ve vlastnostech příspěvku jeden vrátí.

Před každým přepsáním, ne jen před úpravou

Nový import je také přepsání, a to se ukazuje jako případ, kde si tohle vydělá na živobytí. Upravit příspěvek ručně je záměr; znovu naimportovat zdroj přes příspěvek, který jsi od té doby uklidil, je nehoda, která sní večer práce, a až dosud byla jedinou záchranou záloha.

Deset na příspěvek, nejnovější první.

Vybraná poznáním, ne čtením času

Seznam je takový, jakým procházíš každý jiný seznam v průvodci, a řádek pod kurzorem ukazuje, co ta verze říkala – její titulek, nebo úvodní slova, když žádný nemá. Deset časových údajů ti neřekne nic o tom, která je ta verze, kterou chceš. Deset úvodních vět ti to řekne okamžitě.

Číst dál

Moje fixtury se mnou souhlasily

./blog.sh v1.3 — díl 8 z 9

Importéry měly dobrou sadu testů. Každý zdroj měl fixtury, fixtury se rozebraly, výsledky se ověřily a všechno procházelo.

Pak jsem importéry pustil přes tři archivy, které jsem nevytvořil já: export z Ghostu se 118 příspěvky a 419 obrázky, strom Huga se 77 soubory a WordPress WXR se 194 položkami. Vedle nich čtvrtý, který je celý můj – vlastní export tohoto enginu, načtený rovnou zpět – protože ten se neptá, jestli kód přežije cizího člověka, ale jestli se obě půlky cesty tam a zpět pořád shodují.

Ty tři cizí ale byly pointa. Fixtury s kódem souhlasily, protože oba jejich konce jsou moje.

Obrázek, který nikdo nestáhl neúspěšně

{{< figure >}} je způsob, jakým Hugo zapisuje obrázek, a odstraňovač Liquidu ho snědl jako značku Liquidu. Oba, které v tom archivu byly, mířily na soubory ležící hned vedle článku v jeho svazku stránky: nic ke stažení, nic, co by mohlo selhat, a byly pryč bez řádku v souhrnu – protože je nikdo nezkusil stáhnout, a tak nikdo neselhal.

To je tvar každého nálezu v tomhle průchodu. Ne pády. Ticho.

Číst dál

Deset menších věcí

./blog.sh v1.3 — díl 9 z 9

Zbytek tohoto vydání je deset přírůstků, z nichž každý potřebuje odstavec, ne příspěvek.

Stránky

page: true dá příspěvku trvalou adresu v kořeni – /about/ – mimo výpisy a feedy, ale v sitemapě a v indexu hledání. Ghost, WordPress, Squarespace a Substack je teď importují jako stránky, místo aby je přeskočily, a import řekne, kde přistály a že na ně zatím nic neodkazuje. Engine za tebe položku nav: nenapíše; kam stránka patří v tvém menu, je tvoje rozhodnutí.

Série

series: seskupuje příspěvky a series_part: řadí ten, který jsi publikoval mimo pořadí. Každá série dostane výpis a každý příspěvek v ní odkazuje na předchozí a další díl – jen uvnitř série, nikdy se nepřelévá do archivu okolo. Náhled konceptu říká, jestli se jméno jeho série připojuje k něčemu, co existuje, nebo zakládá něco nového, takže překlep se chytí, dokud je ještě zadarmo opravit.

Mimo výpisy

Číst dál