Zobraziť značky podľa kategórie – Hugo

Cieľ

Chcem pridať možnosť zobraziť všetky použité značky (tags) zo všetkých príspevkov jednej kategórie (categories) do vybranej témy v generátore statických stránok Hugo .

Riešenie

Zapnúť kategórie

Najskôr musím zapnúť použitie „kategórie“ v konfiguračnom súbore config.toml v časti taxonomies, odobratím znaku mriežka zo začiatku riadku category. Kategória v tomto prípade je jedno z viacerých hľadísk, podľa ktorého môžem organizovať vytváraný obsah. Kategória je jedna zo základných taxonómii v Hugovi.

[taxonomies]
  tag = "tags"
  # Categories are disabled by default.
  category = "categories"

V tejto konkrétnej téme hermit je v predvolenom nastavení použitie kategórii vypnuté.

Vytvoriť nový shortcode

Vytvorím taký „filter“, ktorý najskôr vyberie všetky príspevky typu post, potom vyberie všetky príspevky danej kategórie podľa toho kde bude vložený (vyberá podľa .Page.Title), vytvorím novú premennú data a do nej vložím zoznam tag_list a do neho vkladám všetky značky z vybraných príspevkov. Ukladám ich s malými písmenami.

V druhej časti vytvorím z html značiek jednoduchý zoznam, kde každá položka bude jedna značka v podobe odkazu na samostatnú stránku so všetkými príspevkami kde sa daná značka vyskytuje plus počet príspevkov s danou značkou. Prechádzam všetkými použitými značkami na stránke a ak sa nachádza značka aj v zozname v premennej data zobrazím ju.

layouts/shortcodes/tags-from-categories.html

{{ $p := where site.RegularPages "Type" "posts" }}
{{ $p = where $p "Params.categories" "intersect" (slice .Page.Title) }}

{{ $data := newScratch }}
{{ range $p }}
    {{ $data.Add "tag_list" (apply .Params.tags "lower" ".") }}
{{ end }}

<div class="tagcloud01 related-posts">
    <h3>
        Použité značky
    </h3>
        <ul>
            {{ range $name, $taxonomy := .Site.Taxonomies.tags }}
                {{ if in ($data.Get "tag_list") (replace $name "-" " ") }}
                    <li><a href="/tags/{{ $name | urlize }}">#{{ $name | humanize }} ({{ $taxonomy.Count }})</a></li>
                {{end}}
            {{end}}
        </ul>
</div>

No po čase som si všimol, že zoznam značiek neobsahuje úplne všetky značky a po chvíli overovania som prišiel na to, že chýbajú značky obsahujúce v názve interpunkčné znamienka.

Nevymyslel ani nenašiel som žiadne čistejšie riešenie, ale len také, že pred vložením vyfiltrovaných značiek do premennej v nich nahradím písmena s diakritikou písmenami bez diakritiky. Čuduj sa svete, funguje to :)

layouts/shortcodes/tags-from-categories.html

{{ $p := where site.RegularPages "Type" "posts" }}
{{ $p = where $p "Params.categories" "intersect" (slice .Page.Title) }}

{{ $data := newScratch }}
{{ range $p }}
    {{ $temp := (apply .Params.tags "lower" ".") }}
    {{ $temp := ( apply $temp "replace" "." "á" "a") }}
    {{ $temp := ( apply $temp "replace" "." "ä" "a") }}
    {{ $temp := ( apply $temp "replace" "." "č" "c") }}
    {{ $temp := ( apply $temp "replace" "." "ď" "d") }}
    {{ $temp := ( apply $temp "replace" "." "é" "e") }}
    {{ $temp := ( apply $temp "replace" "." "í" "i") }}
    {{ $temp := ( apply $temp "replace" "." "ĺ" "l") }}
    {{ $temp := ( apply $temp "replace" "." "ľ" "l") }}
    {{ $temp := ( apply $temp "replace" "." "ň" "n") }}
    {{ $temp := ( apply $temp "replace" "." "ó" "o") }}
    {{ $temp := ( apply $temp "replace" "." "ô" "o") }}
    {{ $temp := ( apply $temp "replace" "." "ö" "o") }}
    {{ $temp := ( apply $temp "replace" "." "ő" "o") }}
    {{ $temp := ( apply $temp "replace" "." "ŕ" "r") }}
    {{ $temp := ( apply $temp "replace" "." "š" "s") }}
    {{ $temp := ( apply $temp "replace" "." "ť" "t") }}
    {{ $temp := ( apply $temp "replace" "." "ú" "u") }}
    {{ $temp := ( apply $temp "replace" "." "ü" "u") }}
    {{ $temp := ( apply $temp "replace" "." "ű" "u") }}
    {{ $temp := ( apply $temp "replace" "." "ý" "y") }}
    {{ $temp := ( apply $temp "replace" "." "ž" "z") }}
    {{ $data.Add "tag_list" $temp }}
    {{ end }}

<div class="tagcloud01 related-posts">
    <h3>
        Použité značky
    </h3>
        <ul>
            {{ range $name, $taxonomy := .Site.Taxonomies.tags }}
                {{ if in ($data.Get "tag_list") (replace $name "-" " ") }}
                    <li><a href="/tags/{{ $name | urlize }}">#{{ $name | humanize }} ({{ $taxonomy.Count }})</a></li>
                {{end}}
            {{end}}
        </ul>
</div>

Pridať oblak značiek na stránku

V poslednom kroku musím pridať novo vytvorený shortcode, respektíve odkaz na neho na konkrétne miesto na stránke kde sa má zobrazovať zoznam všetkých značiek použitých v príspevkoch danej kategórie.

...
{{< tags-from-categories >}}
...

Výsledok viď buď zoznam značiek použitých v príspevkoch z kategórie poznámky , alebo z kategórie recepty .


zw

Hugo

716 slov

2022-12-29 10:22 +0000

2023-01-15 15:45 +0000