#!/usr/bin/perl -w # trombi_constr, version 1.0 # licence tuteurs # Version 1.0 : Baptiste Mélès, 23 juillet 2007 ################################################################ # Ce programme construit un trombinoscope pour les tuteurs. # # Prérequis : # # - le fichier trombi.xml doit se trouver dans le même répertoire que ce # programme ; # # # # Comment utiliser le programme : # # 1. "trombi_constr > trombi.tml" (par défaut, "trombi_constr" envoie le # fichier TML sur la sortie standard) # # 2. "tmlcheck trombi.tml" (pour vérifier la validité du code TML. # Normalement il ne devrait pas y avoir de problème, sinon le # programme est bugué et il faut prévenir les personnes autorisées) # # 3. "build trombi.tml" (pour convertir le fichier TML en XHTML) # # 4. vérifiez le résultat avec votre navigateur (en particulier, # vérifiez que toutes les photos soient bien présentes. S'il en # manque, rajoutez-les dans le répertoire photos/). # ################################################################ use strict; use XML::Parser; use XML::Simple; ################################################################ # Note sur le fichier trombi.xml # # Le fichier trombi.xml contient la liste de tous les tuteurs, ainsi que # les informations à leur sujet (nom, prénom, promo, fichier de photo, # site perso, etc.) # # Voici un fichier trombi.xml type : # # # # # # Nguyen # Marie-Lan # A/L 1998 # M-L # http://www.eleves.ens.fr/home/mlnguyen # mlnguyen # photos/mlnguyen.jpg # # # # Robin # Émilia # # [etc.] # # my $trombi_XML = "trombi.xml"; my $tuteur; my @liste_tuteurs; my @rangee; my $compte_tuteurs; my $tuteur_nb = 0; sub echo; sub affiche_page (); sub affiche_tableau (); sub affiche_rangee (@); sub affiche_nom ($); # Comme la commande "echo" en shell sub echo { my ($texte) = @_; print "$texte" if (defined($texte)); print "\n"; } ################################################################ # Affiche le fichier TML entier ################################################################ sub affiche_page () { my $entete = << "EOF"; Trombinoscope

Trombinoscope

Ils sont grands, ils sont beaux, ils sont forts, ils sont Tuteurs. Mais qui sont-ils vraiment ? Les Tuteurs sont actuellement 39, dont 3 filles et 6 littéraires (dont 2 filles littéraires ; faut-il également rappeler que la fondatrice des tuteurs est une fille littéraire ?).

Seulement ? Il ne tient qu'à vous de faire changer ça : si vous vous sentez l'étoffe d'un tuteur, écrivez-nous pour candidater ! Rendez-vous sur notre page recrutement pour plus de renseignements.

Remarque : toutes les photographies de tuteurs ne figurent pas sur cette page.

EOF my $pieddepage = << 'EOF';
Auteurs : Marie-Lan Nguyen (version d'origine), Baptiste Mélès (version automatisée). Dernière modification le .
EOF print $entete; affiche_tableau; print $pieddepage; } ################################################################ # Construit et affiche le tableau des tuteurs ################################################################ sub affiche_tableau () { print << "EOF";
EOF # Je prends chaque tuteur foreach $tuteur (@liste_tuteurs) { # Je compte où j'en suis $tuteur_nb++; # J'ajoute le tuteur au groupe de quatre (qui correspond à une rangée # dans le trombi) push @rangee, $tuteur; # Si le nombre où j'en suis est un multiple de quatre, alors on affiche # la rangée if ($tuteur_nb % 4 == 0) { affiche_rangee(@rangee); # Et je vide la rangée après son affichage for (my $i = 0; $i < 4; $i++) { shift @rangee; } } } # La dernière rangée ne contient pas nécessairement quatre personnes : # c'est souvent une rangée incomplète. Il faut donc laisser des cases # vides en fin de rangée. if (scalar @rangee != 0) { affiche_rangee(@rangee); } print << "EOF";
EOF } ################################################################ # La fonction suivante affiche une rangée de quatre tuteurs, selon le # format suivant : # # | photo1 | photo2 | photo3 | photo4 # |----------------------------------------- # | Prénom Nom | etc. # | (« Surnom »). | # | Promo | ################################################################ sub affiche_rangee (@) { my (@rangee) = @_; # J'affiche la rangée des photos echo ""; my $case_nb = 0; foreach my $tuteur (@rangee) { $case_nb++; echo ""; echo '{nom} . ']" ' . 'width="125" ' . '/>'; echo ""; echo; } # Remplissage des cases vides en fin de tableau while ($case_nb < 4) { echo ""; $case_nb++; } echo ""; echo; # Et maintenant, la rangée des noms echo ""; $case_nb = 0; foreach my $tuteur (@rangee) { $case_nb++; echo ""; affiche_nom($tuteur); echo ". " . $tuteur->{promo}; echo ""; echo; } # Remplissage des cases vides en fin de tableau while ($case_nb < 4) { echo ""; $case_nb++; } echo ""; echo; } sub affiche_nom ($) { my ($tuteur) = @_; # Lien vers le site perso, si la balise existe print '' if (defined($tuteur->{siteperso})); # Affichage du nom print $tuteur->{prenom} . " " . $tuteur->{nom}; print '' if (defined($tuteur->{siteperso})); # Affichage du surnom, si précisé print " (« " . $tuteur->{surnom} . " »)" if (defined($tuteur->{surnom})); } ################################################################ ################################################################ ################################################################ ################################################################ # Si le fichier trombi.xml n'existe pas, ce n'est même pas la peine de # commencer. if (! -e $trombi_XML) { die "Erreur : Le fichier $trombi_XML n'existe pas."; } # Je vérifie la validité du code XML my $parser = new XML::Parser(); eval {$parser->parsefile($trombi_XML)} or die "Erreur : $trombi_XML n'est pas un fichier XML valide. $@."; # Je déchiffre le fichier trombi.xml my $xml = new XML::Simple(); my $trombi = $xml->XMLin($trombi_XML); # Je remplis un tableau avec tous les tuteurs à partir du fichier XML foreach $tuteur (@{$trombi->{tuteur}}) { push @liste_tuteurs, $tuteur; # Et j'en profite pour les compter (attention ! ce chiffre ne prend en # compte que les tuteurs figurant dans le fichier trombi.xml, et non # TOUS les tuteurs !) $compte_tuteurs++; } # Afficher le fichier TML (vers la sortie standard) affiche_page;