#!/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,2-3234,1-0,0.xml': ['economie', 0, ''],
	'0,2-3210,1-0,0.xml': ['international', 0, ''],
	'0,57-0,64-823353,0.xml': ['politique', 0, ''],
	'0,2-3242,1-0,0.xml': ['sport', 0, ''],
	'0,2-3238,1-0,0.xml': ['vous', 0, ''],
	'0,2-3476,1-0,0.xml': ['cinema', 0, ''],
	'0,2-3214,1-0,0.xml': ['europe', 0, ''],
	'0,2-3260,1-0,0.xml': ['livres', 0, ''],
	'env_sciences.xml': ['sciences', 0, ''],
	'0,2-651865,1-0,0.xml': ['technologies', 0, ''],
	'0,2-3546,1-0,0.xml': ['voyage', 0, ''],
	'0,2-3246,1-0,0.xml': ['culture', 0, ''],
	'0,2-3232,1-0,0.xml': ['idees', 0, ''],
	'0,2-3244,1-0,0.xml': ['planete', 0, ''],
	'0,2-3224,1-0,0.xml': ['societe', 0, ''],
	'0,2-3208,1-0,0.xml': ['une', 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") :
	for root, dirs, files in os.walk('./SORTIE') :
		for cat in dirs :
			for ele in cat_name.values() :
				if ele[0] == cat :
					for rep, srep, fichier in os.walk('./SORTIE/' + cat):
						with open('./SORTIE/' + 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 de 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
	
			cat, counter, titles = cat_name[name]

			if cat in cat_demande : #2ème filtre : traite seulement les catégories demandées

				#crée les chemins de fichier
				filename = os.path.join(root, name)
				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/" + cat):
					os.makedirs("./SORTIE/" + cat)
					with open('./SORTIE/' + cat + '/' + cat + '.xml','w', encoding = 'UTF-8') as sortiexml :
						sortiexml.write('<?xml version="1.0" encoding="UTF8"?>\n<file>\n</file>')
					sortietxt = open('./SORTIE/' + cat + '/' + cat + '.txt','w', encoding = 'UTF-8').close()

				#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 crée/ouvre le fichier xml correspondant à la bonne rubrique
						with open('./SORTIE/' + cat + '/' + cat + '.xml','r+', encoding = 'UTF-8') as sortiexml:

							#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")
								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>")
								else:
									sortiexml.write("\n</archive>\n</file>")

								titles += str(i.title) #pour gérer les doublons

				cat_name[name] = [cat, counter, titles] #on met le dictionnaire à jour

#génération des fichiers txt
#txt
for root, dirs, files in os.walk('./SORTIE') :
	for name in files:
		if name.endswith('.xml'):
			xmlpath = os.path.join(root, name)
			txtpath = xmlpath.replace('.xml', '.txt')
			txttmp = open(txtpath, 'w', encoding = 'utf-8')
			with open(xmlpath, 'rb') as xmltmp:
				soup = BeautifulSoup(xmltmp, 'lxml-xml')
				arc_list = soup.find_all('archive')
			for i in arc_list:
				txttmp.write(str(i.title.string + '\n'))
				if i.description:
					txttmp.write(str(i.description.string + '\n\n'))
			txttmp.close()