Projet tutoré Gestion d`album photographique

Transcription

Projet tutoré Gestion d`album photographique
Projet tutoré
Gestion d’album photographique
Denis Roegel
1999
Table des matières
1 Objectif
2
2 Nature du travail
2
3 L’existant
3.1 Un format d’entrée flexible . . . . . . . . . . . . .
3.1.1 Description des champs . . . . . . . . . . .
3.1.2 Groupes thématiques . . . . . . . . . . . . .
3.1.3 Structuration du fichier source . . . . . . .
3.1.4 Abréviations . . . . . . . . . . . . . . . . .
3.2 Les images . . . . . . . . . . . . . . . . . . . . . . .
3.2.1 Organisation des images . . . . . . . . . . .
3.2.2 Cartographie d’images . . . . . . . . . . . .
3.3 Indexation . . . . . . . . . . . . . . . . . . . . . . .
3.4 Filtrage . . . . . . . . . . . . . . . . . . . . . . . .
3.5 La structure de la sortie . . . . . . . . . . . . . . .
3.5.1 Exemple de page principale d’un document
3.5.2 Exemple de page de groupe . . . . . . . . .
3.5.3 Exemple de page de thème . . . . . . . . .
3.5.4 Exemple de page de groupes de thème . . .
3.5.5 Exemple de page d’index nominatif . . . . .
3.5.6 Pages pour les personnes . . . . . . . . . .
3.6 Production de sortie LATEX . . . . . . . . . . . . .
3.7 Arborescence du prototype . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
2
2
3
6
6
7
7
8
8
9
10
10
12
13
13
14
14
15
17
17
4 Algorithmes
4.1 Création d’un format plus adapté . . . . .
4.2 Parcours des enregistrements . . . . . . .
4.3 Parcours . . . . . . . . . . . . . . . . . . .
4.4 Index des noms . . . . . . . . . . . . . . .
4.5 Index des lieux . . . . . . . . . . . . . . .
4.6 Liste des groupes et des thèmes . . . . . .
4.7 Corrections fines . . . . . . . . . . . . . .
4.8 Création des pages . . . . . . . . . . . . .
4.9 Tri de l’index des noms . . . . . . . . . .
4.10 Tri de l’index des lieux . . . . . . . . . . .
4.11 Production des pages de l’index nominatif
4.12 Production des pages de l’index des lieux
4.13 Si le temps le permet... . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
20
20
21
21
21
22
22
22
22
22
23
23
23
23
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
1
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
5 Nombre d’étudiants et répartition du travail
5.1 Planning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1
23
23
Objectif
L’objectif de ce projet est de créer un système facilitant la mise au point d’albums photographiques sur le
web. Le terme album photographique est employé dans un sens assez large et album documentaire est
en fait plus approprié. Les données de départ sont des fichiers image (provenant par exemple d’un scanner)
ainsi que des informations documentant ces images. L’objectif est de produire à partir de ces données une
arborescence de pages Html qui puisse être mise sur un CD-ROM ou bien directement sur le web. Le
logiciel produit doit être portable sous UNIX/linux. Ce système doit pouvoir traiter un nombre important
de documents (au moins 10000). Le système devra être testé sur un cas avec au moins une centaine de
documents.
2
Nature du travail
Après une phase d’analyse de l’existant, il s’agit essentiellement d’un travail de programmation (en C,
en scripts UNIX et un peu dans les langages du web, comme Html et Javascript). Il est vivement souhaité
d’avoir de bonnes connaissances en algorithmique et en structures de données. Il n’est pas interdit (pour ne
pas dire qu’il est conseillé) d’utiliser les outils standard du programmeur UNIX, en particulier lex et yacc
pour l’analyse du format d’entrée, sort pour les tris, sed ou/et awk pour les filtrages, etc.
3
L’existant
Un premier prototype a été réalisé, mais il utilise des programmes qui ne sont pas présents sur toutes les
plate-formes. Il est souhaitable de s’affranchir de ces programmes et de n’utiliser que le minimum d’outils
différents. Nous décrivons ici le prototype qui représente l’objectif minimum à atteindre dans ce projet.
3.1
Un format d’entrée flexible
Le format d’entrée comportera essentiellement une suite d’enregistrements de la forme :
@document{dr7-15,
group-id = "dr7",
id = "15",
type = p,
people = "",
date = "",
place = "",
indexedplace = "",
indexeddate = "",
description = "",
shorttitle = "",
source = "",
photographer = "",
dimensions = "",
other-copies = "",
registered = "",
reproduction-date = "",
scanned = "yes",
}
2
(la liste des champs pourra varier)
On souhaite avoir un format compact, entièrement textuel, pour l’ensemble des informations, de telle
sorte que les données puissent être éditées avec un simple traitement de texte. On peut envisager l’emploi
d’un système de gestion de bases de données pour manipuler les informations, mais il faudra alors écrire les
procédures permettant de passer d’un format à l’autre, et il faudra écrire toutes les procédures d’une manière
indépendante d’un système propriétaire comme Oracle. Dans ce projet, on se limite donc volontairement à
prendre comme point de départ un format textuel.
Un document est donc représenté par un enregistrement comme indiqué ci-dessus. Cet enregistrement a
une clé et divers champs. La clé permet d’identifier l’enregistrement de manière unique. Un certain nombre
de champs seront reconnus par le système à réaliser, mais d’autres champs devront pouvoir être ajoutés et
traités facilement. En effet, suivant l’application considérée, un champ pourra avoir un sens ou un autre. Par
exemple, si un document est une photographie, il peut être intéressant de connaı̂tre le nom du photographe.
3.1.1
Description des champs
Clé de l’enregistrement Il s’agit de la chaı̂ne qui permet d’identifier de manière unique l’enregistrement.
Par exemple, dr7-15. La clé est indiquée juste après la première accolade.
Type de l’enregistrement Le type indique s’il s’agit d’une photographie, d’une lettre, d’un autre document, etc. On pourra par exemple adopter la convention
type = p
type = d
type = l
...
pour les photographies, documents, lettres, etc.
Toutefois, pour des raisons qui seront évidentes plus loin, il est pratique d’avoir une clé renseignant sur le
type de l’enregistrement. On peut par exemple convenir que le préfixe alphabétique d’une clé (le plus grand
préfixe composé uniquement de lettres) est suffisant pour la détermination du type, via une table. Le fichier
d’entrée pourrait donc comporter des lignes telles que
@typetable{
p = "dr,xdr",
d = "xdrdd",
l = "xdrdl",
...
}
signifiant que si une clé commence par dr ou xdr, il s’agit d’une photographie ; si la clé commence par
xdrdd, il s’agit d’un document, etc.
Groupe et identifiant dans le groupe De même, on donne dans l’enregistrement le groupe de cet
enregistrement (group-id) et l’identifiant au sein de ce groupe (id). Tous les documents sont regroupés en
groupes qui correspondront en fait à des répertoires, ou des pages de l’album si l’on préfère. Le document
donné précédemment est donc le document 15 au sein du groupe dr7. Un groupe sera toujours une chaı̂ne
formée de lettres et de chiffres, commençant par une lettre. Un identifiant sera toujours un entier non négatif.
Champs divers d’information Les champs date (et autres champs de date), place, description,
shorttitle, source, photographer, dimensions, registered, scanned et quelques autres sont de simples
champs à valeur textuelle. Les champs (en particulier le champ description) peuvent être longs (plusieurs
milliers de caractères). Certains de ces champs peuvent faire référence à d’autres enregistrements, voire à
des pages Html externes. Ces liens devront donc être codés d’une manière spéciale. Le codage suivant est
proposé :
description = " ... voir aussi \cite{dr7-13} ...",
3
description = " ... comparer avec \www{http://www ...} ...",
description = " ... comparer avec \awww{...html} et \rwww{...html}...",
(\cite renverra vers un autre document, \www renverra vers une page Html de manière absolue, alors
que \awww donnera le chemin absolu d’un fichier local et \rwww un chemin relatif.)
Plusieurs de ces champs pourront être utilisés à deux fins : une première est la génération de pages Html,
une autre est la génération d’un catalogue imprimé en TEX. Toutefois, dans le cadre de ce projet, la génération
d’un catalogue TEX ne sera pas réalisée. Il s’agira d’un prolongement du projet. Le texte des champs devra
cependant être adapté à une conversion à la fois en Html et en TEX. Dans la plupart des cas, cela ne pose
pas de problème. Les caractères accentués seront codés en ISO-Latin 1 et en TEX pour les autres (comme
œ qui sera donc codé {\oe}). En Html, un é sera codé par é . Ces transformations pourront
se faire simplement avec un outil comme sed par exemple.
Dans certains cas, il peut être souhaitable d’avoir des champs contenant déjà des étiquettes Html, par
exemple un champ description-html :
description-html = "Les enseignants de l’IUT.
De devant vers derrière et de gauche à
droite,
<ul>
<li>première rangée~: Jacques Martin,
Georges Dupont~;
<li>deuxième rangée~: ...
</ul>",
Champs de personnes Un document peut comporter une liste de personnes pour indexation. Un tel
champ sera de la forme suivante :
people = "Albert Londres and William Shakespeare ...",
Le mot-clé and est donc utilisé comme séparateur de noms. De manière générale, lorsque la valeur
d’un champ est une liste, les éléments de ce champ sont séparés par and. Cela n’est pas toujours approprié,
mais nous nous contenterons de ce codage dans ce projet.
Un nom de personne peut être donné sous plusieurs formes :
– Prénom von Nom
– von Nom, Prénom
– von Nom, Jr, Prénom
Ici, von représente un mot commençant par une minuscule. C’est souvent une particule comme de ou von . Jr représente un titre, un rang, un suffixe, etc. Certaines parties peuvent être omises : les deux
exemples donnés plus haut n’ont par exemple pas de particule.
Ces trois syntaxes sont discriminées par la répartition des virgules. Les différentes composantes sont
déterminées par l’examen des premières lettres. Si ces trois syntaxes sont reconnues, on pourra par exemple
aisément distinguer des homonymes par des suffixes ou des années de naissance :
– Alexandre Dumas
– Dumas, fils, Alexandre
ou ici, où Jr correspond à II, III ou IV :
–
–
–
–
Napoléon Bonaparte
Bonaparte, II, Napoléon
Bonaparte, III, Napoléon
Bonaparte, IV, Napoléon
4
Champs d’indexation de lieux Le champ indexedplace permet d’indiquer des lieux à indexer. En
général, on n’aura qu’un lieu par enregistrement, mais on pourrait imaginer un document faisant référence à
plusieurs lieux (par exemple une carte postale avec plusieurs vues, etc.), et il est donc souhaitable de pouvoir
gérer une liste comme pour les noms des personnes.
Champs d’indexation de date On se donne la possibilité d’indexer une date avec le champ indexeddate.
Ce champ aura une syntaxe plus stricte que le champ date qui, lui, est assez libre. Le fait de pouvoir indexer
une date permet de trier les vues et documents en fonction de la date, si cela est souhaité.
Champs de liaison Certains champs produiront un lien entre l’enregistrement courant et un autre enregistrement de la base. Ce lien se traduira par un lien hypertexte sur une page Html. Nous avons déjà vu
un exemple de lien depuis le texte d’un champ (\cite), mais certains champs peuvent être complètement
dédiés à cette tâche. Des exemples de champ de liaison pourront être :
see-also = "dr15-4 and dr16-2",
copy-of = "dr11-18",
Champ d’image principale En général, la clé d’un enregistrement détermine le nom de l’image principale
qui lui est associée. Il peut cependant arriver que l’on veuille associer une autre image principale à un
enregistrement. Cela peut se faire grâce au champ main-view :
main-view = "xdrc2-29s2-150.jpg",
Champs d’images annexes Un enregistrement peut aussi renvoyer à d’autres images que l’image principale. Ces images sont les images annexes. Elles sont indiquées dans le champ other-views. En voici un
exemple :
other-views = "{Page
{Page
{Page
{Page
{Page
{Page
",
1~:}
2~:}
3~:}
4~:}
5~:}
6~:}
and
and
and
and
and
and
{g2-1as1-150t.jpg}
{g2-1bs1-150t.jpg}
{g2-1cs1-150t.jpg}
{g2-1ds1-150t.jpg}
{g2-1es1-150t.jpg}
{g2-1fs1-150t.jpg}
and
and
and
and
and
and
{g2-1as1-150.jpg}
{g2-1bs1-150.jpg}
{g2-1cs1-150.jpg}
{g2-1ds1-150.jpg}
{g2-1es1-150.jpg}
{g2-1fs1-150.jpg}
and
and
and
and
and
Ici, l’enregistrement de clé g2-1 comporte six images annexes : g2-1as1-150.jpg à g2-1fs1-150.jpg.
Pour chacune de ces six images, le champ other-views comporte un triplet. Les triplets sont séparés par
and . Le premier élément du triplet est un texte introductif à l’image. Le second élément est une image
miniature de l’image annexe. Le troisième élément est le nom de l’image annexe. Si le second élément est
vide, la page Html résultante montrera l’image réelle et non l’image miniature.
Champs d’informations complémentaires Il pourra y avoir par exemple des liens vers d’autres pages
Html. On écrira dans ce cas
information-page = "info/louvre.html",
pour renvoyer vers une page d’information qui donnerait par exemple des détails sur le Louvre (ce qui
peut être intéressant si la base de données est une base de peintures, par exemple). On supposera que l’on
donnera toujours le chemin de ces pages Html depuis la racine, ce qui évite des complications liées à la
localisation de la page qui contient le lien (ces pages ne seront pas toutes au même niveau).
5
Informations sur les groupes de documents Dans le fichier source, un document débute un nouveau
groupe dès que son identifiant de groupe change. Il peut toutefois être intéressant d’ajouter des informations
propres au groupe juste avant le premier document de ce groupe dans le fichier source. On utilisera la notation
suivante :
@group{g1,
title = "Tableaux du Louvre",
details = "info/g1/details.html",
}
3.1.2
Groupes thématiques
Les documents sont comme on l’a vu regroupés en groupes qui correspondent à des répertoires. On pourra
aussi avoir des groupes correspondant à des regroupement thématiques. Un document pourra appartenir à
un ou plusieurs thèmes et un thème indiquera les documents qui le composent.
Un exemple de thème est :
@theme{th1,
title = "Voyage au Kénya",
elements = "dr15-7 and ...",
description = "...",
...
}
La clé du thème est ici th1 .
Dans un document, on pourra renvoyer au thème via sa clé de la manière suivante :
theme = "th1",
3.1.3
Structuration du fichier source
Le fichier source sera un fichier texte comportant essentiellement des suites d’enregistrements documents ou thèmes . Mais ces enregistrements pourront être structurés, c’est-à-dire qu’ils pourront se
placer à plusieurs niveaux, tout comme un paragraphe peut se retrouver à différents niveaux.
Structuration des documents Par défaut, en l’absence de commande explicite de structure, les documents sont rangés dans leurs groupes et les groupes sont rangés dans un répertoire particulier. De même, les
thèmes sont rangés dans un répertoire particulier.
Ceci ne pose pas de problème tant qu’il n’y a que quelques centaines de documents. Au-delà, la gestion
devient très lourde et un besoin de structure se fait sentir. Le fichier source sera donc structuré grâce à des
commandes @section et @subsection. Ces commandes définissent une structure, en lui donnant un nom
symbolique (qui sera un nom de répertoire), un titre et une description (qui pourra se retrouver sur une page
Html). Il sera possible de pointer vers une page Html spécifique grâce au champ details.
@section{paris,
title = "Mon voyage à Paris",
description = "Je suis parti le ...",
}
@subsection{louvre,
title = "Le musée du Louvre",
description = "Quelques commentaires~: ...",
details = "info/louvre.html",
}
6
@document{dr78-23,
...
}
@subsection{orsay,
title = "Le musée d’Orsay",
description = "...",
}
...
@section{new-york,
title = "Mon voyage à New York",
description = "...",
}
...
Dans cet exemple, le document dr78-23 sera rangé dans le groupe (et répertoire) dr78. Ce répertoire (et
peut-être d’autres) sera rangé dans le répertoire louvre, qui lui-même sera rangé dans le répertoire paris.
Enfin, ce dernier sera un sous-répertoire du répertoire groups.
Structuration des thèmes Les thèmes pourront être structurés sur le même principe, avec les mêmes
commandes @section et @subsection.
Structuration du fichier source Il est malcommode de devoir manipuler un fichier source trop volumineux. On prévoit donc un mécanisme de structuration permettant d’inclure des fichiers externes. Cela se fera
avec la commande @include :
@include{photos-louvre}
3.1.4
Abréviations
On autorisera l’emploi d’abréviations dans le fichier source. Ces abréviations sont définies avec la commande @string :
@string{photo-jm = "Jacques Martin"}
L’abréviation photo-jm pourra s’utiliser dans un enregistrement ultérieur quelconque, par exemple :
...
photographer = photo-jm,
...
Ceci sera équivalent à
...
photographer = "Jacques Martin",
...
3.2
Les images
Il faut une flexibilité vis-à-vis du type d’image de la base. Par défaut, on suppose que les vues sont en
150 dpi, et que les fichiers d’image ont un nom du type :
dr7-15s1-150.jpg
7
où le nom du fichier commence par l’identifiant du document (ici dr7-15), est suivi de sn où n est un
numéro de version de l’image (ici 1), utile si le document est un document scanné et qu’il a été scanné à
plusieurs reprises, dans des conditions différentes. La suite est la résolution de l’image, et enfin vient le suffixe
indiquant la nature de l’image. Par défaut, on supposera toujours travailler avec des images JPEG.
Certains documents peuvent avoir des images annexes, et celles-ci ont des noms tels que dr7-15as1150.jpg, dr7-15bs1-150.jpg, etc., ou encore dr7-15p1s1-150.jpg, dr7-15p2s1-150.jpg, etc. La partie
se trouvant entre le numéro 15 et le s peut être une chaı̂ne alphabétique suivie éventuellement de chiffres.
La partie s1 peut être elle-aussi suivi de lettres.
La plupart des images existeront en deux versions : une grande (correspondant aux fichiers précédents) et
une petite (où .jpg est remplacé par t.jpg). Le traitement de tels fichiers graphiques est un autre problème
qui n’est pas étudié ici.
3.2.1
Organisation des images
Les images correspondent naturellement à des enregistrements et seront donc rangées selon ce critère.
Donc, dr7-15as1-150.jpg et dr7-15as1-150t.jpg seront rangés dans le répertoire dr7.
3.2.2
Cartographie d’images
Certaines images seront cartographiées. Cela est particulièrement utile si l’image comporte un certain
nombre de zones qui sont difficiles à localiser autrement qu’en indiquant leurs coordonnées. Un bon exemple
est une photographie de groupe où les personnes ne sont pas bien rangées en ligne. La cartographie se
traduira par un champ de l’enregistrement document, donnant les coordonnées de points, avec un numéro et
une légende. En voici un exemple :
map-size = "{975,660}",
image-map = "
{1,[60,420,93,456],’Paul Newman’} and
{2,[169,391,195,423],’John Wayne’} and
{3,[555,404,586,441],’Marilyn Monroe’}
",
Le champ map-size indiquera les dimensions de l’image par défaut. Ces dimensions sont utiles pour
traiter les valeurs qui suivent.
Le champ image-map comporte une suite de triplets hn,c,nomi. n est le numéro d’une zone à identifier. c
est un quadruplet (x1 ,y1 ,x2 ,y2 ) donnant les coordonnées des coins inférieur gauche et supérieur droit d’une
zone rectangulaire sur laquelle une marque sera centrée. nom est un commentaire.
Seules les images principales des documents pourront être cartographiées. Les images annexes (aux suffixes
a, b,. etc.) ne pourront pas l’être.
La lecture de cette partie d’un document produira un fichier metapost de la forme suivante (en supposant
que la cartographie corresponde à l’image dr96-1s1-150.jpg) :
input write_script
def write_to_file(text arg)=write arg to "dr96-1s1-150map.sh"; enddef;
beginfig(1);
mapsize(975,660);
circledlabel(1,60,420,93,456);
%% ’Paul Newman’
circledlabel(2,169,391,195,423);
%% ’John Wayne’
circledlabel(3,555,404,586,441);
%% ’Marilyn Monroe’
fillboxes(b1, b2, b3);
endfig;
write_script("dr96-1s1-150",975,660);
end
8
Dans ce cas-là, le nom du fichier serait dr96-1s1-150map.mp.
L’exécution de ce programme permettra d’obtenir une variante de la vue dr96-1s1-150.jpg, où les trois
zones identifiées seront recouvertes d’un numéro. Ces deux variantes pourront être observées en alternance
grâce à du code Javascript. Un exemple de telle page alternant entre les images dr96-1s1-150.jpg et
dr96-1s1-150all.jpg est :
<HTML><HEAD>
<TITLE>Exemple d’utilisation de carte</TITLE>
<SCRIPT LANGUAGE="JavaScript">
var imageson = new Object();
var imagesoff = new Object();
imageson[’tep1’] = new Image();
imageson[’tep1’].src = "dr96-1s1-150.jpg";
imagesoff[’tep1’] = new Image();
imagesoff[’tep1’].src = "dr96-1s1-150all.jpg";
function rollon(imgName) {
document[’tep1’].src = imageson[’tep1’].src;
}
function rolloff(imgName) {
document[’tep1’].src = imagesoff[’tep1’].src;
}
</SCRIPT>
</HEAD>
<BODY TEXT="#505000" BGCOLOR="#FFFFFF">
<font face=helvetica>
<p><center>
<a href="dr96-1.html"
onMouseOver="rollon(’tep1’); return false"
onMouseOut="rolloff(’tep1’); return false">
<IMG SRC="dr96-1s1-150all.jpg" BORDER="0"
NAME="tep1"></a>
</center>
...
L’intérêt de cette procédure est de pouvoir créer de manière automatique des images annotées. Bien sûr,
il est aussi possible de créer ces variantes à la main avec un éditeur d’images.
3.3
Indexation
À partir de l’ensemble des enregistrements, on produira plusieurs index. Les données indexées sont pour le
moment uniquement des noms de personnes concernées par les enregistrements, donc le contenu des champs
people, ou des lieux. Le choix de l’index des personnes produit dépend du type d’enregistrement. Pour
l’instant, on se limitera à deux index de personnes : un pour les photographies, un autre pour les documents.
Pour l’index nominatif, le parcours des données en entrée remplira un fichier persons.idx. Ces fichiers
comporteront, d’une manière non triée, ce qui compose les index. Pour chaque personne, il y aura une ligne
comportant :
–
–
–
–
–
–
le nom pour le tri
le prénom pour le tri
le titre du document pour le tri
le nom réel (la plupart du temps identique au nom pour le tri)
le prénom réel (la plupart du temps identique au prénom pour le tri)
la référence du document
9
La section 4 donne plus d’indications sur la procédure à suivre.
Le principe d’indexation est assez général et on doit pouvoir étendre le système facilement pour lui
adjoindre d’autres index, par exemple un index de concepts, de mots-clés, etc.
3.4
Filtrage
Il est intéressant de pouvoir produire une sortie correspondant à une partie des données satisfaisant un
certain critère. On pourrait imaginer de ne s’intéresser qu’à un certain lieu et de conserver uniquement les
documents en rapport avec ce lieu. Ou encore de ne conserver que les documents en rapport avec un ensemble
de personnes.
On va donc imaginer trois sortes de filtrages :
– filtrage par liste de noms
– filtrage par liste de lieux
– filtrage par liste de clés
Dans le premier cas, on dispose d’un fichier avec un nom par ligne, les noms étant donnés dans le même
format que dans le fichier des documents.
Dans le second cas, on dispose d’un fichier avec un lieu par ligne.
Dans le troisième cas, on donne une liste de clés ou d’expressions déterminant des clés. Une ligne d’un
tel fichier est donc :
– soit un nom d’enregistrement comme xy27-12,
– soit un nom de groupe suivi de -* pour indiquer que tous les documents du groupe sont inclus, par
exemple vac1990-*,
– soit un intervalle représenté par deux noms d’enregistrements séparés par --, par exemple dr153-1-dr155-37,
– soit un document à exclure, en préfixant le nom de l’enregistrement avec ^, par exemple ^xs12-8
Toutes les contraintes précédentes seraient représentées par les lignes
xy27-12
vac1990-*
dr153-1--dr155-37
^xs12-8
Lors de tous les parcours des enregistrements, on effectue le filtrage adéquat.
3.5
La structure de la sortie
Le traitement de la base de données source produit une arborescence de fichiers Html. À la racine, on
aura les répertoires suivants :
– groups
– themes
– indexes
À cela pourront s’ajouter d’autres répertoires, commme general pour des documents généraux, par
exemple.
Le répertoire groups comportera des sous-répertoires correspondant aux divisions @section. Ces sous
répertoires comporteront eux-mêmes des sous-répertoires correspondant aux divisions @subsection. Les
groupes ne seront donc pas forcément tous au même niveaux. Le niveau dépendra de la dernière commande
@section ou @subsection rencontrée.
Le répertoire groups comportera une page Html permettant d’accéder aux contenus des groupes. Chaque
sous-répertoire comportera un fichier Html donnant la liste des groupes qui s’y trouvent. Enfin, les répertoires
10
des groupes comporteront un fichier donnant le contenu du groupe, ainsi qu’un fichier Html par élément du
groupe (c’est-à-dire par document).
Il est suggéré de commencer par produire un gros fichier qui est une concaténation (avec des délimitations
convenables) de tous les fichiers Html produits. De cette manière, il est plus facile de travailler globalement
sur le fichier. Les délimitations pourront se présenter de la manière suivante :
\begin{filecontents}{nom du fichier1}
...
\end{filecontents}
\begin{filecontents}{nom du fichier2}
...
\end{filecontents}
...
En voici un exemple :
\begin{filecontents}{groups/g1/g1-1.html}
<HTML><HEAD><TITLE>Jean content (1997)</TITLE>
</HEAD>
<BODY TEXT="#505000" BGCOLOR="#FFFFFF">
<font face=helvetica>
<center><a href="../../catalogue.html" target="_top"><IMG
SRC="../../images/sommaire.gif"></a>
<a href="contents.html" target="_top"><IMG SRC="../../images/autres.gif"></a>
<a href="../g3/g3-1.html" target="_top"><IMG
SRC="../../images/precedent.gif"></a>
<a href="../g1/g1-2.html" target="_top"><IMG
SRC="../../images/suivant.gif"></a>
</center>
<p><center><h1>Jean content (1997)</h1></center>
<p><center>
<IMG SRC="g1-1s1-150.jpg">
</center>
<p><b>R&eacute;f&eacute;rence&nbsp;:</b> <em>g1-1</em>
<p><b>Description d&eacute;taill&eacute;e&nbsp;:</b> <em>Nous voyons ici Jean
sourire. Il a envie de jouer.</em>
<p><b>Date&nbsp;:</b> 20/2/1997
<p><b>Lieu&nbsp;:</b> Nancy, à la maison
<p><b>Photographe&nbsp;:</b> La maman de Jean
<p><b>Personnes index&eacute;es&nbsp;: </b><ul>
<li><a href="../../indexes/people/letters/D.html#JeanDupont" target="_top">Jean
Dupont</a></li>
</ul>
</BODY></HTML>
\end{filecontents*}
\begin{filecontents*}{groups/g1/g1-2.html}
<HTML><HEAD><TITLE>Jean Dupont et Paulette Martin</TITLE>
</HEAD>
<BODY TEXT="#505000" BGCOLOR="#FFFFFF">
<font face=helvetica>
<center><a href="../../catalogue.html" target="_top"><IMG
SRC="../../images/sommaire.gif"></a>
<a href="contents.html" target="_top"><IMG SRC="../../images/autres.gif"></a>
11
<a href="../g1/g1-1.html" target="_top"><IMG
SRC="../../images/precedent.gif"></a>
<a href="../g2/g2-1.html" target="_top"><IMG
SRC="../../images/suivant.gif"></a>
</center>
<p><center><h1>Jean Dupont et Paulette Martin</h1></center>
<p><center>
<IMG SRC="g1-2s1-150.jpg">
</center>
<p><b>R&eacute;f&eacute;rence&nbsp;:</b> <em>g1-2</em>
<p><b>Description d&eacute;taill&eacute;e&nbsp;:</b> <em>Jean et Paulette se
retrouvent.</em>
<p><b>Date&nbsp;:</b> vers 1998
<p><b>Lieu&nbsp;:</b> peut-^
etre Metz
<p><b>Photographe&nbsp;:</b> Le frère de Jean
<p><b>Personnes index&eacute;es&nbsp;: </b><ul>
<li><a href="../../indexes/people/letters/D.html#JeanDupont" target="_top">Jean
Dupont</a></li>
<li><a href="../../indexes/people/letters/M.html#PauletteMartin" target="_top">Paulette
Martin</a></li>
</ul>
</BODY></HTML>
\end{filecontents}
...
3.5.1
Exemple de page principale d’un document
Ces pages devront être reliées entre elles, via un lien précédent et un lien suivant . La notion de
précédent et de suivant dépend directement de l’ordre des données de départ. Le suivant du tout dernier
enregistrement sera le premier. Pour ce faire, un premier parcours (ou un filtrage convenable avec des outils UNIX) des enregistrements produira la liste des clés des enregistrements. Cette liste sera utilisée pour
construire les liens précédent et suivant .
<HTML><HEAD><TITLE>Jean content (1997)</TITLE>
</HEAD>
<BODY TEXT="#505000" BGCOLOR="#FFFFFF">
<font face=helvetica>
<center><a href="../../catalogue.html" target="_top"><IMG
SRC="../../images/sommaire.gif"></a>
<a href="contents.html" target="_top"><IMG SRC="../../images/autres.gif"></a>
<a href="../g3/g3-1.html" target="_top"><IMG
SRC="../../images/precedent.gif"></a>
<a href="../g1/g1-2.html" target="_top"><IMG
SRC="../../images/suivant.gif"></a>
</center>
<p><center><h1>Jean content (1997)</h1></center>
<p><center>
<IMG SRC="g1-1s1-150.jpg">
</center>
<p><b>R&eacute;f&eacute;rence&nbsp;:</b> <em>g1-1</em>
<p><b>Description d&eacute;taill&eacute;e&nbsp;:</b> <em>Nous voyons ici Jean
12
sourire. Il a envie de jouer.</em>
<p><b>Date&nbsp;:</b> 20/2/1997
<p><b>Lieu&nbsp;:</b> Nancy, &agrave; la maison
<p><b>Photographe&nbsp;:</b> La maman de Jean
<p><b>Personnes index&eacute;es&nbsp;: </b><ul>
<li><a href="../../indexes/people/letters/D.html#JeanDupont" target="_top">Jean
Dupont</a></li>
</ul>
</BODY></HTML>
Dans la page précédente, on notera un lien vers une page d’index, via l’étiquette JeanDupont dans
la construction D.html#JeanDupont . Cela correspond à l’étiquette JeanDupont du fichier D.html .
Cette étiquette sera construite à partir du nom, en supprimant les espaces.
3.5.2
Exemple de page de groupe
Une page de groupe renvoie vers les éléments du groupe, mais aussi vers les groupes précédent et suivant.
Ces derniers liens peuvent être construits à partir de la liste construite précédemment. Une page de groupe
renvoie aux éléments via de petites images (fichiers ...t.jpg. Celles-ci seront par exemple présentées en
tableaux avec un titre pour chacune d’elle.
<HTML><HEAD><TITLE>Contenu du groupe g1</TITLE></HEAD>
<BODY TEXT="#505000" BGCOLOR="#FFFFFF">
<font face=helvetica>
<center><a href="../../catalogue.html"><IMG
SRC="../../images/sommaire.gif"></a>
<a href="../list.html"><IMG SRC="../../images/liste_groups.gif"></a>
<a href="../g3/contents.html"><IMG SRC="../../images/precedent.gif"></a>
<a href="../g2/contents.html"><IMG SRC="../../images/suivant.gif"></a>
</center>
<CENTER><h1>Contenu du groupe g1</h1></CENTER>
<P>
<table border=0 cellpadding=0>
<tr><td>
<table border=0 cellpadding=0><tr><td><a href="g1-1.html"><img
src="g1-1s1-150t.jpg" align=center></a></td></tr>
<tr><td align=left width=150 valign=top bgcolor=#ffffff>Jean content (1997)
(1)</td></tr></table>
</td><td>
<table border=0 cellpadding=0><tr><td><a href="g1-2.html"><img
src="g1-2s1-150t.jpg" align=center></a></td></tr>
<tr><td align=left width=150 valign=top bgcolor=#ffffff>Jean Dupont et Paulette
Martin (2)</td></tr></table>
</td></table>
</BODY></HTML>
3.5.3
Exemple de page de thème
Les pages de thèmes sont construites à partir des enregistrements @theme. Ces pages donnent aussi la
liste des éléments via de petites images.
<HTML><HEAD><TITLE>Th&egrave;me drs6</TITLE></HEAD>
<BODY TEXT="#505000" BGCOLOR="#FFFFFF">
<font face=helvetica>
13
<center><a href="../../catalogue.html"><IMG SRC="../images/sommaire.gif"></a>
</center>
<center><h1>Th&egrave;me<br>Photos de mes vacances en 1999</h1></center>
<b>&Eacute;l&eacute;ments du th&egrave;me&nbsp;:</b>
<a href="../../groups/dr96/dr96-34.html" target="_top">
<img align=center src="../../groups/dr96/dr96-34s1-150t.jpg"></a> et
<a href="../../groups/dr120/dr120-18.html" target="_top">
<img align=center src="../../groups/dr120/dr120-18s1-150t.jpg"></a>.
</BODY></HTML>
3.5.4
Exemple de page de groupes de thème
Si l’on suppose qu’une suite de thèmes commence par
@section{vacances,
title = "Mes vacances",
description = "...",
}
@theme{v1990,
title = "Mes vacances en 1990",
elements = "...",
description = "...",
...
}
@theme{v1991,
title = "Mes vacances en 1991",
elements = "...",
description = "...",
...
}
...
on pourrait en produire :
<HTML><HEAD><TITLE>Mes vacances</TITLE></HEAD>
<BODY TEXT="#505000" BGCOLOR="#FFFFFF">
<font face=helvetica>
<center><a href="../catalogue.html"><IMG SRC="../images/sommaire.gif"></a>
</center>
<center><h1>Mes vacances</center>
<ul>
<li><a href="vacances/v1990.html">Mes vacances en 1990</a>
<li><a href="vacances/v1991.html">Mes vacances en 1991</a>
<li><a href="vacances/v1992.html">Mes vacances en 1992</a>
</ul>
</BODY></HTML>
3.5.5
Exemple de page d’index nominatif
Le point d’entrée de l’index nominatif (qui pourra renvoyer vers des milliers de personnes) sera une
simple liste des premières lettres de l’alphabet. Cette liste devra consister en les premières lettres réellement
utilisées. Chaque lettre renverra vers une page consacrée à cette lettre.
<HTML><HEAD><title>Index des noms</title></HEAD>
14
<BODY TEXT="#505000" BGCOLOR="#FFFFFF">
<font face=helvetica>
<center><a href="../../catalogue.html">
<IMG SRC="../../images/sommaire.gif"></a>
</center>
<center><h1>Index des noms</h1></center>
<center><h2><a href="letters/D.html">D</a>
<a href="letters/M.html">M</a> </h2>
</center>
</BODY>
</HTML>
Une page consacrée à une lettre se présente ainsi :
<HTML><HEAD><title>Index des noms commen&ccedil;ant par D</title></HEAD>
<BODY TEXT="#505000" BGCOLOR="#FFFFFF">
<font face=helvetica>
<center><a href="../../../catalogue.html">
<IMG SRC="../../../images/sommaire.gif"></a>
<a href="../main.html"><IMG SRC="../../../images/index.gif"></a>
</center>
<center><h1>Index des noms commen&ccedil;ant par D</h1></center>
<UL>
<LI>Dupont</LI>
<UL>
<LI><a name="ArthurDupont">Arthur Dupont</a>
<a href="../persons/person1-0.html">(photos)</a>
<a href="../persons/person1-1.html">(documents)</a>
</LI>
<LI><a name="JeanDupont">Jean Dupont</a>
<a href="../persons/person2-0.html">(photos)</a>
<a href="../persons/person2-1.html">(documents)</a>
</LI>
</UL>
</BODY>
</HTML>
Chaque personne renvoie à une page correspondant à chaque type de document existant pour cette
personne. Ici, nous avons choisi les suffixes -0 pour les photographies et -1 pour les documents, mais il peut
être plus parlant de prendre -p et -d.
3.5.6
Pages pour les personnes
Chaque personne indexée a sa page, pour un type de document donné. Celle-ci donne par défaut la
liste de toutes les vues de ce type où cette personne est indexée. Chaque titre de vue renvoie au document
correspondant. D’autre part, cette page renvoie à deux autres pages : l’une permet de balayer cycliquement
toutes les vues, l’autre permet d’avoir une vue d’ensemble de toutes les images miniatures. Le balayage
cyclique pourra se faire en javascript. Enfin, une page de personne peut renvoyer à une page plus spécifique,
non générée automatiquement.
La page principale d’une personne se présente ainsi (ici person2-p.html) :
<HTML><HEAD><title>Jean Dupont</title></HEAD>
<BODY TEXT="#505000" BGCOLOR="#FFFFFF">
<font face=helvetica>
<center><a href="../../../catalogue.html">
15
<IMG SRC="../../../images/sommaire.gif"></a>
<a href="../main.html"><IMG SRC="../../../images/index.gif"></a>
<a href="../letters/D.html"><IMG SRC="../../../images/indexD.gif"></a>
<a href="person2f-p.html">Cycle</a>
<a href="person2i-p.html">Images</a>
</center>
<center><h1>Photographies concernant Jean Dupont </h1></center>
<ol>
<LI><a href="../../../groups/g2/g2-2.html">Carte de Jean
de Paris (1999)</a></LI>
<LI><a href="../../../groups/g1/g1-2.html">Jean Dupont et
Paulette Martin</a></LI>
<LI><a href="../../../groups/g1/g1-1.html">Jean content (1997)</a></LI>
<LI><a href="../../../groups/g3/g3-1.html">Jean, Paulette
et leur fils Arthur</a></LI>
<LI><a href="../../../groups/g2/g2-1.html">Une lettre de
Jean enfant</a></LI>
</ol>
</BODY>
</HTML>
La page d’une personne donnant la vue d’ensemble de toutes les images miniatures est (ici person2ip.html) :
<HTML><HEAD><title>Jean Dupont </title> </head>
<body TEXT="#505000" BGCOLOR="#FFFFFF">
<font face=helvetica>
<center><a href="../../../catalogue.html">
<IMG SRC="../../../images/sommaire.gif"></a>
<a href="../main.html"><IMG SRC="../../../images/index.gif"></a>
<a href="../letters/D.html"><IMG SRC="../../../images/indexD.gif"></a>
<a href="person2f-p.html">Cycle</a></center>
<center><h1>Photographies concernant Jean Dupont </h1></center>
<table border=0 cellpadding=0>
<tr>
<td><a href="../../../groups/g2/g2-2.html">
<img src="../../../groups/g2/g2-2s1-150t.jpg" align=center></a></td>
<td><a href="../../../groups/g1/g1-2.html">
<img src="../../../groups/g1/g1-2s1-150t.jpg" align=center></a></td>
<td><a href="../../../groups/g1/g1-1.html">
<img src="../../../groups/g1/g1-1s1-150t.jpg" align=center></a></td>
<td><a href="../../../groups/g3/g3-1.html">
<img src="../../../groups/g3/g3-1s1-150t.jpg" align=center></a></td>
<td><a href="../../../groups/g2/g2-1.html">
<img src="../../../groups/g2/g2-1s1-150t.jpg" align=center></a></td>
</tr>
</table> </body> </html>
Les images sont présentées en tableau, à raison de cinq vues par ligne.
Enfin, les pages permettant un balayage sont (ici person2f-p.html) :
– <html>
<head>
<title>person 2</title>
</head>
16
<frameset rows="60,*" frameborder=0 border=1>
<frame src="person2b-p.html" name="title" scrolling="NO">
<frame src="../../../groups/g2/g2-2.html" name="image" scrolling="YES">
</frameset>
</html>
– et (ici person2b-p.html)
<HTML><HEAD><title>Jean Dupont </title>
<script language="JavaScript">
var current = 1;
var donnees = new Array (
"g2/g2-2.html",
"g1/g1-2.html",
"g1/g1-1.html",
"g3/g3-1.html",
"g2/g2-1.html");
function goUp(dir){
current=current+dir+donnees.length;
if (current > donnees.length) current=current-donnees.length;
if (current > donnees.length) current=current-donnees.length;
var reference = "../../../groups/"+donnees[current-1];
parent.image.location = reference;
document.forms["navigation"].num.value=current+"/"+donnees.length;
}
</script>
</head>
<body TEXT="#505000" BGCOLOR="#FFFFFF">
<center>
<form name="navigation">
<a href="../../../catalogue.html" target="_top">Sommaire</a>
<input type=BUTTON value="<-" name="up" onClick="goUp(-1);">
<a href="person2.html" target="_top">Jean Dupont </a>
<input type=BUTTON value="->" name="down" onClick="goUp(1);">
<input type=TEXT name="num" value= "1">
</form>
<script>
document.forms["navigation"].num.value=current+"/"+donnees.length;
</script>
</center>
</body>
</html>
On notera que les personnes sont numérotées (dans l’ordre alphabétique) et que ces numéros sont utilisés
pour les noms des fichiers. Cela évite le problème de caractères qui ne pourraient pas figurer dans un nom
de fichier.
3.6
Production de sortie LATEX
En fonction du temps disponible, on pourra ajouter cette possibilité.
3.7
Arborescence du prototype
Nous donnons ici le détail de l’arborescence du prototype. Par rapport à ce qui a été dit plus haut, il y
a quelques différences, en particulier dans les noms des fichiers vis-à-vis du type de document.
17
Ce prototype donne une idée de ce que l’on veut obtenir. Les images sont fictives. Pour ce projet, on
pourra soit utiliser des images réelles (mais attention aux problèmes de droits et copyright), soit produire des
images avec les outils adéquats. Si vous avez la possibilité de scanner des photographies et des documents,
vous pourrez obtenir un prototype plus réaliste, mais cela n’est pas obligatoire.
./info
./groups
./groups/g1
./groups/g1/g1-1.html
./groups/g1/g1-2.html
./groups/g1/contents.html
./groups/g1/g1-1s1-150.jpg
./groups/g1/g1-1s1-150t.jpg
./groups/g1/g1-2s1-150.jpg
./groups/g1/g1-2s1-150t.jpg
./groups/g2
./groups/g2/g2-1.html
./groups/g2/g2-2.html
./groups/g2/contents.html
./groups/g2/g2-1as1-150.jpg
./groups/g2/g2-1as1-150t.jpg
./groups/g2/g2-1bs1-150.jpg
./groups/g2/g2-1bs1-150t.jpg
./groups/g2/g2-1cs1-150.jpg
./groups/g2/g2-1cs1-150t.jpg
./groups/g2/g2-1ds1-150.jpg
./groups/g2/g2-1ds1-150t.jpg
./groups/g2/g2-1es1-150.jpg
./groups/g2/g2-1es1-150t.jpg
./groups/g2/g2-1fs1-150.jpg
./groups/g2/g2-1fs1-150t.jpg
./groups/g2/g2-1s1-150.jpg
./groups/g2/g2-1s1-150t.jpg
./groups/g2/g2-2as1-150.jpg
./groups/g2/g2-2as1-150t.jpg
./groups/g2/g2-2s1-150.jpg
./groups/g2/g2-2s1-150t.jpg
./groups/g3
./groups/g3/g3-1.html
./groups/g3/contents.html
./groups/g3/g3-1s1-150.jpg
./groups/g3/g3-1s1-150t.jpg
./groups/doc1
./groups/doc1/doc1-1.html
./groups/doc1/contents.html
./groups/list.html
./index
./index/people
./index/people/letters
./index/people/letters/D.html
./index/people/letters/M.html
./index/people/persons
./index/people/persons/person1-0.html
./index/people/persons/person1f-0.html
18
./index/people/persons/person1b-0.html
./index/people/persons/person1i-0.html
./index/people/persons/person2-0.html
./index/people/persons/person2f-0.html
./index/people/persons/person2b-0.html
./index/people/persons/person2i-0.html
./index/people/persons/person2-1.html
./index/people/persons/person2f-1.html
./index/people/persons/person2b-1.html
./index/people/persons/person2i-1.html
./index/people/persons/person3-1.html
./index/people/persons/person3f-1.html
./index/people/persons/person3b-1.html
./index/people/persons/person3i-1.html
./index/people/persons/person4-0.html
./index/people/persons/person4f-0.html
./index/people/persons/person4b-0.html
./index/people/persons/person4i-0.html
./index/people/main.html
./index/places
./index/places/main.html
./themes
./themes/drs1.html
./themes/main.html
./general
./images
./images/autres.gif
./images/index.gif
./images/indexA.gif
./images/indexB.gif
./images/indexC.gif
./images/indexD.gif
./images/indexE.gif
./images/indexF.gif
./images/indexG.gif
./images/indexH.gif
./images/indexI.gif
./images/indexJ.gif
./images/indexK.gif
./images/indexL.gif
./images/indexM.gif
./images/indexN.gif
./images/indexO.gif
./images/indexP.gif
./images/indexQ.gif
./images/indexR.gif
./images/indexS.gif
./images/indexT.gif
./images/indexU.gif
./images/indexV.gif
./images/indexW.gif
./images/indexX.gif
./images/indexY.gif
19
./images/indexZ.gif
./images/precedent.gif
./images/sommaire.gif
./images/suivant.gif
./images/liste_groups.gif
./donnees
./donnees/proto.bib
./catalogue.html
4
Algorithmes
Nous donnons ici des indications sur les grandes lignes du projet. Il ne s’agit que d’indications et toute
solution plus adaptée est bien sûr bienvenue.
4.1
Création d’un format plus adapté
La base de donnée pouvant être très volumineuse, on évitera de la charger intégralement en mémoire. Il
pourra donc être nécessaire de lire le fichier source plusieurs fois. Dans une première étape, on transformera
donc le fichier source en un format plus adapté. Cette première étape aura en particulier pour objectif
d’expanser les macros @string ainsi que les inclusions de fichier avec @include. Cette première étape peut
aussi inclure la phase de filtrage des enregistrements.
Dans un premier temps, on chargera donc en mémoire le fichier de filtrage. Celui-ci permettra de remplir
un tableau.
On pourra mettre au point une fonction prenant en paramètre une clé et renvoyant vrai si l’enregistrement
doit être conservé et non sinon.
Le fichier résultant ne contiendra plus que des enregistrements
@document{xxx,
...
}
@theme{xxx,
...
}
et des commandes de sectionnement :
@section{sec1,
...
}
@subsection{subsec1,
...
}
@group{id,
...
}
De plus, la lecture de l’enregistrement @typetable aura permis d’ajouter un type explicite aux enregistrements qui n’en auraient pas.
Tout ce qui reste dans le fichier est donc de la même forme, à savoir
@nom{clé,
champ1 = valeur1,
20
champ2 = valeur2,
...
champn = valeurn,
}
Cette première transformation pourra se faire en utilisant lex et yacc.
Seuls les enregistrements non filtrés subsisteront.
Au cours de cette même étape, on déterminera les séquences de clés. Ces séquences serviront à déterminer
les notions de précédent et suivant d’un enregistrement.
On associera aussi ici une clé à un groupe.
4.2
Parcours des enregistrements
Les pages produites sont pour l’instant écrites dans un fichier unique, ce qui autorisera un filtrage globale
par sed par exemple.
Production des pages principales. Les notions de précédent et suivant sont disponibles.
Les \cite dans les champs sont traités par une fonction spéciale qui prend une chaı̂ne et en renvoie une
autre.
4.3
Parcours
Un second parcours (voire le même) produit les sommaires des groupes et des thèmes.
4.4
Index des noms
Les index peuvent aussi être produits en même temps. On produit un unique fichier d’index nominatif.
Chaque ligne aura la structure suivante :
\indexentry{1}{2}{3}{4}{5}{6}{7}{8}{9}{10}{11}{12}{13}{14}{15}{16}
où
–
–
–
–
–
–
–
–
–
–
–
–
–
–
–
–
paramètre
paramètre
paramètre
paramètre
paramètre
paramètre
paramètre
paramètre
paramètre
paramètre
paramètre
paramètre
paramètre
paramètre
paramètre
paramètre
1 : nom pour tri
2 : nom réel
3 : prénom pour tri
4 : von pour tri
5 : nom pour tri
6 : Jr pour tri
7 : prénom réel
8 : nom réel
9 : von réel
10 : Jr réel
11 : clé d’accès
12 : type de document
13 : titre pour tri
14 : titre réel
15 : groupe
16 : id
Le plus souvent, le nom pour le tri est le même que le nom réel. De même pour les autres composantes.
Mais on s’autorise des cas particuliers où un mot ne serait pas trié comme le mot le laisserait penser. Dans
ce cas, une composante aurait la forme suivante : a//b. Un nom pourrait être :
people = "de la Mare//Mére, fils, Jean",
21
et ceci signifierait que Mére doit être classé sous Mare.
Ce découpage avec // peut être fait sur toutes les parties d’un nom et le titre. On proposera des solutions
pour résoudre les éventuels cas d’ambiguı̈tés.
L’importance des éléments pour le tri dépend essentiellement des outils utilisés pour faire le tri. Certains
outils ne géreront pas bien les caractères 8 bits et un caractère comme é ne sera pas mis au niveau de e mais peut-être après ou avant toutes les lettres. Dans ce cas, il faudra produire les clés de tri, en remplaçant
par exemple é par e , etc.
Le type de document peut être par exemple p pour photographie, d pour document, etc.
La clé d’accès est la clé utilisée dans les pages de document pour pointer dans l’index.
Voici un exemple de ligne d’index (ce qui suit n’occupe qu’une ligne mais a été coupé pour des raisons
de lisibilité) :
\indexentry{Koechlin}{Koechlin}{Amédée}{de}{Koechlin}{fils}{Amédée}{Koechlin}
{de}{fils}{AmédéedeKoechlin}{p}{Portrait}{Portrait}{xy27}{11}
Nous n’avons pas inclus ici l’indexation de la date (champ indexeddate), mais il est souhaitable de
l’intégrer. Dans ce cas, les documents datés seraient triés par date et les documents non datés seraient
simplement triés alphabétiquement suivant le titre.
4.5
Index des lieux
Chaque ligne aura la structure suivante :
\indexentry{1}{2}{3}{4}{5}{6}
–
–
–
–
–
–
paramètre
paramètre
paramètre
paramètre
paramètre
paramètre
1:
2:
3:
4:
5:
6:
lieu pour tri
lieu réel
titre pour tri
titre réel
groupe
id
Exemple d’entrée :
\indexentry{Paris}{Paris}{La tour Eiffel}{La tour Eiffel}{su12}{3}
Le problème du tri est le même que celui qui a été évoqué plus haut.
Ici non plus, nous n’avons pas inclus l’indexation de la date et il est souhaitable de le faire.
4.6
Liste des groupes et des thèmes
4.7
Corrections fines
{\oe} → oe (car œ ne se trouve pas dans le code ISO-Latin 1
4.8
Création des pages
Les fichiers agglomérés sont découpés.
4.9
Tri de l’index des noms
On pourra utiliser sort sur le fichier produit précédemment. sort est très rapide, mais il faudra prendre
garde à produire des clés 7 bits. Pour ce faire, on utilisera une table, qui devra être paramétrable (par exemple
en fonction de la langue) : cette table contiendra des règles comme é → e .
22
4.10
Tri de l’index des lieux
On pourra utiliser sort sur le fichier produit précédemment. sort est très rapide, mais il faudra prendre
garde à produire des clés 7 bits.
4.11
Production des pages de l’index nominatif
Il s’agit de parcourir le fichier de l’index trié.
4.12
Production des pages de l’index des lieux
Cela se fait sur le même principe que l’index nominatif.
4.13
Si le temps le permet...
Ajout de scripts CGI pour obtenir une indexation dynamique.
5
Nombre d’étudiants et répartition du travail
Ce projet convient à quatre étudiants motivés.
L’objectif est de réaliser un système simple, bien documenté et utilisable.
Beaucoup d’aspects techniques ont été défrichés dans ce qui précède et le projet est essentiellement un
travail d’implémentation.
5.1
Planning
Au cours de la première semaine, les étudiants essaieront le prototype, comprendront l’articulation des
différentes pages et réuniront un certain nombre de photographies (disons 200) qui serviront à tester le
fonctionnement du système.
Ensuite, un étudiant pourra par exemple travailler sur la conversion du format texte externe en un format
interne. Cette conversion se fera probablement le plus avantageusement avec lex et yacc. Un autre étudiant
pourra travailler sur les différentes phases du programme principal, leur articulation et la production des
pages Html. Un autre étudiant pourra travailler sur les index et leur tri.
Si le temps le permet, on pourra envisager la production d’un catalogue imprimé (fichier TEX qui pourra
être converti en PDF).
La programmation se fera en C, sauf pour l’emploi d’outils standard externes.
La documentation du projet devra bien entendue être soignée.
23

Documents pareils