From 88ec2461ea2114b53aea0fd1af745b88102fc1ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9o=20Baras?= Date: Fri, 2 Apr 2021 15:24:56 +0200 Subject: [PATCH] =?UTF-8?q?Am=C3=A9lioration=20du=20traitement=20des=20con?= =?UTF-8?q?tenus=20textuels=20avant=20export=20markdown?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- python/export_docx_to_yaml.py | 5 ++-- python/export_sae_docx_to_yaml.py | 6 ++--- python/ressource.py | 3 ++- python/ressourcedocx.py | 43 +++++++++++++++---------------- python/tools.py | 9 ++++++- 5 files changed, 37 insertions(+), 29 deletions(-) diff --git a/python/export_docx_to_yaml.py b/python/export_docx_to_yaml.py index c407f45..edeeb90 100644 --- a/python/export_docx_to_yaml.py +++ b/python/export_docx_to_yaml.py @@ -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) diff --git a/python/export_sae_docx_to_yaml.py b/python/export_sae_docx_to_yaml.py index 0b3183d..73c0605 100644 --- a/python/export_sae_docx_to_yaml.py +++ b/python/export_sae_docx_to_yaml.py @@ -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]) diff --git a/python/ressource.py b/python/ressource.py index 869243d..a2f4ecb 100644 --- a/python/ressource.py +++ b/python/ressource.py @@ -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(): diff --git a/python/ressourcedocx.py b/python/ressourcedocx.py index 4e392af..7f5ab3c 100644 --- a/python/ressourcedocx.py +++ b/python/ressourcedocx.py @@ -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): diff --git a/python/tools.py b/python/tools.py index 4c29e0e..67d3dfc 100644 --- a/python/tools.py +++ b/python/tools.py @@ -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 \ No newline at end of file + 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 \ No newline at end of file