#!/usr/bin/perl
#On affecte le contenu de la variable $ARGV[0] (Correspond au premier élément contenu dans le tableau @ARGV, c'est à dire au premier paramètre qui se trouve sur la ligne de commande) à la variable $fichier
$fichier=$ARGV[0];
#On ouvre en lecture le fichier dont le nom est contenu dans la variable $fichier et on le référence sous le nom FICHIERENTREE
open(FICHIERENTREE, $fichier);
#On remplace la chaîne de caractères ".txt" contenue dans la variable $fichier par ".html"
$fichier=~s/.txt/.html/;
#On ouvre en écriture le fichier nommé "dico_mots_ " suivi du contenu de la variable $fichier et on le référence sous le nom FICHIERSORTIE1
#Si le fichier n'existe pas, il est créé
#Si le fichier existe déjà, son contenu est écrasé
open(FICHIERSORTIE1, ">dico_mots_".$fichier);
#On ouvre en écriture le fichier nommé "dico_occurences_ " suivi du contenu de la variable $fichier et on le référence sous le nom FICHIERSORTIE2
#Si le fichier n'existe pas, il est créé
#Si le fichier existe déjà, son contenu est écrasé
open(FICHIERSORTIE2, ">dico_occurences_".$fichier);
#On crée une variable $texte vide
$texte="";
#On crée un compteur $compteurlignes qui compte les lignes et on l'initialise à 0
$compteurlignes=0;
#On crée un compteur $compteurmots qui compte les mots et on l'initialise à 0
$compteurmots=0;
#On crée un compteur $compteurmotsdifferents qui compte les mots différents et on l'initialise à 0
$compteurmotsdifferents=0;
#On écrit le début du fichier html, l'entête et le début du corps dans le fichier référencé sous le nom FICHIERSORTIE1
#On retourne à la ligne
print FICHIERSORTIE1 "<html>\n<head><title>Dictionnaire alphabétique</title><style type=\"text/css\">body { font-family: \"arial\" }</style></head><body>\n";
#On écrit le début du tableau dans le fichier référencé sous le nom FICHIERSORTIE1
#On retourne à la ligne
print FICHIERSORTIE1 "<table align=\"center\" border=\"1\">\n";
#On écrit le début du fichier html, l'entête et le début du corps dans le fichier référencé sous le nom FICHIERSORTIE2
#On retourne à la ligne
print FICHIERSORTIE2 "<html>\n<head><title>Dictionnaire par occurences</title><style type=\"text/css\">body { font-family: \"arial\" }</style></head><body>\n";
#On écrit le début du tableau dans le fichier référencé sous le nom FICHIERSORTIE2
#On retourne à la ligne
print FICHIERSORTIE2 "<table align=\"center\" border=\"1\">\n";
#Tant qu'on peut associer une ligne du fichier référencé sous le nom FICHIERENTREE à la variable $ligne, on exécute le bloc d'instructions
while (my $ligne=<FICHIERENTREE>) {
	#On incrémente le compteur $compteurlignes
	$compteurlignes++;
	#On met en minuscule tous les caractères contenus dans la variable $ligne
	$ligne=lc($ligne);
	#On supprime le dernier caractère contenu dans la variable $ligne seulement si celui-ci est un retour à la ligne
	chomp $ligne;
	#On supprime les balises
	$ligne=~s/<.*>//g;
	#On remplace les caractères inutiles par un dièse
	$ligne=~s/[ ,.;:!?()"«»-]/#/g;
	#Si le contenu de la variable $ligne contient une apostrophe précédée d'un mot ne dépassant pas deux lettres (Comme pour qu'en, l'envi, d'odeurs, ...), on exécute le bloc d'instructions
	if ($ligne=~/#[a-zA-Z]{1,2}'/) {
		#On remplace l'apostrophe par un dièse
		$ligne=~s/'/#/g;
	}
	#On ajoute, à la suite du contenu de la variable $texte, le contenu de la variable $ligne et on ajoute un dièse
	$texte=$texte.$ligne."#";
}
#On ferme le fichier référencé sous le nom FICHIERENTREE
close(FICHIERENTREE);
#On remplace les dièses qui sont les uns à la suite des autres (Exemple : le##petit###chien) par un seul dièse (Exemple : le#petit#chien)
$texte=~s/#(#)*/#/g;
#On supprime le dernier caractère contenu dans la variable $texte seulement si celui-ci est un retour à la ligne
chomp $texte;
#On sépare (Le séparateur étant le caractère dièse) la chaîne de caractères contenue dans la variable $texte en plusieurs éléments qu'on affecte au tableau @mots
@mots=split(/#/,$texte);
#Pour chaque élément du tableau @mots qu'on affecte à la variable $mot, on exécute le bloc d'instructions
foreach $mot (@mots) {
	#On incrémente le compteur $compteurmots
	$compteurmots++;
	#Si le contenu de la variable $mot n'est pas vide, on exécute le bloc d'instructions
	if ($mot ne "") {
		#Si le contenu de la variable $mot existe dans le tableau $dicomots, on exécute le bloc d'instructions
		if (exists($dicomots{$mot})) {
			#On incrémente la valeur de la clé $mot du tableau $dicomots
			$dicomots{$mot}++;
		}
		#Sinon (Donc si le contenu de la variable $mot n'existe pas dans le tableau $dicomots), on exécute le bloc d'instructions
		else {
			#On affecte la valeur 1 à la valeur de la clé $mot du tableau $dicomots
			$dicomots{$mot}=1;
			#On incrémente le compteur $compteurmotsdifferents
			$compteurmotsdifferents++;
		}
	}
}
#On trie les clés du tableau associatif %dicomots par ordre alphabétique et on affecte le résultat dans un nouveau tableau @dicoword
@dicoword=sort(keys %dicomots);
#Pour chaque élément du tableau @dicoword qu'on affecte à la variable $mot, on exécute le bloc d'instructions
foreach $mot (@dicoword) {
	#On écrit dans le fichier référencé sous le nom FICHIERSORTIE1 le contenu des cellules de la ligne du tableau
	#On retourne à la ligne
	print FICHIERSORTIE1 "<tr><td>",$mot,"</td><td>",$dicomots{$mot},"</td></tr>\n";
}
#On écrit la fin du tableau du fichier référencé sous le nom FICHIERSORTIE1
print FICHIERSORTIE1 "</table>\n</body>\n</html>";
#On trie les valeurs du tableau associatif %dicomots par ordre décroissant et on affecte le résultat dans un nouveau tableau @dicooccurences
@dicooccurences=sort{$dicomots{$b}<=>$dicomots{$a}}(keys %dicomots);
#Pour chaque élément du tableau @dicooccurences qu'on affecte à la variable $mot, on exécute le bloc d'instructions
foreach $mot (@dicooccurences) {
	#On écrit dans le fichier référencé sous le nom FICHIERSORTIE2 le contenu des cellules de la ligne du tableau
	#On retourne à la ligne
	print FICHIERSORTIE2 "<tr><td>",$mot,"</td><td>",$dicomots{$mot},"</td></tr>\n";
}
#On écrit la fin du tableau du fichier référencé sous le nom FICHIERSORTIE2
print FICHIERSORTIE2 "</table>\n</body>\n</html>";
#On ferme le fichier référencé sous le nom FICHIERSORTIE2
close(FICHIERSORTIE2);
#On ferme le fichier référencé sous le nom FICHIERSORTIE1
close(FICHIERSORTIE1);
#On retourne à la ligne
#On affiche en gras (\033[01m) "Resultat de l'analyse du fichier :" et en gras et bleu (\033[34m) le contenu de la variable $fichier (\033[00m permet de remettre le texte en noir)
#On retourne à la ligne
print "\n\033[01mResultat de l'analyse du fichier \033[34m",$fichier,"\033[00m :\n";
#Si la valeur de la variable $compteurlignes est égale à 0, on exécute le bloc d'instructions
if ($compteurlignes==0) {
	#On affiche "Le fichier ne contient aucune ligne."
	#On retourne à la ligne
	print "Le fichier ne contient aucune ligne.\n";
}
#Sinon si la valeur de la variable $compteurlignes est égale à 1, on exécute le bloc d'instructions
elsif ($compteurlignes==1) {
	#On affiche "Le fichier contient ", suivi en rouge (\033[31m) du contenu de la variable $compteurlignes, et suivi en rouge (\033[31m) de " ligne"
	#On retourne à la ligne
	print "Le fichier contient \033[31m",$compteurlignes," ligne\033[00m.\n";
}
#Sinon si aucune des deux conditions précédentes n'est remplie (Donc si la valeur de la variable $compteurlignes est strictement supérieure à 1), on exécute le bloc d'instructions
else {
	#On affiche "Le fichier contient ", suivi en rouge (\033[31m) du contenu de la variable $compteurlignes, et suivi en rouge (\033[31m) de " lignes"
	#On retourne à la ligne
	print "Le fichier contient \033[31m",$compteurlignes," lignes\033[00m.\n";
}
#Si la valeur de la variable $compteurmots est égale à 0, on exécute le bloc d'instructions
if ($compteurmots==0) {
	#On affiche "Le fichier ne contient aucun mot."
	#On retourne à la ligne
	print "Le fichier ne contient aucun mot.\n";
}
#Sinon si la valeur de la variable $compteurmots est égale à 1, on exécute le bloc d'instructions
elsif ($compteurmots==1) {
	#On affiche "Le fichier contient ", suivi en rouge (\033[31m) du contenu de la variable $compteurmots, et suivi en rouge (\033[31m) de " mot"
	#On retourne à la ligne
	print "Le fichier contient \033[31m",$compteurmots," mot\033[00m.\n";
}
#Sinon si aucune des deux conditions précédentes n'est remplie (Donc si la valeur de la variable $compteurmots est strictement supérieure à 1), on exécute le bloc d'instructions
else {
	#On affiche "Le fichier contient ", suivi en rouge (\033[31m) du contenu de la variable $compteurmots, suivi en rouge (\033[31m) de " mots", suivi de " dont ", suivi en rouge (\033[31m) du contenu de la variable $compteurmotsdifferents, et suivi en rouge (\033[31m) de " differents"
	#On retourne à la ligne
	print "Le fichier contient \033[31m",$compteurmots," mots\033[00m dont \033[31m",$compteurmotsdifferents," differents\033[00m.\n";
}
#On affiche "Nom du fichier contenant le dictionnaire alphabetique : ", suivi en vert (\033[32m) de "dico_mots_" et suivi en vert (\033[32m) du contenu de la variable $fichier
#On retourne à la ligne
print "Nom du fichier contenant le dictionnaire alphabetique : \033[32mdico_mots_",$fichier,"\033[00m\n";
#On affiche "Nom du fichier contenant le dictionnaire par occurences : ", suivi en vert (\033[32m) de "dico_occurences_" et suivi en vert (\033[32m) du contenu de la variable $fichier
#On retourne à la ligne
print "Nom du fichier contenant le dictionnaire par occurences : \033[32mdico_occurences_",$fichier,"\033[00m\n\n";