tuteurs.ens.fr/www/meta/trombi_constr

308 lines
7.5 KiB
Perl
Executable file
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/local/util/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 :
#
# <?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>É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 À LA MAIN !!!
Elle est générée par le script trombi_constr. Pour savoir comment
utiliser ce script, éditez-le : il contient une documentation.
Sinon, renseignez-vous auprè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 40,
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 ?). </p>
<p> 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 <a href="&url.tuteurs;meta/recrutement.html">notre page
recrutement</a> pour plus de renseignements. </p>
<p> Remarque : toutes les photographies de tuteurs ne figurent pas sur
cette page. </p>
EOF
my $pieddepage = << 'EOF';
<div class="metainformation">
Auteurs : Marie-Lan Nguyen (version d'origine), Baptiste Mélès (version
automatisée). Dernière modification le
<date value="$Date: 2007-07-24 16:50:55 $" />.
</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 à 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";
</table>
</div>
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 "<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é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é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;