from invoke import task from pathlib import Path from prompt_toolkit import prompt from prompt_toolkit.completion import WordCompleter from prompt_toolkit.validation import Validator from unidecode import unidecode import jinja2 from pytex import texenv import datetime import locale locale.setlocale(locale.LC_ALL, "fr_FR.UTF-8") TRIBES = [ {"name": "Terminale Technologique", "directory": "TST"}, {"name": "Terminale Terminale spé sti2d", "directory": "TST_sti2d"}, {"name": "Science numérique et technologique", "directory": "SNT"}, {"name": "Enseignement scientifique", "directory": "EnsSci"}, {"name": "Maths Complémentaires", "directory": "Complementaire"}, ] AUTHOR = "Benjamin Bertrand" def is_tribe(tribe): return tribe in [t["directory"] for t in TRIBES] def get_sequences(tribe): p = Path(tribe) return [x for x in p.iterdir() if (x.is_dir() and x.name[0:2].isdigit())] def get_tags(tribe=""): p = Path(tribe) tags = set() indexes = p.glob("**/index.rst") for index_p in indexes: with open(index_p, "r") as index: line = index.readline() while line: if line.startswith(":tags"): tags.update(line[7:].replace("\n", "").split(", ")) break line = index.readline() return {t.lower() for t in tags} def next_weekday(date, day=0): return date + datetime.timedelta(days=(day - date.weekday() + 7) % 7) def sequence_prompt( author=AUTHOR, tribe="", title="", tags="", summary="", *args, **kwrds, ): sequence = {} print("Nouvelle séquence") sequence["author"] = prompt("Auteur: ", default=author) sequence["date"] = datetime.date.today() tribes = WordCompleter([t["directory"] for t in TRIBES]) sequence["tribe"] = prompt( "Classe: ", completer=tribes, validator=Validator.from_callable(is_tribe), default=tribe, ) sequences = get_sequences(sequence["tribe"]) if sequences: print("Séquences trouvées:\n\t" + "\n\t".join(sorted([s.name for s in sequences]))) sequence["num"] = max([int(seq.name[0:2]) for seq in sequences]) + 1 else: print("Pas de séquence trouvée") sequence["num"] = 1 sequence["title"] = prompt( f"Nom de la séquence (n°{sequence['num']}): ", default=title ) known_tags = get_tags() sequence["tags"] = prompt( "Tags (séparés par une virgule): ", completer=WordCompleter(known_tags), default=tags, ) sequence["summary"] = prompt("Résumé: ", default=summary) return sequence def import_skel(dest, datas, skel="sequence", skel_path="./tools/skeleton"): d = Path(dest) d.mkdir() p = Path(skel_path + "/" + skel) files = [t.name for t in p.iterdir()] template_loader = jinja2.FileSystemLoader(searchpath=p) template_env = jinja2.Environment(loader=template_loader) texenv.loader.loaders.append(template_loader) print("") for filename in files: if filename.endswith(".tex"): template = texenv.get_template(filename) else: template = template_env.get_template(filename) output_text = template.render(**datas) with open(d / filename, "w") as f: f.write(output_text) print(f"Importation de {filename} - OK") @task def sequence(c): sequence = {} validate = False while not validate: sequence = sequence_prompt(**sequence) dest = unidecode( ("{tribe}/{num:0>2}_{title}/".format(**sequence)).replace(" ", "_") ) dest = Path(dest) seq_summary = """\ Séquence: {num:0>2} {title} Niveau: {tribe} Auteur: {author} Date: {date} Tags: {tags} Sommaire: {summary} Dossier: {dest} """.format( dest=dest, **sequence ) print(seq_summary) validate = prompt("C'est ok? ").lower() in ["o", "k", "oui", "ok"] sequence["title_under"] = "#" * len(sequence["title"]) import_skel(dest, sequence, "sequence")