Update: 11.02.2022 – Bash-Scripte gefixt, damit sie auch Tags und Kategorien mit Bindestrichen anzeigen.

Vorab: Das hier ist sehr hacky. Aber ich habe leider keine entsprechenden Kenntnisse, um das richtig umzusetzen. Und da ich ein fauler Mensch bin, reicht mir die beschriebene Lösung aus, um mein Problem zu lösen. Wer etwas Würde hat, macht jetzt am besten diesen Beitrag wieder zu :P

Was will ich überhaupt lösen?§

Mein Problem: In WordPress kann man beim Einfügen von Tags in einen Beitrag direkt Vorschläge sehen, die zum eingegebenen String passen. So wird verhindert, dass es irgendwann verschiedene Schreibweisen von Tags gibt und man immer die selben Tags verwendet.

In Hugo gibt es das natürlich nicht. Zumindest habe ich dazu nichts gefunden. Deshalb möchte ich eine Liste aller Tags angezeigt bekommen, die bisher allen vorhandenen Blogbeiträgen verwendet wurden und dazu auch noch die Anzahl der Vorkommen.

Ich könnte jetzt anfangen, $Suchmaschine zu benutzen und mir in Python irgendwas zusammen zu coden. Ich bin für die einfachere Möglichkeit. Denn schließlich zeigt das bei mir im Blog verwendete Theme bereits die Tags und Kategorien an und und sogar, wie oft diese verwendet wurden. Hugo kann also die Arbeit für mich machen.

Die Ideallösung wäre, wenn ich eine json-Datei erstellen lassen könnte mit diesen Informationen. Wie man so etwas macht, konnte ich leider nicht herausfinden. Ich bin Anwender, kein Programmierer.

Ultra hacky ab jetzt :P§

Letzte Warnung: Mach hier zu, wenn du noch etwas Würde behalten möchtest :)

Zuerst erstellt man einen Shortcode in layouts/shortcodes/ mit dem Namen _internal-cats-tags.html mit folgendem Inhalt:

{{ range $.Site.Taxonomies.categories.ByCount }}
internal_category:{{ .Name }}:{{ .Count }}:
{{end}}

{{ range $.Site.Taxonomies.tags.ByCount }}
internal_tag:{{ .Name }}:{{ .Count }}:
{{end}}

Es ist Absicht, dass hier eine Textliste und kein HTML generiert werden soll. So muss man später weniger filtern.

Danach erstellt man in contents/ eine Datei _internal_cats_tags.md mit diesem Inhalt:

---
title: internal-only-cats-tags
date: 2022-02-08T02:43:20+01:00
draft: true
---
{{ < _internal-cats-tags > }}

Die Datei ist absichtlich auf Entwurf (draft: true) eingestellt, um niemals nicht auf dem Webserver zu landen.

Dann lässt man Hugo die ganze Website rendern und erhält die Datei public/_internal_cats_tags/index.html.

Ergebnis§

So sieht die generierte Seite aus:

Von Hugo generierte Liste von Kategorien und Tags und deren verwendete Häufigkeit
Von Hugo generierte Liste von Kategorien und Tags und deren verwendete Häufigkeit

Und so sieht der Quelltext aus:

[…]
internal_category:643:allgemein:
internal_category:416:mobilität:
internal_category:332:fotografie:
internal_category:326:mumble:
internal_category:274:musik:
[…]
internal_tag:761:open-source:
internal_tag:525:fahrrad:
internal_tag:368:fotos:
internal_tag:348:creative-commons:
internal_tag:335:mumble:
internal_tag:326:mobilität:
internal_tag:292:musik:[…]

Aus dieser Seite kann man nun die Daten filtern.

Daten filtern und in neue Dateien schreiben§

Jetzt kann man die Kategorien und die Tags herausfiltern und in neue Datien schreiben.

Nach Kategorien filtern§

grep -i -E "^internal_category:[0-9]{1,4}:[a-z0-9-]*:$" public/_internal_cats_tags/index.html | sort -r -V | uniq | cut -d':' -f2,3 > _list-categories.txt

Ergebnis:

643:allgemein
416:mobilität
332:fotografie
326:mumble
274:musik
225:linux
162:web
94:android
66:spiele
34:linkdump

Tags§

grep -i -E "^internal_tag:[0-9]{1,4}:[a-z0-9-]*:$" public/_internal_cats_tags/index.html | sort -r -V | uniq | cut -d':' -f2,3 > _list-tags.txt

Ergebnis:

525:fahrrad
368:fotos
335:mumble
326:mobilität
292:musik
256:linux
241:pforzheim
215:videos
213:natur
206:filme
[...]

Helfer für die Bash§

In die .bashrc kommt hinein:

export HUGO_WORKDIR="/home/blog.natenom.com-hugo"

function hugo-check-and-write-cats-tags (
    cd $HUGO_WORKDIR
    test -f public/_internal_cats_tags/index.html && \
        grep -i -E "^internal_category:[0-9]{1,4}:[a-z0-9]*:$" public/_internal_cats_tags/index.html | sort -r -V | uniq | cut -d':' -f2,3 > _list-categories.txt && \
        grep -i -E "^internal_tag:[0-9]{1,4}:[a-z0-9]*:$" public/_internal_cats_tags/index.html | sort -r -V | uniq | cut -d':' -f2,3 > _list-tags.txt && \
        echo "Updates written" || \
        echo "File is not available, no updates."
)

alias hugo-search-tags='cd $HUGO_WORKDIR; cat _list-tags.txt | grep -i '
alias hugo-search-categories='cd $HUGO_WORKDIR; cat _list-categories.txt | grep -i '

Wenn ich den Eindruck habe, dass die extrahierten Daten veralten sein könnten, rufe ich in der Shell hugo-check-and-write-cats-tags auf, sobald die komplette Website generiert wurde.

Suchfunktion§

Jetzt kann ich nach Tags suchen:

$ hugo-search-tags oliz
66:polizei
3:polizeipräsidium
2:polizeipräsidentin

Und nach Kategorien:

$ hugo-search-categories ""
643:allgemein
416:mobilität
332:fotografie
326:mumble
274:musik
225:linux
[]

Und im KDE Advanced Text Editor (kate) kann ich dann direkt mit F4 eine Konsole öffnen und nach Kategorien und Tags suchen, während ich das Front Matter bearbeite.

Kate Editor mit einer geöffneten Shell zur Suche nach Kategorien und Tags.
Kate Editor mit einer geöffneten Shell zur Suche nach Kategorien und Tags.

Später§

Und irgendwann mal, später, also irgendwann später, mache ich das dann auch so, dass man sich nicht für die Lösung schämen muss. Ganz bestimmt.