#/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);
use XML::RSS;

my $rep="$ARGV[0]";
$rep=~ s/[\/]$//; # on s'assure que le nom du répertoire ne se termine pas par un "/"										
my $DUMPFULL1="";
my $DUMPFULL2="";
my $DUMPFULL3="";
my $cptArticle=0;
my %dicoTitres=();
my %dicoDescriptions=();
my $encodagesortie="utf-8";
#----------------------------------------
my $output1="./SORTIES/SORTIExmlrss.txt";
open(FILEOUTTXT,">:encoding($encodagesortie)",$output1);
my $output2="./SORTIES/SORTIExmlrss.xml";
open(FILEOUTXML,">:encoding($encodagesortie)",$output2);
my $output3="./SORTIES/TMPxmlrss.txt";
open(FILEOUTTMP,">:encoding($encodagesortie)",$output3);
#----------------------------------------
&parcoursarborescencefichiers($rep);	# fonction récursive!
#----------------------------------------
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";
print FILEOUTXML "<FILTRAGE>\n".$DUMPFULL1."</FILTRAGE>\n";
print FILEOUTXML "</PARCOURS>\n";
close(FILEOUTXML);
print FILEOUTTXT $DUMPFULL2;
close(FILEOUTTXT);
print FILEOUTTMP $DUMPFULL3;
close(FILEOUTTMP);
#----------------------------------------
&TreeTagger;
#----------------------------------------
exit;
#----------------------------------------------
sub parcoursarborescencefichiers {
	# 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) {
			&parcoursarborescencefichiers($file);	# récursivité sur les dossiers!
		}
		# Cas d'un fichier
		if (-f $file) {
			# Condition: si fichier .xml et s'il ne contient pas fil (pas d'articles)
			if (($file=~/\.xml$/) && (!($file=~ /fil/))) {
				# Récupération de l'encodage
				my $encodage=`file -i $file | cut -d= -f2`; 
				print "ENCODAGE : $encodage \n";
				chomp($encodage);
				
				# Condition: sortir si le fichier est encodé en binaire (fil vide dans notre corpus)
				next if $encodage eq "binary";
				
				# Ouverture avec spécification de l'encodage détecté
				open(FILEIN,"<:encoding($encodage)",$file);
				
				# Lancement du module XML::RSS et parsing
				my $rss=new XML::RSS;
				$rss->parsefile($file);

				# Boucle: pour chaque balise <item> repéré dans les items du module
				foreach my $item (@{$rss->{'items'}}) {
						$cptArticle++;
						$DUMPFULL1.="<article numero=\"$cptArticle\">\n";

						# Récupération des infos que l'on veut par parcours dans l'arbo
						my $date=$item->{'pubDate'};
						$date=&nettoieText($date);
						if (uc($encodage) ne "UTF-8") {utf8($date);}
						
						my $titre=$item->{'title'};
						$titre=&nettoieText($titre);
						if (uc($encodage) ne "UTF-8") {utf8($titre);}
						#print $titre."\n";
						
						# Utilisation de dictionnaires pour éviter doublons (titres et résumés)
						if (!(exists($dicoTitres{$titre}))) {
							$DUMPFULL1.="<date>$date</date>\n<abstract>$titre</abstract>\n";
							$DUMPFULL3.="<abstract>$titre</abstract>\n";
							$DUMPFULL2.=$titre."\n";
							$dicoTitres{$titre}++;
						}
						else {
					   		$dicoTitres{$titre}++;
							$DUMPFULL1.="<abstract>-</abstract>\n"; 
						}

						my $description=$item->{'description'};
						$description=&nettoieText($description);
						if (uc($encodage) ne "UTF-8") {utf8($description);}
						
						if (!(exists($dicoDescriptions{$description})) and (!($description =~ /lemonde/))) {
							$DUMPFULL1.="<description>$description</description>\n";
							$DUMPFULL3.="<description>$description</description>\n";
							$DUMPFULL2.=$description."\n";
							$dicoDescriptions{$description}++;
						}
						else {
							$dicoDescriptions{$description}++;
							$DUMPFULL1.="<description>-</description>\n";
						}
						
						$DUMPFULL1.="</article>\n";
				}
				close(FILEIN);
			}
		}
	}
}
print $DUMPFULL1;
#----------------------------------------------
sub nettoieText {
	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/&#38;#39;/'/g;
	$texte =~ s/&#39;/'/g;
	$texte =~ s/&#38;#34;/"/g;
	$texte =~ s/&#34;/"/g;
	$texte =~ s/<[^>]+>//g;
	$texte =~ s/&#233;/é/g;
	$texte =~ s/&#234;/ê/g;
	return $texte;
}
#----------------------------------------------
sub TreeTagger {
	system("perl tokenise-utf8.pl $output3 > ./SORTIES/TXTatagger-xmlrss.txt");
	system("./tree-tagger-linux-3.2/bin/tree-tagger -token -lemma -no-unknown -sgml french-utf8.par ./SORTIES/TXTatagger-xmlrss.txt ./SORTIES/TXTtagged-xmlrss.txt");
	system("perl treetagger2xml-utf8.pl ./SORTIES/TXTtagged-xmlrss.txt $encodagesortie");
}