#/usr/bin/perl
<<DOC; 
Marianna Kucharski
 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
#-----------------------------------------------------------
#Seuls les commentaires sur les parties qui diffèrent du programme de Marguerite sont indiqués.


my $rep="$ARGV[0]";

$rep=~ s/[\/]$//;

my $DUMPFULL1="";
#----------------------------------------
my $output1="SORTIE_bao1.xml";
if (!open (FILEOUT,">$output1")) { die "Pb a l'ouverture du fichier $output1"};
#----------------------------------------
&parcoursarborescencefichiers($rep);	
#----------------------------------------

print FILEOUT "<?xml version=\"1.0\" encoding=\"iso-8859-1\" ?>\n";
print FILEOUT "<PARCOURS>\n";
print FILEOUT "<NOM>Marianna Kucharski</NOM>\n";
print FILEOUT "<FILTRAGE>\n".$DUMPFULL1."</FILTRAGE>\n";
print FILEOUT "</PARCOURS>\n";
close(FILEOUT);
exit;
#----------------------------------------------
sub parcoursarborescencefichiers {
    my $path = 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);
		}
		if (-f $file && $file =~ /0,.*\.xml$/)
	#on ne veut que les fichiers xml , et ceux qui ne commencent pas par "fil". On ne veut que ceux qui commencent par "0," et qui se terminent par ".xml"
		{		
# Ci dessous le filtrage à réaliser sur chaque fichier:     

			open(FILEINPUT,$file);
			my $comptChannel=1;
			my $comptChannel2=1;
#Pour séparer les balises <title> et <description> des item et des channel , on utilise deux compteurs différents qu'on initialise à 1.
			while ($ligne = <FILEINPUT>){
				if ($ligne=~/<title>([^<]+)<\/title>/) {
					$texte_brut=&nettoyage_entites_xml($1);
                #on applique la procédure de nettoyage définie après sur le contenu des balises <title>.
					
					if($comptChannel==1){
					$DUMPFULL1.="<channel>\n"."<title_gen>$texte_brut</title_gen>\n";
						$comptChannel++;
					}
					elsif($comptChannel!=2){
						$DUMPFULL1.="<title>$texte_brut<\/title>\n";}
					     else{$comptChannel++};
				}#on utilise le compteur comptChannel pour distinguer les titres des items et les titres de channels. On utilise des balises différentes: <title_gen> pour 
				 #les titres channel et <title> pour les items. On sait que le premier titre rencontré correspond au channel.
				
				if ($ligne=~/<description>([^<]+)<\/description>/) 
				{
						$texte_brut=&nettoyage_entites_xml($1);
				#on applique la procédure de nettoyage sur le contenu des balises <description> 
					if($comptChannel2==1){
						$DUMPFULL1.="<description_gen>$texte_brut</description_gen>\n";
						$comptChannel2++;
					}
					else{
					$DUMPFULL1.="<description>$texte_brut<\/description>\n";}
			    #on utilise le compteur comptChannel2 pour distinguer entre les balises <descritpion> des items et des channels. 
				#On sait que la première description rencontrée correspond à celle de la balise <channel>, on utilise la balise <description_gen> pour la distinguer.
				}
			}
			close(FILEINPUT);
			print $i++,"\n"; #incrémenté pour chaque fichier traité. Cela permet de voir à l'écran, lors de l'éxécution du programme,
			#où on en est dans l'arborescence. (petit repère facultatif).
			
			$DUMPFULL1.="</channel>\n";
		   #on a concaténé au fur et à mesure le filtrage dans la variable DUMPFULL1. On finit par fermer la balise </channel>.
		   #Ainsi, chaque balise <channel> contient le filtrage de chaque fichier.
		}
	}
}
#----------------------------------------------
#définition de la procédure de nettoyage des entités. On les remplace par les bons caractères.
sub nettoyage_entites_xml{
					$txt_b= shift @_;
					$txt_b=~s/&#38;#39;/\'/g;
					$txt_b=~s/&#38;#34;/\"/g;
					$txt_b=~s/&#233;/é/g;
					$txt_b=~s/&#234;/ê/g;
					return $txt_b;
}