From 907575c6346e7f5b10b13940758ae5803406878b Mon Sep 17 00:00:00 2001 From: Emmanuel Viennet Date: Sat, 10 Apr 2021 17:35:40 +0200 Subject: [PATCH] documentation, build.sh script, options to specify paths --- .gitignore | 319 ++++++++++++++++++++++++++++++ README.md | 48 ++++- build.sh | 33 ++++ python/config.py | 8 + python/export_docx_to_yaml.py | 50 +++-- python/export_sae_docx_to_yaml.py | 51 ++++- python/export_yaml_to_latex.py | 47 +++-- python/officiel.py | 11 +- python/ressource.py | 8 +- 9 files changed, 534 insertions(+), 41 deletions(-) create mode 100644 .gitignore create mode 100755 build.sh create mode 100644 python/config.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c5e1105 --- /dev/null +++ b/.gitignore @@ -0,0 +1,319 @@ +# ---> LyX +# Ignore LyX backup and autosave files +# http://www.lyx.org/ +*.lyx~ +*.lyx# + +# ---> TeX +## Core latex/pdflatex auxiliary files: +*.aux +*.lof +*.log +*.lot +*.fls +*.out +*.toc +*.fmt +*.fot +*.cb +*.cb2 +.*.lb + +## Intermediate documents: +*.dvi +*.xdv +*-converted-to.* +# these rules might exclude image files for figures etc. +# *.ps +# *.eps +# *.pdf + +## Generated if empty string is given at "Please type another file name for output:" +.pdf + +## Bibliography auxiliary files (bibtex/biblatex/biber): +*.bbl +*.bcf +*.blg +*-blx.aux +*-blx.bib +*.run.xml + +## Build tool auxiliary files: +*.fdb_latexmk +*.synctex +*.synctex(busy) +*.synctex.gz +*.synctex.gz(busy) +*.pdfsync + +## Build tool directories for auxiliary files +# latexrun +latex.out/ + +## Auxiliary and intermediate files from other packages: +# algorithms +*.alg +*.loa + +# achemso +acs-*.bib + +# amsthm +*.thm + +# beamer +*.nav +*.pre +*.snm +*.vrb + +# changes +*.soc + +# comment +*.cut + +# cprotect +*.cpt + +# elsarticle (documentclass of Elsevier journals) +*.spl + +# endnotes +*.ent + +# fixme +*.lox + +# feynmf/feynmp +*.mf +*.mp +*.t[1-9] +*.t[1-9][0-9] +*.tfm + +#(r)(e)ledmac/(r)(e)ledpar +*.end +*.?end +*.[1-9] +*.[1-9][0-9] +*.[1-9][0-9][0-9] +*.[1-9]R +*.[1-9][0-9]R +*.[1-9][0-9][0-9]R +*.eledsec[1-9] +*.eledsec[1-9]R +*.eledsec[1-9][0-9] +*.eledsec[1-9][0-9]R +*.eledsec[1-9][0-9][0-9] +*.eledsec[1-9][0-9][0-9]R + +# glossaries +*.acn +*.acr +*.glg +*.glo +*.gls +*.glsdefs +*.lzo +*.lzs + +# uncomment this for glossaries-extra (will ignore makeindex's style files!) +# *.ist + +# gnuplottex +*-gnuplottex-* + +# gregoriotex +*.gaux +*.gtex + +# htlatex +*.4ct +*.4tc +*.idv +*.lg +*.trc +*.xref + +# hyperref +*.brf + +# knitr +*-concordance.tex +# TODO Uncomment the next line if you use knitr and want to ignore its generated tikz files +# *.tikz +*-tikzDictionary + +# listings +*.lol + +# luatexja-ruby +*.ltjruby + +# makeidx +*.idx +*.ilg +*.ind + +# minitoc +*.maf +*.mlf +*.mlt +*.mtc[0-9]* +*.slf[0-9]* +*.slt[0-9]* +*.stc[0-9]* + +# minted +_minted* +*.pyg + +# morewrites +*.mw + +# nomencl +*.nlg +*.nlo +*.nls + +# pax +*.pax + +# pdfpcnotes +*.pdfpc + +# sagetex +*.sagetex.sage +*.sagetex.py +*.sagetex.scmd + +# scrwfile +*.wrt + +# sympy +*.sout +*.sympy +sympy-plots-for-*.tex/ + +# pdfcomment +*.upa +*.upb + +# pythontex +*.pytxcode +pythontex-files-*/ + +# tcolorbox +*.listing + +# thmtools +*.loe + +# TikZ & PGF +*.dpth +*.md5 +*.auxlock + +# todonotes +*.tdo + +# vhistory +*.hst +*.ver + +# easy-todo +*.lod + +# xcolor +*.xcp + +# xmpincl +*.xmpi + +# xindy +*.xdy + +# xypic precompiled matrices and outlines +*.xyc +*.xyd + +# endfloat +*.ttt +*.fff + +# Latexian +TSWLatexianTemp* + +## Editors: +# WinEdt +*.bak +*.sav + +# Texpad +.texpadtmp + +# LyX +*.lyx~ + +# Kile +*.backup + +# gummi +.*.swp + +# KBibTeX +*~[0-9]* + +# TeXnicCenter +*.tps + +# auto folder when using emacs and auctex +./auto/* +*.el + +# expex forward references with \gathertags +*-tags.tex + +# standalone packages +*.sta + +# Makeindex log files +*.lpz + +# xwatermark package +*.xwm + +# REVTeX puts footnotes in the bibliography by default, unless the nofootinbib +# option is specified. Footnotes are the stored in a file with suffix Notes.bib. +# Uncomment the next line to have this generated file ignored. +#*Notes.bib + +# MacOS +.DS_Store? +ehthumbs.db +Icon? +Thumbs.db +*.DS_Store + +# Emacs +*~ +\#*\# +/.emacs.desktop +/.emacs.desktop.lock +*.elc +auto-save-list +tramp +.\#* + +# Python +# ---> Python +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# VS Code +.vscode/ +*.code-workspace diff --git a/README.md b/README.md index 9af8493..47ff965 100644 --- a/README.md +++ b/README.md @@ -1 +1,47 @@ -# Referentiels \ No newline at end of file +# Référentiel de formation R&T + +## Installation sur Mac + +Avec Anaconda: + + conda install pypandoc + conda install ruamel + conda install ruamel.yaml + pip install docx2python + +Sans Anaconda, remplacer `conda` par `pip`. + +## Utilisation + +Les sources sont les fichiers GoogleDoc (drive), réunis par un script Apps Scripts (`FusionneFiches`) qui permet d'obtenir deux documents: l'un réunissant les fiches ressources, l'autre les fiches SAÉ. + +### Extraction des informations +Les fichiers `.docx` sont analysés pour créer les documents `yaml`. On a un script pour les ressource et un autre pour les SAÉ. + +#### Ressources + + cd python + python export_docx_to_yaml.py [nom du fichier docx] + +par exemple: + + python export_docx_to_yaml.py import/compilation-ressources\ 2021-04-10T07_38_45.782Z.docx + +#### SAÉs + + python export_sae_docx_to_yaml.py import/compilation-saes\ 2021-04-10T07_37_48.302Z.docx + + +### Génération du LaTeX + + cd python + python export_yaml_to_latex.py --full + +### Génération de PDF + + cd latex + pdflatex pn_formation + pdflatex pn_formation + +Le résultat est `pn_formation.pdf`. + diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..5836439 --- /dev/null +++ b/build.sh @@ -0,0 +1,33 @@ +#!/bin/bash + +# Reconstruit tout ! + +ressources="$1" +saes="$2" + +die() { + echo + echo "Erreur: $1" + echo + exit 1 +} + +[ "$ressources" ] || die "Usage: $0 doc_ressources doc_sae" +[ "$saes" ] || die "Usage: $0 doc_ressources doc_sae" +[ -d python ] || die "repertoire manquant: python" +[ -d latex ] || die "repertoire manquant: latex" + +[ -d python/export ] || mkdir "python/export" || die "creating python/export directory" + +python python/export_docx_to_yaml.py "$ressources" -o "python/export" -r . || die "echec de export_docx_to_yaml.py" +python python/export_sae_docx_to_yaml.py "$saes" -o "python/export" -r . || die "echec de export_sae_docx_to_yaml.py" +python python/export_yaml_to_latex.py -a -r . || die "echec de export_yaml_to_latex.py" + +cd latex +pdflatex pn_formation +pdflatex pn_formation + +echo "Done." +echo "Resultat: latex/pn_formation.pdf" + + diff --git a/python/config.py b/python/config.py new file mode 100644 index 0000000..073ab5f --- /dev/null +++ b/python/config.py @@ -0,0 +1,8 @@ + +"""Configuration (chemins) +""" +import os + +class Config(object): + ROOT=".." + diff --git a/python/export_docx_to_yaml.py b/python/export_docx_to_yaml.py index 60572e9..7e2fbef 100644 --- a/python/export_docx_to_yaml.py +++ b/python/export_docx_to_yaml.py @@ -1,21 +1,49 @@ +import sys +import argparse +import logging import docx2python -from ressource import get_matrices_ac_ressource -from ressourcedocx import * -import tools - -import logging - -from tools import get_indice, get_indice_sans_accent_ni_espace +from config import Config __LOGGER = logging.getLogger(__name__) - REPERTOIRE = "import" -DOCUMENT = "ressources_v1" + +parser = argparse.ArgumentParser( + description="Parse doc ressources et crée yaml", + usage='%(prog)s [options]' + ) +parser.add_argument( + "DOCUMENT", + nargs="?", + default=REPERTOIRE + "/" + "ressources_v0" + ".docx" + ) +parser.add_argument( + "-o", + "--outdir", + default="export", + help="repertoire resultat, defaut: export" + ) +parser.add_argument( + "-r", + "--root", + default="..", + help="repertoire de base (racine) pour chercher les fichiers de données" + ) +args = parser.parse_args() +Config.ROOT = args.root + +__LOGGER.warning(f"{sys.argv[0]} processing {args.DOCUMENT}") +__LOGGER.warning(f"{sys.argv[0]} outputs to {args.outdir}") + +# Ces imports doivent être faits après la config +import tools +from tools import get_indice, get_indice_sans_accent_ni_espace +from ressource import get_matrices_ac_ressource +from ressourcedocx import * # Ouverture du document -docu = docx2python.docx2python(REPERTOIRE + "/" + DOCUMENT + ".docx") +docu = docx2python.docx2python(args.DOCUMENT) docu = docu.body docu[0] # Titre général @@ -161,7 +189,7 @@ for sem in ressources: for r in ressources[sem]: output = r.to_yaml() if WITH_EXPORT and r.code: - fichier = "export/{}.yml".format(r.code) + fichier = f"{args.outdir}/{r.code}.yml" with open(fichier, "w", encoding="utf8") as fid: fid.write(output) diff --git a/python/export_sae_docx_to_yaml.py b/python/export_sae_docx_to_yaml.py index f8393ef..e5790d3 100644 --- a/python/export_sae_docx_to_yaml.py +++ b/python/export_sae_docx_to_yaml.py @@ -1,16 +1,47 @@ -import docx2python -from ressourcedocx import * -from tools import * - +import sys +import argparse import logging -__LOGGER = logging.getLogger(__name__) +import docx2python +from config import Config + +__LOGGER = logging.getLogger(__name__) REPERTOIRE = "import" -DOCUMENT = "sae_v1" + +parser = argparse.ArgumentParser( + description="Parse doc ressources et crée SAE", + usage='%(prog)s [options]' + ) +parser.add_argument( + "DOCUMENT", + nargs="?", + default=REPERTOIRE + "/" + "ressources_v0" + ".docx" + ) +parser.add_argument( + "-o", + "--outdir", + default="export", + help="repertoire resultat, defaut: export" + ) +parser.add_argument( + "-r", + "--root", + default="..", + help="repertoire de base (racine) pour chercher les fichiers de données" + ) +args = parser.parse_args() +Config.ROOT = args.root + +__LOGGER.warning(f"{sys.argv[0]} processing {args.DOCUMENT}") +__LOGGER.warning(f"{sys.argv[0]} outputs to {args.outdir}") + +# Ces imports doivent être faits après la config +from tools import * +from ressourcedocx import * # Ouverture du document -docu = docx2python.docx2python(REPERTOIRE + "/" + DOCUMENT + ".docx") +docu = docx2python.docx2python(args.DOCUMENT) docu = docu.body docu[0] # Titre général @@ -200,7 +231,8 @@ for sem in saes: for s in saes[sem]: output = s.to_yaml() if s.code: - fichier = "export/{}.yml".format(s.code.replace("É", "E")) + code_clean = s.code.replace("É", "E") + fichier = f"{args.outdir}/{code_clean}.yml" with open(fichier, "w", encoding="utf8") as fid: fid.write(output) @@ -208,7 +240,8 @@ for sem in exemples: for s in exemples[sem]: for (i, e) in enumerate(exemples[sem][s]): output = e.to_yaml() - fichier = "export/{}_exemple{}.yml".format(s.replace("É", "E"), i+1) + code_clean = s.replace("É", "E") + fichier = f"{args.outdir}/{code_clean}_exemple{i+1}.yml" with open(fichier, "w", encoding="utf8") as fid: fid.write(output) diff --git a/python/export_yaml_to_latex.py b/python/export_yaml_to_latex.py index 4d877fc..89433e8 100644 --- a/python/export_yaml_to_latex.py +++ b/python/export_yaml_to_latex.py @@ -1,16 +1,38 @@ -import ressource -from ressource import * import os -import officiel - +import argparse import logging + +from config import Config + __LOGGER = logging.getLogger(__name__) -REPERTOIRE_TEMP = "export" -REPERTOIRE_RESSOURCES_DEFINITIVES = "../yaml/ressources" -REPERTOIRE_SAE_DEFINITIVES = "../yaml/saes" -REPERTOIRE_LATEX_RESSOURCES = "../latex/ressources" -REPERTOIRE_LATEX_SAES = "../latex/saes" + +parser = argparse.ArgumentParser(description="Conversion des YAML en LaTeX") +parser.add_argument( + "-a", + "--all", + action="store_true", + help="exporte le LaTeX complet" + ) +parser.add_argument( + "-r", + "--root", + default="..", + help="repertoire de base (racine) pour chercher les fichiers de données" + ) +args = parser.parse_args() +Config.ROOT = args.root + +import ressource +from ressource import * +import officiel + +REPERTOIRE_TEMP = Config.ROOT + "/python/export" +REPERTOIRE_RESSOURCES_DEFINITIVES = Config.ROOT + "/yaml/ressources" +REPERTOIRE_SAE_DEFINITIVES = Config.ROOT + "/yaml/saes" +REPERTOIRE_LATEX_RESSOURCES = Config.ROOT + "/latex/ressources" +REPERTOIRE_LATEX_SAES = Config.ROOT + "/latex/saes" +REPERTOIRE_SYNTHESE = Config.ROOT + "/latex/synthese" # Chargement des ressources : depuis les versions définitives du répertoire yaml d'abord, # puis dans python/export si manquantes @@ -73,7 +95,6 @@ for sem in ["S1", "S2"]: print(str_matrice(M1, saes, ressources, sem)) chaine = ressource.to_latex_matrice_acs(M1, saes, ressources, sem) - REPERTOIRE_SYNTHESE = "../latex/synthese" fichierlatex = REPERTOIRE_SYNTHESE + "/" + f"{sem}_acs_vs_saes_ressources.tex" with open(fichierlatex, "w", encoding="utf8") as fid: fid.write(chaine) @@ -94,8 +115,10 @@ for sem in ["S1", "S2"]: fid.write(chaine) print(f"Export de {fichierlatex}") -## Export latex divers -if False: +## Export latex divers (désactivé par défaut pour gagner du temps) +if not args.all: + __LOGGER.warning(f"{sys.argv[0]}: reduced version (use -a to get full docs)") +else: # Export latex des ressources for sem in ressources: for r in ressources[sem]: diff --git a/python/officiel.py b/python/officiel.py index 6849be4..a23b204 100644 --- a/python/officiel.py +++ b/python/officiel.py @@ -1,23 +1,24 @@ import logging, yaml import unicodedata +from config import Config __LOGGER = logging.getLogger(__name__) # Récupère les informations officielles ## Les ressources -with open("pn/ressources.yml", 'r', encoding="utf8") as fid: +with open(Config.ROOT+"/python/pn/ressources.yml", 'r', encoding="utf8") as fid: DATA_RESSOURCES = yaml.load(fid.read(), Loader=yaml.Loader) ## Les ACS -with open("pn/acs.yml", 'r', encoding="utf8") as fid: +with open(Config.ROOT+"/python/pn/acs.yml", 'r', encoding="utf8") as fid: DATA_ACS = yaml.load(fid.read(), Loader=yaml.Loader) ## Les SAEs -with open("pn/saes.yml", 'r', encoding="utf8") as fid: +with open(Config.ROOT+"/python/pn/saes.yml", 'r', encoding="utf8") as fid: DATA_SAES = yaml.load(fid.read(), Loader=yaml.Loader) ## Les compétences -with open("../yaml/competences/RT123.yml", 'r', encoding="utf8") as fid: +with open(Config.ROOT+"/yaml/competences/RT123.yml", 'r', encoding="utf8") as fid: DATA_COMPETENCES = yaml.load(fid.read(), Loader=yaml.Loader) ## Les abbréviations -with open("../yaml/abbreviations.yml", "r", encoding="utf8") as fid: +with open(Config.ROOT+"/yaml/abbreviations.yml", "r", encoding="utf8") as fid: DATA_ABBREVIATIONS = yaml.load(fid.read(), Loader=yaml.Loader) def supprime_accent_espace(chaine): diff --git a/python/ressource.py b/python/ressource.py index d6afb31..22229ed 100644 --- a/python/ressource.py +++ b/python/ressource.py @@ -3,6 +3,8 @@ import string import pypandoc import ruamel.yaml +from config import Config + from modeles import get_modele, TemplateLatex from officiel import * from ressourcedocx import remove_ligne_vide @@ -22,7 +24,7 @@ class Ressource(): except: Ressource.__LOGGER.warning(f"Pb de chargement de {fichieryaml}") - def to_latex(self, modele="pn/modele_ressource.tex"): + def to_latex(self, modele=Config.ROOT+"/python/pn/modele_ressource.tex"): """Génère le code latex décrivant la ressource""" modlatex = get_modele(modele) #"pn/modele_ressource.tex") @@ -149,7 +151,7 @@ class SAE(): - def to_latex(self, modele="pn/modele_sae.tex"): + def to_latex(self, modele=Config.ROOT+"/python/pn/modele_sae.tex"): """Génère le code latex décrivant la ressource""" modlatex = get_modele(modele) #"pn/modele_ressource.tex") @@ -233,7 +235,7 @@ class ExempleSAE(): except: Ressource.__LOGGER.warning(f"Pb de chargement de {fichieryaml}") - def to_latex(self, modele="pn/modele_exemple_sae.tex"): + def to_latex(self, modele=Config.ROOT+"/python/pn/modele_exemple_sae.tex"): """Génère le code latex décrivant la ressource""" modlatex = get_modele(modele) #"pn/modele_ressource.tex")