ZdS Converter, pour convertir les mini-tutos en moyen-tutos

Un petit script Python pour les rédacteurs

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour tout le monde !

Aujourd’hui, je voudrais vous présenter un petit script que j’ai écrit en Python 3 qui permet de convertir l’archive d’un mini-tuto en celle d’un moyen-tuto. Pour l’utiliser, copiez-collez le code qui suit dans un fichier texte, rendez-le exécutable (chmod +x fichier.py sous GNU/Linux) puis exécutez la commande python3 fichier.py ou exécutez-le directement avec ./fichier.py (remplacez bien sur "fichier.py" par le nom que vous aurez donnés au fichier) dans un terminal. Le programme vous demandera alors le nom de l’archive à convertir (qui doit être dans le même dossier que le fichier du script) : entrez son nom complet (en incluant l’extension ".zip"). Une nouvelle archive du même nom que l’originale, précédé de "NEW_", apparaitra. Elle contiendra votre moyen-tuto, contenant une partie nommée "The new container", qui elle-même contiendra toutes les sections de votre mini-tuto. Vous pourrez alors les fragmenter ou les déplacer dans d’autres parties.

Il agit en modifiant le fichier manifest.json de l’archive : il rajoute un objet container qui a pour enfants les enfants de l’objet container original. Ce script a l’avantage d’éviter toute erreur de manipulation, puisque c’est la librairie JSON de Python qui se charge du boulot.

Voilà le code. Il ne requiert que les modules standards de Python.

 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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
#  zds-converter.py
#  
#  Licence AGPLv3 by rezemika
#  

import json
import tempfile
import zipfile
import shutil
import os

def remove_from_zip(zipfname, *filenames):
    # https://stackoverflow.com/questions/4653768/overwriting-file-in-ziparchive
    tempdir = tempfile.mkdtemp()
    try:
        tempname = os.path.join(tempdir, 'new.zip')
        with zipfile.ZipFile(zipfname, 'r') as zipread:
            with zipfile.ZipFile(tempname, 'w') as zipwrite:
                for item in zipread.infolist():
                    if item.filename not in filenames:
                        data = zipread.read(item.filename)
                        zipwrite.writestr(item, data)
        shutil.move(tempname, zipfname)
    finally:
        shutil.rmtree(tempdir)

def edit_manifest(manifest):
    new_manifest = json.loads(manifest)
    children = new_manifest["children"]
    new_manifest["children"] = [{
        "object": "container",
        "slug": "the-new-container",
        "title": "The new container",
        "introduction": "introduction.md",
        "conclusion": "conclusion.md",
        "children": children,
    }, ]
    return new_manifest

def mini2medium(filename):
    """
        Converts the archive of a mini-tuto to a medium one.
    """
    new_name = "NEW_{}".format(filename)
    print("Création d'un fichier {}".format(new_name))
    shutil.copyfile(filename, new_name)
    # Gets the old manifest, to edit it later.
    print("Récupération de l'ancien 'manifest.json'")
    with zipfile.ZipFile(new_name, 'r') as new_archive:
        old_manifest = new_archive.read("manifest.json").decode("utf-8")
    # Removes the old manifest from the new archive.
    print("Suppression du 'manifest.json' dans la nouvelle archive.")
    remove_from_zip(new_name, "manifest.json")
    print("Écriture du nouveau 'manifest.json'")
    with zipfile.ZipFile(new_name, 'a') as new_archive:
        new_json = edit_manifest(old_manifest)
        new_archive.writestr("manifest.json", json.dumps(new_json))
    print("Terminé.")
    exit(0)

if __name__ == "__main__":
    filename = input("Entrez le nom complet de l'archive : ")
    mini2medium(filename)

J’espère qu’il pourra vous être utile. N’hésitez pas à me donner vos avis et critiques. ;)

Édité par rezemika

"Les accidents dans un système doivent se produire, mais il n’est pas obligatoire qu’ils produisent pour vous et moi." Laurence Gonzales - Deep Survival

+0 -0

Je ne sais pas si tu as déjà essayé, mais Zest Writer permet aussi de faire ce genre de chose depuis une interface graphique. L’avantage étant que c’est adapté pour passer de n’importe quel format, vers n’importe quel autre (si la structure le permet).

C’est vrai que ton script a l’avantage d’être rapide à lancer, mais si tu fais souvent des changements de structures et même de format (article vers billet ou billet vers tuto par exemple) je te conseille Zest Writer.

C’était la minute pub

+2 -0
Auteur du sujet

Je ne sais pas si tu as déjà essayé, mais Zest Writer permet aussi de faire ce genre de chose depuis une interface graphique.

firm1

Ah, je ne le savais pas. Merci de l’info ! :)

Acessoirement, le code de ZdS pour les tutoriels (la partie gestion sans BDD) peut quasiment s’utiliser tel quel pour gérer le manifest et autres joyeusetés :)

pierre_24

C’est vrai que ça a l’air simple, et le code est très compréhensible en plus (même moi j’ai pu le lire :D ).

Édité par rezemika

"Les accidents dans un système doivent se produire, mais il n’est pas obligatoire qu’ils produisent pour vous et moi." Laurence Gonzales - Deep Survival

+0 -0

Je ne sais pas si tu as déjà essayé, mais Zest Writer permet aussi de faire ce genre de chose depuis une interface graphique.

firm1

Si tu pouvais faire une version TUI sans Java… :D (on me chuchote que ce n’est pas bien de troller).

Édité par Morlaer

Breizh zo ma bro, hag ihuel eo ma c’halon geti. Da viken. – L’oiseau imaginaire : ZzxŷxzZ

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte