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éférence :</b> <em>g1-1</em> <p><b>Description détaillée :</b> <em>Nous voyons ici Jean sourire. Il a envie de jouer.</em> <p><b>Date :</b> 20/2/1997 <p><b>Lieu :</b> Nancy, à la maison <p><b>Photographe :</b> La maman de Jean <p><b>Personnes indexées : </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éférence :</b> <em>g1-2</em> <p><b>Description détaillée :</b> <em>Jean et Paulette se retrouvent.</em> <p><b>Date :</b> vers 1998 <p><b>Lieu :</b> peut-^ etre Metz <p><b>Photographe :</b> Le frère de Jean <p><b>Personnes indexées : </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éférence :</b> <em>g1-1</em> <p><b>Description détaillée :</b> <em>Nous voyons ici Jean 12 sourire. Il a envie de jouer.</em> <p><b>Date :</b> 20/2/1997 <p><b>Lieu :</b> Nancy, à la maison <p><b>Photographe :</b> La maman de Jean <p><b>Personnes indexées : </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è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ème<br>Photos de mes vacances en 1999</h1></center> <b>Éléments du thème :</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ç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ç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