#/usr/bin/perl
#es scriptum filtrage exp reg nettoyage encodages differents pour chaque sortie
#articles numérotés, nettoyage à la main, vérification de doublons...
use Encode 'decode';
use open ":encoding(Latin1)";
use warnings;
use Unicode::String qw(utf8);
<<DOC; 
Votre Nom : Corina,Satenik
JANVIER 2013
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

###################################################################"
my $rep="$ARGV[0]";   #talis em repertoire vorpes 0 argument
# on s'assure que le nom du repertoire ne se termine pas par un "/"
$rep=~ s/[\/]$//;
# on initialise une variable contenant le flux de sortie 
my $DUMPFULL1=""; #pour fichiers xml 
my $DUMPFULL2=""; #pour fichiers txt
my $numArticle=0; #initialisation compteur
my %dicoTitres=(); #initialisation
my %dicoDescriptions=(); #initialisation
#####################################################################"
my $output1="SORTIENUM.xml";
	if (!open (OUTXML,">:encoding(UTF-8)",">$output1")) { die "Pb a l'ouverture du fichier $output1"};
my $output2="SORTIENUM.txt";
	if (!open (OUTTXT,">:encoding(ISO-8859-1)",">$output2")) { die "Pb a l'ouverture du fichier $output2"};
###############################################"""
&parcoursarborescencefichiers($rep);	#recurse! 
	      #################################################################################
print OUTXML "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";  #inchi voch utf-8?
print OUTXML "<PARCOURS>\n";
print OUTXML "<NOM>Satenik,Corina</NOM>\n";
print OUTXML "<FILTRAGE>".$DUMPFULL1."</FILTRAGE>\n";
print OUTXML "</PARCOURS>\n";
close(OUTXML);
print OUTTXT $DUMPFULL2;
close(OUTTXT);
exit;
#############################################################################################"
sub parcoursarborescencefichiers {
    my $path = shift(@_);  #@_ un  tableau qui stocke les arguments passés à 1 procédure
    opendir(DIR, $path) or die "can't open $path: $!\n";
    my @files = readdir(DIR); #bacec 2008
    closedir(DIR);
    foreach my $file (@files) {
	next if $file =~ /^\.\.?$/; #stegh inch a anum?
	$file = $path."/".$file; #2008/
	if (-d $file) { #si c'est un directory, rebelote
	    &parcoursarborescencefichiers($file);	#recurse!
	}
	if (-f $file) { #si c'est un file, voir si c'est .txt ou .xml
		if ($file=~/\.xml$/) 
		{ #si fichier xml
			print $i++;
			open(XMLIN, $file); 
			my $contenuxml=""; #initialisation variable texte
			while (my $ligne=<XMLIN>) #traite le fichier xml
				{
					$ligne=~s/\n//g; #retire les  retours à la ligne s'il y en a
					$ligne=~s/\r//g;
					$contenuxml.=$ligne; #concatène le tout
					$contenuxml=~s/> *</></g;#retire les blancs entre les chevrons es inch a anum?
				
				}
			while ($contenuxml=~/<item><title>([^<]+)<\/title>.+?<description>([^<]+)<\/description>/g)
				{
				$numArticle++;
				$DUMPFULL1.="<article numero=\"$numArticle\">\n";
				my $titre=$1;
				$titre=&nettoieText($titre);
				
				utf8($titre);
				if (!(exists($dicoTitres{$titre}))) {
				$DUMPFULL1.="<titre>".$titre."</titre>\n"; #pour .xml utf-8
				$titreiso=decode("iso-8859-1", $titre);
				$DUMPFULL2.="Titre : ".$titreiso."\n"; #pour .txt iso
				
				$dicoTitres{$titre}++;
				}
				else {
				$dicoTitres{$titre}++;
				$DUMPFULL1.="<titre>-</titre>\n";
				}
				
				my $description=$2;
				$description=&nettoieText($description);
				utf8($description); 
				if (!(exists($dicoDescriptions{$description}))) {
				$DUMPFULL1.="<description>".$description."</description>\n"; #pour .xml
				$descriptioniso=decode("iso-8859-1", $description);
				$DUMPFULL2.="Description : ".$descriptioniso."\n"; #pour .txt
				$dicoDescriptions{$description}++;
				}
				else {	
				$dicoDescriptions{$description}++;
						$DUMPFULL1.="<description>-</description>\n";
						}
				$DUMPFULL1.="</article>"; #on ferme la balise article dans le fichier xml
				
				
				
				
				} # fin while extraction contenu

			    close(XMLIN);
			    print "$numArticle\n";
		  }	
		}
	}#fin si c'est un fichier
}#fin parcours
#----------------------------------------------
sub nettoieText {
	 $texte=shift; 
	$texte =~ s/&lt;/</g;
    $texte =~ s/&gt;/>/g;
    $texte =~ s/<a href[^>]+>//g;
    $texte =~ s/<img[^>]+>//g;
    $texte =~ s/<\/a>//g;
    $texte =~ s/&#38;#39;/'/g;
    $texte =~ s/&#38;#34;/"/g;
    $texte =~ s/<[^>]+>//g;
    $texte =~s/&#39;/\'/g;
    $texte =~s/&#34;/\"/g;
    $texte =~s/&#233;/é/g;
    $texte =~s/&#234;/ê/g;
    $texte =~s/&amp;eacute;/é/g;
    $texte =~s/&amp;egrave;/è/g;
    $texte =~s/&amp;icirc;/\î/g;
    $texte =~s/&amp;ocirc;/\ô/g;
    $texte =~s/&amp;ccedil;/\ç/g;
    $texte =~s/&amp;agrave;/\à/g;
    $texte =~s/&#38;/&/g;
    $texte =~s/<.*$//g;
	$texte =~ s/&amp;|&#38;/&/g;
	$texte =~ s/&amp;|&#38;/&/g; 
	$texte =~ s/&apos;|&#39;/'/g; 
	$texte =~ s/&nbsp;|&#160;/? /g; 
	$texte =~ s/&shy;|&#173;/­/g; 
	$texte =~ s/&quot;|&#34;/"/g; 
	$texte =~ s/&laquo;|&#171;/«/g; 
	$texte =~ s/&raquo;|&#187;/»/g; 
	$texte =~ s/&lsaquo;|&#8249;/‹/g; 
	$texte =~ s/&rsaquo;|&#8250;/›/g; 
	$texte =~ s/&ldquo;|&#8220;/“/g; 
	$texte =~ s/&rdquo;|&#8221;/”/g; 
	$texte =~ s/&bdquo;|&#8222;/„/g; 
	$texte =~ s/&lsquo;|&#8216;/‘/g; 
	$texte =~ s/&bdquo;|&#8222;/„/g; 
	$texte =~ s/&rsquo;|&#8217;/’/g; 
	$texte =~ s/&sbquo;|&#8218;/‚/g; 
	$texte =~ s/&hellip;|&#8230;/…/g; 
	$texte =~ s/!|&#33;/!/g; 
	$texte =~ s/&iexcl;|&#161;/¡/g; 
	$texte =~ s/\?|&#63;/\?/g;
	$texte =~ s/\(|&#40;/\(/g; 
	$texte =~ s/\)|&#41;/\)/g; 
	$texte =~ s/\[|&#91;/\[/g; 
	$texte =~ s/]|&#93;/]/g; 
	$texte =~ s/{|&#123;/{/g; 
	$texte =~ s/}|&#125;/}/g; 
	$texte =~ s/&uml;|&#168;/¨/g; 
	$texte =~ s/&acute;|&#180;/´/g; 
	$texte =~ s/`|&#96;/`/g; 
	$texte =~ s/\^|&#94;/\^/g; 
	$texte =~ s/&circ;|&#710;/ˆ/g; 
	$texte =~ s/~|&#126;/~/g; 
	$texte =~ s/#|&#35;/#/g; 
	$texte =~ s/\*|&#42;/\*/g; 
	$texte =~ s/,|&#44;/,/g; 
	$texte =~ s/\.|&#46;/\./g; 
	$texte =~ s/:|&#58;/:/g; 
	$texte =~ s/;|&#59;/;/g; 
	$texte =~ s/&middot;|&#183;/·/g; 
	$texte =~ s/&bull;|&#8226;/•/g; 
	$texte =~ s/&macr;|&#175;/¯/g; 
	$texte =~ s/-|&#45;/-/g; 
	$texte =~ s/&ndash;|&#8211;/–/g; 
	$texte =~ s/&mdash;|&#8212;/—/g; 
	$texte =~ s/_|&#95;/_/g; 
	$texte =~ s/\||&#124;/\|/g; 
	$texte =~ s/&brvbar;|&#166;/¦/g; 
	$texte =~ s/&zwj;|&#8205;/?/g; 
	$texte =~ s/&dagger;|&#8224;/†/g; 
	$texte =~ s/&Dagger;|&#8225;/‡/g; 
	$texte =~ s/&Dagger;|&#8225;/‡/g; 
	$texte =~ s/&sect;|&#167;/§/g;
	$texte =~ s/&para;|&#182;/¶/g;
	$texte =~ s/&copy;|&#169;/©/g;
	$texte =~ s/&reg;|&#174;/®/g;
	$texte =~ s/&trade;|&#8482;/™/g;
	$texte =~ s/@|&#64;/@/g;
	$texte =~ s/\/|&#47;/\//g;
	$texte =~ s/\\|&#92;/\\/g;
	$texte =~ s/&loz;|&#9674;/?/g;
	$texte =~ s/&spades;|&#9824;/?/g;
	$texte =~ s/&clubs;|&#9827;/?/g;
	$texte =~ s/&hearts;|&#9829;/?/g;
	$texte =~ s/&diams;|&#9830;/?/g;
	$texte =~ s/&larr;|&#8592;/?/g;
	$texte =~ s/&uarr;|&#8593;/?/g;
	$texte =~ s/&rarr;|&#8594;/?/g;
	$texte =~ s/&darr;|&#8595;/?/g;
	$texte =~ s/&harr;|&#8596;/?/g;
	$texte =~ s/&aacute;|&#225;/á/g;
	$texte =~ s/&Aacute;|&#193;/Á/g;
	$texte =~ s/&acirc;|&#226;/â/g;
	$texte =~ s/&Acirc;|&#194;/Â/g;
	$texte =~ s/&agrave;|&#224;/à/g;
	$texte =~ s/&Agrave;|&#192;/À/g;
	$texte =~ s/&aring;|&#229;/å/g;
	$texte =~ s/&Aring;|&#197;/Å/g;
	$texte =~ s/&atilde;|&#227;/ã/g;
	$texte =~ s/&Atilde;|&#195;/Ã/g;
	$texte =~ s/&auml;|&#228;/ä/g;
	$texte =~ s/&Auml;|&#196;/Ä/g;
	$texte =~ s/&aelig;|&#230;/æ/g;
	$texte =~ s/&AElig;|&#198;/Æ/g;
	$texte =~ s/&ccedil;|&#231;/ç/g;
	$texte =~ s/&Ccedil;|&#199;/Ç/g;
	$texte =~ s/&eacute;|&#233;/é/g;
	$texte =~ s/&Eacute;|&#201;/É/g;
	$texte =~ s/&ecirc;|&#234;/ê/g;
	$texte =~ s/&Ecirc;|&#202;/Ê/g;
	$texte =~ s/&egrave;|&#232;/è/g;
	$texte =~ s/&Egrave;|&#200;/È/g;
	$texte =~ s/&euml;|&#235;/ë/g;
	$texte =~ s/&Euml;|&#203;/Ë/g;
	$texte =~ s/&iacute;|&#237;/í/g;
	$texte =~ s/&Iacute;|&#205;/Í/g;
	$texte =~ s/&icirc;|&#238;/î/g;
	$texte =~ s/&Icirc;|&#206;/Î/g;
	$texte =~ s/&igrave;|&#236;/ì/g;
	$texte =~ s/&Igrave;|&#204;/Ì/g;
	$texte =~ s/&iuml;|&#239;/ï/g;
	$texte =~ s/&Iuml;|&#207;/Ï/g;
	$texte =~ s/&ntilde;|&#241;/ñ/g;
	$texte =~ s/&Ntilde;|&#209;/Ñ/g;
	$texte =~ s/&oacute;|&#243;/ó/g;
	$texte =~ s/&Oacute;|&#211;/Ó/g;
	$texte =~ s/&ocirc;|&#244;/ô/g;
	$texte =~ s/&Ocirc;|&#212;/Ô/g;
	$texte =~ s/&ograve;|&#242;/ò/g;
	$texte =~ s/&Ograve;|&#210;/Ò/g;
	$texte =~ s/&oslash;|&#248;/ø/g;
	$texte =~ s/&Oslash;|&#216;/Ø/g;
	$texte =~ s/&otilde;|&#245;/õ/g;
	$texte =~ s/&Otilde;|&#213;/Õ/g;
	$texte =~ s/&ouml;|&#246;/ö/g;
	$texte =~ s/&Ouml;|&#214;/Ö/g;
	$texte =~ s/&oelig;|&#156;/œ/g;
	$texte =~ s/&OElig;|&#140;/Œ/g;
	$texte =~ s/&scaron;|&#353;/š/g;
	$texte =~ s/&Scaron;|&#352;/Š/g;
	$texte =~ s/&szlig;|&#223;/ß/g;
	$texte =~ s/&eth;|&#240;/ð/g;
	$texte =~ s/&ETH;|&#208;/Ð/g;
	$texte =~ s/&thorn;|&#254;/þ/g;
	$texte =~ s/&THORN;|&#222;/Þ/g;
	$texte =~ s/&uacute;|&#250;/ú/g;
	$texte =~ s/&Uacute;|&#218;/Ú/g;
	$texte =~ s/&ucirc;|&#251;/û/g;
	$texte =~ s/&Ucirc;|&#219;/Û/g;
	$texte =~ s/&ugrave;|&#249;/ù/g;
	$texte =~ s/&Ugrave;|&#217;/Ù/g;
	$texte =~ s/&uuml;|&#252;/ü/g;
	$texte =~ s/&Uuml;|&#220;/Ü/g;
	$texte =~ s/&yacute;|&#253;/ý/g;
	$texte =~ s/&Yacute;|&#221;/Ý/g;
	$texte =~ s/&yuml;|&#255;/ÿ/g;
	$texte =~ s/&Yuml;|&#376;/Ÿ/g;
	$texte =~ s/&curren;|&#164;/¤/g;
	$texte =~ s/&euro;|&#128;/€/g;
	$texte =~ s/\$|&#36;/\$/g;
	$texte =~ s/&cent;|&#162;/¢/g;
	$texte =~ s/&pound;|&#163;/£/g;
	$texte =~ s/&yen;|&#165;/¥/g;
	$texte =~ s/&fnof;|&#402;/ƒ/g;
	$texte =~ s/&alpha;|&#945;/a/g;
	$texte =~ s/&Alpha;|&#913;/?/g;
	$texte =~ s/&beta;|&#946;/ß/g;
	$texte =~ s/&Beta;|&#914;/?/g;
	$texte =~ s/&gamma;|&#947;/?/g;
	$texte =~ s/&Gamma;|&#915;/G/g;
	$texte =~ s/&delta;|&#948;/d/g;
	$texte =~ s/&Delta;|&#916;/?/g;
	$texte =~ s/&epsilon;|&#949;/e/g;
	$texte =~ s/&Epsilon;|&#917;/?/g;
	$texte =~ s/&zeta;|&#950;/?/g;
	$texte =~ s/&Zeta;|&#918;/?/g;
	$texte =~ s/&eta;|&#951;/?/g;
	$texte =~ s/&Eta;|&#919;/?/g;
	$texte =~ s/&theta;|&#952;/?/g;
	$texte =~ s/&Theta;|&#920;/T/g;
	$texte =~ s/&iota;|&#953;/?/g;
	$texte =~ s/&Iota;|&#921;/?/g;
	$texte =~ s/&kappa;|&#954;/?/g;
	$texte =~ s/&Kappa;|&#922;/?/g;
	$texte =~ s/&lambda;|&#955;/?/g;
	$texte =~ s/&Lambda;|&#923;/?/g;
	$texte =~ s/&mu;|&#956;/µ/g;
	$texte =~ s/&Mu;|&#924;/?/g;
	$texte =~ s/&nu;|&#957;/?/g;
	$texte =~ s/&Nu;|&#925;/?/g;
	$texte =~ s/&xi;|&#958;/?/g;
	$texte =~ s/&Xi;|&#926;/?/g;
	$texte =~ s/&omicron;|&#959;/?/g;
	$texte =~ s/&Omicron;|&#927;/?/g;
	$texte =~ s/&pi;|&#960;/p/g;
	$texte =~ s/&Pi;|&#928;/?/g;
	$texte =~ s/&rho;|&#961;/?/g;
	$texte =~ s/&Rho;|&#929;/?/g;
	$texte =~ s/&sigma;|&#963;/s/g;
	$texte =~ s/&sigmaf;|&#962;/?/g;
	$texte =~ s/&Sigma;|&#931;/S/g;
	$texte =~ s/&tau;|&#964;/t/g;
	$texte =~ s/&Tau;|&#932;/?/g;
	$texte =~ s/&upsilon;|&#965;/?/g;
	$texte =~ s/&Upsilon;|&#933;/?/g;
	$texte =~ s/&phi;|&#966;/f/g;
	$texte =~ s/&Phi;|&#934;/F/g;
	$texte =~ s/&chi;|&#967;/?/g;
	$texte =~ s/&Chi;|&#935;/?/g;
	$texte =~ s/&psi;|&#968;/?/g;
	$texte =~ s/&Psi;|&#936;/?/g;
	$texte =~ s/&omega;|&#969;/?/g;
	$texte =~ s/&Omega;|&#937;/O/g;
	$texte  =~ s/&deg;|&#176;/°/g;
	$texte =~ s/&micro;|&#181;/µ/g;
	$texte =~ s/&lt;|&#60;/</g;
	$texte =~ s/&gt;|&#62;/>/g;
	$texte =~ s/&le;|&#8804;/=/g;
	$texte =~ s/&ge;|&#8805;/=/g;
	$texte =~ s/=|&#61;/=/g;
	$texte =~ s/&asymp;|&#8776;/˜/g;
	$texte =~ s/&ne;|&#8800;/?/g;
	$texte =~ s/&equiv;|&#8801;/=/g;
	$texte =~ s/&plusmn;|&#177;/±/g;
	$texte =~ s/&minus;|&#8722;/-/g;
	$texte =~ s/\+|&#43;/\+/g;
	$texte =~ s/&times;|&#215;/×/g;
	$texte =~ s/&divide;|&#247;/÷/g;
	$texte =~ s/&frasl;|&#8260;//g;
	$texte =~ s/%|&#37;/%/g;
	$texte =~ s/&permil;|&#8240;/‰/g;
	$texte =~ s/&frac14;|&#188;/¼/g;
	$texte =~ s/&frac12;|&#188;/½/g;
	$texte =~ s/&frac34;|&#188;/¾/g;
	$texte =~ s/&sup1;|&#185;/¹/g;
	$texte =~ s/&sup2;|&#178;/²/g;
	$texte =~ s/&sup3;|&#179;/³/g;
	$texte =~ s/&ordm;|&#186;/º/g;
	$texte =~ s/&ordf;|&#170;/ª/g;
	$texte =~ s/&fnof;|&#402;/ƒ/g;
	$texte =~ s/&prime;|&#8242;/'/g;
	$texte =~ s/&Prime;|&#8243;/?/g;
	$texte =~ s/&part;|&#8706;/?/g;
	$texte =~ s/&prod;|&#8719;/?/g;
	$texte =~ s/&sum;|&#8721;/?/g;
	$texte =~ s/&radic;|&#8730;/v/g;
	$texte =~ s/&infin;|&#8734;/8/g;
	$texte =~ s/&not;|&#172;/¬/g;
	$texte =~ s/&cap;|&#8745;/n/g;
	$texte =~ s/&int;|&#8747;/?/g;
	#$texte =~ s/et|&/?/g;
	$texte =~ s/&/et/g;
	$texte =~ s/<.+?>//g;
	return $texte;
}#fin nettoietexte


