#/usr/bin/perl
#perl fichier.pl repertoire (rubrique)
<<DOC; 
Votre Nom : QIU
MARS 2021
 usage : perl parcours-arborescence-fichiers repertoire-a-parcourir
 Le programme prend en entr? le nom du r?ertoire contenant les fichiers
DOC
#-----------------------------------------------------------
use strict;
use XML::RSS;
use utf8;
use Timer::Simple;
# on instancie un timer commencant à 0.0s par défaut
my $t = Timer::Simple->new();
# on lance le timer
$t->start;

my $rep="$ARGV[0]";
my $rubrique="$ARGV[1]";
$rep=~ s/[\/]$//; #2020
my $rss=new XML::RSS;
my %dico_des_titres=();
my $compteur=0;
my $nbFile=0;
my $nom="";

open my $OUT ,">:encoding(utf8)","./sortie2/XML-RSS_sortietxt_$rubrique.txt";
open my $OUTXML,">:encoding(utf8)","./sortie2/XML-RSS_sortiexml_$rubrique.xml";
print $OUTXML "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";
print $OUTXML "<corpus2020>\n";
print $OUTXML "<extraction type=\"$rubrique\">\n";
print $OUTXML "<etudiant><prenom>Haiyan</prenom><nom>QIU</nom><prenom>Jinyuan</prenom><nom>Xu</nom></etudiant>\n";
#----------------------------------------
&parcoursarborescencefichiers($rep);	#recurse!
#---------------------------------------- 
print $OUTXML "</extraction>\n";
print $OUTXML "</corpus2020>\n";
close $OUT;
close $OUTXML;
print "Nb item : $compteur\n";
print "time so far: ", $t->elapsed, " seconds\n";
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 =~ /^\.\.?$/;   # on traite pas les fichirs . ou .. 
		$file = $path."/".$file;
		if (-d $file) {            #-d permet de tester le statut de la chaine de car qui designe le fichier
			&parcoursarborescencefichiers($file);	#recurse!
		}
		#on teste s'il s'agit d'un fichier
		if (-f $file) {  
			if ($file =~/$rubrique.+\.xml$/){
				$nom=$file;
				print $nbFile++," Traitement de : ",$file,"\n";
				
				#TRAITEMENT DES FICHIERS XML
				eval {$rss->parsefile($file); };
				if( $@ ) {
					$@ =~ s/at \/.*?$//s;               # remove module line number
					print STDERR "\nERROR in '$file':\n$@\n";
				} 
				else {
					print $OUTXML "<fichier nom=\"$nom\">\n";
					foreach my $item (@{$rss->{'items'}}) {
					my $description=$item->{'description'};
					my $title=$item->{'title'};
					$title=~s/<[^>]+>//g;
					$description=~s/<[^>]+>//g;
					$compteur++; #compteur d'items					
					if (!(exists ($dico_des_titres{$title}))) {
						$dico_des_titres{$title}=1;
						my($titre_propre,$description_propre) = &nettoyage($title,$description);
						print $OUT "$titre_propre\n$description_propre\n\n";
						print $OUTXML "\t<item num=\"$compteur\">\n\t\t<titre>$titre_propre</titre>\n\t\t<description>$description_propre</description>\n\t</item>\n";
					}
					}
				print $OUTXML "</fichier>\n";
				}    
			}	
    	}
	}
}
#----------------------------------------------
sub nettoyage {
    #my $titre=shift(@_); autre solution en vidant la liste des arguments du programmes...
    #my $description=shift(@_);
    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;
    $description=~s/ //g;
    $description=~s/&nbsp;/ /g;
    $titre=~s/&lt;.+?&gt;//g;
    $titre=~s/&#38;#39;/'/g;
    $titre=~s/&#38;#34;/"/g;
    $titre=~s/$/\./g;
	$titre=~s/\.+$/\./g;
	$titre.=".";
	$titre=~s/\.\.$/\./;
	$titre=~s/ / /g;
    $titre=~s/ //g;
    $titre=~s/&nbsp;/ /g;
    return $titre,$description;
}