2
0
Fork 0

modif Perl/genere_catalogue_tests.pl : ajout d un index par mot-cle en fin de document (par lecture de la rubrique Mots-cles des fichiers README)

This commit is contained in:
troufflard 2015-06-26 15:37:18 +00:00
parent ece2eab3dc
commit dccf63fdc3
2 changed files with 462 additions and 160 deletions

View file

@ -3,7 +3,8 @@ use strict;
use warnings; use warnings;
use File::Basename; use File::Basename;
use English; use English;
use Encode; use Encode;# package encodage fichier texte
use Cwd; # package pour connaitre le repertoire courant
use File::Spec::Functions qw(rel2abs); use File::Spec::Functions qw(rel2abs);
use File::Temp qw/ cleanup /;#creation d un repertoire temporaire qui s efface automatiquement en sortie de programme => my ($handle, $nom_rep) = File::Temp->newdir(TEMPLATE => "toto_XXXX"); use File::Temp qw/ cleanup /;#creation d un repertoire temporaire qui s efface automatiquement en sortie de programme => my ($handle, $nom_rep) = File::Temp->newdir(TEMPLATE => "toto_XXXX");
#fonction cleanup() => appel a cleanup() pour forcer la destruction des repertoires et fichier temporaires #fonction cleanup() => appel a cleanup() pour forcer la destruction des repertoires et fichier temporaires
@ -15,45 +16,69 @@ my $format_reel = '[+-]?[\.]?\d+[\.]?\d*(?:[eE][+-]?\d*)?';
##################################################################################################### #####################################################################################################
# script pour generer automatiquement un document pdf qui resume les tests # script pour generer automatiquement un document pdf qui resume les tests
# disponibles (recopie des rubriques "But du test" et "Description du calcul" du # disponibles (recopie des rubriques "But du test" et "Description du calcul" du
# fichier README de cahque repertoire de test) # fichier README de chaque repertoire de test)
# #
# Notes aux utilisateurs : # Notes aux utilisateurs :
# les repertoires de tests sont recherches dans toute l arborescence depuis l endroit ou # les repertoires de tests sont recherches dans toute l arborescence depuis l endroit ou
# ce script est lance (recherche de tous les repertoires commencant par Test_R ou Test_L # ce script est lance (recherche de tous les repertoires commencant par Test_R ou Test_L)
# A noter que si un des repertoires n a pas de fichier README, le script s arrete sans # A noter que si un des repertoires ne contient pas de fichier README, le script s arrete sans
# creation du .pdf # creation du .pdf. De meme, si l un des fichiers README ne contient pas la rubrique "But du test"
# ou "Description du calcul"
# #
# Notes aux developpeurs : # Notes aux developpeurs :
# - l une des plus grandes difficultes est l encodage des fichiers pour gerer les accents # - le choix de ne pas generer de pdf a la moindre defaillance d un fichier README a pour
# but de forcer a rendre conforme les fichiers README. Une ecriture partielle du fichier
# pdf en omettant les README defaillants pourrait conduire a un oubli de certains tests.
# - l une des plus grandes difficultes est l encodage des fichiers pour gerer les accents.
# le choix d encodage est impose par la variable $ENCODAGE_TEX
# (en cas de gros probleme, la meilleure solution est de supprimer/remplacer les caracteres # (en cas de gros probleme, la meilleure solution est de supprimer/remplacer les caracteres
# les plus problematiques des fichiers README) # les plus problematiques des fichiers README)
# - c est difficile d anticiper ce que les gens vont ecrire dans les fichiers README. # - c est difficile d anticiper ce que les gens vont ecrire dans les fichiers README.
# un certain nombre de caracteres ou de groupes de caracteres ne sont pas directement utilisables # un certain nombre de caracteres ou de groupes de caracteres ne sont pas directement utilisables
# dans un fichier .tex # dans un fichier .tex
# (par exemple : <, >, _, etc... ou bien encore les exposants ^3.14159265) # (par exemple : <, >, _, etc... ou bien encore les exposants ^3.14159265)
# la gestion de ces caracteres se fait au cas par cas dans la subroutine ecrire_rubrique_README() # Le plus souvent, il suffit de rajouter des dollars autour des caracteres problematiques mais
# au niveau du bloc suivant (substitution de caracteres s///) : # ce n est pas systematique.
#-------------------------------------------------------------------------------- # La gestion de ces caracteres se fait au cas par cas dans la subroutine translate_to_latex()
#-------------------------------------------------------------------------------- # au niveau du bloc "A FAIRE EVOLUER" (par substitution de caracteres s///g)
#A FAIRE EVOLUER : gestion au cas par cas des caracteres speciaux dans Latex
#--------------------------------------------------------------------------------
#--------------------------------------------------------------------------------
# ...
# ...
# ...
#--------------------------------------------------------------------------------
#--------------------------------------------------------------------------------
##################################################################################################### #####################################################################################################
######################################################################################################
#
# PARAMETRES
#
######################################################################################################
#--------------------------------------------------------------------------------
#nom du fichier catalogue de tests #nom du fichier catalogue de tests
#--------------------------------------------------------------------------------
my $NOM_PDF_CATALOGUE = "documentation_tests.pdf"; my $NOM_PDF_CATALOGUE = "documentation_tests.pdf";
#encodage du fichier .tex temporaire (pour accepter les accents) #--------------------------------------------------------------------------------
#encodage du fichier .tex temporaire (rq : notamment pour accepter les accents)
#--------------------------------------------------------------------------------
my $ENCODAGE_TEX = 'iso-8859-15'; my $ENCODAGE_TEX = 'iso-8859-15';
#--------------------------------------------------------------------------------
#concernant fichiers README :
#--------------------------------------------------------------------------------
#--liste des rubriques a recopier de chaque README (rq : insensible a la casse)
my @LISTE_RUBRIQUES_README = ('But du test',
'Description du calcul');
#--nom de la rubrique contenant des mots-cles (rq : insensible a la casse)
my $NOM_RUBRIQUE_MOTS_CLES = 'Mots-cles';
######################################################################################################### #########################################################################################################
@ -71,6 +96,9 @@ verif_commande('pdflatex') or die "\nErreur (prog:$NOM_PROG) : commande pdflatex
@_ = qx(pdflatex -help | grep -- -halt-on-error); @_ = qx(pdflatex -help | grep -- -halt-on-error);
($#_ > -1) or die "\nErreur (prog:$NOM_PROG) : commande pdflatex => option -halt-on-error non existante...\n\n"; ($#_ > -1) or die "\nErreur (prog:$NOM_PROG) : commande pdflatex => option -halt-on-error non existante...\n\n";
#verif validite de la commande makeindex
verif_commande('makeindex') or die "\nErreur (prog:$NOM_PROG) : commande makeindex introuvable...\n\n";
######################################################################################################### #########################################################################################################
@ -78,30 +106,29 @@ verif_commande('pdflatex') or die "\nErreur (prog:$NOM_PROG) : commande pdflatex
######################################################################################################### #########################################################################################################
#liste des repertoires de tests rapides (Test_R) #liste des repertoires de tests rapides (Test_R)
my @REP_TESTS_R = map {chomp($_); $_} qx(find . -name "Test_R*" -type d); my @REP_TESTS_R = map {chomp($_); $_} qx(find . -name "Test_R*" -type d);
#print "$_\n" for @REP_TESTS_R; #print "$_\n" for @REP_TESTS_R; exit;
#liste des repertoires de tests rapides (Test_R) #liste des repertoires de tests rapides (Test_R)
my @REP_TESTS_L = map {chomp($_); $_} qx(find . -name "Test_L*" -type d); my @REP_TESTS_L = map {chomp($_); $_} qx(find . -name "Test_L*" -type d);
#print "$_\n" for @REP_TESTS_L; #print "$_\n" for @REP_TESTS_L; exit;
######################################################################################################### #########################################################################################################
# verification de la presence d un fichier README dans les tests rapides @REP_TESTS_R et les tests longs @REP_TESTS_L # verification de la presence d un fichier README dans les tests rapides @REP_TESTS_R et les tests longs @REP_TESTS_L
######################################################################################################### #########################################################################################################
my $is_absence_README = 0; my $is_absence_README = 0;
#-dans les tests rapides
foreach my $rep_test (@REP_TESTS_R,@REP_TESTS_L) { foreach my $rep_test (@REP_TESTS_R,@REP_TESTS_L) {
(-e "$rep_test/README") or do { (-e "$rep_test/README") or do {
print "\n" if(not $is_absence_README);#on passe une ligne si c est le premier repertoire defaillant warn "\n" if(not $is_absence_README);#on passe une ligne si c est le premier repertoire defaillant
warn "Erreur (prog:$NOM_PROG) : repertoire de test $rep_test ne contient pas de fichier README...\n"; warn "Erreur (prog:$NOM_PROG) : repertoire de test $rep_test ne contient pas de fichier README...\n";
$is_absence_README = 1; $is_absence_README = 1;
}; };
} }
#arret du programme si il y a absence d au moins 1 fichier README #arret du programme si il y a absence d au moins 1 fichier README
if($is_absence_README) { if($is_absence_README) {
print "\n"; warn "\n";
print_ligne_pointilles(); afficher_ligne_pointilles('warn');
print "Erreur (prog:$NOM_PROG) : arret a cause de l absence de fichiers README\n"; warn "Erreur (prog:$NOM_PROG) : arret a cause de l absence de fichier(s) README\n";
print_ligne_pointilles(); afficher_ligne_pointilles('warn');
die "\n"; die "\n";
} }
@ -121,11 +148,11 @@ $SIG{TERM} = \&sortie_programme;#TERM => capture signal : kill -15
#creation d un repertoire temporaire (... qui s effacera automatiquement en sortie de programme grace a l utilisation de la construction objet File::Temp->newdir() #creation d un repertoire temporaire (... qui s effacera automatiquement en sortie de programme grace a l utilisation de la construction objet File::Temp->newdir()
my $rep_tmp = File::Temp->newdir("rep_tmp_".$NOM_PROG.'_XXXXX'); my $REP_TMP = File::Temp->newdir("rep_tmp_".$NOM_PROG.'_XXXXX');
my $racine_fic_latex = "toto"; my $racine_fic_latex = "toto";
#deplacement vers le repertoire temporaire #deplacement vers le repertoire temporaire
chdir $rep_tmp; chdir $REP_TMP;
#------------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------------
#creation du fichier .tex avec encodage $ENCODAGE_TEX (et debut du document : preambule) #creation du fichier .tex avec encodage $ENCODAGE_TEX (et debut du document : preambule)
@ -139,111 +166,32 @@ preambule_fic_tex_tmp($HANDLE_TEX);
#--- tests rapides --- #--- tests rapides ---
print $HANDLE_TEX "\\clearpage\\newpage\n"; print $HANDLE_TEX "\\clearpage\\newpage\n";
print $HANDLE_TEX "\\section{Tests rapides}\n"; print $HANDLE_TEX "\\section{Tests rapides}\n";
recopie_README("R", $HANDLE_TEX, \@REP_TESTS_R, @LISTE_RUBRIQUES_README);
my $no_test = 0;
foreach my $rep_test (@REP_TESTS_R) {
$_ = $rep_test; s/^\.+\///;
print "ajout test : $_\n";
#incrementation numero test
$no_test++;
#chemin du fichier README
my $fic_README = "../$rep_test/README";
#derniere partie du nom du repertoire
my $nom_test = basename $rep_test;
$nom_test =~ s/_/\$\\_\$/g;#tiret bas entre dollars
#ecriture d une nouvelle sous-section pour ce test
print $HANDLE_TEX "\\subsection{Test\$\\_\$R n\$^\\circ\$$no_test : $nom_test}\n";
#ecriture du nom complet du repertoire sous forme d une arborescence simple
print $HANDLE_TEX "\\noindent \\underline{R\\\'epertoire} :\\\\\n";
my @rep_arbo = split(/\/+/, $rep_test);
shift(@rep_arbo) if($rep_arbo[0] =~ /^\.+$/);#suppression d un eventuel ./ ou ../ devant le nom du repertoire
#--variables pour faire une jolie indentation via \hspace
my $hspace_cm = 0.5;
my $hspace_cm_incr = 0.35;
foreach my $rep_arbo (@rep_arbo) {
$rep_arbo =~ s/_/\$\\_\$/g;
print $HANDLE_TEX "\\hspace*{${hspace_cm}cm}\$\\triangleright\$ $rep_arbo\\\\\n";
$hspace_cm += $hspace_cm_incr;
}
#saisie de l encodage du README (par defaut : rien) (rq : on utilise la commande linux/Unix "file")
my $encodage_source = '';
#cas UTF-nombre (exemples : UTF-8, UTF-16, etc...)
if(qx(file $fic_README) =~ /utf-(\d+)/i) {
$encodage_source = ":encoding(UTF-$1)";
}
#ecriture de la partie "But du test"
ecrire_rubrique_README($fic_README, $encodage_source, $HANDLE_TEX, qw(But du test) );
#ecriture de la partie "Description du calcul"
ecrire_rubrique_README($fic_README, $encodage_source, $HANDLE_TEX, qw(Description du calcul) );
}
#--- tests longs --- #--- tests longs ---
print $HANDLE_TEX "\\clearpage\\newpage\n"; print $HANDLE_TEX "\\clearpage\\newpage\n";
print $HANDLE_TEX "\\section{Tests longs}\n"; print $HANDLE_TEX "\\section{Tests longs}\n";
recopie_README("L", $HANDLE_TEX, \@REP_TESTS_L, @LISTE_RUBRIQUES_README);
$no_test = 0;
foreach my $rep_test (@REP_TESTS_L) {
$_ = $rep_test; s/^\.+\///;
print "ajout test : $_\n";
#incrementation numero test
$no_test++;
#chemin du fichier README
my $fic_README = "../$rep_test/README";
#derniere partie du nom du repertoire
my $nom_test = basename $rep_test;
$nom_test =~ s/_/\$\\_\$/g;#tiret bas entre dollars
#ecriture d une nouvelle sous-section pour ce test
print $HANDLE_TEX "\\subsection{Test\$\\_\$L n\$^\\circ\$$no_test : $nom_test}\n";
#ecriture du nom complet du repertoire sous forme d une arborescence simple
print $HANDLE_TEX "\\noindent \\underline{R\\\'epertoire} :\\\\\n";
my @rep_arbo = split(/\/+/, $rep_test);
shift(@rep_arbo) if($rep_arbo[0] =~ /^\.+$/);#suppression d un eventuel ./ ou ../ devant le nom du repertoire
#--variables pour faire une jolie indentation via \hspace
my $hspace_cm = 0.5;
my $hspace_cm_incr = 0.35;
foreach my $rep_arbo (@rep_arbo) {
$rep_arbo =~ s/_/\$\\_\$/g;
print $HANDLE_TEX "\\hspace*{${hspace_cm}cm}\$\\triangleright\$ $rep_arbo\\\\\n";
$hspace_cm += $hspace_cm_incr;
}
#saisie de l encodage du README (par defaut : rien) (rq : on utilise la commande linux/Unix "file")
my $encodage_source = '';
#cas UTF-nombre (exemples : UTF-8, UTF-16, etc...)
if(qx(file $fic_README) =~ /utf-(\d+)/i) {
$encodage_source = ":encoding(UTF-$1)";
}
#ecriture de la partie "But du test"
ecrire_rubrique_README($fic_README, $encodage_source, $HANDLE_TEX, qw(But du test) );
#ecriture de la partie "Description du calcul"
ecrire_rubrique_README($fic_README, $encodage_source, $HANDLE_TEX, qw(Description du calcul) );
}
#------------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------------
#fin de l ecriture du fichier .tex : ajout de end{document} #fin de l ecriture du fichier .tex
#------------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------------
#ajout de l index (ajout egalement dans le sommaire sans numerotation)
print $HANDLE_TEX "\\clearpage\\newpage\n";
print $HANDLE_TEX "\\printindex\n";#ecriture de l index
#ajout de \end{document}
print $HANDLE_TEX "\\end{document}\n"; print $HANDLE_TEX "\\end{document}\n";
close($HANDLE_TEX); close($HANDLE_TEX);
#------------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------------
#compilation pdflatex (1 premiere fois pour voir si ca marche et une 2eme fois pour generer la table des matieres et les hyperliens #compilation pdflatex (avec index)
# en trois temps :
# 1- premier pdflatex (generation du .pdf et du .idx)
# 2- makeindex (creation de l index)
# 3- deuxieme pdflatex (table des matieres et index)
#------------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------------
print "\n"; print "\n";
print "compilation pdflatex (1ere fois)\n"; print "compilation pdflatex (1ere fois)\n";
@ -261,14 +209,37 @@ system("pdflatex -halt-on-error $racine_fic_latex.tex > toto.log");
chdir ".."; chdir "..";
sortie_programme(); sortie_programme();
} }
#-2eme compilation (etant donne que ca a marche la 1ere fois, pdflatex ne peut pas echouer cette 2eme fois) #-generation de l index
print "compilation index (makeindex)\n";
#-verif presence .idx
if(not -e "$racine_fic_latex.idx") {
warn "\nErreur (prog:$NOM_PROG) : le fichier index .idx n a pas ete cree\n";
warn " Les fichiers suivants ont ete cree a des fins de debug :\n";
warn " - $NOM_PDF_CATALOGUE.tex (fichier .tex donne en argument de pdflatex)\n";
warn " - $NOM_PDF_CATALOGUE.error_log (affichage renvoye par pdflatex)\n";
warn "\n";
system("mv -f $racine_fic_latex.tex ../$NOM_PDF_CATALOGUE.tex");
system("mv -f toto.log ../$NOM_PDF_CATALOGUE.error_log");
chdir "..";
sortie_programme();
}
system("makeindex $racine_fic_latex.idx > toto.log");
#-2eme compilation (pdflatex avec option -halt-on-error pour forcer a quitter a la moindre erreur)
print "compilation pdflatex (2eme fois)\n"; print "compilation pdflatex (2eme fois)\n";
system("pdflatex $racine_fic_latex.tex > toto.log"); system("rm -f $racine_fic_latex.pdf");
system("pdflatex -halt-on-error $racine_fic_latex.tex > toto.log");
#-verif presence .pdf
if(not -e "$racine_fic_latex.pdf") {
warn "\nErreur (prog:$NOM_PROG) : erreur a l execution de pdflatex.\n";
warn " Les fichiers suivants ont ete cree a des fins de debug :\n";
warn " - $NOM_PDF_CATALOGUE.tex (fichier .tex donne en argument de pdflatex)\n";
warn " - $NOM_PDF_CATALOGUE.error_log (affichage renvoye par pdflatex)\n";
warn "\n";
system("mv -f $racine_fic_latex.tex ../$NOM_PDF_CATALOGUE.tex");
system("mv -f toto.log ../$NOM_PDF_CATALOGUE.error_log");
chdir "..";
sortie_programme();
}
@ -280,15 +251,15 @@ chdir "..";
#affichage fin programme #affichage fin programme
print "\n"; print "\n";
print_ligne_pointilles(); afficher_ligne_pointilles('print');
print "Le fichier $NOM_PDF_CATALOGUE a ete cree...\n"; print "Le fichier $NOM_PDF_CATALOGUE a ete cree...\n";
print_ligne_pointilles(); afficher_ligne_pointilles('print');
print "\n"; print "\n";
#- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
#- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
#remarque : fin du programme => le repertoire temporaire $rep_tmp sera efface automatiquement #remarque : fin du programme => le repertoire temporaire $REP_TMP sera efface automatiquement
# car utilisation de File::Temp->newdir() # car utilisation de File::Temp->newdir()
#- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
#- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -302,74 +273,392 @@ print "\n";
#subroutine de sortie du programme #subroutine de sortie du programme
#-------------------------------------------------- #--------------------------------------------------
sub sortie_programme { sub sortie_programme {
#- - - - - - - - -
#effacement du repertoire temporaire (subroutine cleanup() du package File::Temp) #effacement du repertoire temporaire (subroutine cleanup() du package File::Temp)
#- - - - - - - - -
# rq : on remonte d un cran dans l arborescence si le repertoire courant est le repertoire temporaire
# (sinon le repertoire temporaire $REP_TMP ne pourra pas etre efface avec cleanup() )
chdir ".." if(cwd() =~ /$REP_TMP/);
cleanup(); cleanup();
exit; exit;
} }#sub sortie_programme
#-------------------------------------------------- #--------------------------------------------------
#subroutine qui ecrit une rubrique du fichier du README #subroutine pour generer un label de section sur 9 caracteres de A a Z
# rq : la variable $LABEL_ACTUEL est hors subroutine pour la rendre globale
# elle est initialisee lors du premier appel a la subroutine
# rq : le label est constitue de 9 caracteres (a priori, il ne faut pas depasser ce nombre
# pour eviter une erreur latex dans les index)
# de toute facon, avec 9 caracteres, la batterie peut contenir jusqu a 26 puissance 9, soit plus de 5400 milliards de tests !!!!
#-------------------------------------------------- #--------------------------------------------------
sub ecrire_rubrique_README { my $LABEL_ACTUEL;
sub genere_label_section {
#initialisation du label actuel si c est la premiere fois que cette subroutine est appelee
$LABEL_ACTUEL = 'AAAAAAAAA' if(not defined $LABEL_ACTUEL);
#le label a renvoyer est le label actuel
my $label_a_renvoyer = $LABEL_ACTUEL;
#table de conversion lettre en position alphabet (et l inverse)
my $TAB_CONVERT_lettre2pos = {
'A' => 1, 'B' => 2, 'C' => 3, 'D' => 4, 'E' => 5, 'F' => 6,
'G' => 7, 'H' => 8, 'I' => 9, 'J' => 10, 'K' => 11, 'L' => 12,
'M' => 13, 'N' => 14, 'O' => 15, 'P' => 16, 'Q' => 17, 'R' => 18,
'S' => 19, 'T' => 20, 'U' => 21, 'V' => 22, 'W' => 23, 'X' => 24,
'Y' => 25, 'Z' => 26};
my $TAB_CONVERT_pos2lettre = {
'1' => 'A', '2' => 'B', '3' => 'C', '4' => 'D', '5' => 'E', '6' => 'F',
'7' => 'G', '8' => 'H', '9' => 'I', '10' => 'J', '11' => 'K', '12' => 'L',
'13' => 'M', '14' => 'N', '15' => 'O', '16' => 'P', '17' => 'Q', '18' => 'R',
'19' => 'S', '20' => 'T', '21' => 'U', '22' => 'V', '23' => 'W', '24' => 'X',
'25' => 'Y', '26' => 'Z'};
#- - - - - - - - -
#actualisation du label pour le prochain appel
#- - - - - - - - -
#label actuel sous forme d un tableau d entier par conversion
my @tab_label = map {$TAB_CONVERT_lettre2pos->{$_}} split(//, $LABEL_ACTUEL);
my $nb_chars = $#tab_label + 1;
#test qui ne devrait jamais poser probleme (a moins que la batterie de verif ne contiennent 26 puissance 9 tests !!!!)
my $is_max_test = 1;
for(my $i=0; $i<$nb_chars; $i++) {$is_max_test = 0 if($tab_label[$i] != 26);}
if($is_max_test) {
warn "\n";
afficher_ligne_pointilles('warn');
warn "Erreur (prog:$NOM_PROG) : le nombre de tests de la batterie a atteint son maximum de 26 puissance $nb_chars !!!!!!\n\n";
afficher_ligne_pointilles('warn');
warn "\n";
sortie_programme();
}
#incrementation du label
$tab_label[0]++;
for(my $i=0; $i<$nb_chars; $i++) {
#incrementation de l indice suivant si l indice courant depasse 26
if($tab_label[$i] > 26) {
$tab_label[$i] = 1;
$tab_label[$i+1]++ if($i != ($nb_chars-1));
}
else {
last;
}
}
#-conversion inverse
$LABEL_ACTUEL = '';
foreach my $val (@tab_label) {$LABEL_ACTUEL .= $TAB_CONVERT_pos2lettre->{$val};}
#rappel : on return la valeur precedente de $LABEL_ACTUEL et non celle que l on vient d actualiser
return $label_a_renvoyer;
}#sub genere_label_section
#--------------------------------------------------
#subroutine pour recopier les fichiers README d une
# liste de repertoires de tests vers un fichier ouvert
#--------------------------------------------------
#
# en entree :
# - lettre indiquant test rapide ou long (donc la lettre "R" ou "L")
# - handle du fichier destination (donc deja ouvert par open() )
# - reference vers la liste des repertoires de test (antislash devant pour une reference : par exemple \@REP_TESTS_R)
# - liste des noms de rubriques a recopier (
#
# pas de sortie
#
sub recopie_README {
my $lettre_rapide_ou_long = shift;#doit etre egal a R ou L
my $handle_destination = shift;
my $ref_liste_rep_tests = shift;
my @liste_rubriques = @_;
my $no_test = 0;
foreach my $rep_test (@$ref_liste_rep_tests) {
$_ = $rep_test; s/^\.+\///;#suppression de l eventuel ./ ou ../ devant le nom du repertoire
print "ajout test : $_\n";
#incrementation numero test
$no_test++;
#chemin du fichier README
my $fic_README = "../$rep_test/README";
#derniere partie du nom du repertoire
my $nom_test = basename $rep_test;
$nom_test =~ s/_/\$\\_\$/g;#tiret bas entre dollars
#saisie de l encodage du README (par defaut : rien) (rq : on utilise la commande linux/Unix "file" pour avoir des infos sur l encodage)
my $encodage_source = '';
#cas UTF-nombre (exemples : UTF-8, UTF-16, etc...)
if(qx(file $fic_README) =~ /utf-(\d+)/i) {
$encodage_source = ":encoding(UTF-$1)";
}
#autres cas a definir
#elsif() {}
#- - - - - - - - - - - - - - - -
#ecriture d une nouvelle sous-section pour ce test
#- - - - - - - - - - - - - - - -
print $HANDLE_TEX "\\subsection{Test\$\\_\$$lettre_rapide_ou_long n\$^\\circ\$$no_test : $nom_test}\n";
#- - - - - - - - - - - - - - - -
#indexage et ecriture de la liste des mots-cles eventuels de ce test
#- - - - - - - - - - - - - - - -
my @mots_cles = saisir_mots_cles_README($fic_README, $encodage_source);
if($#mots_cles > -1) {
#indexage
#--generation d un label
my $label_section = genere_label_section();
print $HANDLE_TEX "\\label{$label_section}\n";
#indexage de chaque mot-cle via commande \ind (voir preambule du document latex dans la subroutine preambule_fic_tex_tmp() )
foreach my $mot_cle (@mots_cles) {
print $HANDLE_TEX "\\ind{$mot_cle}{$label_section}\n";
}
}
#- - - - - - - - - - - - - - - -
#ecriture du nom complet du repertoire sous forme d une arborescence simple
#- - - - - - - - - - - - - - - -
print $HANDLE_TEX "\\noindent \\underline{R\\\'epertoire} :\\\\\n";
my @rep_arbo = split(/\/+/, $rep_test);
shift(@rep_arbo) if($rep_arbo[0] =~ /^\.+$/);#suppression d un eventuel ./ ou ../ devant le nom du repertoire
#--variables pour faire une jolie indentation via \hspace
my $hspace_cm = 0.5;
my $hspace_cm_incr = 0.35;
foreach my $rep_arbo (@rep_arbo) {
$rep_arbo =~ s/_/\$\\_\$/g;#eventuels tirets bas entre dollars
print $HANDLE_TEX "\\hspace*{${hspace_cm}cm}\$\\triangleright\$ $rep_arbo\\\\\n";
$hspace_cm += $hspace_cm_incr;
}
#- - - - - - - - - - - - - - - -
#recopie des rubriques dans l ordre de la liste @liste_rubriques
#- - - - - - - - - - - - - - - -
#indicateurs de reussite de la recopie des rubriques du README
my ($is_probleme_rubrique, $message);
foreach my $rubrique (@liste_rubriques) {
$rubrique =~ s/^\s+//;
$rubrique =~ s/\s+$//;
my @mots_rubriques = split(/\s+/, $rubrique);
#ecriture de la rubrique
($is_probleme_rubrique, $message) = recopie_rubrique_README($fic_README, $encodage_source, $HANDLE_TEX, @mots_rubriques);
#-- erreur si la rubrique n a pas ete trouvee
if($is_probleme_rubrique) {
warn "Erreur (prog:$NOM_PROG) : lecture README => probleme dans la recopie de la rubrique \"$rubrique\" avec le message d erreur suivant :\n";
warn " **$message\n";
warn "\n";
sortie_programme();
}
}#foreach my $rubrique (@liste_rubriques)
}#foreach my $rep_test (@$ref_liste_rep_tests)
}#sub recopie_README
#--------------------------------------------------
#subroutine qui ecrit une rubrique du fichier README vers un fichier deja ouvert
#--------------------------------------------------
#
# en entree :
# - chemin vers le fichier README
# - encodage du fichier README (de la forme ":encoding(nom_encodage)", par exemple : ":encoding(UTF-8)"
# - handle du fichier destination (donc deja ouvert par open() )
# - liste de mots de la rubrique
#
# en sortie :
# - un indicateur de reussite avec les valeurs suivantes :
# 0 => la rubrique a ete trouvee et recopiee avec succes
# 1 => il y a eu une non-conformite
# - message
#
sub recopie_rubrique_README {
my $fic_source = shift; my $fic_source = shift;
my $encodage_source = shift; my $encodage_source = shift;
my $handle_fic_destination = shift; my $handle_fic_destination = shift;
my @mots_rubriques = @_; my @mots_rubriques = @_;
#construction du titre de la rubrique a partir des mots @mots_rubriques
# et d une expression reguliere pour rechercher la rubrique
my $regexp = shift(@mots_rubriques); my $regexp = shift(@mots_rubriques);
my $nom_rubrique = $regexp;
foreach my $mot (@mots_rubriques) { foreach my $mot (@mots_rubriques) {
$regexp .= '\s+'."$mot"; $regexp .= '\s+'."$mot";
$nom_rubrique .= " $mot";
} }
#a ce stade, le motif a trouver est de la forme : mot\s+mot\s+mot etc...
#indicateur de reussite et message associe
my $is_probleme_rubrique = 1;
my $message = 'rubrique introuvable';
open(my $Hlocal, "<$encodage_source", "$fic_source"); open(my $Hlocal, "<$encodage_source", "$fic_source");
while(<$Hlocal>) { while(<$Hlocal>) {
next if(not /^\s*$regexp\s*$/i); next if(not /^\s*$regexp\s*$/i);#recherche du bloc correspondant a la rubrique
$_ = <$Hlocal>; #normalement, la ligne suivante est une ligne de pointilles
print $handle_fic_destination "\\subsubsection{Description du calcul}\n"; $_ = <$Hlocal>; chomp;
#-si ce n est pas une ligne de pointilles => echec
if(not /^\s*-+\s*$/) {
$is_probleme_rubrique = 1;
$message = 'rubrique trouvee mais non conforme (absence de la ligne de pointilles apres le nom de la rubrique)';
last;
}
#- - - - - - - - - - - - - - - - - - - - - - - - - - -
#recopie de la rubrique vers le fichier de destination
#- - - - - - - - - - - - - - - - - - - - - - - - - - -
$is_probleme_rubrique = 0;
$message = 'rubrique trouvee et recopiee avec succes';
#creation d une sous-sous-section pour cette rubrique
print $handle_fic_destination "\\subsubsection{$nom_rubrique}\n";
while(<$Hlocal>) { while(<$Hlocal>) {
last if(/^\s*-+$/); last if(/^\s*-+$/);#critere d arret : ligne de pointilles (a moins que la fin du fichier n ait ete atteinte avant)
chomp(); chomp;
#--------------------------------------------------------------------------------
#--------------------------------------------------------------------------------
#A FAIRE EVOLUER : gestion au cas par cas des caracteres speciaux dans Latex
#--------------------------------------------------------------------------------
#--------------------------------------------------------------------------------
s/_/\$\\_\$/g;#tiret bas (solution : entre dollars)
s/\^($format_reel)/\$\^$1\$/g;#cas d un exposant mathematique : symbole circonflexe suivi d un nombre (solution : entre dollars)
s/([<>])/\$$1\$/;#symboles inferieur et superieur (solution : entre dollars)
#--------------------------------------------------------------------------------
#--------------------------------------------------------------------------------
#gestion des caracteres ou groupes de caracteres speciaux
$_ = translate_to_latex($_);
print $handle_fic_destination "$_\\\\\n"; print $handle_fic_destination "$_\\\\\n";
} }
last; last;
} }
close($Hlocal); close($Hlocal);
}#sub ecrire_rubrique_README return ($is_probleme_rubrique, $message);
}#sub recopie_rubrique_README
#--------------------------------------------------
#subroutine permettant de saisir les mots-cles contenus dans la rubrique "Mots-cles" d un fichier README
# important : cette subroutine s attend a trouver un seul mot-cle par ligne et pouvant contenir des espaces (exemple : "contraintes planes")
# rq : le nom de la rubrique a trouver est contenu dans la variable $NOM_RUBRIQUE_MOTS_CLES
#--------------------------------------------------
#
# en entree :
# - chemin vers le fichier README
# - encodage du fichier README (de la forme ":encoding(nom_encodage)", par exemple : ":encoding(UTF-8)"
#
# en sortie :
# - liste de mots-cles
#
sub saisir_mots_cles_README {
my $fic_source = shift;
my $encodage_source = shift;
#construction d une expression reguliere pour rechercher la rubrique
$NOM_RUBRIQUE_MOTS_CLES =~ s/^\s+//;
$NOM_RUBRIQUE_MOTS_CLES =~ s/\s+$//;
my @mots_rubrique = split(/\s+/, $NOM_RUBRIQUE_MOTS_CLES);
my $regexp = shift(@mots_rubrique);
foreach my $mot (@mots_rubrique) {
$regexp .= '\s+'."$mot";
}
#a ce stade, le motif a trouver est de la forme : mot\s+mot\s+mot etc...
#liste des mots-cles de la rubrique Mots-cles de ce README
my @liste_mots_cles;
open(my $Hlocal, "<$encodage_source", "$fic_source");
while(<$Hlocal>) {
next if(not /^\s*$regexp\s*$/i);#recherche du bloc correspondant a la rubrique
#normalement, la ligne suivante est une ligne de pointilles
$_ = <$Hlocal>; chomp;
#-si ce n est pas une ligne de pointilles => echec
if(not /^\s*-+\s*$/) {
last;
}
#- - - - - - - - - - - - - - - - - - - - - - - - - - -
#saisie des mots-cles
#- - - - - - - - - - - - - - - - - - - - - - - - - - -
while(<$Hlocal>) {
last if(/^\s*-+$/);#critere d arret : ligne de pointilles (a moins que la fin du fichier n ait ete atteinte avant)
next if(/^\s*$/);
chomp;
s/^\s+//; s/\s+$//;
#gestion des caracteres ou groupes de caracteres speciaux
$_ = translate_to_latex($_);
#ajout du mots-cle a la liste
push(@liste_mots_cles, $_);
}
last;
}
close($Hlocal);
return(@liste_mots_cles);
}#sub saisir_mots_cles_README
#--------------------------------------------------
#subroutine de conversion des caracteres ou groupe de caracteres speciaux en vue
# d une ecriture latex
#--------------------------------------------------
#
# en entree :
# - une chaine de caracteres
#
# en sortie :
# - la chaine convertie
#
sub translate_to_latex {
my $string = shift;
#--------------------------------------------------------------------------------
#--------------------------------------------------------------------------------
#A FAIRE EVOLUER : gestion au cas par cas des caracteres speciaux dans Latex
#
# (important : ne pas oublier de l option "g" a la fin de l operateur de substitution => $string =~ s/bla bla/ha ha/g; )
#--------------------------------------------------------------------------------
#--------------------------------------------------------------------------------
$string =~ s/_/\$\\_\$/g;#tiret bas (solution : antislash devant + entre dollars)
$string =~ s/\^($format_reel)/\$\^$1\$/g;#cas d un exposant mathematique : symbole circonflexe suivi d un nombre (solution : entre dollars)
$string =~ s/([<>])/\$$1\$/g;#symboles inferieur et superieur (solution : entre dollars)
#ajouter ici d autres cas sous la forme : $string =~ s/bla bla/ha ha/g;
#--------------------------------------------------------------------------------
#--------------------------------------------------------------------------------
return $string;
}#sub translate_to_latex
#-------------------------------------------------- #--------------------------------------------------
#subroutine permettant d ecrire une ligne de pointilles de la largeur du terminal #subroutine permettant d ecrire une ligne de pointilles de la largeur du terminal
#-------------------------------------------------- #--------------------------------------------------
sub print_ligne_pointilles { #
# en entree :
# - print ou warn (suivant que l on souhaite afficher avec print (donc vers STDOUT) ou warn (donc vers STDERR)
#
sub afficher_ligne_pointilles {
use Term::ReadKey; use Term::ReadKey;
my $nb_char_largeur_terminal = ( GetTerminalSize() )[0]; my $nb_char_largeur_terminal = ( GetTerminalSize() )[0];#largeur du terminal en nombre de caracteres (via package Term::ReadKey)
my $funct_disp = shift;
my $ligne_pointilles = ''; my $ligne_pointilles = '';
$ligne_pointilles .= '-' for(1 .. $nb_char_largeur_terminal); $ligne_pointilles .= '-' for(1 .. $nb_char_largeur_terminal);
print "$ligne_pointilles\n";
}#sub print_message_avec_pointilles print "$ligne_pointilles\n" if($funct_disp eq 'print');
warn "$ligne_pointilles\n" if($funct_disp eq 'warn');
}#sub afficher_ligne_pointilles
#-------------------------------------------------- #--------------------------------------------------
@ -439,6 +728,19 @@ citecolor= green %couleur citation biblio
%\pagestyle{arabic} %\pagestyle{arabic}
\pagenumbering{arabic} \pagenumbering{arabic}
%remarque : le package makeidx doit etre place apres \usepackage{hyperref} pour beneficier des liens hyperef dans l index
\usepackage{imakeidx}
%-- nouvelles commandes pour que ce soit des numeros de section (et non des pages) qui apparaissent dans l index
% selon astuce (2015-06-26) : http://www.latex-community.org/forum/viewtopic.php?f=51&t=14334
%:: \ind => 2 arguments : index entry, label de section
\newcommand{\ind}[2]{\index{#1|inds{\ref{#2}}}}
%:: \inds => ne sert qu a enlever les numeros de page dans la \ref de \ind
\newcommand{\inds}[2]{#1}
% exemple de sequence avec une section et 2 mots indexes concernant cette section :
% \section{Revelations : la face cachee du monde de la recherche}\label{section_1}\ind{scandale}{section_1}\ind{Capital_sur_M6}{section_1}
\makeindex[intoc]
\begin{document} \begin{document}
\maketitle \maketitle

Binary file not shown.