#usr/bin/perl -w
<<DOC; 
Votre Nom : Jianying LIU
JANVIER 2020
 usage : perl BaO1.pl repertoire-a-parcourir rubrique
 Le programme prend en entrée le nom du répertoire-racine contenant les fichiers
 à traiter et le nom de la rubrique à traiter parmi ces fichiers
DOC
use strict;
use utf8;

#indiquer l'encodage de sortie dans le console
binmode(STDOUT, ":utf8");

my $rep = $ARGV[0];       #?guillemets?
$rep =~ s/[\/]$//;          #[\/] choisir entre deux
my $rubrique = $ARGV[1];


#programme principal

#ouvrir le fichier txt et le fichier xml pour l'écriture
open(TXT, ">:encoding(utf8)", "sortie_$rubrique.txt");
open(XML, ">:encoding(utf8)", "sortiexml_$rubrique.xml");
print XML "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<corpus 2019>\n";    #écrire la tête du fichier xml

my $i = 1;      #compteur pour le calcul total de fichiers rss traités
my $count_item = 1;
my %dico_titres = ();
&parcoursArbFic($rep);

print XML "</corpus 2019>\n";
close TXT;
close XML;
exit;


###############################################

sub parcoursArbFic {
	my $path = shift(@_);    #shift obligatoire
	my @files = <$path/*>;  #cette opération renvoie la liste des fichiers/répertoire dans ce répertoire, sans . et .. (donc pas besoin de tester et sauter), ordonné, avec chemin complet (donc pas besoin de concaténation pour obtenir le path
	foreach my $file (@files) {
		#if rep. recursif
		if (-d $file) {
			&parcoursArbFic($file);
		}
		#if file : open, chercher motif, ecrire   sous-fonction
		if (-f $file and $file =~ /$rubrique.+xml$/) {
			print $i++," Traitement de : ",$file,"\n";
			&ecritureFic($file);
		}
	}	
}

#traitement sur un fichier rss cherché
sub ecritureFic{
	#ouvrir le fichier RSS
	my $fichier = shift(@_);
	open(RSS, "<:encoding(utf8)", $fichier);
	#lecture global du fichier
	$/ = undef;
	my $textelu = <RSS>;
	close RSS;
	
	#chercher motif avec RegExp
	while ($textelu =~ /<item>.*?<title>(.+?)<\/title>.+?<description>(.+?)<\/description>/sg){  #m multiple lines, on peut matcher plusieurs lignes,influencer ^ et $; s influence . qui peut matcher aussi \n maintenant
		my $titre = $1;
		my $description = $2;
		#tester si ce titre existe déjà dans le dico_titre
		if (! (exists $dico_titres{$titre})){   #!布尔值取反 存在 --> 不存在； exists fonctionne sur les clés
			$dico_titres{$titre} = $description;
			($titre, $description) = &nettoyage($titre,$description);  #sans paranthèses, on n'arrive pas à ajouter le point à la fin de chaque titre, mais pourquoi??
			
			#écrire le contenu dans deux fichiers
			print TXT "$titre\n$description\n--------------------\n";
			print XML "<item numero=\"$count_item\">\n<titre>$titre<\/titre>\n<description>$description<\/description>\n<\/item>\n";   #slash可以转义也可不转
			$count_item++;
		}
	}
}


#nettoyer le contenu extrait du rss avec une sous-fonction
sub nettoyage {
	my $titre = $_[0];
	my $description = $_[1];
	$titre=~s/^<!\[CDATA\[//; ##
	$titre=~s/\]\]>$//;       ##
	$description=~s/^<!\[CDATA\[//;  ##
	$description=~s/\]\]>$//;  ##
	$description=~s/&lt;.+?&gt;//g;
    $description=~s/&#38;#39;/'/g;
    $description=~s/&#38;#34;/"/g;
	$description=~s/ +/ /g;   #supprimer les espaces abondantes successifs; le nettoyage manquant?
    $titre=~s/&lt;.+?&gt;//g;
    $titre=~s/&#38;#39;/'/g;
    $titre=~s/&#38;#34;/"/g;
    $titre=~s/([^?\.])$/$1\./g;         #?ajouter un point à la fin de chaque titre####
    return $titre,$description;
}

