Amélioration du traitement des contenus textuels avant export markdown

This commit is contained in:
Cléo Baras 2021-04-02 15:24:56 +02:00
parent bb4bd79b6d
commit 88ec2461ea
5 changed files with 37 additions and 29 deletions

View File

@ -1,6 +1,7 @@
import docx2python
from ressourcedocx import *
import tools
import logging
@ -64,7 +65,7 @@ for i in range(2, len(docu)): # A priori un tableau
champ = ligne[0][0] # le nom du champ
i = get_indice_sans_accent_ni_espace(champ, ENTETES) # l'indice de l'entete dans ENTETES
if i != None:
data[i] = "\n".join(res[j][1])
data[i] = tools.caracteres_recalcitrants("\n".join(res[j][1]))
if champ == "Prérequis" and not data[i]:
data[i] = "aucun"
print(f"Dans {nom_ressource}, complète les prérequis à \"aucun\"")
@ -76,7 +77,7 @@ for i in range(2, len(docu)): # A priori un tableau
# j+1 = les ACs par compétences
acs = res[j+2]
for k in range(len(acs)):
apprentissages[k] = "\n".join(acs[k]) # fusionne les ACS (généralement sur plusieurs lignes)
apprentissages[k] = tools.caracteres_recalcitrants("\n".join(acs[k])) # fusionne les ACS (généralement sur plusieurs lignes)
if non_interprete: # souvent Heures de formation (incluant les TP)

View File

@ -69,7 +69,7 @@ for i in range(1, len(docu)): # A priori un tableau
for j in range(len(res)): # parcours des entêtes du tableau décrivant la ressource
ligne = res[j]
if len(ligne) == 2: # ligne de données classique champ => valeur
champ = ligne[0][0] # le nom du champ
champ = caracteres_recalcitrants(ligne[0][0]) # le nom du champ
if champ.startswith("Nom de la"):
champ = "Titre de la" # corrige les noms/titres
i = get_indice_sans_accent_ni_espace(champ, ENTETES_CHAPEAU) # l'indice de l'entete dans ENTETES
@ -84,7 +84,7 @@ for i in range(1, len(docu)): # A priori un tableau
# j+1 = les ACs par compétences
acs = res[j+2]
for k in range(len(acs)):
apprentissages[k] = "\n".join(acs[k]) # fusionne les ACS (généralement sur plusieurs lignes)
apprentissages[k] = caracteres_recalcitrants("\n".join(acs[k])) # fusionne les ACS (généralement sur plusieurs lignes)
if non_interprete: # souvent Heures de formation (incluant les TP)
@ -127,7 +127,7 @@ for i in range(1, len(docu)): # A priori un tableau
for j in range(len(res)): # parcours des entêtes du tableau décrivant la ressource
ligne = res[j]
if len(ligne) == 2: # ligne de données classique champ => valeur
champ = ligne[0][0] # le nom du champ
champ = caracteres_recalcitrants(ligne[0][0]) # le nom du champ
i = get_indice_sans_accent_ni_espace(champ, ENTETES_EXEMPLES) # l'indice de l'entete dans ENTETES
if i != None:
data[i] = "\n".join(res[j][1])

View File

@ -5,7 +5,8 @@ import ruamel.yaml
from modeles import get_modele, TemplateLatex
from officiel import DATA_ACS, get_officiel_sae_name_by_code, get_officiel_ressource_name_by_code
from ressourcedocx import caracteres_recalcitrants, remove_ligne_vide
from ressourcedocx import remove_ligne_vide
from tools import caracteres_recalcitrants
class Ressource():

View File

@ -5,6 +5,8 @@ from officiel import supprime_accent_espace, get_code_from_nom_using_dict
import ruamel.yaml
from ruamel.yaml.scalarstring import FoldedScalarString as folded
from tools import caracteres_recalcitrants
__LOGGER = logging.getLogger(__name__)
@ -51,9 +53,9 @@ class RessourceDocx():
"acs": self.apprentissages,
"sae": self.sae,
"prerequis": self.prerequis,
"contexte": folded(caracteres_recalcitrants(self.contexte)),
"contenu": folded(caracteres_recalcitrants(self.contenu)),
"motscles": caracteres_recalcitrants(self.mots) if self.mots else ""
"contexte": folded(self.contexte),
"contenu": folded(self.contenu),
"motscles": self.mots if self.mots else ""
}
# output = yaml.dump(dico, #Dumper=yaml.Dumper,
# sort_keys=False, allow_unicode=True)
@ -334,17 +336,18 @@ def get_marqueur_numerique(contenu):
return m
def get_marqueurs(contenus):
"""Renvoie la liste des marqueurs (à 1 caractère) partant d'une liste de ligne"""
"""Renvoie la liste des marqueurs (à 1 caractère) partant d'une liste de lignes (éventuellement vide)"""
marqueurs = []
for ligne in contenus:
m = re.search(r"(\t)*", ligne) # des \t ?
m = re.search(r"(\t)*", ligne) # y a-t-il des tabulations ?
if m.group() != "":
ajout = m.group()
else:
ajout = ""
ligne = ligne.replace("\t","")[0].rstrip() # le marqueur en début de ligne (si 1 caractère)
if ligne[0] not in string.ascii_letters and ligne[0] != "É" and ligne[0] != "/":
marqueurs += [ajout + ligne[0]] # tous les symboles
ligne = ligne.replace("\t","").rstrip()
if ligne: # si la ligne n'est pas vide, cherche le marqueur en début de ligne (si 1 caractère)
if ligne[0] not in string.ascii_letters and ligne[0] != "É" and ligne[0] != "/":
marqueurs += [ajout + ligne[0]] # tous les symboles
marqueurs_finaux = [] # tri les marqueurs en supprimant les doublons et en gardant un ordre (pour détecter les sous listes)
for m in marqueurs:
@ -358,19 +361,22 @@ def get_marqueur(ligne, marqueurs):
if ligne.startswith(m):
return m
def nettoie_contenus(r):
# suppression des \t
contenu = r.contenu.replace(" / ", "/") # supprime les nbsp
if r.code == "R113":
print("ici")
def remplace_marqueur_numerique_with_caracteres(contenu):
"""Remplace les marqueurs numériques par des marqueurs > lorsque présents dans un contenu"""
marqueurs_numeriques = get_marqueur_numerique(contenu)
for m in marqueurs_numeriques: # remplace les marqueurs numériques
contenu = contenu.replace(m, ">")
return contenu
def nettoie_contenus(r):
# suppression des \t
contenu = r.contenu.replace(" / ", "/")
contenu = remplace_marqueur_numerique_with_caracteres(contenu)
contenus = [ligne.rstrip() for ligne in contenu.split("\n")] # les contenus
contenus = remove_ligne_vide(contenus) # supprime les lignes vides
# contenus = remove_ligne_vide(contenus) # supprime les lignes vides
marqueurs_finaux = get_marqueurs(contenus)
@ -388,13 +394,6 @@ def nettoie_contenus(r):
r.contenu = contenu
def caracteres_recalcitrants(contenu):
contenu = contenu.replace("", "è").replace("", "'").replace("", "é")
contenu = contenu.replace("", "â").replace(b'a\xcc\x82'.decode("utf8"), "â")
contenu = contenu.replace('\xa0', ' ') # le nbsp
return contenu
class SAEDocx():
def __init__(self, nom, brut):

View File

@ -16,4 +16,11 @@ def get_indice_sans_accent_ni_espace(champ, entetes):
entete_purge = supprime_accent_espace(entete).rstrip()
if entete_purge in champ_purge:
return i
return None
return None
def caracteres_recalcitrants(contenu):
contenu = contenu.replace("", "è").replace("", "'").replace("", "é")
contenu = contenu.replace("", "â").replace(b'a\xcc\x82'.decode("utf8"), "â")
contenu = contenu.replace('\xa0', ' ') # le nbsp
return contenu