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.