# coding: utf-8
#!/bin/python

#on importe toutes les librairies dont on va avoir besoin :
import urllib2
from StringIO import StringIO
import gzip
import chardet
import re
from os import listdir
import sys
from bs4 import BeautifulSoup

#on définit le traitement et la construction du tableau comme une fonction 'analyse'
def analyse(fichier):
  
  #on initialise les compteurs i(pour les liens) et j(pour les fichiers):
  i=1
  j=1
  path_fichier=''+str(dossier)+'/'+str(fichier)+''
  fichierurls=open(path_fichier,'r')
  liste=fichierurls.readlines()

  tab='Projet/TABLEAUX/resultats'+str(j)+'.html'

  #ouverture du tableau pour stocker les résultats
  tableau=open(tab, 'a')
  tableau.write('<html><head><meta charset="utf-8" /><title>Résultats de l\'Analyse</title></head><body><table border cellpading="5">')
  tableau.write('<tr><td>Numéro</td><td>URL</td><td>Page Aspirée</td><td>Encodage</td><td>Dump (utf-8)</td><td>Dump (nettoyé)</td><td>Nb d\'occurrences (censure)</td><td>Nb d\'occurrences (tabou)</tr>')

  #Traitement des urls, une par une :
  for url in liste :
    #suppression du dernier caractère 
    url=url.strip()
    
    #aspiration de la page web
    request = urllib2.Request(url)
    
    #vérification pour savoir si l'encodage est en gzip
    request.add_header('Accept-encoding', 'gzip')
    response = urllib2.urlopen(request)
    
    #et si c'est bien le cas, on convertit :
    if response.info().get('Content-Encoding') == 'gzip':
      buf = StringIO(response.read())
      f = gzip.GzipFile(fileobj=buf)
      data = f.read() 
    
    else :
      data=response.read() 
      
    #et on récupère l'encodage
    c=chardet.detect(data)
    encodage=str(c.values()[1])
    print encodage

    #on stocke la page aspirée dans un fichier
    nom_page_asp='Projet/PAGES-ASPIREES/page-asp-'+str(i)+'.html'
    page_asp=open(nom_page_asp,'w')
    page_asp.write(data)

    
    #on va stocker le code source de la page dans un fichier dump
    nom_dump='Projet/DUMP-TEXT/dump-'+str(i)+'.txt'
    dump=open(nom_dump,'w')
    
      
    #si l'encodage est bien utf-8, on copie le code source dans le fichier dump   
    if encodage=='utf-8':
      dump.write(data)
      dump.close()
      
    #cette page est détectée en MacCyrillic mais le code source indique windows-1251
    if encodage=='MacCyrillic':
      encodage='windows-1251'
  
    #si l'encodage est différent, on copie une version convertie dans le fichier dump
    if encodage!='utf-8':
      data=data.decode(encodage)
      dump.write(data.encode('utf-8'))
  
    #nettoyage du dump
    fic=open(nom_dump,'r')
    soup = BeautifulSoup(fic, 'html.parser')
    # d'abord on se débarasse de tous les scripts...
    for script in soup(["script", "style"]):
	script.extract()    # rip it out
    # ... puis on récupère le texte (dans un autre ordre, on a encore les scripts)
    texte = soup.get_text()
    # et pour finir on rend le texte présentable
    lines = (line.strip() for line in texte.splitlines())
    chunks = (phrase.strip() for line in lines for phrase in line.split("  "))
    text = '\n'.join(chunk for chunk in chunks if chunk)
    # et on l'écrit dans un fichier 'dump_propre'
    dump_net=open('Projet/DUMP-TEXT/dump_propre'+str(i)+'.txt','w')
    dump_net.write(text.encode('utf8'))    
    dump_net.close()
    
    #comptage des occurrences de 'censure' (différentes langues)
    rech_censure=re.compile('[^\W]*(censu|цензур|Zensur|zens|sensuu)[^\W]*',re.IGNORECASE)
    nb_occ_c=0
    fichier_dump=open('Projet/DUMP-TEXT/dump_propre'+str(i)+'.txt','r')
    dump_texte=fichier_dump.read()
    occ=rech_censure.findall(dump_texte)
    for each_occ in occ:
      nb_occ_c+=1
    print "nombre d'occurences de censure:" + str(nb_occ_c)
    
    #comptage des occurrences de 'tabou' (différentes langues)
    rech_tabou=re.compile('[^\W]*(tabou|taboo|tabu|табу)[^\W]*',re.IGNORECASE)
    nb_occ_t=0
    occ=rech_tabou.findall(dump_texte)
    for each_occ in occ:
      nb_occ_t+=1
    print "nombre d'occurrences de tabou:" + str(nb_occ_t)
    
    #création d'un fichier pour stocker les contextes globaux :
    fichier_cont_glob=open('Projet/CONTEXTES/contexte_global'+str(j)+'.txt','a')
    
    #extraction des contextes
    contexte_gauche=""
    contexte_droite=""
    fichier_dump=open('Projet/DUMP-TEXT/dump_propre'+str(i)+'.txt', 'r')
    regex=re.compile('[^\W]*(tabou|taboo|tabu|табу|censur|цензур|Zensur|zens|sensuu)[^\W]*',re.IGNORECASE)
    lignes=fichier_dump.readlines()
    for ligne in lignes :
      if regex.search(ligne):
	num_ligne=lignes.index(ligne)
	
	prec = [(lignes[num_ligne-3]),(lignes[num_ligne-2]),(lignes[num_ligne-1])]
	suiv = [(lignes[num_ligne+1]),(lignes[num_ligne+2]),(lignes[num_ligne+3])]
	
	s="/"
	contexte_gauche = s.join(prec)
	contexte_droite = s.join(suiv)
	ligne_cible=str(ligne)
	
	#on écrit chaque contexte dans un fichier à part:
	contexte=open('Projet/CONTEXTES/contexte'+str(i)+'.txt','w')
	contexte.write(contexte_gauche)
	contexte.write(ligne_cible)
	contexte.write(contexte_droite)
	contexte.close()
	
	#et on écrit les contextes dans le fichier global
	fichier_cont_glob.write(contexte_gauche)
	fichier_cont_glob.write(ligne_cible)
	fichier_cont_glob.write(contexte_droite)
	
    #écriture des résultats dans le tableau
    tableau.write('<tr><td>'+str(i)+'</td><td><a href="'+ url+ '">url</a></td><td><a href="'+ str(nom_page_asp) +'">page aspirée '+str(i)+'</a></td><td>'+ str(encodage) +'</td><td><a href="'+ str(nom_dump) +'">dump'+str(i)+'</a></td><td><a href="/media/guersande/60BA-19B0/Projet/DUMP-TEXT/dump_propre'+str(i)+'.txt">Dump propre '+str(i)+'</a></td><td>'+str(nb_occ_c)+'</td><td>'+str(nb_occ_t)+'</td></tr>')

    i=i+1  

  #fermeture du tableau 
  tableau.write('</table></body></html>')
  tableau.close
  j=j+1
    
print "Choisissez votre dossier d'URLS."
dossier=raw_input()

#On transforme le contenu du dossier en liste à parcourir
liste_fichiers=listdir(dossier)

#on applique la fonction 'analyse' à l'ensemble des fichiers du dossier d'URLS choisi par l'utilisateur
for fichier in liste_fichiers :
  analyse(fichier)
