#/usr/bin/perl
<<DOC; 
Votre Nom : Clémentine Gross et Ilaine Wang
JUIN 2012
 usage : perl parcours-arborescence-fichiers repertoire-a-parcourir
 Le programme prend en entrée le nom du répertoire contenant les fichiers à traiter
 Le programme construit en sortie un fichier structuré contenant sur chaque ligne le nom du fichier et le résultat du filtrage :
<FICHIER><NOM>du fichier</NOM></FICHIER><CONTENU>du filtrage</CONTENU></FICHIER>
DOC
#-----------------------------------------------------------
use Unicode::String qw(utf8);

my $rep="$ARGV[0]";
$rep=~ s/[\/]$//;
my $DUMPFULL1="";
my $DUMPFULL2="";
my $DUMPFULL3="";
my $compteurArticle=0;
my %dicoTitres=();
my %dicoDescriptions=();
my %dicoRubriques=();
my $encodagesortie="utf-8";
my $encodageCordial="iso-8859-1";
my $etat=0;
#----------------------------------------
&parcoursRub($rep); # Un premier parcours pour récupérer les noms des rubriques
#----------------------------------------
print keys(%dicoRubriques);
print "Veuillez sélectionner la rubrique que vous voulez parmi les précédentes:\n";
my $choix=<STDIN>;
chomp($choix);	# Suppresion retour chariot de STDIN
#----------------------------------------
&parcoursArborescenceFichiers($rep, $choix); # Ajout de la variable $choix en paramètres
#----------------------------------------
close(FILEOUTTMP);
#----------------------------------------	# Cordial (ISO)
my $outputCOR="./SORTIES/sortieCOR.txt";
system("iconv -f $encodagesortie -t $encodageCordial $output1 > $outputCOR");
open(FILECOR,$outputCOR);
while (my $ligne=<FILECOR>) {
	$ligne=&nettoieTexte($ligne);
}
close(FILECOR);
#----------------------------------------
&TreeTagger;
#----------------------------------------
exit;
#----------------------------------------------
sub parcoursRub {
	# Parcours de répertoires à partir de l'argument (dossier racine)
	my $path = shift(@_);
	opendir(DIR, $path) or die "can't open $path: $!\n";
	my @files = readdir(DIR);
	closedir(DIR);
	# Boucle: "pour chaque objet trouvé..."
	foreach my $file (@files) {
		next if $file =~ /^\.\.?$/;
		$file = $path."/".$file;
		# Cas d'un répertoire
		if (-d $file) {
			&parcoursRub($file); # Récursivité!
		}
		# Cas d'un fichier (+ .xml)
		if (-f $file) {
			if ($file=~/\.xml$/) {

				# Récupération de l'encodage avec commande Unix file
				my $encodage=`file -i $file | cut -d= -f2`;
				chomp($encodage);

				# Lecture et récupération du contenu du fichier traité
				my $texte="";
				open(FILEIN,"<:encoding($encodage)",$file);
				while (my $ligne=<FILEIN>) {
					chomp($ligne);
					$texte.= $ligne;
				}

				$texte =~ s/>[[:space:]]</></g;
				
				# Récupération et nettoyage du nom de la rubrique
				if ($texte =~ /<channel><title>([^>]+)<\/title>/) {
					my $rub=$1;
					$rub=&nettoieRub($rub);
					print $rub,"\n";
				
					if (!(exists $dicoRubriques{$rub})) {
						$dicoRubriques{$rub}++;
					}
				}
			}
		}
	}
}
#----------------------------------------------
# Procédure dans parcoursArborescenceFichiers
sub Rubriques {
	my $txt = shift(@_);
	my $choix = shift(@_);
	if ($txt=~ /<channel><title>([^>]+)<\/title>/) {
		my $rub=$1;
		$rub=&nettoieRub($rub);
		$rub=~ s/\t//;	# suppresion de la tabulation ajoutée auparavant par souci de clarté d'affichage!!
		
		# Conditions: si la rub récupérée correspond au choix de l'utilisateur + si le fichier n'a pas encore été créé ($etat)
		if (($rub eq $choix) && ($etat eq 0)) {
			$output1="./SORTIES/SORTIEregexp-$rub.txt";
			open(FILEOUTTXT,">>:encoding($encodagesortie)",$output1);
			$output2="./SORTIES/SORTIEregexp-$rub.xml";
			open(FILEOUTXML,">>:encoding($encodagesortie)",$output2);

			print FILEOUTXML "<?xml version=\"1.0\" encoding=\"$encodagesortie\" ?>\n";
			print FILEOUTXML "<PARCOURS>\n";
			print FILEOUTXML "<NOM>CG&#38;IW</NOM>\n";
			print FILEOUTXML "<FILE>\n";
			print FILEOUTXML "<NAME>$ARGV[0]</NAME>\n";
			
			# Changement "d'état" correspondant à la création du fichier de la rubrique choisie
			$etat=1;	# etat devient True!
		}
		
		# Conditions: si la rub récupérée est la bonne (et sous-entendu si l'état est 1)
		if ($rub eq $choix) {
			# Réouverture des bons fichiers "rubriques", sinon print dans le vide
			$output1="./SORTIES/SORTIEregexp-$rub.txt";
			open(FILEOUTTXT,">>:encoding($encodagesortie)",$output1);
			$output2="./SORTIES/SORTIEregexp-$rub.xml";
			open(FILEOUTXML,">>:encoding($encodagesortie)",$output2);
			$outputTTG="./SORTIES/TTGregexp.txt";
			open(FILEOUTTTG,">>:encoding($encodagesortie)",$outputTTG);
		}
	}
}
#----------------------------------------------
sub nettoieRub {
	my $rub=shift;
	$rub=utf8($rub);	# conversion en UTF-8 pour éviter les problèmes d'encodage...
	$rub=~ s/é/e/gi;
	$rub=~ s/è/e/gi;
	$rub=~ s/ê/e/gi;
	$rub=~ s/à/a/gi;
	$rub=~ s/[[:space:]]//g;
	$rub=~ s/-?LeMonde\.fr:?//gi;
	$rub=uc($rub);
	$rub=$rub."\t"; # ajout de tabulation pour l'affiche dans le terminal
	return $rub;
}
#----------------------------------------------
sub parcoursArborescenceFichiers {
	my $path = shift(@_);
	my $choix = shift(@_);
	opendir(DIR, $path) or die "can't open $path: $!\n";
	my @files = readdir(DIR);
	closedir(DIR);
	foreach my $file (@files) {
		next if $file =~ /^\.\.?$/;
		$file = $path."/".$file;
		if (-d $file) {
			&parcoursArborescenceFichiers($file, $choix);
		}
		if (-f $file) {
			if ($file=~/\.xml$/) {

				my $encodage=`file -i $file | cut -d= -f2`;
				chomp($encodage);

				my $texte="";
				open(FILEIN,"<:encoding($encodage)",$file);
				if ($encodage eq "binary") { # si l'encodage détecté est binaire, on ouvre le fichier pour récupérer la valeur txt de l'encodage
					print "$file\n";
					open(FILEIN1,"<",$file);
					while (my $ligne=<FILEIN1>) {
						chomp($ligne); 
						$texte.= $ligne;
					}
					if ($texte =~ m/encoding=\'(.+?)\'/g) {
						$encodage1=$1;
					}
					close(FILEIN1);
					open(FILEIN,"<:encoding($encodage1)",$file);
				}
				while (my $ligne=<FILEIN>) {
					chomp($ligne);
					$texte.= $ligne;
					}

				$texte =~ s/>[[:space:]]</></g;

				&Rubriques($texte, $choix);

				$DUMPFULL1 = "";
				$DUMPFULL2 = "";
				$DUMPFULL3 = "";

				while ($texte =~ /<item>.+?<title>([^<]*)<\/title>.+?<description>([^<]*)<\/description>.+?<pubDate>([^<]*)<\/pubDate>/g) {
					$compteurArticle++;
					$DUMPFULL1.="<article numero=\"$compteurArticle\">\n";

					my $titre=$1;
					$titre=&nettoieTexte($titre);
					if (uc($encodage) ne "UTF-8") {utf8($titre);}

					my $description=$2;
					$description=&nettoieTexte($description);
					if (uc($encodage) ne "UTF-8") {utf8($description);}

					my $date=$3;
					$date=&nettoieTexte($date);
					if (uc($encodage) ne "UTF-8") {utf8($date);}

					if (!(exists($dicoTitres{$titre}))) {
						$DUMPFULL1.="<date>$date</date>\n<abstract>$titre</abstract>\n";
						$DUMPFULL3.="<abstract>$titre</abstract>\n";
						$DUMPFULL2.=$titre." ";
						$dicoTitres{$titre}++;
					}
					else {
				   		$dicoTitres{$titre}++;
						$DUMPFULL1.="<abstract>-</abstract>\n";
					}

					if (!(exists($dicoDescriptions{$description})) and (!($description =~ /lemonde/))) {
						$DUMPFULL1.="<description>$description</description>\n";
						$DUMPFULL3.="<description>$description</description>\n";
						$DUMPFULL2.=$description." ";
						$dicoDescriptions{$description}++;
					}
					else {
						$dicoDescriptions{$description}++;
						$DUMPFULL1.="<description>-</description>\n";
					}
					$DUMPFULL1.="</article>\n";
				}
				print FILEOUTXML "<FILTRAGE>\n".$DUMPFULL1."</FILTRAGE>\n</PARCOURS>\n";
				print FILEOUTTXT $DUMPFULL2;
				print FILEOUTTTG $DUMPFULL3;
			}
			close(FILEIN);
		}
	}
	close(FILEOUTXML);
	close(FILEOUTTXT);
	close(FILEOUTTTG);
}
#----------------------------------------------
sub nettoieTexte {
	my $texte=shift;
	$texte =~ s/&lt;/</g;
	$texte =~ s/&gt;/>/g;
	$texte =~ s/<a href[^>]+>//g;
	$texte =~ s/<img[^>]+>//g;
	$texte =~ s/<\/a>//g;
	$texte =~ s/&#39;/'/g;
	$texte =~ s/&#34;/"/g;
	$texte =~ s/&#38;#39;/'/g;
	$texte =~ s/&#38;#34;/"/g;
	$texte =~ s/<[^>]+>//g;
	$texte =~ s/&#233;/é/g;
	$texte =~ s/&#234;/ê/g;
	$texte =~ s/&#91;/[/g;
	$texte =~ s/&#93;/]/g;
	$texte =~ s/&#38;/ et /g;
	$texte =~ s/&amp;/ et /g;
	$texte =~ s//'/g;
	$texte =~ s//oe/g;
	$texte =~ s//Oe/g;
	$texte =~ s// et /g;
	$texte =~ s//:/g;
	$texte =~ s// euros/g;
	$texte =~ s//"/g;
	$texte =~ s//"/g;
	$texte =~ s//:/g;
	
	# Traitement des nombreux caractères de contrôles dus à des erreurs...
	if ($texte =~ /[[:cntrl:]]/) {
		print "Caractère de contrôle!\n";
		$texte =~ s/[[:cntrl:]]/oe/; # remplacement par le seul caractère alphanumérique
	}
	if ($texte =~ / oe /) { $texte =~ s/ oe // ;} # suppression si oe seul (cas de certaines ponctuations, inutiles pour notre analyse morphosyntaxique)
	return $texte;
}
#----------------------------------------------
sub TreeTagger {
	system("perl tokenise-utf8.pl $outputTTG > ./SORTIES/TXTatagger-regexp.txt");
	system("./tree-tagger-linux-3.2/bin/tree-tagger -token -lemma -no-unknown -sgml french-utf8.par ./SORTIES/TXTatagger-regexp.txt ./SORTIES/TXTtagged-regexp.txt");
	system("perl treetagger2xml-utf8.pl ./SORTIES/TXTtagged-regexp.txt $encodagesortie");
}