#/usr/bin/perl
<<DOC; 
Nom : Meixin YAN & Yuchen SONG
FEVRIER 2019
 usage : perl BAO1_regexp.pl repertoire-a-parcourir flux-à-traiter
 Le programme prend en entrée le nom du répertoire contenant les fichiers à traiter et le code du flux RSS
 Le programme construit en sortie un fichier TXT et un fichier XML
DOC
#-----------------------------------------------------------
#on récupère le nom du répertoire à parcourir
my $rep="$ARGV[0]";
#on s'assure que le nom du répertoire ne se termine pas par un "/"
$rep=~ s/[\/]$//;
#on récupère le code de la rubrique
my $rubrique="$ARGV[1]";
my $i=0;
#un hash de doublons
my %doublons;
#on crée les fichiers de sortie
open(OUT, ">:encoding(utf-8)", "sortie-$rubrique-regexp.txt");
open(OUTXML, ">:encoding(utf-8)", "sortie-$rubrique-regexp.xml");
#préparation du document xml
print OUTXML "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
print OUTXML "<racine>\n";
#----------------------------------------
&parcoursarborescencefichiers($rep);	#recurse!
print OUTXML "</racine>\n" ;
close OUT ;
close OUTXML ;
exit ;
#----------------------------------------------
#on définit une fonction en perl
sub parcoursarborescencefichiers {
    #on récupère le nom du répertoire à parcourir
	my $path = shift(@_);
	#on ouvre le répertoire fourni en arg
	#on ouvre le répertoire 2018
    opendir(DIR, $path) or die "can't open $path: $!\n";
    #on lit le répertoire
	#on trouve les répertoires:Jan/Feb/Mar/etc.
	my @files = readdir(DIR);
    closedir(DIR);
	
    foreach my $file (@files) {
		#quand on parcourt une liste, si la condition est réalisée, on passe au suivant
		next if $file =~ /^\.\.?$/;
		#reconstruire un chemin relatif qui permet d'accéder aux ressources
		$file = $path."/".$file; 		
		#-d:ecq c'est un répertoire? (d:directory)
		if (-d $file) {
			&parcoursarborescencefichiers($file);	#recurse! #re-ouvrir
			print "on entre dans",$file,"\n";
		}
		#-f:non, c'est pas un répertoire, c'est un fichier (f:file)
		if (-f $file) {
			#si c'est un fichier, on le traite
			#pour dire au programme qu'on arrête sur telle ou telle rubrique
			#on ajout en haut une variable $rubrique pour filtrer
			#$ dans l'expression régulière:à la fin 
			if ($file =~ /$rubrique.+\.xml$/){
				#intégrer ce qu'on a déjà fait	
				print $i++, "==>", $file, "\n";
				open(FIC, "<:encoding(utf-8)", $file) ;
				#on déclare une variable qui va accueillir la concatération du texte extrait
				my $tout_le_texte = "" ;
				while (my $ligne = <FIC>) {
					#on enlève le retour à la ligne à la fin de chaque ligne
					chomp $ligne;
					#on concatène tout le fichier dans une même variable
					$tout_le_texte = $tout_le_texte . $ligne . " " ;
				}
				close FIC ;
				while ($tout_le_texte =~ /<item>.*?<title>([^<]*)<\/title>.*?<description>([^<]*)<\/description>.*?<\/item>/g) {
				#le modificateur //g signifie recherche globale et autorise l'opérateur de mise en correspondance à correspondre autant de fois que possible
					#le titre qui se situe entre les balises <title></title> égale le premier bloc ([^<]*) de l'expression régulière  
					my $titre = $1 ;
					#la description qui se situe entre les balises <description></description> égale le deuxième bloc ([^<]*) de l'expression régulière
					my $description = $2 ;
					my ($titrenettoye,$descriptionnettoye) = &nettoyage($titre, $description) ;
					#si exister les doublons:
					if (exists $doublons{$titrenettoye}) {
						#incrémentation
						$doublon{$titrenettoye}++;
					}
					#si n'exister pas les doublons:
					else {
						#"1" indiqueque la sortie actuelle est sortie immédiatement sans mise en cache
						$doublon{$titrenettoye}=1;
						print OUT "TITRE : $titrenettoye\n" ;
						print OUT "DESCRIPTION : $descriptionnettoye\n" ;
						print OUTXML "<article>\n" ;
						print OUTXML "<titre>$titrenettoye</titre>\n" ;
						print OUTXML "<description>$descriptionnettoye</description>\n" ;
						print OUTXML "</article>\n" ;
					}
				}
			}
		}
	}
}
sub nettoyage {
#@_ : my ($titre,$description) = @_
	my $var = $_[0] ;
	my $var1 = $_[1] ;
	#pour faciliter la segmentation au plus tard, on ajoute un point
	$var = $var . "." ; # $var .= "." ;
	$var1 = $var1 . "." ;
	$var1 =~ s/&#38;#39;/'/g ;
	return $var, $var1 ;
}

#----------------------------------------------