2015-06-26 02:03:28 +02:00
#!/usr/bin/perl -s
use strict ;
use warnings ;
use File::Basename ;
use English ;
2015-06-26 17:37:18 +02:00
use Encode ; # package encodage fichier texte
use Cwd ; # package pour connaitre le repertoire courant
2015-06-26 02:03:28 +02:00
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
my $ NOM_PROG = basename $ PROGRAM_NAME ; #$NOM_PROG contient le nom de ce script (utile pour afficher le nom du script dans les warning (warn) ou les messages d erreur (die) )
#pattern d un reel pour les regex (pour eviter d utiliser $RE{num}{real} du package Regexp::Common qui n est pas toujours disponible)
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
2015-06-26 17:37:18 +02:00
# fichier README de chaque repertoire de test)
2015-06-26 02:03:28 +02:00
#
# Notes aux utilisateurs :
# les repertoires de tests sont recherches dans toute l arborescence depuis l endroit ou
2015-06-26 17:37:18 +02:00
# 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"
2015-06-26 02:03:28 +02:00
#
# Notes aux developpeurs :
2015-06-26 17:37:18 +02:00
# - 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
2015-06-26 02:03:28 +02:00
# (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)
2015-06-26 17:37:18 +02:00
# 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)
2015-06-26 02:03:28 +02:00
#####################################################################################################
2015-06-26 17:37:18 +02:00
######################################################################################################
#
# PARAMETRES
#
######################################################################################################
#--------------------------------------------------------------------------------
2015-06-26 02:03:28 +02:00
#nom du fichier catalogue de tests
2015-06-26 17:37:18 +02:00
#--------------------------------------------------------------------------------
2015-06-26 02:03:28 +02:00
my $ NOM_PDF_CATALOGUE = "documentation_tests.pdf" ;
2015-06-26 17:37:18 +02:00
#--------------------------------------------------------------------------------
#encodage du fichier .tex temporaire (rq : notamment pour accepter les accents)
#--------------------------------------------------------------------------------
2015-06-26 02:03:28 +02:00
my $ ENCODAGE_TEX = 'iso-8859-15' ;
2015-06-26 17:37:18 +02:00
#--------------------------------------------------------------------------------
#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' ;
2015-06-26 02:03:28 +02:00
#########################################################################################################
# verifications prealables
#########################################################################################################
#verif validite de l encodage $ENCODAGE_TEX
@ _ = grep { /^$ENCODAGE_TEX$/i } Encode - > encodings ( ":all" ) ;
( $# _ > - 1 ) or die "\nErreur (prog:$NOM_PROG) : encodage $ENCODAGE_TEX non disponible (changer la variable \$ENCODAGE_TEX dans l en-tete de ce script)...\n\n" ;
$ ENCODAGE_TEX = $ _ [ 0 ] ;
#verif validite de la commande pdflatex
verif_commande ( 'pdflatex' ) or die "\nErreur (prog:$NOM_PROG) : commande pdflatex introuvable...\n\n" ;
#-verif validite de l option -halt-on-error de la 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" ;
2015-06-26 17:37:18 +02:00
#verif validite de la commande makeindex
verif_commande ( 'makeindex' ) or die "\nErreur (prog:$NOM_PROG) : commande makeindex introuvable...\n\n" ;
2015-06-26 02:03:28 +02:00
#########################################################################################################
# liste des repertoires de test
#########################################################################################################
#liste des repertoires de tests rapides (Test_R)
my @ REP_TESTS_R = map { chomp ( $ _ ) ; $ _ } qx( find . -name "Test_R*" -type d ) ;
2015-06-26 17:37:18 +02:00
#print "$_\n" for @REP_TESTS_R; exit;
2015-06-26 02:03:28 +02:00
#liste des repertoires de tests rapides (Test_R)
my @ REP_TESTS_L = map { chomp ( $ _ ) ; $ _ } qx( find . -name "Test_L*" -type d ) ;
2015-06-26 17:37:18 +02:00
#print "$_\n" for @REP_TESTS_L; exit;
2015-06-26 02:03:28 +02:00
#########################################################################################################
# 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 ;
foreach my $ rep_test ( @ REP_TESTS_R , @ REP_TESTS_L ) {
( - e "$rep_test/README" ) or do {
2015-06-26 17:37:18 +02:00
warn "\n" if ( not $ is_absence_README ) ; #on passe une ligne si c est le premier repertoire defaillant
2015-06-26 02:03:28 +02:00
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 ) {
2015-06-26 17:37:18 +02:00
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' ) ;
2015-06-26 02:03:28 +02:00
die "\n" ;
}
#########################################################################################################
# generation du catalogue des tests au format .pdf
# rq : generation d un document latex puis d un document .pdf via pdflatex
# a la fin, seul le .pdf restera, tous les fichiers intermediaires seront effaces)
#########################################################################################################
#on va creer un repertoire temporaire qui est sense s effacer automatiquement
# le probleme est que si un signal d interruption est envoye (ctrl-c par exemple), le repertoire ne sera pas efface.
# donc, on va capturer certains signaux pour faire un appel a la subroutine sortie_programme()
$ SIG { INT } = \ & sortie_programme ; #INT => capture signal : ctrl-c ou kill -2
$ SIG { TERM } = \ & sortie_programme ; #TERM => capture signal : kill -15
#remarque : par essence, le signal kill -9 ne peut pas etre capture
#creation d un repertoire temporaire (... qui s effacera automatiquement en sortie de programme grace a l utilisation de la construction objet File::Temp->newdir()
2015-06-26 17:37:18 +02:00
my $ REP_TMP = File::Temp - > newdir ( "rep_tmp_" . $ NOM_PROG . '_XXXXX' ) ;
2015-06-26 02:03:28 +02:00
my $ racine_fic_latex = "toto" ;
#deplacement vers le repertoire temporaire
2015-06-26 17:37:18 +02:00
chdir $ REP_TMP ;
2015-06-26 02:03:28 +02:00
#------------------------------------------------------------------------------------------
#creation du fichier .tex avec encodage $ENCODAGE_TEX (et debut du document : preambule)
#------------------------------------------------------------------------------------------
open ( my $ HANDLE_TEX , ">:encoding($ENCODAGE_TEX)" , "$racine_fic_latex.tex" ) ;
preambule_fic_tex_tmp ( $ HANDLE_TEX ) ;
#------------------------------------------------------------------------------------------
#corps du texte (d abord les tests rapides, ensuite les tests longs)
#------------------------------------------------------------------------------------------
#--- tests rapides ---
print $ HANDLE_TEX "\\clearpage\\newpage\n" ;
print $ HANDLE_TEX "\\section{Tests rapides}\n" ;
2015-06-26 17:37:18 +02:00
recopie_README ( "R" , $ HANDLE_TEX , \ @ REP_TESTS_R , @ LISTE_RUBRIQUES_README ) ;
2015-06-26 02:03:28 +02:00
#--- tests longs ---
print $ HANDLE_TEX "\\clearpage\\newpage\n" ;
print $ HANDLE_TEX "\\section{Tests longs}\n" ;
2015-06-26 17:37:18 +02:00
recopie_README ( "L" , $ HANDLE_TEX , \ @ REP_TESTS_L , @ LISTE_RUBRIQUES_README ) ;
2015-06-26 02:03:28 +02:00
#------------------------------------------------------------------------------------------
2015-06-26 17:37:18 +02:00
#fin de l ecriture du fichier .tex
2015-06-26 02:03:28 +02:00
#------------------------------------------------------------------------------------------
2015-06-26 17:37:18 +02:00
#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}
2015-06-26 02:03:28 +02:00
print $ HANDLE_TEX "\\end{document}\n" ;
close ( $ HANDLE_TEX ) ;
2015-06-26 17:37:18 +02:00
2015-06-26 02:03:28 +02:00
#------------------------------------------------------------------------------------------
2015-06-26 17:37:18 +02:00
#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)
2015-06-26 02:03:28 +02:00
#------------------------------------------------------------------------------------------
print "\n" ;
print "compilation pdflatex (1ere fois)\n" ;
#-1ere comilation (pdflatex avec option -halt-on-error pour forcer a quitter a la moindre erreur)
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 ( ) ;
}
2015-06-26 17:37:18 +02:00
#-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)
2015-06-26 02:03:28 +02:00
print "compilation pdflatex (2eme fois)\n" ;
2015-06-26 17:37:18 +02:00
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 ( ) ;
}
2015-06-26 02:03:28 +02:00
#deplacement du catalogue final vers le repertoire de depart sous le nom prevu par la variable $NOM_PDF_CATALOGUE
system ( "mv -f $racine_fic_latex.pdf ../$NOM_PDF_CATALOGUE" ) ;
#retour au repertoire de depart
chdir ".." ;
#affichage fin programme
print "\n" ;
2015-06-26 17:37:18 +02:00
afficher_ligne_pointilles ( 'print' ) ;
2015-06-26 02:03:28 +02:00
print "Le fichier $NOM_PDF_CATALOGUE a ete cree...\n" ;
2015-06-26 17:37:18 +02:00
afficher_ligne_pointilles ( 'print' ) ;
2015-06-26 02:03:28 +02:00
print "\n" ;
#- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
#- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2015-06-26 17:37:18 +02:00
#remarque : fin du programme => le repertoire temporaire $REP_TMP sera efface automatiquement
2015-06-26 02:03:28 +02:00
# car utilisation de File::Temp->newdir()
#- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
#- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
#--------------------------------------------------
#subroutine de sortie du programme
#--------------------------------------------------
sub sortie_programme {
2015-06-26 17:37:18 +02:00
#- - - - - - - - -
2015-06-26 02:03:28 +02:00
#effacement du repertoire temporaire (subroutine cleanup() du package File::Temp)
2015-06-26 17:37:18 +02:00
#- - - - - - - - -
# 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/ ) ;
2015-06-26 02:03:28 +02:00
cleanup ( ) ;
exit ;
2015-06-26 17:37:18 +02:00
} #sub sortie_programme
2015-06-26 02:03:28 +02:00
2015-06-26 17:37:18 +02:00
#--------------------------------------------------
#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 !!!!
#--------------------------------------------------
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 ( ) ;
}
2015-06-26 02:03:28 +02:00
2015-06-26 17:37:18 +02:00
#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
2015-06-26 02:03:28 +02:00
#--------------------------------------------------
2015-06-26 17:37:18 +02:00
#subroutine pour recopier les fichiers README d une
# liste de repertoires de tests vers un fichier ouvert
2015-06-26 02:03:28 +02:00
#--------------------------------------------------
2015-06-26 17:37:18 +02:00
#
# 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 {
2015-06-26 02:03:28 +02:00
my $ fic_source = shift ;
my $ encodage_source = shift ;
my $ handle_fic_destination = shift ;
my @ mots_rubriques = @ _ ;
2015-06-26 17:37:18 +02:00
#construction du titre de la rubrique a partir des mots @mots_rubriques
# et d une expression reguliere pour rechercher la rubrique
2015-06-26 02:03:28 +02:00
my $ regexp = shift ( @ mots_rubriques ) ;
2015-06-26 17:37:18 +02:00
my $ nom_rubrique = $ regexp ;
2015-06-26 02:03:28 +02:00
foreach my $ mot ( @ mots_rubriques ) {
$ regexp . = '\s+' . "$mot" ;
2015-06-26 17:37:18 +02:00
$ nom_rubrique . = " $mot" ;
2015-06-26 02:03:28 +02:00
}
2015-06-26 17:37:18 +02:00
#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' ;
2015-06-26 02:03:28 +02:00
open ( my $ Hlocal , "<$encodage_source" , "$fic_source" ) ;
while ( <$Hlocal> ) {
2015-06-26 17:37:18 +02:00
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 ;
}
2015-06-26 02:03:28 +02:00
2015-06-26 17:37:18 +02:00
#- - - - - - - - - - - - - - - - - - - - - - - - - - -
#recopie de la rubrique vers le fichier de destination
#- - - - - - - - - - - - - - - - - - - - - - - - - - -
$ is_probleme_rubrique = 0 ;
$ message = 'rubrique trouvee et recopiee avec succes' ;
2015-06-26 02:03:28 +02:00
2015-06-26 17:37:18 +02:00
#creation d une sous-sous-section pour cette rubrique
print $ handle_fic_destination "\\subsubsection{$nom_rubrique}\n" ;
while ( <$Hlocal> ) {
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 ( $ _ ) ;
2015-06-26 02:03:28 +02:00
print $ handle_fic_destination "$_\\\\\n" ;
}
2015-06-26 17:37:18 +02:00
2015-06-26 02:03:28 +02:00
last ;
}
close ( $ Hlocal ) ;
2015-06-26 17:37:18 +02:00
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
#- - - - - - - - - - - - - - - - - - - - - - - - - - -
2015-06-26 02:03:28 +02:00
2015-06-26 17:37:18 +02:00
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+$// ;
2015-06-26 02:03:28 +02:00
2015-06-26 17:37:18 +02:00
#gestion des caracteres ou groupes de caracteres speciaux
$ _ = translate_to_latex ( $ _ ) ;
2015-06-26 02:03:28 +02:00
2015-06-26 17:37:18 +02:00
#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
2015-06-26 02:03:28 +02:00
#--------------------------------------------------
#subroutine permettant d ecrire une ligne de pointilles de la largeur du terminal
#--------------------------------------------------
2015-06-26 17:37:18 +02:00
#
# 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 {
2015-06-26 02:03:28 +02:00
use Term::ReadKey ;
2015-06-26 17:37:18 +02:00
my $ nb_char_largeur_terminal = ( GetTerminalSize ( ) ) [ 0 ] ; #largeur du terminal en nombre de caracteres (via package Term::ReadKey)
my $ funct_disp = shift ;
2015-06-26 02:03:28 +02:00
my $ ligne_pointilles = '' ;
$ ligne_pointilles . = '-' for ( 1 .. $ nb_char_largeur_terminal ) ;
2015-06-26 17:37:18 +02:00
print "$ligne_pointilles\n" if ( $ funct_disp eq 'print' ) ;
warn "$ligne_pointilles\n" if ( $ funct_disp eq 'warn' ) ;
} #sub afficher_ligne_pointilles
2015-06-26 02:03:28 +02:00
#--------------------------------------------------
#subroutine d ecriture du preambule du fichier .tex temporaire
#--------------------------------------------------
sub preambule_fic_tex_tmp {
my $ handle = shift ;
print $ handle ' \ documentclass [ a4paper , 12 pt ] { scrartcl }
\ usepackage [ latin1 ] { inputenc }
\ usepackage [ francais ] { babel }
\ usepackage { epsfig , color }
\ usepackage { graphicx }
\ usepackage { hyperref }
\ usepackage { fancybox }
\ usepackage { wrapfig }
% \ usepackage { pslatex }
\ usepackage { amsmath }
\ usepackage { subfigure }
% \ usepackage { /Users/ troufflard /LATEX/ BIBLIOTHEQUE / macro_figure }
2015-06-26 17:37:18 +02:00
% \ usepackage { eurosym }
2015-06-26 02:03:28 +02:00
\ usepackage { calc }
% \ usepackage { t1enc }
\ usepackage { ifthen }
\ usepackage { lscape }
\ usepackage { tabularx }
\ usepackage { multirow }
\ usepackage { colortbl }
% \ newcolumntype { M } [ 1 ] { > { \ raggedright } m {#1} }
\ usepackage { tikz }
\ usetikzlibrary { trees }
\ addto \ captionsfrench { \ def \ figurename { Figure } }
\ addto \ captionsfrench { \ def \ tablename { Tableau } }
% \ usepackage { hangcaption }
\ oddsidemargin 0.1 cm
\ evensidemargin - 0.9 cm
\ topmargin - 1 cm
\ headsep 1 cm
\ textwidth 17 cm
\ textheight 24 cm
\ parindent 0.5 cm
\ raggedbottom
\ sloppy
\ setcounter { tocdepth } { 2 }
\ usepackage { hyperref }
\ hypersetup {
colorlinks = true , % colorise les liens
breaklinks = true , % permet le retour <EFBFBD> la ligne dans les liens trop longs
urlcolor = blue , % couleur des hyperliens
linkcolor = blue , % couleur des liens internes
citecolor = green % couleur citation biblio
}
% creation d une longueur egale a \ baselineskip pour l utiliser dans les tabular ( car un bug incroyable fait que \ baselineskip est egal a 0 dans les tabular ! ! ! ! )
\ newlength { \ savebaselineskip }
\ setlength { \ savebaselineskip } { \ baselineskip }
\ title { Catalogue des tests }
\ date { \ today }
% \ pagestyle { arabic }
\ pagenumbering { arabic }
2015-06-26 17:37:18 +02:00
% 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 ]
2015-06-26 02:03:28 +02:00
\ begin { document }
\ maketitle
\ tableofcontents
' ;
} #sub preambule_fic_tex_tmp
#####################################################################################################
#subroutine qui recherche l existence d une commande et renvoie le premier path trouve (renvoie 0 si commande introuvable)
#####################################################################################################
# en entree :
# - nom de la commande
#
# en sortie :
# - chemin aboslu de la commande (0 si commande introuvable)
#
sub verif_commande {
my $ cmd = shift ; #nom de la commande
#cas d un chemin absolu ou relatif (si la commande commence par . ou /. Par exemple : ./HZpp ../HZppfast ou /Users/dupont/bin/HZppfast)
if ( $ cmd =~ /^\./ or $ cmd =~ /^\// ) {
#on passe la commande en chemin absolu
$ cmd = rel2abs ( $ cmd ) ;
return $ cmd ;
}
#sinon on regarde dans la variable environnement $PATH
foreach my $ path ( split ( /\s*:\s*/ , $ ENV { PATH } ) ) {
if ( - x "$path/$cmd" ) {
#on s assure que c est un chemin absolu
$ cmd = rel2abs ( "$path/$cmd" ) ;
return $ cmd ;
}
}
#on regarde a nouveau si la commande est en chemin absolu ou relatif
# (cas d une commande qui ne commence pas par . ou / et qui n est pas dans les PATH. Par exemple : rep/HZpp)
if ( - x $ cmd ) {
#on passe la commande en chemin absolu
$ cmd = rel2abs ( $ cmd ) ;
return $ cmd ;
}
#cas ou la commande est introuvable
return 0 ;
} #sub verif_commande