Après avoir utilisé Pelican pendant six ans, j’ai finalement décidé de porter mes sites vers Hugo. Je n’ai rien à reprocher à Pelican, mais j’utilise régulièrement Hugo au travail, et passer de l’un à l’autre m’est de plus en plus pénible. Et puis j’espère que, de la même manière que Pelican m’a servi d’introduction au Python, Hugo me permettra de me familiariser avec Go.
La migration de Pelican vers Hugo se déroule en deux temps. L’adaptation du thème et des réglages d’abord, un travail nécessairement manuel, mais bouclé en quelques heures. La conversion des fichiers ensuite, une tâche répétitive et ennuyeuse, donc candidate à l’automatisation.
Le script — en Python, ironiquement — est publié sur Github avec des commentaires en anglais. Il est reproduit ci-dessous avec des commentaires en français.
#!/usr/bin/env python3
#
# Pelican to Hugo v20180603
#
# Anthony Nelzin-Santos
# https://anthony.nelzin.fr
# anthony@nelzin.fr
#
# European Union Public Licence v1.2
# https://joinup.ec.europa.eu/collection/eupl/eupl-text-11-12
import os, os.path, re
# Ajouter le chemin du dossier contenant les articles ici.
path = 'votre/dossier/ici'
files = os.listdir(path)
for file in files:
file_name, file_extension = os.path.splitext(file)
# Les fichiers d’entrée seront conservés,
# les fichiers de sorties seront renommés avec
# le suffixe "_hugo".
regexed_file = file_name + '_hugo' + file_extension
# Seuls les fichiers Markdown visibles sont convertis.
# Cette précaution est normalement inutile…
# sauf quand elle l’est, à cause des fichiers .DS_Store.
if not file_name.startswith('.') and file_extension in ('.md') :
input_file = os.path.join(path, file)
output_file = os.path.join(path, regexed_file)
# Les fichiers sont convertis ligne par ligne
# avec regex. La conversion d’un millier de fichiers
# prend à peine quelques secondes.
with open(input_file, 'rU') as fi, open(output_file, 'w') as fo:
for line in fi:
# Ajouter le délimiteur ouvrant avant le titre.
line = re.sub(r'(title:)', r'---\n\1', line)
# Ajouter le délimiteur fermant après les tags.
line = re.sub(r'(themes: .*)$$', r'\1\n---', line)
# Entourer le titre de guillemets.
line = re.sub(r'title: (.*)', r'title: "\1"', line)
# Changer le format de la date.
line = re.sub(r'(date: \d{4}-\d{2}-\d{2}) (\d{2}:\d{2})', r'\1T\2:00Z', line)
# Une manière lente (mais pédagogique)
# d’éditer les tags.
if re.match(r'themes: (.*)', line):
# Éclater la liste des tags.
tag_split = re.sub(r'(.*)', r'\1', line).split(', ')
# Reformer la liste des tags.
tag_plist = '\n- '.join(tag_split)
# Passer la liste à la ligne.
tag_list = re.sub(r'themes: (.*)', r'themes: \n- \1', tag_plist)
# Et entourer les tags de guillemets.
line = re.sub(r'- (.*)', r'- "\1"', tag_list)
fo.write(line)
# Afficher un message pour suivre la conversion.
print(file_name + ' converti.')
Avec ce script, un fichier Markdown utilisant la syntaxe pseudo-YAML attendue par Pelican :
title: Lorem ipsum dolor sit amet
date: 2018-06-03 12:00
themes: Lorem, ipsum, dolor
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla tincidunt rutrum nulla eget mollis. Quisque quis velit ac neque porta egestas et eget ex. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris id enim varius ligula scelerisque vehicula. Sed consequat id ligula viverra condimentum. Vestibulum a consectetur risus, vitae pretium est. Maecenas eu arcu sit amet est commodo malesuada. Nulla mattis mauris et dictum ultrices. Nullam consequat blandit mauris non pulvinar.
Sera converti en fichier utilisant la syntaxe YAML stricte attendue par Hugo et d’autres générateurs de blog statique :
---
title: "Lorem ipsum dolor sit amet"
date: 2018-06-03T12:00:00Z
sur:
- "Lorem"
- "ipsum"
- "dolor"
---
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla tincidunt rutrum nulla eget mollis. Quisque quis velit ac neque porta egestas et eget ex. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris id enim varius ligula scelerisque vehicula. Sed consequat id ligula viverra condimentum. Vestibulum a consectetur risus, vitae pretium est. Maecenas eu arcu sit amet est commodo malesuada. Nulla mattis mauris et dictum ultrices. Nullam consequat blandit mauris non pulvinar.
Ce script est un point de départ, qui devra être complété pour prendre en compte les taxonomies ou adapté à la syntaxe TOML.