tuteurs.ens.fr/meta/trombi_constr

309 lines
7.5 KiB
Text
Raw Normal View History

#!/usr/bin/perl -w
# trombi_constr, version 1.0
# licence tuteurs
# Version 1.0<EFBFBD>: Baptiste M<>l<EFBFBD>s, 23<32>juillet 2007
################################################################
# Ce programme construit un trombinoscope pour les tuteurs.
#
# Pr<50>requis<69>:
#
# - le fichier trombi.xml doit se trouver dans le m<>me r<>pertoire que ce
# programme<6D>;
#
#
#
# Comment utiliser le programme<6D>:
#
# 1.<2E>"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<69> du code TML.
# Normalement il ne devrait pas y avoir de probl<62>me, sinon le
# programme est bugu<67> et il faut pr<70>venir les personnes autoris<69>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<70>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 <20> leur sujet (nom, pr<70>nom, promo, fichier de photo,
# site perso, etc.)
#
# Voici un fichier trombi.xml type<70>:
#
# <?xml version="1.0" encoding="iso-8859-1" ?>
#
# <trombi>
# <tuteur>
# <nom>Nguyen</nom>
# <prenom>Marie-Lan</prenom>
# <promo>A/L<>1998</promo>
# <surnom>M-L</surnom>
# <siteperso>http://www.eleves.ens.fr/home/mlnguyen</siteperso>
# <login>mlnguyen</login>
# <photo>photos/mlnguyen.jpg</photo>
# </tuteur>
#
# <tuteur>
# <nom>Robin</nom>
# <prenom><3E>milia</prenom>
#
# [etc.]
#
# </trombi>
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";
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE html PUBLIC "-//ENS/Tuteurs//DTD TML 1//EN" "tuteurs://DTD/tml.dtd">
<html>
<head>
<title>Trombinoscope</title>
</head>
<body>
<h1>Trombinoscope</h1>
<!--
NE MODIFIEZ PAS CETTE PAGE <20> LA MAIN !!!
Elle est g<>n<EFBFBD>r<EFBFBD>e par le script trombi_constr. Pour savoir comment
utiliser ce script, <20>ditez-le<6C>: il contient une documentation.
Sinon, renseignez-vous aupr<70>s des autres tuteurs.
-->
<p> 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<74>raires (dont 2<>filles litt<74>raires<65>; faut-il
<EFBFBD>galement rappeler que la fondatrice des tuteurs est une fille
litt<EFBFBD>raire<EFBFBD>?). </p>
<p> Seulement<6E>? Il ne tient qu'<27> vous de faire changer <20>a<EFBFBD>: si vous vous
sentez l'<27>toffe d'un tuteur, <20>crivez-nous pour candidater<65>! Rendez-vous
sur <a href="&url.tuteurs;meta/recrutement.html">notre page
recrutement</a> pour plus de renseignements. </p>
<p> Remarque<75>: toutes les photographies de tuteurs ne figurent pas sur
cette page. </p>
EOF
my $pieddepage = << "EOF";
<div class="metainformation">
Auteurs<EFBFBD>: Marie-Lan Nguyen (version d'origine), Baptiste M<>l<EFBFBD>s (version
automatis<EFBFBD>e). Derni<6E>re modification le
<date value="\$Date: 2007-07-23 15:02:45 $" />.
</div>
</body>
</html>
EOF
print $entete;
affiche_tableau;
print $pieddepage;
}
################################################################
# Construit et affiche le tableau des tuteurs
################################################################
sub affiche_tableau () {
print << "EOF";
<div style="text-align: center;">
<table style="margin-left: auto; margin-right: auto;" class="tableau">
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 <20> une rang<6E>e
# dans le trombi)
push @rangee, $tuteur;
# Si le nombre o<> j'en suis est un multiple de quatre, alors on affiche
# la rang<6E>e
if ($tuteur_nb % 4 == 0) {
affiche_rangee(@rangee);
# Et je vide la rang<6E>e apr<70>s son affichage
for (my $i = 0; $i < 4; $i++) { shift @rangee; }
}
}
# La derni<6E>re rang<6E>e ne contient pas n<>cessairement quatre personnes<65>:
# c'est souvent une rang<6E>e incompl<70>te. Il faut donc laisser des cases
# vides en fin de rang<6E>e.
if (scalar @rangee != 0) { affiche_rangee(@rangee); }
print << "EOF";
</table>
</div>
EOF
}
################################################################
# La fonction suivante affiche une rang<6E>e de quatre tuteurs, selon le
# format suivant<6E>:
#
# | photo1 | photo2 | photo3 | photo4
# |-----------------------------------------
# | Pr<50>nom Nom | etc.
# | (<28><>Surnom<6F><6D>). |
# | Promo |
################################################################
sub affiche_rangee (@) {
my (@rangee) = @_;
# J'affiche la rang<6E>e des photos
echo "<tr>";
my $case_nb = 0;
foreach my $tuteur (@rangee) {
$case_nb++;
echo "<td>";
echo '<img ' . 'src="' . $tuteur->{photo} . '" '
. 'alt="[Photo de ' . $tuteur->{prenom} . " "
. $tuteur->{nom} . ']" '
. 'width="125" ' . '/>';
echo "</td>";
echo;
}
# Remplissage des cases vides en fin de tableau
while ($case_nb < 4) {
echo "<td></td>";
$case_nb++;
}
echo "</tr>";
echo;
# Et maintenant, la rang<6E>e des noms
echo "<tr>";
$case_nb = 0;
foreach my $tuteur (@rangee) {
$case_nb++;
echo "<td>";
affiche_nom($tuteur);
echo ". " . $tuteur->{promo};
echo "</td>";
echo;
}
# Remplissage des cases vides en fin de tableau
while ($case_nb < 4) {
echo "<td></td>";
$case_nb++;
}
echo "</tr>";
echo;
}
sub affiche_nom ($) {
my ($tuteur) = @_;
# Lien vers le site perso, si la balise <siteperso> existe
print '<a href="' . $tuteur->{siteperso} . '">'
if (defined($tuteur->{siteperso}));
# Affichage du nom
print $tuteur->{prenom} . " " . $tuteur->{nom};
print '</a>'
if (defined($tuteur->{siteperso}));
# Affichage du surnom, si pr<70>cis<69>
print " (<28> " . $tuteur->{surnom} . " <20>)"
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<75>: Le fichier $trombi_XML n'existe pas.";
}
# Je v<>rifie la validit<69> 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 <20> partir du fichier XML
foreach $tuteur (@{$trombi->{tuteur}}) {
push @liste_tuteurs, $tuteur;
# Et j'en profite pour les compter (attention<6F>! ce chiffre ne prend en
# compte que les tuteurs figurant dans le fichier trombi.xml, et non
# TOUS les tuteurs<72>!)
$compte_tuteurs++;
}
# Afficher le fichier TML (vers la sortie standard)
affiche_page;