#!/usr/bin/python
#!-*-coding:utf8-*-
import urllib
import urllib2
import os
import socket
import nltk
from bs4 import UnicodeDammit
import re

dos=raw_input("Donnez le nom du dossier contenant les fichiers url : ")
tableau=raw_input("Donnez le nom du fichier html ou stocker ces liens : ")

#Commencer a ecrire dans le tableau (ouverture des balises html et body)
fichierin =open(tableau, "w")
fichierin.write("<html><head><link rel=\"stylesheet\" href=\"style.css\"/><meta charset=\"utf-8\" /><title>Americanisation</title></head><body>")


#creation d'un dossier pour les fichiers globaux s'il n'existe pas deja
if not os.path.exists("./FICHIERSGLOBAUX"):
        os.mkdir("./FICHIERSGLOBAUX") 

j=1 #variable pour compter les tableaux



#------Lire le contenu du dossier et traiter chaque fichier URL------#

for filename in (os.listdir(dos)):

    #ouvrir le fichier url
    fichierout=open("%s/%s"%(dos,filename), "r")

    #-------Création des noms de sous-dossiers------#
   
    (filename, extension) = os.path.splitext(filename)

    
    #----------Création de sous-dossiers------------#
    
    if not os.path.exists("./PAGES-ASPIREES/"+filename):
        os.mkdir("./PAGES-ASPIREES/"+filename)
        
    if not os.path.exists("./DUMP-TEXT/"+filename):
        os.mkdir("./DUMP-TEXT/"+filename)

    if not os.path.exists("./CONTEXTES/"+filename):
        os.mkdir("./CONTEXTES/"+filename)

    if not os.path.exists("./FICHIERSGLOBAUX/"+filename):
        os.mkdir("./FICHIERSGLOBAUX/"+filename)


    #-----creation du titre du tableau------#

    title = filename.replace ("_", " ") 

    #----Commencer a ecrire le tableau, et ses headers----#

    print>>fichierin, "<table><tr><th colspan=\"9\">Tableau numero",j, "(",title,") :</th></tr>"
    print>>fichierin, "<tr><th class=\"short\">No.</th><th>Lien</th><th>Page aspirée</th><th>Erreur</th><th>DUMP</th><th>DUMP UTF-8</th><th>Contextes</th><th>Contextes Html</th><th class=\"short\">Nbr Occs</th></tr>"

    j+=1
    i=1 #compteur pour les URLs
    countglobal=0 #compteur pour le nombre de fichiers dans les fichiers globaux


#--------Lire le contenu du fichier URL et traiter chaque URL --------#

    for ligne in (fichierout.readlines()):

        print>>fichierin, "<tr><td>",i,"</td><td><a href=\"",ligne,"\">URL",i,"</a></td>" # 2 premieres colonnes


        #------Aspiration de la page -----#
                
        URLerreur="-"
        httperreur="-"

        print u">>>URL numéro %d, dossier %s >>> "%(i, title),

        try:
            flux = urllib2.urlopen(ligne, timeout=20) #tenter d'ouvrir le flux


        #--------Gestion des erreurs ---------#
            
        except socket.timeout as socketErreur:
            print "\rURLErreur >>> %s" %(socketErreur)
            print>>fichierin, "<td class=\"erreur\">Page non aspirée</td>"
            print>>fichierin, "<td class=\"erreur\"> socket timeout</td>"
            print>>fichierin, "<td class=\"erreur\"> -</td>"
            print>>fichierin, "<td class=\"erreur\"> -</td>"
            print>>fichierin, "<td class=\"erreur\"> -</td>"
            print>>fichierin, "<td class=\"erreur\"> -</td>"
            print>>fichierin, "<td class=\"erreur\">-</td></tr>"

            i+=1
            continue
            
        except urllib2.HTTPError as httperreur:
            
            print "Erreur http >>> %s" %(httperreur)
            print>>fichierin, "<td class=\"erreur\">Page non aspirée</td>"
            print>>fichierin, "<td class=\"erreur\">%s</td>" %(httperreur)
            print>>fichierin, "<td class=\"erreur\"> -</td>"
            print>>fichierin, "<td class=\"erreur\"> -</td>"
            print>>fichierin, "<td class=\"erreur\"> -</td>"
            print>>fichierin, "<td class=\"erreur\"> -</td>"
            print>>fichierin, "<td class=\"erreur\"> -</td></tr>"

            i+=1
            continue
            
        except ValueError as valueError:
            
            print "Erreur http >>> %s" %(valueError)
            print>>fichierin, "<td class=\"erreur\">Page non aspirée</td>"
            print>>fichierin, "<td class=\"erreur\">%s</td>" %(valueError)
            print>>fichierin, "<td class=\"erreur\"> -</td>"
            print>>fichierin, "<td class=\"erreur\"> -</td>"
            print>>fichierin, "<td class=\"erreur\"> -</td>"
            print>>fichierin, "<td class=\"erreur\"> -</td>"
            print>>fichierin, "<td class=\"erreur\"> -</td></tr>"

            i+=1
            continue

        except urllib2.URLError as URLerreur:
            print "\rURLErreur >>> %s" %(URLerreur.reason)
            print>>fichierin, "<td class=\"erreur\">Page non aspirée</td>"
            print>>fichierin, "<td class=\"erreur\">%s</td>" %(URLerreur.reason)
            print>>fichierin, "<td class=\"erreur\"> -</td>"
            print>>fichierin, "<td class=\"erreur\"> -</td>"
            print>>fichierin, "<td class=\"erreur\"> -</td>"
            print>>fichierin, "<td class=\"erreur\"> -</td>"
            print>>fichierin, "<td class=\"erreur\"> -</td></tr>"

            i+=1
            continue
   

        #------Si le flux est ouvert-------#
         
        else:
            codehttp = flux.getcode()
            print u"début de l'aspiration >>>",
            try :
                contenuhtml = flux.read() #lire le contenu

            
            #--------Gestion des erreurs-------#

            except socket.timeout as socketErreur:
                flux.close()
                print "\rURLErreur >>> %s" %(socketErreur)
                print>>fichierin, "<td class=\"erreur\">Page non aspirée</td>"
                print>>fichierin, "<td class=\"erreur\"> socket timeout</td>"
                print>>fichierin, "<td class=\"erreur\"> -</td>"
                print>>fichierin, "<td class=\"erreur\"> -</td>"
                print>>fichierin, "<td class=\"erreur\"> -</td>"
                print>>fichierin, "<td class=\"erreur\"> -</td>"
                print>>fichierin, "<td class=\"erreur\"> -</td></tr>"
 
             
             #--------S'il n'y a pas d'erreurs-------#

            else:

                flux.close() #fermeture de flux
                
                print "done ! - http code : %s" %(codehttp)


                pageaspiree=open("./PAGES-ASPIREES/"+filename+"/page"+str(i)+".html", "w" ) #ecrire le contenu de la page aspiree
                print>>pageaspiree, contenuhtml
                pageaspiree.close()
                
                #3eme et 4eme colonnes
                print>>fichierin, "<td><a href=\"../PAGES-ASPIREES/"+filename+"/page"+str(i)+".html\">page "+str(i)+"</a></td>"
                print>>fichierin, "<td>%d</td>" %(codehttp)

                
                #----------Detection d'encodage --------#
                
                encodage=""

                #-----Detection d'encodage dans le code source -------#

                if re.findall(r'< ?meta.*charset.*?/?>', contenuhtml):
                    encodage=re.findall(r'< ?meta.*charset.*?/?>', contenuhtml)
                    encodage= re.findall(r'charset ?= ?[^/>]*', encodage[0])
                    encodage=encodage[0].split("=")
                    encodage= (re.findall(r'[\w-]+[^ \"\']', encodage[1]))[-1]
                

                #---------Si l'encodage et de l'utf-8---------#

                if encodage=="utf-8" or encodage=="UTF-8":
                    
                    dumptextutf8 = nltk.clean_html(contenuhtml)
		        
                    dumptext=open("./DUMP-TEXT/"+filename+"/page"+str(i)+"utf8.txt", "w" )
                    print>>dumptext, dumptextutf8
                    dumptext.close()
		        
                    #5eme et 6eme colonnes
                    print>>fichierin, "<td> --> </td>"
                    print>>fichierin, "<td><a href=\"../DUMP-TEXT/"+filename+"/page"+str(i)+"utf8.txt\">page "+str(i)+"</a></td>"

                else:
				    
			
				    #--------Dump plain text (intial)-------#
                        

                    plaintext = nltk.clean_html(contenuhtml)
				    
                    dumptext=open("./DUMP-TEXT/"+filename+"/page"+str(i)+".txt", "w" )
                    print>>dumptext, plaintext
                    dumptext.close()


                   
                    #-------Conversion en utf-8-------#

                    newContent=UnicodeDammit(plaintext,[encodage, "windows-1256", "iso-8859-7"] )
                    text= newContent.unicode_markup
                    dumptextutf8=text.encode('utf-8')

                    dumptext=open("./DUMP-TEXT/"+filename+"/page"+str(i)+"utf8.txt", "w")
                    print>>dumptext, dumptextutf8
                    dumptext.close()

                    #5eme colonnes
                    print>>fichierin,"<td><a href=\"../DUMP-TEXT/"+filename+"/page"+str(i)+".txt\">"
                    
                    if encodage=="":
                        print>>fichierin,"BS4: "+newContent.original_encoding+"</a></td>"#6eme colonne
                    else:
                        print>>fichierin,encodage+"</a></td>"
                    print>>fichierin, "<td><a href=\"../DUMP-TEXT/"+filename+"/page"+str(i)+"utf8.txt\">page "+str(i)+"</a></td>"#7eme colonne


                #-------Extraction des contextes---------#

                fichierdmp=open("./DUMP-TEXT/"+filename+"/page"+str(i)+"utf8.txt", "r")
                conx=fichierdmp.read()
                fichierdmp.close()

                
                conx=conx.decode("utf-8",errors="ignore") #decoder le texte
                conx=conx.replace("#","") #supprimer les croisillons

                expr = re.compile(ur"(?:([^\t\n]{,150})(([Aa]m.ricani[sz].*?\W)|(\W[Aα]μερικανοπο[ίι].*?\W)|(εξαμερ[ίι]καν[ίι]σ.*?\W)|(\W[Aα]μερικανισμός))([^\t\n]{,150}\W))", re.I) #motif pour les contextes

                res=re.findall(expr,conx)#chercher les contextes selon le motif ci-dessus

                fichiercontextes=open("./CONTEXTES/"+filename+"/page"+str(i)+".txt", "w")

                #ecrire les contextes dans le fichier contextes.txt
                for found in res:
                    print>>fichiercontextes, found[0].encode("utf-8")+found[1].encode("utf-8")+found[6].encode("utf-8")+"#"
    
                fichiercontextes.close()
            
                print>>fichierin, "<td><a href=\"../CONTEXTES/"+filename+"/page"+str(i)+".txt\">page "+str(i)+"</a></td>"        

                #--------Contextes html--------#


                os.system("perl ./PROGRAMMES/minigrepMultilingue2/minigrepmultilingue.pl UTF-8 ./DUMP-TEXT/"+filename+"/page"+str(i)+"utf8.txt ./PROGRAMMES/minigrepMultilingue2/motif.txt")
                os.rename("resultat-extraction.html", "./CONTEXTES/"+filename+"/page"+str(i)+"utf8.html")

                print>>fichierin, "<td><a href=\"../CONTEXTES/"+filename+"/page"+str(i)+"utf8.html\">page "+str(i)+"</a></td>"        


                #-------Nombre d'occurrences------#

                nboccs=0

                nboccs=len(re.findall(ur"(\W[Aα]μερικανισμός\W)|(\W[Aa]m.ricani[sz].*?\W)|(\Wεξαμερ[ίι]καν[ίι]σ.*?\W)|(?:\W[Aα]μερικανοπο[ίι].*?\W)",conx, re.I))

                print>>fichierin, "<td>"+str(nboccs)+"</td></tr>"         

                
                #---------Dump Global--------# 
                
                acopier=open("./DUMP-TEXT/"+filename+"/page"+str(i)+"utf8.txt", "r")
                pourDG=acopier.read()
                acopier.close()
                

                dumpsglobaux=open("./FICHIERSGLOBAUX/"+filename+"/DumpsGlobauxPYTHON.txt", "a")
                dumpsglobaux.write(pourDG)
                dumpsglobaux.close() 

                if pourDG!="":
                    countglobal+=1


                #-------Contextes Globaux------# 
                
                acopier=open("./CONTEXTES/"+filename+"/page"+str(i)+".txt", "r")
                pourCG=acopier.read()
                acopier.close()
                
                
                contextesglobaux=open("./FICHIERSGLOBAUX/"+filename+"/ContextesGlobauxPYTHON.txt", "a")
                contextesglobaux.write(str(pourCG))
                contextesglobaux.close() 
                
  

        i+=1
            
    fichierout.close()

        #------FIN de la boucle : lire le contenu du fichier URL-----#
        

    print>>fichierin, "<tr class=\"final\"><td></td><td></td><td></td><td></td><td></td>"
    print>>fichierin, "<td class=\"finalglob\"><a href=\"../FICHIERSGLOBAUX/"+filename+"/DumpsGlobauxPYTHON.txt\">Dump Global("+str(countglobal)+")</a></td>"  
    print>>fichierin, "<td class=\"finalglob\"><a href=\"../FICHIERSGLOBAUX/"+filename+"/ContextesGlobauxPYTHON.txt\">Contextes Globaux("+str(countglobal)+")</a></td><td></td><td></td></tr>"            

    print>>fichierin,"</table><br><br>"

        
    
#refermer les balises ouvertes au début du fichierin.html
print>>fichierin, "</body></html>"

fichierin.close()


