308 lines
7.5 KiB
Perl
Executable file
308 lines
7.5 KiB
Perl
Executable file
#!/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 :
|
||
#
|
||
# <?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 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 ?). </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-23 15:07:44 $" />.
|
||
</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;
|