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"}, ] 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(): 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) ) sequences = get_sequences(sequence["tribe"]) print("Séquences trouvées:\n\t" + "\n\t".join(sorted([s.name for s in sequences]))) sequence["num"] = len(sequences) + 1 sequence["title"] = prompt(f"Nom de la séquence (n°{sequence['num']}): ") known_tags = get_tags() sequence["tags"] = prompt( "Tags (séparés par une virgule): ", completer=WordCompleter(known_tags) ) sequence["summary"] = prompt("Résumé: ") 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 = sequence_prompt() 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? ") if validate.lower() in ["o", "y", ""]: sequence["title_under"] = "#" * len(sequence["title"]) import_skel(dest, sequence, "sequence") else: print("Tant pis. Ya plus qu'à recommencer.")