#/usr/bin/perl
#BaO1
<<DOC; 
Marguerite Leenhardt
 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
# DOC définit la documentation du programme 
#-----------------------------------------------------------

# on récupère le premier argument passé au programme dans le tableau des arguments à l'indice O et on crée une variable scalaire qu'on nomme rep
# rep prend donc comme valeur le nom du répertoire qu'on veut traiter
# my : permet de définir des variables locales, ici elle est connu pour l'ensemble du programme puisqu'elle est au début du programme
my $rep="$ARGV[0]";

# on s'assure que le nom du répertoire ne se termine pas par un "/"
# on nettoie le '/' à la fin du nom du dossier qui donne sa valeur à 'rep'
$rep=~ s/[\/]$//;
# on initialise une variable contenant le flux de sortie 

my $DUMPFULL1="";
#----------------------------------------
my $output1="SORTIE.xml";
# on crée un fichier de sortie
if (!open (FILEOUT,">$output1")) { die "Pb a l'ouverture du fichier $output1"};
# on ouvre le fichier de sortie en ecriture, en s'assurant que le fichier s'ouvre bien
# on rajoute une condition pour dire qu'on arrête l'exécution du programme si le fichier de sortie ne s'ouvre pas bien
#----------------------------------------
&parcoursarborescencefichiers($rep);	#recurse!
# on lance le parcours récursif de l'arborescence 
# en appelant une procédure qui prend comme argument la valeur de $rep
# & signifie qu'on veut lancer une procédure désignée par son nom. La procédure est définie à la fin du programme
#----------------------------------------
print FILEOUT "<?xml version=\"1.0\" encoding=\"iso-8859-1\" ?>\n";
print FILEOUT "<PARCOURS>\n";
print FILEOUT "<NOM>Marguerite Leenhardt</NOM>\n";
print FILEOUT "<FILTRAGE>".$DUMPFULL1."</FILTRAGE>\n";
print FILEOUT "</PARCOURS>\n";
# écrit dans le fichier de sortie: les balises XML et le résultat du filtrage contenu dans la variable DUMPFULL1


close(FILEOUT);
exit;
# on ferme le fichier de sortie
# on sort du programme
#----------------------------------------------
# ci-dessous est définie la procédure appelée dans le programme
# c'est dans la procédure qu'on va intervenir pour faire le travail de filtrage
# il faut parcourir l'ensemble des fihciers présents dans l'arborescence

sub parcoursarborescencefichiers {
    my $path = shift(@_);
# cette ligne signifie plusieurs choses:
# @_ : variable prédéfinie qui représente le tableau des arguments passés à la procédure, i.e. crée une liste des arguments placés à la procédure, en l'occurrence ($rep)
# shift : fonction qui prend le 1° élément de la liste et le sort de la liste ( en commençant par la gauche), i.e. vide le 1° élt du tableau des arguments placés au programme et #l'associe à une variable scalaire nommée $path.
#En perl, les variables précédés de "@" sont des tableaux de scalaires
    opendir(DIR, $path) or die "can't open $path: $!\n";
# my : définit une variable locale dans la plus petite boucle qui la contient, i.e. cette variable n'existe que dans la définition de la procédure.
# opendir : fonction prédéfinie qui permet d'ouvrir un répertoire
# il faut définir un pointeur de répertoire, DIR, : même syntaxe que pour l'ouverture de fichiers
    my @files = readdir(DIR);
# readdir : fonction prédéfinie pour lire le contenu du répertoire, qui renvoie une liste
# on peut donc créer une variable scalaire (tableau de scalaires)
# @files contient donc tous les éléments contenus dans le répertoire : liste des fichiers ou sous répertoires
    closedir(DIR);
    foreach my $file (@files) {
# La fonction foreach est une boucle prédéfinie qui parcourt la liste. Elle prend au fur et à mesure chaque fichier( ou sous répertoire) de la liste @files et le range dans $file
	next if $file =~ /^\.\.?$/;
# next : si la regexp qui suit est vraie, on passe à l'élt suivant dans la liste
	$file = $path."/".$file;
# on reécrit le chemin du fichier
	if (-d $file) {
	    &parcoursarborescencefichiers($file); 
	}
	if (-f $file) {
	#-d : permet de tester si c'est un répertoire; si oui, on rappelle la procédure. On a de la récursivité. 
	#-f : permet de tester si c'est un fichier.
	#Ainsi, on va appliquer le filtrage à chaque fichier.
	
#       TRAITEMENT à réaliser sur chaque fichier
	   if ($file=~/.xml$/){
	 #on ne veut que les fichiers xml
		open(F,$file);

		$compttitle=1;
		$comptdesc=1;
		$comptitem=0;

			while($ligne=<F>){
     
      if ($ligne=~/<title>(.*)<\/title>/){
		my $text=$1;
        if (($compttitle == 1) || ($compttitle == 2)) {   
          $DUMPFULL1.="<titlechannel>\n";
          $DUMPFULL1.="$text \n";   
          $DUMPFULL1.="</titlechannel>\n";		  
          $compttitle++;
          }
        else {
          $DUMPFULL1.="<titleitem num=\"".$compttitle."\">\n";
          $DUMPFULL1.="$text \n"; 
          $DUMPFULL1.="</titleitem> \n";
		  $comptitem++;
           }  
		}

		if($ligne=~/\<description\>(.*)\<\/description\>/) {
		my $text=$1;
        if (($comptdesc == 1) || ($comptdesc == 2)) {   
          $DUMPFULL1.="<descchannel>\n";
          $DUMPFULL1.="$text \n";     
		  $DUMPFULL1.="</descchannel>\n";	
          $comptdesc++;
          }
        else {
          $DUMPFULL1.="<descitem num=\"".$comptitem."\">\n";
		  $DUMPFULL1.="$text \n"; 
		  $DUMPFULL1.="</descitem> \n";
		  }  
  }
  
	 if($ligne=~/<item>/){
      $comptitem++;
						}
				}
}
	}
    }
}
#il faudrait ajouter en procédure un programme de nettoyage qui remplace le mauvais encodage des entités XML, mais il sera dans BaO2