#!usr/bin/perl

# But du programme : Parcours de l'arborescence d'un dossier, affichage du contenu des fichiers présents, traitement d'extraction des balises title et description selon 4 méthodes.
# Fonctionnement : perl+nom_du_programme+nom_de_dossier pour le lancer

use strict;
use warnings;
use 5.014;
use Switch;
use Data::Dumper;
use XML::RSS;
#use File::Slurp;


#use locale; # intégration des accents facilitée
#use utf8;
# Main

die "Pour $0 syntaxe correcte : perl $0 nom_repertoire " unless @ARGV == 1;

my $racine = $ARGV[0];
my $saveDir = "$ARGV[0]";
print "répertoire de départ : $racine\n";
#On efface les dossiers antérieures portant le même nom
system("rm -rf RESULTAT_EXTRACTION");
mkdir ("RESULTAT_EXTRACTION");
my $saveName;
my %dejaOuvertHtml1=();
my %dejaOuvertXml1=();
my $encodage=0;
my %testExistenceTitreTXT=();
my %testExistenceTitreHTML=();
my %testExistenceTitreXML=();
my %testExistenceTitreXMLRSS=();


lectureDossier1($racine);
lectureDossier2("RESULTAT_EXTRACTION");



#étape 1 : Vérification :
#1-1 : Dossier ou fichier ?
#1-2 : Restriction, ne pas utiliser les dossiers . ou ..

sub lectureDossier1
{
	my ($dossierEnCours) = @_;
	#say "$dossierEnCours";
	opendir (my $D, $dossierEnCours)  or die "Erreur d'ouverture de dossier type : $!";
	#print "Dossier ouvert : $D\n";
	foreach my $x (readdir ($D))
	{		
			$saveName=$x;
			$x=$dossierEnCours."/".$x;
		#print "fichier traité : $x\n";
		#next if (($x eq ".") or ($x eq ".."));
		#print "fichier traité après exclusion : $x\n";
			next if $x=~ /^\.|\.\.?$/;
		if (-d $x)
		{
			lectureDossier1($x);
			#say "$x est un dossier";
		}
		elsif (-f $x)
		{
			#say "$x est un fichier";
			traitementXML($x);
		}
	}	
	closedir $D;
};
# ajout des footers si .html ou .xml
sub lectureDossier2
{
	my ($dossierEnCours) = @_;
	my $compteur=0;
	opendir (my $D, $dossierEnCours)  or die "Erreur d'ouverture de dossier type : $!";
	foreach my $x (readdir ($D))
	{		
		$saveName=$x;
		$x=$dossierEnCours."/".$x;
		next if $x=~ /^\.|\.\.?$/;
		if (-d $x)
		{
			lectureDossier2($x);
		}
		elsif (-f $x)
		{
			if ($x=~ /.*\.html$/)
			{
				open (my $finalHtml, ">>", "$x");
				footerHtml($finalHtml);
			}
			if ($x=~ /.*\.xml$/)
			{
				open (my $finalXml, ">>", "$x");
				footerXML($finalXml);

			}
			if ($x=~ /.*\.txt$/)
			{
				#	mkdir ("./RESULTAT_EXTRACTION/dossierTXTtreetagger");
				#	system("cat $x|/home/joe/treetagger/cmd/tree-tagger-french-utf8 >> ./RESULTAT_EXTRACTION/dossierTXTtreetagger/$compteur");
				#$compteur++;
			}

			
		}
	}	
	closedir $D;
};



#étape 2 : vérification du format de fichier (si .xml on traite, sinon pas d'utilisation)

sub traitementXML
{
	my ($fichier)=@_;
	if ($fichier=~ /.*\.xml/)
	{
		#say "$fichier est un fichier xml";
		evaluation($fichier);
	}

}

#étape 3 : evalue et établit l'arborescence 

sub evaluation
{

my ($fichier)=@_;
my $ligne;
my $texte;
my $rubrique;

open (my $IN3, "<", "$fichier");
while ($ligne=<$IN3>)
{
$ligne=~ s/\n//g;
$texte.=$ligne;
}


	if ($texte=~/<channel>.*?<title>(.*?)<.title>/g)
	{
	$rubrique=$1;
	}
	if (defined($rubrique))
	{
	#	$rubrique= substr($rubrique,14);
		say $rubrique;
		$rubrique= nettoyageRubrique($rubrique);
		#say $rubrique;
		extractionTXT($fichier,$rubrique);
		extractionHTML($fichier,$rubrique);
		extractionXML($fichier,$rubrique);
		extractionXMLRSS($fichier,$rubrique);
	}
	close $IN3;
}

#étape 3.1 : nettoyage des noms de rubrique

sub nettoyageRubrique
{ 
my ($element) = @_;

my %hash=(
"à"=>"a",
"â"=>"a",
"é"=>"e",
"è"=>"e",
"ê"=>"e",
"ë"=>"e",
"\x{E9}"=>"e",#É
"î"=>"i",
"ï"=>"i",
"ï"=>"i",
"î"=>"i",
"ô"=>"o",
"û"=>"u",
"ü"=>"u",
","=>" ",
" "=>"_",
"Le Monde.fr"=>"",
"LeMonde.fr"=>""
);
foreach my $key (keys %hash)
{
 $element=~ s/$key/$hash{$key}/g; 
}
	$element=uc($element);
	foreach my $change ($element)
	{
	$change=~ s/_-_//g;
	$change=~ s/_:_/_/g;
	$change=~ s/_\.//g;
	}
	return $element;
}


#étape 4.1.1 : Extraction TXT par rubrique
sub extractionTXT
{
	my ($fichier,$rubrique)=@_;
	$encodage=detectionEncodage($fichier);
	mkdir ("./RESULTAT_EXTRACTION/$encodage");
	mkdir ("./RESULTAT_EXTRACTION/$encodage/$rubrique");
	open (my $IN4, "<:encoding($encodage)", "$fichier") or die "Erreur 4IN : $!";
	$saveName=~ s/xml/txt/g;
	my $chemin="./RESULTAT_EXTRACTION/$encodage/$rubrique/$saveName";
	open (my $OUT4, ">>:encoding($encodage)", "$chemin") or die "Erreur 4OUT : $!";
	my $ligne;
	my $texte;
	my $titre;
	my $description;
	

	while ($ligne=<$IN4>)
	{
		$ligne=~ s/\n//g;
		$texte.=$ligne;
	}
	$texte=nettoyageFichier($texte);
	while ($texte=~ m/<item>.*?<title>(.*?)<.title>.*?<description>(.*?)<.description>/g)
	{
		$titre=$1;
		$description=$2;
			
		unless (exists ($testExistenceTitreTXT{$titre}))
			{	
				$testExistenceTitreTXT{$titre}++;
				say $OUT4 "*";
				say $OUT4 "titre : $titre";
				say $OUT4 "description : $description";
			}
	}
	close $IN4;
	close $OUT4;
}


#étape 4.1.2 : Extraction Html par rubrique
sub extractionHTML
{
		my ($fichier,$rubrique)=@_;
		$encodage=detectionEncodage($fichier);
		mkdir ("./RESULTAT_EXTRACTION/$encodage");
		mkdir ("./RESULTAT_EXTRACTION/$encodage/$rubrique");
		open (my $IN4, "<:encoding($encodage)", "$fichier") or die "Erreur 4IN : $!";
		$saveName=~ s/txt/html/g;
		my $chemin="./RESULTAT_EXTRACTION/$encodage/$rubrique/$saveName";
		open (my $OUT4, ">>:encoding($encodage)", "$chemin") or die "Erreur 4OUT : $!";
		my $ligne;
		my $texte;
		my $titre;
		my $description;
		

		while ($ligne=<$IN4>)
		{
			$ligne=~ s/\n//g;
			$texte.=$ligne;
		}

		$texte=nettoyageFichier($texte);
		if (!exists($dejaOuvertHtml1{"$encodage/$rubrique/$saveName"})) 
		{
			headerHtml($OUT4);
			$dejaOuvertHtml1{"$encodage/$rubrique/$saveName"}++;
		}
		while ($texte=~/<item>.*?<title>(.*?)<.title>.*?<description>(.*?)<.description>/g)
		{
			$titre=$1;
			$description=$2;
			unless (exists($testExistenceTitreHTML{$titre}))
			{
			$testExistenceTitreHTML{$titre}++;
			say $OUT4 "<tr><td colspan=\"2\" align=\"center\" bgcolor=\"beige\">$fichier/$rubrique</td></tr>";
			say $OUT4 "<tr><td>titre : $titre</td>";
			say $OUT4 "<td>description : $description</td></tr>";
			}
		}	
		close $IN4;
		close $OUT4;
}	
#étape  4.1.2 : extraction XML classée par rubrique
sub extractionXML
{
	my ($fichier,$rubrique)=@_;
	$encodage=detectionEncodage($fichier);
	mkdir ("./RESULTAT_EXTRACTION/$encodage");
	mkdir ("./RESULTAT_EXTRACTION/$encodage/$rubrique");
	open (my $IN4, "<:encoding($encodage)", "$fichier") or die "Erreur 4IN : $!";
	my $saveNameXML = $saveName;
	$saveNameXML=~ s/html/xml/g;
	my $chemin="./RESULTAT_EXTRACTION/$encodage/$rubrique/$saveNameXML";
	open (my $OUT4, ">>:encoding($encodage)", "$chemin") or die "Erreur 4OUT : $!";
	my $ligne;
	my $texte;
	my $titre;
	my $description;
	

	while ($ligne=<$IN4>)
	{
		$ligne=~ s/\n//g;
		$texte.=$ligne;
	}
	$texte=nettoyageFichier($texte);

	if (!exists($dejaOuvertXml1{"$encodage/$rubrique/$saveNameXML"}))
	{
		headerXML($OUT4);
		$dejaOuvertXml1{"$encodage/$rubrique/$saveNameXML"}++;
	}
	
	while ($texte=~/<item>.*?(<title>.*?<.title>).*?(<description>.*?<.description>)/g)
	{
		$titre=$1;
		$description=$2;
		unless(exists($testExistenceTitreXML{$titre}))
		{
			$testExistenceTitreXML{$titre}++;
			say $OUT4 "<dossier>$fichier/$rubrique</dossier>";			
			say $OUT4 "$titre";
			say $OUT4 "$description";
		}
	}

	close $IN4;
	close $OUT4;

}

sub extractionXMLRSS
{
	my ($fichier,$rubrique)=@_;
	my $rss = new XML::RSS;
	$encodage=detectionEncodage($fichier);
	mkdir ("./RESULTAT_EXTRACTION/$encodage");
	mkdir ("./RESULTAT_EXTRACTION/$encodage/$rubrique");
	my $saveNameXMLRSS = $saveName;
	$saveNameXMLRSS=~ s/html/txt/g;
	my $chemin="./RESULTAT_EXTRACTION/$encodage/$rubrique/xmlrss_$saveNameXMLRSS";
	open (my $OUT5, ">>:encoding($encodage)", "$chemin") or die "Erreur 5OUT : $!";
	$rss->parsefile($fichier);
	my $texte;
	
	foreach my $objet (@{$rss->{items}})
	{
	  my $titre = $objet->{'title'};
	  my $description = $objet->{'description'};
	  
	  unless (exists ($testExistenceTitreXMLRSS{$titre}))
	  {
	    $texte=nettoyageFichier($titre);
	    say $OUT5 "titre : $texte";
	    $texte=nettoyageFichier($description);
	    say $OUT5 "description : $texte";
	  }
	}
	close $OUT5;
	
}



#étape 4.2

sub nettoyageFichier
{
	my ($texte)= @_;
	my %hash4=(
	"&#39;"=>"'",
	"&lsquo;"=>"'",
	"&rsquo;"=>"'",
	"&#38;"=>"&",
	"&amp;"=>"&",
	"&#34;"=>"\"",
	"&quot;"=>"\"",
	"&#39;"=>"\'",
	"&apos;"=>"\'",
	"&#60;"=>"<",
	"&#62;"=>">",
	"&#160;"=>" ",
	"&nbsp;"=>" ",
	"&#163;"=>"£",
	"&pound;"=>"£",
	"&#169;"=>"©",
	"&#171;"=>"«",
	"&laquo;"=>"«",
	"&#187;"=>"»",
	"&raquo;"=>"",
	"&#201;"=>"É",
	"&Eacute;"=>"É",
	"&#237;"=>"î",
	"&icirc;"=>"î",
	"&#239;"=>"ï",
	"&iuml;"=>"ï",
	"&#224;"=>"à",
	"&agrave;"=>"à",
	"&#226;"=>"â",
	"&acirc;"=>"â",
	"&#231;"=>"ç",
	"&ccedil;"=>"ç",
	"&#232;"=>"è",
	"&egrave;"=>"è",
	"&#233;"=>"é",
	"&eacute;"=>"é",
	"&#234;"=>"ê",
	"&ecirc;"=>"ê",
	"&#244;"=>"ô",
	"&ocirc;"=>"ô",
	"&#251;"=>"û",
	"&ucirc;"=>"û",
	"&#252;"=>"ü",
	"&uuml;"=>"ü",
	"&uuml;"=>"ü",
	"&gt;"=>">",
	"&lt;"=>"<"
	);

	foreach my $key (keys %hash4)
	{
		$texte=~ s/$key/$hash4{$key}/g; 
	}
	$texte=enleveBalise($texte);
	return $texte;
}

sub headerHtml 
{
	
	my ($EXIT) =@_;		
print $EXIT 
"<html>
<head>
<meta charset=$encodage
</head>
<title></title>
<body>
 <table border=\"5\">
";
	
}

sub footerHtml
{
	my ($EXIT) =@_;		
print $EXIT
"</table>
</body>
</html>
";
}

sub headerXML
{
	my ($OUT)=@_;	
	print $OUT "<?xml version=\"1.0\" encoding=\"$encodage\"?>";
	print $OUT "<racine>";
}

sub footerXML
{
	my ($OUT)=@_;
	print $OUT "</racine>";
}


sub detectionEncodage
{
my ($scalaire) = @_;
my $encodageFonction;
open (my $encodeIN, "<","$scalaire");
while (my $ligneEncode = <$encodeIN>)
{
	if ($ligneEncode=~ m/<.xml.*?encoding=(.*?).>/)
	{
		$encodageFonction = $1;
	}
}
close $encodeIN;	
$encodageFonction=~ s/'//g;
$encodageFonction=~ s/"//g;
return $encodageFonction;
}

sub enleveBalise
{
	my ($ligne)=@_;	
	$ligne=~ s/<img.*?>//g;
	$ligne=~ s/<br.*?\/>//g;
	$ligne=~ s/<a.*?\/a>//g;
	$ligne=~ s/\&/and/g;
	return $ligne;
}


