#/usr/bin/perl
<<DOC; 
Votre Nom : Nidia Hernandez - Xianfan Zhang
JANVIER 2016
 usage : perl app2-surf.pl repertoire-a-parcourir rubrique
 Le programme prend en entrée le nom du répertoire contenant les fichiers à traiter
 Il extrait le contenu textuel (titre et description de chaque article) et il produit une sortie txt et une sortie xml
DOC
#-----------------------------------------------------------
my $rep="$ARGV[0]"; # repertoire à parcourir
my $rubrique= "$ARGV[1]"; # rubrique à traiter
my %dico; #pour eviter des doublons
# on s'assure que le nom du répertoire ne se termine pas par un "/"
$rep=~ s/[\/]$//;
#---------------------------------------- initialisation flux de sortie
# sortie txt
my $output0="$rubrique-surface.txt";
if (!open (FILEOUT,">$output0")) { die "Could not open $output0"};
close(FILEOUT);
# sortie xml
my $output1="$rubrique-surface.xml";
if (!open (FILEOUT,">$output1")) { die "Could not open $output1"};
#---------------------------------------- début fichier xml 
print FILEOUT "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";
print FILEOUT "<PARCOURS>\n";
print FILEOUT "<NOM>Nidia Hernandez</NOM>\n";
print FILEOUT "<NOM>Xianfan Zhang</NOM>\n";
close (FILEOUT);
#----------------------------------------
# Appel à une procédure (précédé par le symbole "&" )
&parcoursarborescence($rep);	
#----------------------------------------
open (FILEOUT,">>:encoding(utf-8)", $output1);
print FILEOUT "</PARCOURS>\n";
close(FILEOUT);
exit;
#-----------------------------------------------------------------------------------------------

# sous-programme
sub parcoursarborescence { 
    
	# Le nom du dossier passé comme argument est stocké dans une variable 
	my $dossier = shift(@_);  
	# Ouverture du dossier
    opendir(DOSSIER, $dossier) or die "Could not open $dossier: $!\n";  
 	# Liste des fichiers contenus dans ce dossier
    my @files = readdir(DOSSIER);
    closedir(DOSSIER);
    
	# Traitement de chaque fichier
	foreach my $file (@files) {  
		# Ignorer les éléments cachés
		next if $file =~ /^\.\.?$/;  
		# Reconstruction du chemin absolu de l'élément
		$file = $dossier."/".$file;
		# -d permet de savoir si l'objet est un répertoire (directory) ou pas // si c'est le cas on regarde son contenu 
		if (-d $file) {  
			print "<NOUVEAU REPERTOIRE> ==> ",$file,"\n";
			&parcoursarborescence($file);	#recurse!
			print "<FIN REPERTOIRE> ==> ",$file,"\n";
		}	
		# -f permet de savoir si l'objet est un fichier (file) ou pas
		if (-f $file) {  	
		# si c'est xml, c'est la SURFACE, on fait le traitement
			if ($file =~/$rubrique.+\.xml$/) {
				print "<",$i++,"> ==> ",$file,"\n"; # imprime le nom de fichier précédé par un compteur // permet de vérifier dans la ligne de commande qu'on traite bien les bons fichiers
				$codage = "utf-8";
				open (FIC, "<:encoding($codage)", $file);
				open (OUT, ">>:encoding($codage)", "$rubrique-surface.txt");
				open (OUT2, ">>:encoding($codage)", "$rubrique-surface.xml");
				#ramener tout le flux textuel de FIC sur une seule ligne
				my $texte="";
				# lecture du fichier ligne par ligne 
				while (my $ligne = <FIC>) {
					# supprime le retour à ligne  
			    	chomp $ligne;
					# regex pour retrouver les retours à la ligne
			    	$ligne =~ s/\r//g;
			    	$texte = $texte . $ligne;
				}
				close FIC;
					# supprime les blancs à l'extérieur des balises
					$texte =~ s/>\s+</></g;
					# la regex permet d'extraire le contenu textuel associé: titre/link/description 
					while ($texte =~m/<item><title>([^<]+?)<\/title><link>(?:[^<]+?)<\/link><description>([^<]+?)<\/description>/g) {
			        	my $titre = $1;
			        	my $description = $2;
												
						$titre=~s/&lt;.+?&gt;//g; # nettoyage 
						$description=~s/&lt;.+?&gt;//g; # nettoyage 
						$titre.="."; # ajout d'un point à la fin de chaque titre
						$titre=~s/\?\.$/\?/;  #s'il y a un point d'exclamation ou d'intérrogation avant, on enlève le point final 
						
			        	if (!(exists $dico{$titre})) { # si la ligne n'est pas déjà dans le dico, on l'ajoute au fichier de sortie
							$dico{$titre} = 1;
							print OUT "$titre\n";
							print OUT "$description\n"; 
							print OUT2 "<item>\n<title>$titre</title>\n<description>$description</description>\n</item>\n";   	
			        	}
					}
					close OUT;
					close OUT2;
			
				}
			}
    	}
	}
