Créer automatiquement un modèle pré-rempli d'article sur Pelican


 jeu. 09 janvier 2014    Pelican

Depuis mon passage d'Octopress à Pelican, un petit outil me manque : la possibilité de créer un squelette d'article automatiquement à partir du titre, et directement dans le bon répertoire. Sur Octopress, cela se fait par la commande rake new_post['Mon super post!']. Par cette commande, l'en-tête est renseignée avec un certain nombre d'informations comme le titre ou la date, le nom du fichier est généré automatiquement et "slugifié", tout ça dans le bon répertoire.

Jusqu'à présent, sur Pelican, pour créer un nouvel article, je faisais un copier-coller d'un ancien post, et je modifiais tout à la main. Pas terrible.

Qu'à cela ne tienne, nous allons faire notre propre script Python pour automatiser tout ça. Le script, le voici, les commentaires sont dedans :

 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
46
47
48
#!/usr/bin/python
# -*- coding: utf8 -*-
#---------------------
#newpost.py
#Cree par letchap
#---------------------

import re
import sys
import os
from unidecode import unidecode
import time

def slugify(titre):

    # je m'assure d'avoir de l'unicode
    value = titre.decode('utf8')
    # je transforme mon texte en ascii
    value = unidecode(value)
    # je supprime les caractères spéciaux, je normalise les espaces, je mets en minuscule
    value = re.sub('[^\w\s-]', '', value).strip().lower()
    # je rajoute les tirets et je renvoie le titre slugifié
    return re.sub('[-\s]+', '-', value)

def newpost(titre):

    slug = slugify(titre)

    if os.path.isfile(os.path.join(os.getcwd(), "content/" + str(slug) + ".markdown")):
        print('Ce fichier existe déjà') # bon, comme son nom l'indique, c'est pour tester les doublons
        sys.exit(1)
    else:
		with open(os.path.join(os.getcwd(), "content/" + str(slug) + ".markdown"), "w") as f: # si je n'ai pas de doublon, je crée le fichier et le squelette de mon post dans content
			f.write("Title: " + titre + "\n")
			f.write("Date: " + time.strftime('%Y-%m-%d %H:%M', time.localtime()) + "\n")
			f.write("Category: " + "\n")
			f.write("Tags: " + "\n")
			f.write("Slug: " + slug +"\n\n")



if __name__ == '__main__':
	if len(sys.argv) < 2:
		print('Précisez le titre du post')
		sys.exit(1)
	else:
		titre = sys.argv[1]
		newpost(titre)

Télécharger newpost.py

En résumé, ce script, à partir d'un titre passé en paramètre va générer un nom de fichier "slugifié", c'est à dire sans caratère accentué, en minuscule et séparé par des tirets, ainsi que l'en-tête de notre fichier. Le fichier de sortie ressemblera à ça :

Title: Mon super post!
Date: 2014-01-10 23:40
Category:
Tags:
Slug: mon-super-post

Ce script fonctionne pour un fichier markdown, et pour un article. Rien ne vous empêche de modifier le script à la marge pour une page et en ReST.

Dernière étape, comment lancer ce script ?

J'ai d'abord regardé du côté des outils fournis par Pelican, à savoir make et fabric. Malheureusement, il n'est pas possible de faire un make newpost 'Mon super post!' ou un fab newpost:'Mon super post!'.

En revanche, aucun problème pour faire python newpost.py 'Mon super post!'.

Le dernier petit truc pour pouvoir faire plus simplement python newpost 'Mon super post!', il suffit de créer un répertoire newpost à la racine du blog, et de mettre notre script python dans ce répertoire en le nommant __main__.py.