3 minutes
Blog with Hugo 2.0
Ce billet est la suite du premier article sur la publication de blog avec Hugo.
Depuis j’ai automatisé une bonne partie du process de publication ce qui me permet de rédiger mes billets depuis Obsidian et de les convertir avec un script bash pour Hugo.
Ce même script va également synchroniser les articles avec le VPS qui héberge mon blog.
Voici le script en question :
#!/bin/bash
set -e
# === CONFIGURATION ===
OBSIDIAN_DIR="$HOME/Library/Mobile Documents/iCloud~md~obsidian/Documents/path/to/Articles/Blog/"
HUGO_SITE_DIR="$HOME/local/hugo/blog"
HUGO_CONTENT_DIR="$HUGO_SITE_DIR/content/posts"
REMOTE_USER="vps_auth"
REMOTE_HOST="vps_IP"
REMOTE_DIR="/vps/remote/blog/directory"
SSH_KEY="$HOME/.ssh/id_rsa"
EDITOR="nano" # Ou "code", "vim", etc.
# === PARAMÈTRE ===
POST_FILE="$1"
if -z "$POST_FILE" ; then
echo "Usage: ./$(basename "$0") mon_article.md"
exit 1
fi
SRC_PATH="$OBSIDIAN_DIR/$POST_FILE"
DST_PATH="$HUGO_CONTENT_DIR/$POST_FILE"
if ! -f "$SRC_PATH" ; then
echo "❌ Fichier introuvable: $SRC_PATH"
exit 1
fi
# === 1. Copie vers Hugo ===
echo "📄 Copie de l’article vers Hugo…"
cp "$SRC_PATH" "$DST_PATH"
# === 2. Création frontmatter si manquant ou incorrect ===
# === Extraction date de création (date) et de modif (updated) ===
if "$OSTYPE" == "darwin"* ; then
CREATED=$(stat -f "%SB" -t "%Y-%m-%d" "$DST_PATH" 2>/dev/null || date '+%Y-%m-%d')
UPDATED=$(stat -f "%Sm" -t "%Y-%m-%d" "$DST_PATH")
else
CREATED_RAW=$(stat -c "%W" "$DST_PATH")
UPDATED=$(stat -c "%y" "$DST_PATH" | cut -d' ' -f1)
if "$CREATED_RAW" -gt 0 ; then
CREATED=$(date -d @"$CREATED_RAW" '+%Y-%m-%d')
else
CREATED="$UPDATED"
fi
fi
# === Lire le contenu sans frontmatter ===
CONTENT=$(awk '//{f=!f; next} !f' "$DST_PATH")
# === Extraire les tags de type ===
TAGS=$(awk '/:/ {flag=1; next} /^ *- / && flag {gsub(/ /, "", $0); print $0} !/^ *- / && flag {flag=0}' "$DST_PATH")
TAGS=$(echo "$TAGS" | sed 's/-//' | tr '\n' ' ' | sed 's/ *$//') # Nettoyer les espaces et les tirets
# === Convertir en tableau YAML
YAML_TAGS="["
for tag in $TAGS; do
YAML_TAGS+="\"$tag\", "
done
YAML_TAGS=$(echo "$YAML_TAGS" | sed 's/, $/]/')
echo $YAML_TAGS
# === Générer le nouveau frontmatter ===
TITLE=$(basename "$POST_FILE" .md)
TMP_FILE=$(mktemp)
cat <<EOF >"$TMP_FILE"
$CONTENT
EOF
mv "$TMP_FILE" "$DST_PATH"
# === 3. Conversion Obsidian -> Markdown compatible Hugo ===
echo "🔁 Conversion syntaxe Obsidian → Hugo"
# 1. Convertir  → 
sed -i '' -E 's/!\[\[([^]]+)\]\]//g' "$DST_PATH"
# 2. Convertir Lien Interne → Lien Interne
sed -i '' -E 's/\[\[([^]]+)\]\]/\1/g' "$DST_PATH"
# 3. Supprimer les ancres de paragraphe
sed -i '' -E 's/\^[a-zA-Z0-9_-]+//g' "$DST_PATH"
# 4. Supprimer les blocs dataview
sed -i '' -e '/^```dataview/,/^```/d' "$DST_PATH"
# 5. Supprimer les tags inline comme
sed -i '' -E 's/(^| )#[a-zA-Z0-9_-]+//g' "$DST_PATH"
# === 4. Génération du site statique ===
echo "🏗️ Génération du site Hugo…"
cd "$HUGO_SITE_DIR"
hugo
# === 5. Déploiement sur le VPS ===
echo "🚀 Déploiement via rsync…"
rsync -avz -e "ssh -i $SSH_KEY" public/ "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR"
# === 6. Commit Git (optionnel) ===
"📦 Commit Git (optionnel)…"
add "$DST_PATH"
commit -m "📚 Publication automatique de $POST_FILE"
push origin main
echo "✅ Publication terminée avec succès !"
Il s’agit encore d’une version améliorable de ce script, je me laisse encore l’opportunité de publier les mises à jour sur un serveur git.
Je cherche encore à améliorer l’utilisation du script en simplifiant l’appel au script qui nécessite de connaitre le nom du fichier markdown à publier.
Si vous avez aussi des idées d’amélioration, n’hésitez pas à me les faire parvenir. 😁