Améliore le traitement des lignes vides dans le markdown

This commit is contained in:
Cléo Baras 2021-04-04 09:34:03 +02:00
parent 92099755a2
commit da84905424
9 changed files with 60 additions and 36 deletions

View File

@ -10,28 +10,30 @@
\setlength{\extrarowheight}{2pt} % Marge des lignes \setlength{\extrarowheight}{2pt} % Marge des lignes
% 1er tableau : Nom/Code/Heures % 1er tableau : Nom/Code/Heures
\begin{tabular}[t]{|P|Q|P|Q|} \begin{tabular}[t]{|P|Q|V|}
\hline % 1ère ligne \hline % 1ère ligne
{\bfseries Ressource} \xdef\rescode{\csname Rcode\CODE\endcsname}
& \multicolumn{3}{l|}{ {\bfseries Ressource \rescode}
\xdef\rescode{\csname Rcode\CODE\endcsname} & \multicolumn{2}{l|}{\hypertarget{res:\rescode}{\bfseries \csname Rname\CODE\endcsname}}
\hypertarget{res:\rescode}{\bfseries \csname Rname\CODE\endcsname} \\
} \\
\hline % 2ème ligne \hline % 2ème ligne
{\bfseries Code} %{\bfseries Code}
& \csname Rcode\CODE\endcsname %& \csname Rcode\CODE\endcsname
& {\bfseries Semestre} %&
& \csname Rsem\CODE\endcsname \\ {\bfseries Semestre}
& \multicolumn{2}{l|}{\csname Rsem\CODE\endcsname} \\
\hline % 3ème ligne Heures \hline % 3ème ligne Heures
%{ \setlength{\extrarowheight}{0pt} %{ \setlength{\extrarowheight}{0pt}
% \begin{tabular}[t]{@{}Q@{}} \bfseries Heures de formation \\ \bfseries encadrées \end{tabular} % \begin{tabular}[t]{@{}Q@{}} \bfseries Heures de formation \\ \bfseries encadrées \end{tabular}
%} %}
\hline \hline
{\bfseries Heures}
&
{\bfseries Formation encadrée} {\bfseries Formation encadrée}
& {\csname Rtraining\CODE\endcsname}h & {\csname Rtraining\CODE\endcsname}h, dont {\csname Rtp\CODE\endcsname}h de TP \\
& % {\bfseries dont heures de TP} %& % {\bfseries dont heures de TP}
{\bfseries dont TP} % {\bfseries dont TP}
& {\csname Rtp\CODE\endcsname}h \\ %& {\csname Rtp\CODE\endcsname}h \\
\hline \hline
\end{tabular} \end{tabular}

View File

@ -47,6 +47,7 @@ stable.
% Livrable % Livrable
\ajoutSlivrables{ \ajoutSlivrables{
\vspace{-5pt}
\begin{itemize} \begin{itemize}
\item \item
Schéma réseau annoté avec le plan d'adressage et les services; Schéma réseau annoté avec le plan d'adressage et les services;

View File

@ -47,6 +47,7 @@ en mesurant l'importance et la portée des contenus qu'il diffuse
% Livrable % Livrable
\ajoutSlivrables{ \ajoutSlivrables{
\vspace{-5pt}
\begin{itemize} \begin{itemize}
\item \item
dossier ou rapport d'étude dossier ou rapport d'étude

View File

@ -45,6 +45,7 @@ fonctionnel et structuré.
% Livrable % Livrable
\ajoutSlivrables{ \ajoutSlivrables{
\vspace{-5pt}
\begin{itemize} \begin{itemize}
\item \item
Maquette du projet Maquette du projet

View File

@ -41,6 +41,7 @@ présenter sous forme d'un bilan à un client ou un collaborateur.
% Livrable % Livrable
\ajoutSlivrables{ \ajoutSlivrables{
\vspace{-5pt}
\begin{itemize} \begin{itemize}
\item \item
Rapport écrit Rapport écrit

View File

@ -55,6 +55,7 @@ informatique pour le compte de son entreprise.
% Livrable % Livrable
\ajoutSlivrables{ \ajoutSlivrables{
\vspace{-5pt}
\begin{itemize} \begin{itemize}
\item \item
Codes informatiques du site Web fonctionnel et dynamique Codes informatiques du site Web fonctionnel et dynamique

View File

@ -53,7 +53,7 @@ output1 = pypandoc.convert_text(temp1, 'tex', format='md',
print("ici") print("ici")
# Export latex des ressources # Export latex des ressources
if False: if True:
for sem in ressources: for sem in ressources:
for r in ressources[sem]: for r in ressources[sem]:
@ -64,7 +64,7 @@ if False:
print(f"Export de {fichierlatex} ") print(f"Export de {fichierlatex} ")
# Export latex des sae # Export latex des sae
if False: if True:
for sem in saes: for sem in saes:
for s in saes[sem]: for s in saes[sem]:

View File

@ -145,7 +145,6 @@ class SAE():
descriptif = "" descriptif = ""
SAE.__LOGGER.warning(f"{self.sae['titre']} n'a pas de description") SAE.__LOGGER.warning(f"{self.sae['titre']} n'a pas de description")
else: else:
descriptif = descriptif.replace("\n", "\n\n").replace("\n" * 4, "\n") # corrige les suppressions de ligne à la relecture du yaml
descriptif = md_to_latex(descriptif) descriptif = md_to_latex(descriptif)
# préparation des livrables # préparation des livrables
@ -154,7 +153,6 @@ class SAE():
livrables = "" livrables = ""
SAE.__LOGGER.warning(f"{self.sae['titre']} n'a pas de livrables") SAE.__LOGGER.warning(f"{self.sae['titre']} n'a pas de livrables")
else: else:
livrables = livrables.replace("\n", "\n\n").replace("\n" * 4, "\n") # corrige les suppressions de ligne à la relecture du yaml
livrables = md_to_latex(livrables) livrables = md_to_latex(livrables)
chaine = "" chaine = ""
@ -198,7 +196,6 @@ class ExempleSAE():
description = "" description = ""
ExempleSAE.__LOGGER.warning(f"{self.exemple['titre']} n'a pas de description") ExempleSAE.__LOGGER.warning(f"{self.exemple['titre']} n'a pas de description")
else: else:
description = description.replace("\n", "\n\n").replace("\n" * 4, "\n") # corrige les suppressions de ligne à la relecture du yaml
description = md_to_latex(description) description = md_to_latex(description)
# préparation de la forme # préparation de la forme
@ -207,7 +204,6 @@ class ExempleSAE():
formes = "" formes = ""
ExempleSAE.__LOGGER.warning(f"{self.exemple['titre']} n'a pas de formes") ExempleSAE.__LOGGER.warning(f"{self.exemple['titre']} n'a pas de formes")
else: else:
formes = formes.replace("\n", "\n\n").replace("\n" * 4, "\n") # corrige les suppressions de ligne à la relecture du yaml
formes = md_to_latex(formes) formes = md_to_latex(formes)
# préparation de la problématique # préparation de la problématique
@ -216,7 +212,6 @@ class ExempleSAE():
problematique = "" problematique = ""
ExempleSAE.__LOGGER.warning(f"{self.exemple['titre']} n'a pas de problematique") ExempleSAE.__LOGGER.warning(f"{self.exemple['titre']} n'a pas de problematique")
else: else:
problematique = problematique.replace("\n", "\n\n").replace("\n" * 4, "\n") # corrige les suppressions de ligne à la relecture du yaml
problematique = md_to_latex(problematique) problematique = md_to_latex(problematique)
# préparation des modalites # préparation des modalites
@ -225,7 +220,6 @@ class ExempleSAE():
modalite = "" modalite = ""
ExempleSAE.__LOGGER.warning(f"{self.exemple['titre']} n'a pas de modalite") ExempleSAE.__LOGGER.warning(f"{self.exemple['titre']} n'a pas de modalite")
else: else:
modalite = modalite.replace("\n", "\n\n").replace("\n" * 4, "\n") # corrige les suppressions de ligne à la relecture du yaml
modalite = md_to_latex(modalite) modalite = md_to_latex(modalite)
chaine = "" chaine = ""
@ -242,9 +236,15 @@ class ExempleSAE():
def md_to_latex(contenu): def md_to_latex(contenu):
"""Réalise la conversion markdown to latex avec pypandoc""" """Réalise la conversion markdown to latex avec pypandoc"""
contenu = contenu.replace("\n", "\n\n") # corrige les suppressions de ligne à la relecture du yaml
contenu = pypandoc.convert_text(contenu, 'tex', format='md', contenu = pypandoc.convert_text(contenu, 'tex', format='md',
extra_args=['--atx-headers']) extra_args=['--atx-headers'])
contenu = contenu.replace("\r\n", "\n") contenu = contenu.replace("\r\n", "\n")
contenu = caracteres_recalcitrants(contenu) contenu = caracteres_recalcitrants(contenu)
contenu = remove_ligne_vide(contenu) contenu = remove_ligne_vide(contenu)
lignes = contenu.split("\n") # pour debug
if contenu.startswith("\\begin{itemize}"):
contenu = "\\vspace{-5pt}\n" + contenu # ajout d'un offset en cas de liste à puces
return contenu return contenu

View File

@ -9,12 +9,38 @@ from tools import caracteres_recalcitrants
__LOGGER = logging.getLogger(__name__) __LOGGER = logging.getLogger(__name__)
class Docx():
class RessourceDocx(): """Classe de base pour les ressources/saé/exemples du docx"""
"""Classe modélisant les ressources, lorsqu'elles sont extraites du docx"""
def __init__(self, nom, brut): def __init__(self, nom, brut):
self.nom = nom self.nom = nom
self.brut = brut # les données brutes de la ressource self.brut = brut # les données brutes de la ressource
def charge_ac(self, apprentissages):
self.apprentissages = apprentissages
def __str__(self):
print(self.nom + " " + self.code)
def dico_to_yaml(self, dico):
if self.code == "R108":
print("ici")
output = ruamel.yaml.dump(dico, Dumper=ruamel.yaml.RoundTripDumper,
allow_unicode=True, width=100)
# Purge les lignes vides en trop
lignes = output.split("\n")
lignes_finales = []
for (i, ligne) in enumerate(lignes):
if ligne.rstrip() == "":
if i != len(lignes)-1 and lignes[i+1].rstrip() == "":
lignes_finales.append(ligne) # ajoute la ligne si la suivante n'est pas vide
else:
lignes_finales.append(ligne)
output = "\n".join(lignes_finales)
lignes = output.split("\n") # pour vérif
return output
class RessourceDocx(Docx):
"""Classe modélisant les ressources, lorsqu'elles sont extraites du docx"""
def charge_informations(self, code, semestre, heures_encadrees, tp, sae, prerequis, description, mots): def charge_informations(self, code, semestre, heures_encadrees, tp, sae, prerequis, description, mots):
self.code = code self.code = code
@ -28,12 +54,6 @@ class RessourceDocx():
self.contenu = None self.contenu = None
self.mots = mots self.mots = mots
def charge_ac(self, apprentissages):
self.apprentissages = apprentissages
def __str__(self):
print(self.nom + " " + self.code)
def to_yaml(self): def to_yaml(self):
"""Exporte la ressource en yaml""" """Exporte la ressource en yaml"""
dico = {"nom": self.nom, dico = {"nom": self.nom,
@ -48,10 +68,7 @@ class RessourceDocx():
"contenu": folded(self.contenu), "contenu": folded(self.contenu),
"motscles": self.mots if self.mots else "" "motscles": self.mots if self.mots else ""
} }
output = ruamel.yaml.dump(dico, Dumper=ruamel.yaml.RoundTripDumper, return self.dico_to_yaml(dico)
allow_unicode=True, width=100)
output = output.replace("\n\n\n", "\n\n")
return output
def nettoie_champ_heure(champ): def nettoie_champ_heure(champ):
try: # champ contenant uniquement un nbre d'heure try: # champ contenant uniquement un nbre d'heure