#!/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 '{photo} . '" '
. 'alt="[Photo de ' . $tuteur->{prenom} . " "
. $tuteur->{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;