#/usr/bin/perl
<<DOC; 
JANVIER 2019
 usage : perl parcours-arborescence-fichiers repertoire-a-parcourir
Le programme prend en entrée le nom du répertoire contenant les fichiers et la rubrique à traiter. Par exemple: bao1.pl Library "3208"
DOC


use utf8;
my $rep="$ARGV[0]";
my $rubrique="$ARGV[1]";
my %doublon;
#Crétion des fichiers de sortie pour chaque rubrique
open(FILEOUT1, ">:encoding(utf-8)", "sortie_$rubrique.txt");
open(FILEOUT2, ">:encoding(utf-8)", "sortie_$rubrique.xml");
print FILEOUT2 "<?xml version='1.0' encoding='UTF-8'?>\n";
print FILEOUT2 "<PARCOURS>\n";
print FILEOUT2 "<nom>Elias SELHAOUI</nom>\n";
print FILEOUT2 "<fichiers-rss rubrique='$rubrique'>\n";

# on s'assure que le nom du répertoire ne se termine pas par un "/"
$rep=~ s/[\/]$//;

#Appel de la procédure afin de pouvoir parcourir tous les fichiers du répertoire
#Procédure qui est défini après
&parcoursarborescencefichiers($rep);

#fermeture des balises dans les fichiers XML de sortie
print FILEOUT2 "</fichiers-rss>\n";
print FILEOUT2 "</PARCOURS>\n";
close FILEOUT1;
close FILEOUT2;
# on lance la récursion.... et elle se terminera après examen de toute l'arborescence

exit;

#la procédure:
sub parcoursarborescencefichiers {
    my $path = shift(@_);#@_ contient les arguments passés au sous-programme en cours (sub)
    opendir(DIR, $path) or die "can't open $path: $!\n";
    my @files = readdir(DIR); #readdir : fonction qui permet de lire le répertoire, renvoit la liste des fichiers qu'il contient; readdir c'est "l'équivalent" de l'affichage ls.
    closedir(DIR);
    foreach my $file (@files) {
        next if $file =~ /^\.\.?$/; #passe au prochain élément de la liste si l'élément sur lequel on est correspond à .(répertoire courant) ou ..(répertoire parent)
		$file = $path."/".$file;#reconstruction du chemin relatif
		if (-d $file) {
			print "<NOUVEAU REPERTOIRE> ==> ",$file,"\n";
			&parcoursarborescencefichiers($file);	#recurse
			print "<FIN REPERTOIRE> ==> ",$file,"\n";
		}
		if (-f $file) {
            if ($file=~ m/$rubrique.+\.xml$/ ) {
                print "\n<",$i++,"> ==> ",$file,"\n\n";
                #Traitement réalisé sur chaque fichier
                
                open(FILEIN, "<:encoding(utf-8)", $file);
                open(FILEOUT1, ">>:encoding(utf-8)", "sortie_$rubrique.txt");
                open(FILEOUT2, ">>:encoding(utf-8)", "sortie_$rubrique.xml");
				print FILEOUT2 "<date>$file</date>\n";
				
                my $texte="";
                while (my $ligne=<FILEIN>) { #Lecture ligne par ligne du fichier ouvert
                    chomp $ligne; #Suppression du retour à la ligne sur la ligne en cours
					$ligne =~ s/\r//g; #Suppression du retour chariot, sait-on jamais
                    $texte=$texte.$ligne; #Concaténation de la ligne lue dans la variable $texte.
                }
                close FILEIN;
                $texte =~ s/>  +</></g; #Suppression des possibles espaces
				
				#Substitution des entités HTML avec les caractères qui y correspondent
				$texte =~ s/\\xE9/é/g;
				$texte =~ s/\\xE/è/g;
				$texte =~ s/\\xE0/à/g;
				$texte =~ s/\\xEA/ê/g;
				
                my $num=1;
                #Extraction des données textuels du titre et description
                while ($texte =~ /<item>.*?<title>([^<]*)<\/title>.*?<description>([^<]*)<\/description>.*?<\/item>/g){
                    my $title=$1;
                    my $description=$2;
                    
                    #On contrôle que le titre n'a pas encore été lu pour ne pas avoir plusieurs fois le même titre
                    if (!exists $doublon{"$title"})
                    {
                        $doublon{$title}=1;
                        my ($title_clean, $description_clean) = &nettoyage ($title, $description);
                        
                        #Impression des données textuelles extraites dans les fichiers de sortie
                
                        print FILEOUT1 "TITRE: $title_clean.\n";
                        print FILEOUT1 "DESCRIPTION: $description_clean\n\n";
                        
                        print FILEOUT2 "<item numero='$num'>\n";
                        print FILEOUT2 "<titre>$title_clean.</titre>\n";
                        print FILEOUT2 "<description>$description_clean</description>\n";
                        print FILEOUT2 "</item>\n";
                        
                        $num++;
                    }
                    
                }
                
                
                close FILEIN;
                
            }
		}
    }
}

sub nettoyage {
    my $var1=shift(@_);
    my $var2=shift(@_);
    
	$var1 =~ s/&#38;#39;/'/g;
	$var2 =~ s/&#38;#39;/'/g;
	$var1 =~ s/&#38;#34;/"/g;
	$var2 =~ s/&#38;#34;/"/g;
	$var1 =~ s/&#233;/é/g;
	$var2 =~ s/&#233;/é/g;
	$var1 =~ s/&#234;/ê/g;
	$var2 =~ s/&#234;/ê/g;
	$var1 =~ s/Ã©/é/g;
	$var2 =~ s/Ã©/é/g;
	$var1=~s/&lt;.+?&gt;//g;
    $var2=~s/&lt;.+?&gt;//g;
	$var1 =~ s/è8/è/g;
	$var2 =~ s/è8/è/g;
	$var1 =~ s/è0/à/g;
	$var2 =~ s/è0/à/g;
	$var1 =~ s/è7/ç/g;
	$var2 =~ s/è7/ç/g;
	$var1 =~ s/èA/ê/g;
	$var2 =~ s/èA/ê/g;
	$var1 =~ s/è2/â/g;
	$var2 =~ s/è2/â/g;
	$var1 =~ s/èF/ï/g;
	$var2 =~ s/èF/ï/g;
	
    return $var1, $var2;
}

