#!/usr/bin/env python3
# -*- coding: utf-8 -*-

#créé par Pierre, Danrun

import os
import re
from bs4 import BeautifulSoup


#fonction pour nettoyage
def nettoyage(chaine):
	nvl_chaine = re.sub(r'<.*?>', '', chaine)
	if nvl_chaine and not nvl_chaine.endswith('.'):
		nvl_chaine += '.'
	return nvl_chaine


#dictionnaire qui permet de gérer les catégories, le compteur des archives, et les doublons en fonction des noms de fichier
cat_name = {
	'0,2-3236,1-0,0.xml': ['actualite-medias', 0, '', 0, 0],
	'0,2-3234,1-0,0.xml': ['economie', 0, '', 0, 0],
	'0,2-3210,1-0,0.xml': ['international', 0, '', 0, 0],
	'0,57-0,64-823353,0.xml': ['politique', 0, '', 0, 0],
	'0,2-3242,1-0,0.xml': ['sport', 0, '', 0, 0],
	'0,2-3238,1-0,0.xml': ['vous', 0, '', 0, 0],
	'0,2-3476,1-0,0.xml': ['cinema', 0, '', 0, 0],
	'0,2-3214,1-0,0.xml': ['europe', 0, '', 0, 0],
	'0,2-3260,1-0,0.xml': ['livres', 0, '', 0, 0],
	'env_sciences.xml': ['sciences', 0, '', 0, 0],
	'0,2-651865,1-0,0.xml': ['technologies', 0, '', 0, 0],
	'0,2-3546,1-0,0.xml': ['voyage', 0, '', 0, 0],
	'0,2-3246,1-0,0.xml': ['culture', 0, '', 0, 0],
	'0,2-3232,1-0,0.xml': ['idees', 0, '', 0, 0],
	'0,2-3244,1-0,0.xml': ['planete', 0, '', 0, 0],
	'0,2-3224,1-0,0.xml': ['societe', 0, '', 0, 0],
	'0,2-3208,1-0,0.xml': ['une', 0, '', 0, 0],
}


###############################################################################################################################
'''
cette partie (facultative) permet de rendre le programme plus 'pérenne'
il permet de mettre le dictionnaire à jour en fonction du contenu de nos fichiers
ainsi nous pouvons ajouter quelques flux rss et relancer le programme, les doublons et les compteurs seront gérés correctement
'''
if os.path.exists("./SORTIE_V6") :
	for root, dirs, files in os.walk('./SORTIE_V6') :
		for cat in dirs :
			for ele in cat_name.values() :
				if ele[0] == cat :
					for rep, srep, fichier in os.walk('./SORTIE_V6/' + cat):
						with open('./SORTIE_V6/' + cat + '/' + fichier[1] ,'r',encoding = 'UTF-8') as fichierxml :
							contenu = fichierxml.read()
							title_list = re.findall('<title>.*?</title>', contenu)
							nbarchive = len(title_list)
							titles = ''.join(title_list)
							ele[1], ele[2] = nbarchive, titles

###############################################################################################################################

#demande les catégories à l'utilisateur
for i in cat_name.values():
	print(i[0])

demande = input('Indiquez une ou plusieurs catégories (séparées par espace)\n')

cat_demande = re.findall(r'\w+', demande.lower())

#génération de l'arborescence pour parcourir tous les fichiers et tous les sous-dossiers d'un dossier
for root, dirs, files in os.walk('./2018'):
	for name in files :
		if name in cat_name : #1er filtre : exclus les fichiers non pertinents ex : fil.*.xml

			if cat_name[name][0] in cat_demande : #2ème filtre : traite seulement les catégories demandées

				#on crée les chemins de fichier
				cat = cat_name[name][0]
				filename = os.path.join(root, name)
				print(root)
				print(filename + ' : ' + cat)

				#si aucun dossier ne correspond à la catégorie demandée alors on le crée avec ses fichiers xml et txt
				if not os.path.exists("./SORTIE_V6/" + cat):
					os.makedirs("./SORTIE_V6/" + cat)
					
					#si le fichier existe déjà, on l'ouvre en mode r+ (lecture + écriture sans écrasement)
					try:
						xmltmp = open('./SORTIE_V6/' + cat + '/' + cat + '.xml','r+', encoding = 'UTF-8')
						txttmp = open('./SORTIE_V6/' + cat + '/' + cat + '.txt','r+', encoding = 'UTF-8')
					#sinon on crée le fichier en l'ouvrant en mode w (création et écriture, écrasement du contenu de l'ancien fichier si ce dernier existe déjà)
					except:
						xmltmp = open('./SORTIE_V6/' + cat + '/' + cat + '.xml','w', encoding = 'UTF-8')
						txttmp = open('./SORTIE_V6/' + cat + '/' + cat + '.txt','w', encoding = 'UTF-8')
						xmltmp.write('<?xml version="1.0" encoding="UTF8"?>\n<file>\n</file>')
						
					cat_name[name][3] = xmltmp
					cat_name[name][4] = txttmp

				cat, counter, titles, sortiexml, sortietxt = cat_name[name]

				#ouverture d'un fichier
				with open(filename, 'rb') as fichier :

					#utilisation du parser xml
					soup = BeautifulSoup(fichier, 'lxml-xml')

					#on récupère le contenu des items
					items = soup.find_all('item')

					for i in items:

						#xml
						#on vérifie que le titre contenu dans l'item n'est pas déjà dans le fichier (gestion des doublons)
						#s'il n'est pas présent, on écrit le titre et la description(s'il y en a une) dans le fichier ouvert précédemment
						if str(i.title.string) not in titles :
							name_title = nettoyage(str(i.title.string))
							sortiexml.seek(sortiexml.seek(0,2) - 7)
							sortiexml.write('<archive = ' + str(counter) + '>\n<title>' + name_title + "</title>\n")
							sortietxt.write('§ ' + name_title + '\n')
							counter += 1

							if i.description and i.description.string :
								name_description = nettoyage(str(i.description.string))
								sortiexml.write('<description>' + name_description + '</description>' + "\n</archive>\n</file>")
								sortietxt.write(name_description + '\n\n')
							else:
								sortiexml.write("\n</archive>\n</file>")
								sortietxt.write('\n')

							titles += str(i.title) #pour gérer les doublons

				cat_name[name] = [cat, counter, titles, sortiexml, sortietxt] #on met le dictionnaire à jour

for for_sortiexml in cat_name.values():
	if type(for_sortiexml[3]) != int:
		for_sortiexml[3].close()
		for_sortiexml[4].close()
