#/usr/bin/perl

# perl parcours-arborescence-fichiers-ORIGINE.pl 2016 3208

<<DOC; 
Votre Nom : POULAIN
JANVIER 2016
 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
print "-----------------------------------------------------------\n";
print "------------------DEBUT DU PROGRAMME -----------------------\n";
print "-----------------------------------------------------------\n";
#-----------------------------------------------------------
# variable contenant le nom du dossier à parcourir par le programme donné par l'utilisateur
my $rep="$ARGV[0]";
# variable contenant le numéro qui correspond à une rubrique dans les noms de fichiers pour pouvoir séparer les contenu par rubrique
my $rubrique="$ARGV[1]";
# on s'assure que le nom du répertoire ne se termine pas par un "/"
$rep=~ s/[\/]$//;
# on initialise une pile qui nous permettra de vérifier que l'article n'a pas déjà été extrait, pour éviter les doublons
my %dico;
#----------------------------------------
# configuration du fichier de sortie
my $output0="$rubrique.txt";
if (!open (FILEOUT,">:encoding(utf-8)","$output0")) { die "Pb a l'ouverture du fichier $output0"};
close(FILEOUT);
my $output1="$rubrique.xml";
if (!open (FILEOUT,">:encoding(utf-8)","$output1")) { die "Pb a l'ouverture du fichier $output1"};
# préparation du fichier selon la syntaxe xml
print FILEOUT "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";
print FILEOUT "<PARCOURS>\n";
print FILEOUT "<NOM>Mathilde</NOM>\n";
close(FILEOUT);

my $output0="$rubrique-PROF.txt";
if (!open (FILEOUT,">:encoding(utf-8)","$output0")) { die "Pb a l'ouverture du fichier $output0"};
close(FILEOUT);
# my $output2="$rubrique-PROF.xml";
# open (PRO2, ">$rubrique-PROF.xml");
# print PRO2 "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";
# print PRO2 "<PARCOURS>\n";
# print PRO2 "<NOM>Mathilde</NOM>\n";
# close(PRO2);
#---------------------------------------- APPEL DU SOUS PROGRAMME
&parcoursarborescencefichiers($rep);	# on lance la récursion.... et elle se terminera après examen de toute l'arborescence
#---------------------------------------- FIN DU SOUS PROGRAMME
# fin du fichier xml selon la syntaxe approprié pour avoir un fichier xml bien formé
open (FILEOUT, ">>:encoding(utf-8)", $output1);
print FILEOUT "</PARCOURS>\n";
# open (PRO2, ">>:encoding(utf-8)", $output2);
# print PRO2 "</PARCOURS>\n";
exit;
#---------------------------------------------- SOUS PROGRAMME QUI PARCOURT L'ARBORESCENCE
sub parcoursarborescencefichiers 
{
    # RÉCUPÉRATION DE LA VARIABLE CONTENANT LE CHEMIN DE CHAQUE DOSSIER
    my $path = shift(@_);
    opendir(DIR, $path) or die "can't open $path: $!\n";
    # OUVERTURE ET PARCOUR DE TOUS LES RÉPERTOIRES
    my @files = readdir(DIR);
    closedir(DIR);
    foreach my $file (@files) 
    { # POUR CHAQUE FICHIER À L'INTÉRIEUR DES DOSSIERS
		# PASSER SI LE NOM DE FICHIER EST . OU .. CELA SIGNIFIE QU'IL LE NOM DE FICHIER CORRESPOND EN FAIT AU CHEMIN DU REPERTOIRE COURANT OU DU REPERTOIRE PARENT, DONC PERMET D'ÉVITER UNE BOUCLE INFINIE
		next if $file =~ /^\.\.?$/;
		$file = $path."/".$file; # renommer le chemin relatif du dossier par rapport ou je suis pour pouvoir le retrouver
		if (-d $file) 
		{ # test si $file est un répertoire ou non
			# SI C'EST UN REPERTOIRE, ON L'AFFICHE ET ON LE PARCOURT AVEC LE SOUS PROGRAMME -> RECURSIVITÉ
			print "<NOUVEAU REPERTOIRE> ==> ",$file,"\n";
			&parcoursarborescencefichiers($file);	#recurse! récursivité de la procédure
			print "<FIN REPERTOIRE> ==> ",$file,"\n";
		}
		if (-f $file) 
		{ # test si $file est un fichier ou pas
		# SI C'EST UN FICHIER, ON LANCE LE PROGRAMME DE TRAITEMENT DES FICHIERS
			if ($file =~ /$rubrique.+\.xml$/)
			{ # ON CHERCHE LES FICHIERS XML UNIQUEMENT ET QUI CONTIENNENT LE NOM DE LA RUBRIQUE QUE L'ON SOUHAITE
				#       TRAITEMENT à réaliser sur chaque fichier
				# ON OUVRE LE FICHIER DAS UNE VARIABLE $FILE
				print "<",$i++,"> ==> ",$file,"\n";
				$codage="utf-8";
				open (FIC, "<:encoding($codage)", $file);
				# ON OUVRE UN FICHIER DE SORTIE EN TXT
				open (OUT, ">>:encoding($codage)", "$rubrique.txt");
				# ON OUVRE UN FICHIER DE SORTIE EN XML
				open (OUT2, ">>:encoding($codage)", "$rubrique.xml");
				# ON INITIALISE LA VARIABLE $TEXTE QUI VA CONTENIR CE QUI NOUS INTERESSE DANS LE CONTENU DU FICHIER
				my $texte="";
				while (my $ligne = <FIC>) 
				{ # SI LE CONTENU DU FICHEIR N'EST PAS SUR UNE SEULE LIGNE ON MET TOUT SUR LA MÊME LIGNE POUR FACILITER LE TRAITEMENT ENSUITE
					chomp $ligne;
					$texte = $texte . $ligne; # ET ON CONCATÈNE TOUT POUR AVOIR LE CONTENU DU FICHIER SUR UNE SEULE LIGNE
				}
				close FIC;
# 				$texte =~ s/>\s+</></g; # ON ENLÈVE LES SAUTS DE LIGNE À LA FIN DE CHAQUE LIGNE
				while ($texte =~
				m/<item><title>([^<]+?)<\/title><link>([^<]+?)<\/link><description>([^<]+?)<\/description>/g) 
				{
				# ON RECHERCHE LA PARTIE DU TEXTE QUI NOUS INTERESSE DONC CE QU'IL Y A DANS LES BALISES QUE L'ON CHERCHE
				# PERL NOUS PERMET DE RECUPERER CE QUI SE TROUVE DANS CHAQUE PARENTHÈSE PAR LEUR POSITION DONC :
					my $titre=$1;
					my $link=$2;
					my $description=$3;
					$titre=~ s/&lt;.+?&gt;//g;
					$description=~ s/&lt;.+?&gt;//g;
					$link=~ s/#xtor=RSS-3208//g;
					$titre.="."; # IL EST IMPORTANT POUR LE TRAITEMENT POSTÉRIEUR QUE CHAQUE PHRASE SE FINISSE PAR UN POINT
# 					$titre=~ s/\?\.$/\?/; # MAIS IL NE FAUT PAS AJOUTER UN POINT S'IL Y A DÉJÀ UN AUTRE SIGNE DE PONCTUATION DONC ON L'ENLÈVE SI C'EST LE CAS
					
					
# 					if (!(exists $dico{$titre}))
# 					{ # SI LA LIGNE ÉTUDIÉE N'EXISTE PAS DÉJÀ DANS LE DICTIONNAIRE ALORS ON PEUT L'AJOUTER AU FICHIER DE SORTIE
						$dico{$titre} = 1;
						# DANS LE FICHIER TXT D'ABORD :
						print OUT "Titre = ",$titre,"\n";
						print OUT "Lien = ",$link,"\n";
						print OUT "Description = ",$description,"\n\n";
						# ET SUR UNE SEULE LIGNE DANS LE FICHIER XML
						# ETIQUETAGE DU TEXTE AU FUR ET A MESURE
						print "----------------------------------ETIQUETAGE----------------------------------\n";
						my ($titretag,$descriptiontag) = &etiquetage($titre,$description);
						
						print OUT2 "<item><titre>$titretag</titre><description>$descriptiontag</description></item>\n";
# 					}
				}
				# ON FERME LES DEUX FICHIERS DE SORTIE
				close OUT;
				close OUT2;
				
				
				#	Fin du filtreur
				# ON INCREMENTE LE COMPTEUR DE FICHIER
			}
			
			# TRAITEMENT DE LA PROFONDEUR
			
		}
    }
}
#----------------------------------------------
sub etiquetage
{
  my ($t, $d) = @_;

  
  print "------------------------------TRAITEMENT DU TITRE-----------------------------\n";
  # on ouvre un fichier dans lequel on va copier le contenu de la variable $titre pour traiter le fichier et l'étiqueter.
  open(TEMP,">:encoding(utf-8)", "titre.txt");
  print TEMP $t;
  close(TEMP);
  # la commande system permet de lancer n'importe quel programme
  system("perl tokenise-utf8.pl titre.txt | cmd/tree-tagger-french > titre_tag.txt");
  system("perl treetagger2xml-utf8.pl titre_tag.txt utf-8");
  # cette dernière commande va créer un fichier du même nom que le fichier d'entrée mais d'extension xml
  # on ouvre le fichier de sortie qu'on vient de créer avec le traitement pour l'étiquetage
  open(TEMP2, "<:encoding(utf-8)", "titre_tag.txt.xml");
  my $t_tag = "";
#   on lit le fichier par ligne mais il ne faut pas lire la première ligne qui contient l'en-tete xml du fichier de sortie.
  my $ligne = <TEMP2>; # lecture de la première ligne mais on ne fait rien de cette première ligne, elle n'est pas concaténée dans $t_tag.
  while (my $ligne = <TEMP2>)
  {
    $t_tag.= $ligne;
  }
  close(TEMP2);
  
  # même chose pour description
  print "-------------------------TRAITEMENT DE LA DESCRIPTION-------------------------\n";
  open(TEMP3,">:encoding(utf-8)", "description.txt");
  print TEMP3 $d;
  close(TEMP3);
  system("perl tokenise-utf8.pl description.txt | cmd/tree-tagger-french > description_tag.txt");
  system("perl treetagger2xml-utf8.pl description_tag.txt utf-8");
  open (TEMP4,"<:encoding(utf-8)", "description_tag.txt.xml");
  my $d_tag = "";
  my $ligne2 = <TEMP4>;
  while ($ligne2 = <TEMP4>)
  {
    $d_tag.=$ligne2;
  }
  close(TEMP4);
  
  return ($t_tag, $d_tag);
}