From ffadbd7ce6d15ba34c8e0c91a0d24a0631501c5b Mon Sep 17 00:00:00 2001 From: Bertrand Benjamin Date: Fri, 14 Aug 2020 15:06:30 +0200 Subject: [PATCH] Feat: skeleton to create new sequence --- tasks.py | 118 ++++++++++++++++++++++++++ tools/skeleton/sequence/B1.tex | 14 +++ tools/skeleton/sequence/E1.tex | 18 ++++ tools/skeleton/sequence/exercises.tex | 10 +++ tools/skeleton/sequence/index.rst | 12 +++ 5 files changed, 172 insertions(+) create mode 100644 tasks.py create mode 100755 tools/skeleton/sequence/B1.tex create mode 100755 tools/skeleton/sequence/E1.tex create mode 100644 tools/skeleton/sequence/exercises.tex create mode 100644 tools/skeleton/sequence/index.rst diff --git a/tasks.py b/tasks.py new file mode 100644 index 0000000..73c1cb3 --- /dev/null +++ b/tasks.py @@ -0,0 +1,118 @@ +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": "Première Technologique", "directory": "1ST"}, + {"name": "Science numérique et technologique", "directory": "SNT"}, + {"name": "Terminale L-ES", "directory": "TESL"}, + {"name": "Terminale sti2d", "directory": "Tsti2d"}, + ] + +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.") + diff --git a/tools/skeleton/sequence/B1.tex b/tools/skeleton/sequence/B1.tex new file mode 100755 index 0000000..5499669 --- /dev/null +++ b/tools/skeleton/sequence/B1.tex @@ -0,0 +1,14 @@ +\documentclass[a4paper,10pt]{article} +\usepackage{myXsim} + +\author{\Var{ author }} +\title{\Var{title} - Cours} +\date{\Var{date.strftime("%B %Y")} + +\pagestyle{empty} + +\begin{document} + +\maketitle + +\end{document} diff --git a/tools/skeleton/sequence/E1.tex b/tools/skeleton/sequence/E1.tex new file mode 100755 index 0000000..5ee2e80 --- /dev/null +++ b/tools/skeleton/sequence/E1.tex @@ -0,0 +1,18 @@ +\documentclass[a4paper,10pt]{article} +\usepackage{myXsym} + +\author{\Var{ author }} +\title{\Var{title} - Cours} +\date{\Var{date.strftime("%B %Y")} + +\DeclareExerciseCollection{banque} +\xsimsetup{ + step=1, +} + +\begin{document} + +\input{exercises.tex} +\printcollection{banque} + +\end{document} diff --git a/tools/skeleton/sequence/exercises.tex b/tools/skeleton/sequence/exercises.tex new file mode 100644 index 0000000..7209725 --- /dev/null +++ b/tools/skeleton/sequence/exercises.tex @@ -0,0 +1,10 @@ +\collectexercises{banque} +\begin{exercise}[subtitle={<++>}, step={1}, origin={<++>}, topics={\Var{title}}, tags={\Var{tags}}] + <++> +\end{exercise} + +\begin{solution} + <++> +\end{solution} + +\collectexercisesstop{banque} diff --git a/tools/skeleton/sequence/index.rst b/tools/skeleton/sequence/index.rst new file mode 100644 index 0000000..4100cd7 --- /dev/null +++ b/tools/skeleton/sequence/index.rst @@ -0,0 +1,12 @@ +{{ title }} +{{ title_under }} + +:date: 2020-08-14 +:modified: 2020-08-14 +:authors: {{ author }} +:tags: {{ tags }} +:category: {{ tribe }} +:summary: {{ summary }} + +Étape 1: +========