diff --git a/Perl/genere_catalogue_tests.pl b/Perl/genere_catalogue_tests.pl index 2e3cb33..ed5b17a 100755 --- a/Perl/genere_catalogue_tests.pl +++ b/Perl/genere_catalogue_tests.pl @@ -3,7 +3,8 @@ use strict; use warnings; use File::Basename; 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::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 @@ -15,45 +16,69 @@ my $format_reel = '[+-]?[\.]?\d+[\.]?\d*(?:[eE][+-]?\d*)?'; ##################################################################################################### # script pour generer automatiquement un document pdf qui resume les tests # 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 : # 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 -# A noter que si un des repertoires n a pas de fichier README, le script s arrete sans -# creation du .pdf +# ce script est lance (recherche de tous les repertoires commencant par Test_R ou Test_L) +# A noter que si un des repertoires ne contient pas de fichier README, le script s arrete sans +# 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 : -# - 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 # les plus problematiques des 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 # dans un fichier .tex # (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() -# au niveau du bloc suivant (substitution de caracteres s///) : - #-------------------------------------------------------------------------------- - #-------------------------------------------------------------------------------- - #A FAIRE EVOLUER : gestion au cas par cas des caracteres speciaux dans Latex - #-------------------------------------------------------------------------------- - #-------------------------------------------------------------------------------- -# ... -# ... -# ... - #-------------------------------------------------------------------------------- - #-------------------------------------------------------------------------------- +# Le plus souvent, il suffit de rajouter des dollars autour des caracteres problematiques mais +# 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) ##################################################################################################### + +###################################################################################################### +# +# PARAMETRES +# +###################################################################################################### + +#-------------------------------------------------------------------------------- #nom du fichier catalogue de tests +#-------------------------------------------------------------------------------- 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'; +#-------------------------------------------------------------------------------- +#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); ($#_ > -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) 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) 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 ######################################################################################################### my $is_absence_README = 0; -#-dans les tests rapides foreach my $rep_test (@REP_TESTS_R,@REP_TESTS_L) { (-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"; $is_absence_README = 1; }; } #arret du programme si il y a absence d au moins 1 fichier README if($is_absence_README) { - print "\n"; - print_ligne_pointilles(); - print "Erreur (prog:$NOM_PROG) : arret a cause de l absence de fichiers README\n"; - print_ligne_pointilles(); + warn "\n"; + afficher_ligne_pointilles('warn'); + warn "Erreur (prog:$NOM_PROG) : arret a cause de l absence de fichier(s) README\n"; + afficher_ligne_pointilles('warn'); 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() -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"; #deplacement vers le repertoire temporaire -chdir $rep_tmp; +chdir $REP_TMP; #------------------------------------------------------------------------------------------ #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 --- print $HANDLE_TEX "\\clearpage\\newpage\n"; print $HANDLE_TEX "\\section{Tests rapides}\n"; - -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) ); -} +recopie_README("R", $HANDLE_TEX, \@REP_TESTS_R, @LISTE_RUBRIQUES_README); #--- tests longs --- print $HANDLE_TEX "\\clearpage\\newpage\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"; 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 "compilation pdflatex (1ere fois)\n"; @@ -261,14 +209,37 @@ system("pdflatex -halt-on-error $racine_fic_latex.tex > toto.log"); chdir ".."; 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"; -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 print "\n"; -print_ligne_pointilles(); +afficher_ligne_pointilles('print'); print "Le fichier $NOM_PDF_CATALOGUE a ete cree...\n"; -print_ligne_pointilles(); +afficher_ligne_pointilles('print'); 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() #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -302,74 +273,392 @@ print "\n"; #subroutine de sortie du programme #-------------------------------------------------- sub sortie_programme { + #- - - - - - - - - #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(); 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 $encodage_source = shift; my $handle_fic_destination = shift; 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 $nom_rubrique = $regexp; foreach my $mot (@mots_rubriques) { $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"); while(<$Hlocal>) { - next if(not /^\s*$regexp\s*$/i); - $_ = <$Hlocal>; - print $handle_fic_destination "\\subsubsection{Description du calcul}\n"; + 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*$/) { + $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>) { - last if(/^\s*-+$/); - 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) - #-------------------------------------------------------------------------------- - #-------------------------------------------------------------------------------- + last if(/^\s*-+$/);#critere d arret : ligne de pointilles (a moins que la fin du fichier n ait ete atteinte avant) + chomp; + #gestion des caracteres ou groupes de caracteres speciaux + $_ = translate_to_latex($_); print $handle_fic_destination "$_\\\\\n"; } + last; } 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 #-------------------------------------------------- -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; - 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 = ''; $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 #-------------------------------------------------- @@ -390,7 +679,7 @@ sub preambule_fic_tex_tmp { \usepackage{amsmath} \usepackage{subfigure} %\usepackage{/Users/troufflard/LATEX/BIBLIOTHEQUE/macro_figure} -%\usepackage{eurosym} +%\usepackage{eurosym} \usepackage{calc} %\usepackage{t1enc} \usepackage{ifthen} @@ -439,6 +728,19 @@ citecolor= green %couleur citation biblio %\pagestyle{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} \maketitle diff --git a/documentation_tests.pdf b/documentation_tests.pdf index ff7c9d2..83770c0 100644 Binary files a/documentation_tests.pdf and b/documentation_tests.pdf differ