#!/usr/bin/python

#------------------------------------------------------------------------------------
# Utilisation : python3 BaO1-regexp.py chemin/du/repertoire rubrique
# argv[1] = chemin/du/repertoire, ex. /fils-rss-2020
# argv[2] = 3208

import os, sys, re
import time
# Pour compter le temps de fonctionnement...
start = time.time()

#-----------------------

# Fonction pour parcourir les fichiers fils RSS, pour extraire le contenu et le nettoyer. 
def walking_processing_directories(path):
    # Récuperations des fichiers texte grâce au module et la fonction walk. 
    for dirpath, dirnames, files in sorted(os.walk(path)):
        for file in files:
            # On traite seulement les fichiers xml
            if re.search(rf'{rubrique}.+\.xml', file):
                global i 
                i+= 1
                file_path = dirpath + "/" + file
                print (i, "Traitement de {}".format(file_path)) 
                file_xml = open(file_path,"r", encoding="UTF-8")
                # Récuperation de titres, de dates et de descriptions avec regexps
                text = re.findall(r'<item><title>(.+?)<\/title>.+?<description>(.+?)<\/description><guid.+?(\d{4}\/\d{2}\/\d{2}).+?<\/guid>', file_xml.read())
                # On regarde si les tuples (titre et description) n'ont pas été extraits avant un utilisant un set (ensemble) qui élimine les doublons automatiquement.
                for tuple in text:
                    global no_doubles
                    if tuple[0] not in no_doubles:
                        no_doubles.add(tuple[0])
                        global nb_item
                        nb_item += 1
                        # On lance les fonctions de nettoyage sur les tuples.
                        title = text_cleaning(tuple[0])
                        description = text_cleaning(tuple[1])
                        date = tuple[2]
                        # Écriture des fichier de sorties.
                        output.write("{}\n{}\n--------------------\n".format(title,description))
                        output_xml.write("<item date=\"{}\">\n".format(date))
                        output_xml.write("<titre>{}</titre>\n".format(title))
                        output_xml.write("<description>{}</description>\n</item>\n".format(description))

#-----------------------
# Fonction de nettoyage avec regexps.
def text_cleaning(sent):
        text_clean = re.sub(r'<!\[CDATA\[','', sent)
        text_clean = re.sub(r'\]\]>$','', text_clean)
        text_clean = re.sub(r'&lt;.+?&gt;','', text_clean)
        text_clean = re.sub(r'&#38;#39;','\'', text_clean)
        text_clean = re.sub(r'#38;#34;','"', text_clean)
        text_clean = re.sub(r'$','.', text_clean)
        text_clean = re.sub(r'\.+$','.', text_clean)
        text_clean = re.sub(r'\?\.$','?', text_clean)
        text_clean = re.sub(r'&nbsp;',' ', text_clean)
        text_clean = re.sub(r'&nbsp;',' ', text_clean)        
        return text_clean

#----------------------- PROGRAME PRINCIPAL ---------------------------------

# Récuperation des arguments et normalisation du chemin du répertoire
repertoire = sys.argv[1]
repertoire = re.sub(r'(.+)\\$',r'\1', repertoire)
rubrique = sys.argv[2]

# Ouverture des fichier de sortie
output = open("sortie-py_regexp_{}.txt".format(rubrique),"w", encoding="UTF-8") 
output_xml = open("sortie-py_regexp_{}.xml".format(rubrique),"w", encoding="UTF-8") 

#Écriture de l'en-tête xml.
output_xml.write("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n")
output_xml.write("<corpus2020>\n")

i = 0
nb_item = 0
no_doubles = set()

print("\n--->Extraction de la rubrique {}<---\n".format(rubrique))

# Lancement de la fonction principal, fermeture des fichiers de sortie. 
walking_processing_directories(repertoire)

output_xml.write("</corpus2020>\n")
output_xml.close()
output.close()

end = time.time()
print("\nTemps écoulé...", end - start, "secondes")
print("\nItems traités : %d" %(nb_item))

