Aufgabenstellung für eine Hugo-Seite war: Ein Faulpelz möchte nicht gerne eine weitere Shortcode-Datei anlegen, sondern einen Code direkt im Content einsetzen, der normalerweise nur Hugo-Templates (Partials, Shortcodes etc.) vorbehalten ist (nur dort lauffähig ist). Hier können die Hugo-eigenen .inline-Shortcodes ins Spiel kommen. Eigentlich trivial, aber zum heutigen Tag (26.3.2022) mager dokumentiert.

Hinweis zur Sicherheit

Hugo hat dieses Feature in der Grundkonfiguration aus Sicherheitsgründen deaktiviert. Wer in seiner Hugo-Umgebung alleine ist bzw. nur vertrauenswürdige, Content-erstellende Mitarbeiter hat bzw. die erstellten .inline-Codes prüft, bevor die fertiggestellte Seite online geht und bevor ein so eventuell eingebastelter Schadcode Opfer unter Seitenbesuchern finden könnte, der kann dieses feine Feature getrost aktivieren.

Feature aktivieren

In der relevanten, globalen Hugo-Haupt-Konfigurationsdatei setze ich den Parameter enableInlineShortcodes auf true. Bei mir ist das eine YAML-Datei namens config.yml, die sowohl in Production- als auch Development-Umgebung verwendet wird:

enableInlineShortcodes: true

So wird die Hugo-Grundkonfiguration überschrieben, die sich als Unterparameter im security-Block befindet. Wenn man eh einen solchen in seiner Konfigurationsdatei hat, wäre also auch Folgendes möglich:

security:
  enableInlineShortcodes: true
--- WEITERES ZEUGS ---

Wenn diese Konfiguration nicht stimmt, tut Hugo übrigens gar nichts. Der Beispiel-Code unten wird ohne jegliche Rückmeldung beim Rendern entfernt und auf der fertigestellten HTML-Seite ist nix davon zu sehen.

Der Grundcode

Diesen setzt man in seine Markdown- bzw. Hugo-Content-Datei ein.

{{< wasimmerauch.inline >}}
{{ now }}
{{< /wasimmerauch.inline >}}

In der zweiten Zeile findet sich ein {{now}}. Das dient nur zu Demozwecken, dass der in den äußeren Shortcode-Klammern enthaltene Code tatsächlich ausgeführt wird. Wären sie nicht da, würde auf der fertiggestellten HTML-Seite schlicht {{now}} zu sehen sein.

Wie das wasimmerauch schon andeutet, kann man nahezu jedweden Bezeichner vor dem .inline verwenden. Hauptsache er wird dann auch in der schließenden, letzten Zeile identisch verwendet.

Und man kann in ein und der selben Content-Datei den selben Bezeichner mehrfach verwenden. Nur selten muss man aufpassen. Nicht Thema hier.

Die Ausgabe auf der fertiggestellten Seite sieht bei mir dann etwa so aus: 2022-03-28 18:53:11.5033243 +0200 CEST m=+137.467685901.

Selbstverständlich kann auch komplexerer, mehrzeiliger Code verwendet werden. Auch ein Mischmasch aus (Hu)Go- und HTML.

Aber: Nicht jeder Code, der in Hugo-Templates funktioniert wird 1:1 kopiert auf Anhieb funktionieren. Man muss gegebenenfalls etwas schnitzen, da man sich ja innerhalb einer Markdowndatei in einem anderen Kontext/Scope befinden könnte.

Ein komplexeres Beispiel findet sich, neben vielen anderen, z.B. in den Bootstrap-Docs (https://raw.githubusercontent.com/twbs/bootstrap/v5.1.3/site/content/docs/versions.md). Siehe dort das {{< list-versions.inline >}...{{< /list-versions.inline >}. Die Ausgabe auf der fertigestellten/gerenderten Seite sieht in diesem Falle so aus: https://getbootstrap.com/docs/versions/