Pri budovaní statickej stránky so Zolou je jedným z bežných problémov
objavenie nefunkčných interných odkazov až po nasadení. Externé odkazy
smerujúce na váš vlastný obsah (napríklad
[príspevok](/blog/moj-prispevok/)) sú Zolou považované za externé, čím sa
prichádza o cennú príležitosť na validáciu. Tu je postup, ako som
skonvertoval všetky externé sebareferencujúce odkazy na správne interné a
aké výhody to prinieslo.
Externé odkazy tváriacé sa ako interné #
Spočiatku moje blogové príspevky obsahovali takéto odkazy:
[dôležitý príspevok](/blog/insights-google-search-console/#trailing-slash-inconsistency)
[súvisiaci článok](/blog/using-uuid-in-atom-feed/#url-vs-urn-which-one-to-choose)
Hoci pre čitateľov fungujú dobre, Zola ich považuje za externé, pretože
začínajú na /. To znamená:
- Žiadna validácia odkazov počas buildovania
- Žiadna kontrola kotiev
- Potenciál pre nefunkčné odkazy, ktoré prejdú nepovšimnuté
Nie som si istý, ako mi to uniklo až teraz. Ale hej, každý deň sa niečo naučíme!
Nezrovnalosť pri kontrole odkazov #
Tento problém som skutočne objavil pri spustení zola check:
Checking site...
Checking all internal links with anchors.
> Successfully checked 1 internal link(s) with anchors.
Rovnaký výstup sa objavuje aj pri zola build alebo zola serve, ale kto
to číta, keď nie sú žiadne červené chyby, však? Keď som však hľadal všetky
interné odkazy s kotvami:
rg '\[([^\]]+)\]\((/blog/[^)]+)\)' | rg '#'
Našiel som 6 rôznych odkazov, nie jeden! Nezrovnalosť odhalila, že len jeden odkaz bol považovaný za skutočne interný — sebareferencujúci kotevný odkaz:
[Databáza Postgres](#postgres-database)
Jasne mi niečo unikalo.
Konverzia na Zolinu interného odkazu syntaxu #
Zola poskytuje špeciálnu syntax pre interné odkazy pomocou @/, ktorá
umožňuje správnu validáciu. Potreboval som konvertovať odkazy z:
[text](/blog/nazov-prispevku/#kotva)
Na:
[text](/blog/nazov-prispevku/#kotva)
Takto je to trochu ťažšie, pretože musíte odkazovať na skutočný fyzický súbor, nie len na URL, ktorá mu bude priradená. Má to však zmysel, keďže URL môže byť konfigurovaná a menená podľa vôle.
Krok 1: Folderizácia príspevkov #
Keďže niektoré moje príspevky boli už v priečinkoch (kvôli obrázkom) a iné nie, najprv som zjednotil štruktúru “folderizáciou” všetkých príspevkov pomocou skriptu, ktorý používam:
#!/bin/bash
for file in content/blog/*.md
if test -f "$file" && not string match -q "*/index.md" "$file"
filename=$(basename "$file" .md)
mkdir "content/blog/$filename"
mv "$file" "content/blog/$filename/index.md"
end
end
Predtým štruktúra priečinkov vyzerala takto:
content/blog/
├── setting-url-prefix-in-zola.md
├── using-electronic-id-on-arch.md
├── optimize-many-pdfs-at-once.md
├── high-cpu-usage-with-pcscid.md
├── install-php7-with-composer.md
└── running-mastodon-with-docker/ # už folderizovaný
└── index.md
└── docker.png
Po zjednotení bola konzistentná:
content/blog/
├── setting-url-prefix-in-zola/
│ └── index.md
├── using-electronic-id-on-arch/
│ └── index.md
├── optimize-many-pdfs-at-once/
│ └── index.md
├── high-cpu-usage-with-pcscid/
│ └── index.md
├── install-php7-with-composer/
│ └── index.md
└── running-mastodon-with-docker/ # nezmenený
└── index.md
└── docker.png
Je to dôležité aj preto, lebo pri písaní interného odkazu si pravdepodobne nepamätáte, či je príspevok “folderizovaný” alebo nie. Konzistentnosť odstraňuje potenciálne problémy a znižuje mentálnu záťaž. Zároveň zjednodušuje ďalší krok a zabraňuje regulárno-výrazovému peklu.
Krok 2: Konverzia odkazov #
Po niekoľkých iteráciách bol finálny funkčný príkaz pre fish shell:
sd '\[([^\]]+)\]\(/blog/([^/)]+)/?(\)|#[^)]*\))' '[$1](@/blog/$2/index.md$3' content/blog/**/*.md
Čo robí:
\[([^\]]+)\]— zachytáva text odkazu\(/blog/([^/)]+)/?— zodpovedá/blog/nazov-prispevkus voliteľným lomítkom na konci(\)|#[^)]*\))— zachytáva buď)alebo#kotva)- Nahrádza správnou Zolinou syntaxou interného odkazu
Čomu zabraňuje:
-
Odstraňovaniu koncovej interpunkcie: Príliš jednoduché regulárne výrazy zachytávali čiarky a inú interpunkciu
-[nemohol som písať z telefónu](/blog/prispevok/), +[nemohol som písať z telefónu](@/blog/prispevok.md) -
Zodpovedaniu externých URL: Príliš všeobecné regulárne výrazy zodpovedali
/blog/v externých URL akohttps://docker.com/blog/prispevok, čím vznikali deformované odkazy:could not parse domain `https://www.docker.com@/blog/post/index.md` from link: `empty host`
Spustenie zola check bolo úspešné, git diff vyzeralo dobre, takže to
pre môj prípad použitia vyzerá správne.
Robustná validácia odkazov #
Po konverzii zola check --skip-external-links teraz správne validuje
všetky interné odkazy:
Checking all internal links with anchors.
> Successfully checked 7 internal link(s) with anchors.
-> Site content: 236 pages (0 orphan), 3 sections
Done in 74ms.
Výstup je trochu zavádzajúci. Uvádza, že kontroluje 7 interných odkazov,
ale v skutočnosti kontroluje všetky interné odkazy! Len uvádza, že zo
všetkých interných odkazov 7 z nich má aj kotvu, ktorá sa ďalej kontroluje
— čiže nie len to, že odkazovaná stránka existuje, ale aj to, že nadpis je
dostupný cez svoju kotvu. Skúste vložiť preklep do interného odkazu bez
kotvy a spustite zola build:
Building site...
Error: Failed to build the site
Error: Failed to render content of ~/my-blog/content/blog/moj-prispevok/index.md
Error: Reason: Broken relative link `@/blog/iny-prispevok/CHYBA-index.md` in blog/moj-prispevok/index.md
Vidíte? Veľmi dobré na včasné odhalenie chýb.
Kľúčové výhody #
- Validácia odkazov počas buildu — Zola teraz zachytáva nefunkčné interné odkazy počas buildu, čím zabraňuje nasadeniu nefunkčných stránok.
- Overenie kotiev — Systém validuje, že odkazované kotvy skutočne existujú v cieľových príspevkoch.
- Bezpečnosť pri refaktorovaní — Pri premenovaní príspevkov alebo reštrukturalizácii obsahu Zola zachytí nefunkčné interné referencie.
- Konzistentná štruktúra — Všetky interné odkazy teraz sledujú rovnaký
vzor
@/blog/prispevok/index.mdbez ohľadu na pôvodnú štruktúru súborov. - Dôvera pri vývoji — Žiadne hádanie, či interné odkazy fungujú — proces buildu to garantuje.
Záver #
Konverzia externých sebareferencujúcich odkazov na Zolinu syntax interných odkazov mení správu odkazov z manuálneho, chybového procesu na automatizovaný, validovaný systém. Počiatočné nastavenie vyžaduje trochu práce s regulárnymi výrazmi, ale dlhodobé výhody zachytávania nefunkčných odkazov počas buildu ďaleko prevyšujú vynaložené úsilie.
Ak prevádzkujete stránku na Zole s internými odkazmi, dôrazne odporúčam vykonať túto konverziu. Vaše budúce ja vám poďakuje pri refaktorovaní obsahu alebo reštrukturalizácii stránky. Vychutnajte si!