Hugo New Post automatisieren

Das ist wieder so eine Notiz, die für etwa 99 Prozent aller Leser unwichtig ist. Also: Lies einfach die nächste Notiz. Vielleicht hast Du aber diesen Beitrag über die Google-Suchfunktion gefunden. Ich habe ein Weile nach dieser Automatisierung von Hugo gesucht und, bevor ich es wieder vergesse, will ich es hier notieren.

Das Veröffentlichen im Web mit Hugo funktioniert hervorragend. Wäre ich noch mit Wordpress unterwegs, würde ich niemals so viele Notizen erstellen. Mein System ist so aufgebaut, dass ich von überall (mit Internet-Verbindung) Notizen in einer einfachen Markdown-Datei erstellen und dann auch mit einem einzigen Befehl veröffentlichen kann.

Eine Sache war allerdings noch etwas hakelig: das Erstellen der Textdatei. Wenn Du im Terminal unterwegs bist, dann kannst Du ja mit diesem Befehl

hugo new posts/einedatei.md

eine neue Datei erstellen. Der Vorteil ist, dass Hugo nicht nur die Datei erstellt, sondern auch das Front Matter in den Text einfügt. Wenn Du einen bestimmten Front Matter benutzt, musst Du tief in den Themes-Ordner Deines Hugo-Themes suchen, um Dein Front Matter auf Deine Bedürfnisse zu schneidern. Ich habe das zwar bisher so gemacht, aber ich fand es immer umständlich. Und nicht immer sitze ich am Terminal.

Alternativ kannst in einen Editor gehen (ich benutze auf allen Geräten Visual Code) und dort eine neue Datei erstellen. Dann fehlt allerdings das Hugo-Front-Matter und ich muss dann eine bereits erstellte Datei öffnen und das Front Matter aus dieser Datei umständlich umkopieren. Das ist lästig und kostet Zeit.

Make it easy to take it easy: Ich habe also nach einer Lösung, einem Bash Script, gesucht, mit dem ich schnell und einfach eine Notiz im richtigen Ordner mit einem von mir gewählten Namen und meinem Front Matter erstellen kann.

Nach einer Suche habe ich ein Script von Sebastien Taggart gefunden. Er benutzt das Academia-Theme, das die Hugo-Posts folgendermaßen aufbaut: Für jeden Post wird ein eigener Verzeichnisname eingetragen. In diesem Verzeichnis liegt dann eine index.md-Datei und ein Unterverzeichnis für Bilder, Videos und PDFs zum Verlinken. Das sieht dann so aus:

/content/posts/verzeichnisname

/content/posts/verzeichnisname/index.md

/content/posts/verzeichnisname/assets

Der Ansatz: Du befindest Dich in Deinem Website-Verzeichnis und gibst einfach ./new “Verzeichnisname” ein. Daraufhin erstellt das Script in content/posts ein neues Verzeichnis mit dem Verzeichnisnamen ein, darunter dann eine Datei index.md mit Deinem Frontmatter und noch ein zusätzliches Verzeichnis /assets/. Dann brauchst Du die Datei index.md einfach nur noch bearbeiten und dann auf Deinen Server hochzuladen. Ich benutze dazu ein einfaches deploy auf meinen Uberspace.

Hugo New Post in /content/posts/inhalt/index.md

Das Script kannst Du bei Sebastian anschauen. Er hat es gut kommentiert. Hier das auf meine Bedürfnisse abgewandelte Script.

Was machst Du damit:

  1. Du erstellst im Hauptverzeichnis Deiner Hugo-Website eine Datei ohne Endung mit dem Namen „new“.
  2. Dann kopierst Du das folgende Script in die Datei (mit Deinen Anpassungen, siehe Kommentare).
  3. Das Script muss Du noch ausführbar machen mit

    chmod +x new

  4. Nun kannst Du das Script ausführen mit

    ./new “Dein neuer Verzeichnisname”

  5. Wenn alles geklappt hat, müsstest Du nun in /content/posts/ ein neues Verzeichnis mit Deinem gewählten Verzeichnisnamen haben und darin ein Verzeichnis asset und die index.md.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#!/bin/bash
 
TARGETDIR="./content/posts"
 
# Sanitize the input 
 
TITLE=${1} # take the input as-is for the Title before sanitizing for directory name 
SANIN=${1// /-} # replace spaces with dashes
SANIN=${SANIN//_/-} # replace underscores with dashes
SANIN=${SANIN//[^a-zA-Z0-9\-]/} # remove everything except alphanumeric or dash
 
# Your own Hugo Front Matter - adjust to your requirements
 
ISOTIME=$(date -u +'%Y-%m-%dT%H:%M:%SZ') 
PREFILLTPL="--- 
weight: 4 
title: "xxx"
date: 2021-
draft: true 
author: "Reiner"
authorLink: "https://reinergaertner.de" 
description: "xxx" 
 resources:
 - name: "featured-image" 
   src: "assets/" 
 - name: "featured-image-preview" 
   src: "assets/"

tags: ["xxx", "xxx"] 
categories: ["xxx"]
toc: false 
autoCollapseToc: false
lightgallery: true  ---
"
# Create File and prefill
if [[ ! -e "${TARGETDIR}/${SANIN}/" ]]; then
 mkdir -p "${TARGETDIR}/${SANIN}/assets/"
 touch "${TARGETDIR}/${SANIN}/index.md"
 echo "${PREFILLTPL}" >> "${TARGETDIR}/${SANIN}/index.md"
 
else 
   echo "The directory ${TARGETDIR}/${SANIN}/ already exists!  Aborting."
 
   exit 1 
fi

Manche Templates sind anders aufgebaut und schauen direkt in /content/posts nach einem .md-File. Ich habe auch so eine Hugo-Website. Ich habe das also an ein paar Stellen vereinfacht. Verändere einfach die Daten in Deinem Front Matter.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#!/bin/bash
TARGETDIR="./content/posts"

# Sanitize the input (we need this for the pre-filled template)
TITLE=${1} # take the input as-is for the Title before sanitizing for directory name
SANIN=${1// /-} # replace spaces with dashes
SANIN=${SANIN//_/-} # replace underscores with dashes
SANIN=${SANIN//[^a-zA-Z0-9\-]/} # remove everything except alphanumeric or dash

ISOTIME=$(date -u +'%Y-%m-%dT%H:%M:%SZ')
 
# Pre-fill the new file with your own Front Matter below
PREFILLTPL="
---
title: "xxx"
date: 2021-xx
author: "Reiner"
authorLink: "https://reinergaertner.de"
description: "xxx"
license: ""
weight: 2
tags: ["xxx", "xxx"]
categories: ["xxx"]
hiddenFromHomePage: false
toc: false
autoCollapseToc: false
---
"
 
# Create file and prefill
touch "${TARGETDIR}/${SANIN}.md"
echo "${PREFILLTPL}" >> "${TARGETDIR}/${SANIN}.md"

exit 0

Happy Blogging mit Hugo. Sag mir doch Bescheid, wenn sich das Script optimieren lässt oder wenn Du noch eine weitere Ideen dazu hast. Ich bin ja nur ein Script-Daddy. Für sowas reicht es gerade.