• Mémo Slugifier une chaine de caractères

  • Standardiser le nom d'un fichier ou une url

Le slug est très utile pour nommer un fichier, une url en fonction d'un contenu donné. Exemple, une capture d'écran.

La chaine de caractère initiale est déjà fournie. La fonction ci-dessous va remettre le texte en minuscules, supprimer les caractères surnuméraires (tirets, slashs, ponctuation) ainsi que les accents et tronquer la chaîne avant le dernier mot coupé. .

Ici, la chaine finale est tronquée à 100 caractères, certains systèmes n'acceptant pas les noms de fichiers trop longs.

from datetime import datetime


def slugify(name: str, extension: str = ""):
    chars = """, ( ) { } [ ] : ' ? ! " « » + - / = * $ £  % # ~ & | ° §"""
    time = datetime.now().strftime("%Y-%m-%d %H-%M-%S")
    name = name.lower()
    for elem in chars.split():
        name = name.replace(elem, '')
    if name == '  ':
        name.replace('  ', ' ')
    for elem in ['.']:
        name = name.replace(elem, '-')
    for elem in ['à', 'ä', 'â']:
        name = name.replace(elem, 'a')
    for elem in ['é', 'è', 'ê', 'ë']:
        name = name.replace(elem, 'e')
    for elem in ['î', 'ï']:
        name = name.replace(elem, 'i')
    for elem in ['ô', 'ö']:
        name = name.replace(elem, 'o')
    for elem in ['ù', 'û']:
        name = name.replace(elem, 'u')
    for elem in ['\xa0', '  ']:
        name = name.replace(elem, ' ')
    if name[-1] == "i":
        name.replace(name[-1], "")
    name = name.replace('ç', 'c')
    name = name.replace('œ', 'oe')
    name = "{} {}".format(time, name)
    name = name[:95]
    name = name.replace(' ', '-')
    name = name.replace('--', '-')
    slug = "-".join(name.split('-')[0:-1])
    return "{}{}".format(slug, extension)


slug = slugify("Il œuvre à côté de l'alcôve ovoïde, où les bûches se consument dans l'âtre rougeâtre", ".txt")
print(slug)

En sortie :

>> 2019-05-02-12-31-15-il-oeuvre-a-cote-de-lalcove-ovoide-ou-les-buches-se-consument-dans-latre.txt

Ou plus simple, avec l'import d'un petit module Python :

def slugify(name: str):
    chars = """, ( ) { } [ ] : ' ? ! " « » + - / = * $ £ € % # ~ & | ° §"""
    code = unidecode.unidecode(name)
    name = code.lower()
    if '@' in name:
        name = name.replace('@', 'a')
    for elem in chars.split():
        name = name.replace(elem, '')
    if name == '  ':
        name.replace('  ', ' ')
    for elem in ['.']:
        name = name.replace(elem, '-')
    name = name[:95]
    name = name.replace(' ', '-')
    name = name.replace('--', '-')
    return name


2 mai 2019 13:08