Travail dirigé de Martin Sévigny, ©1996 | Section précédente | Section suivante | Page d'accueil | |
Cette annexe présente toutes les étapes nécessaires pour passer des documents SGML à la base de documents. Ces démarches sont relativement techniques mais se retrouvent ici car certaines manipulations ont dû être faites pour corriger des erreurs. Pour être certain de pouvoir les répéter sans problèmes, la plupart des opérations sont décrites en détail.
La première étape consiste à prendre l'ensemble des fichiers constituant les sources SGML, à sélectionner les fichiers désirés puis à les fusionner.
Novell a fourni les sources SGML en un seul fichier compressé. La décompression de ce fichier donne 12 fichiers, correspondant aux douze livres de la documentation de Netware en français. Voici ces fichiers:
Bien entendu, ces fichiers sont des instances de documents SGML respectant la DTD Docbook. Seulement huit livres ont été choisis parmi ces douze, et ils constitueront la base de documents. Ces huit livres sont:
Ces huit fichiers donnent un total de 3 426 125 octets.
Il est plus facile de traiter le corpus de documents s'il est constitué d'un seul fichier. Afin de préparer la fusion de ces huit fichiers, il est important de supprimer la déclaration de type de document que l'on retrouve au début de tous ces fichiers:
<!DOCTYPE BOOK SYSTEM "/dtd/docbook.dtd" [ <!ENTITY % localentities SYSTEM "/dtd/novlents"> %localentities; ]>
Ensuite, il faut mettre bout à bout les fichiers, à l'aide d'un éditeur de texte. L'ordre choisi est celui que l'on retrouve dans le livre "Introduction", où l'on présente l'ensemble des livres:
Afin de rendre le fichier source parfaitement conforme à la norme SGML, il faut inclure la déclaration SGML de même que la déclaration de type de document dont il s'agit. La déclaration SGML utilisée est celle fournie avec la DTD (fichier "c:\dtd\docbook.dcl"), et elle est reproduite ici:
Figure 3: déclaration SGML utilisée
<!SGML "ISO 8879:1986" CHARSET BASESET "ISO 646:1983//CHARSET International Reference Version (IRV)//ESC 2/5 4/0" DESCSET 0 9 UNUSED 9 2 9 11 2 UNUSED 13 1 13 14 18 UNUSED 32 95 32 127 1 UNUSED BASESET "ISO Registration Number 100//CHARSET ECMA-94 Right Part of Latin Alphabet Nr. 1//ESC 2/13 4/1" DESCSET 128 32 UNUSED 160 5 32 165 1 UNUSED 166 88 38 254 1 127 255 1 UNUSED CAPACITY SGMLREF TOTALCAP 4000000 ATTCAP 256000 AVGRPCAP 256000 ENTCAP 300000 ENTCHCAP 350000 GRPCAP 300000 IDCAP 2000000 SCOPE DOCUMENT SYNTAX SHUNCHAR CONTROLS 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 127 255 BASESET "ISO 646:1983//CHARSET International Reference Version (IRV)//ESC 2/5 4/0" DESCSET 0 128 0 FUNCTION RE 13 RS 10 SPACE 32 TAB SEPCHAR 9 NAMING LCNMSTRT "" UCNMSTRT "" LCNMCHAR ".-" UCNMCHAR ".-" NAMECASE GENERAL YES ENTITY NO DELIM GENERAL SGMLREF SHORTREF SGMLREF NAMES SGMLREF QUANTITY SGMLREF ATTCNT 256 GRPCNT 253 GRPGTCNT 253 LITLEN 8092 NAMELEN 44 TAGLVL 100 FEATURES MINIMIZE DATATAG NO OMITTAG NO RANK NO -- While SHORTTAG is set to YES to accomodate FIXED attribute values, the use of short tagging in instances is deprecated -- SHORTTAG YES LINK SIMPLE NO IMPLICIT NO EXPLICIT NO OTHER CONCUR NO SUBDOC NO FORMAL NO APPINFO NONE > |
Ensuite, il faut rajouter l'entête suivant:
<!DOCTYPE SET SYSTEM "/dtd/docbook.dtd" [ <!ENTITY % localentities SYSTEM "/dtd/novlents"> %localentities; ]>
Les fichiers sources fournis par Novell étaient définis dans le but de constituer des documents SGML distincts. Pour arriver à un seul document, nous avons rajouté un élément <SET> au document, cet élément étant déjà prévu dans la DTD afin de grouper un ensemble de livres et un titre (facultatif). Il a donc fallu rajouter les informations suivantes au début de linstance de document:
<SET> <TITLE>Manuels NetWare 4.02</TITLE>
Et rajouter ces caractères à la toute fin du document:
</SET>
Finalement, pour chaque élément <BOOK>, donc pour chaque livre, un attribut fut rajouté afin de simplifier le traitement des liens hypertextuels par Omnimark. Cet attribut est ID et sa valeur est le nom du fichier correspondant au livre.
À ce moment, nous possédons un fichier source SGML qui correspond au corpus de documents choisis. À noter que ce fichier est conservé sous le nom "C:\SOURCES\NETWARE\TRAD\TDPLAIN.SGM" sur le disque dur de lappareil ayant servi à ce projet.
Malheureusement, le fichier ainsi constitué comportait des erreurs SGML qui empêchent son traitement par Omnimark. Cette section décrit les erreurs obtenues et les moyens pris pour les corriger.
La valeur "ws_d1fra" de l'attribut ID du livre de même nom n'est pas valide; car il semble que le caractère "_" soit défendu. Toutes les occurrences de la chaîne "ws_d1fra" furent remplacées par "wsd1fra" dans le document. En tout, on la retrouve une fois en attribut ID et 25 fois en attribut BOOK.
Cette modification n'a aucune conséquence sur la base de documents, puisque ces attributs ne servent qu'à identifier des sources et des cibles hypertextuelles.
Le caractère ASCII 154, qui est toujours utilisé avec un "n" suivi d'un chiffre, est utilisé alors qu'il ne fait pas partie des caractères de base. On le retrouve aux lignes 35146, 46516, 46545, 46569 (deux fois) et 46616 (deux fois). Il fut changé pour le caractère "o", ce qui donne la suite "No 1" par exemple, respectant ainsi la pensée de l'auteur. À noter que l'utilisation des espaces étant aléatoire dans les documents, nous nous sommes permis dinsérer une espace entre chaque "o" et le chiffre qui le suivait.
En SGML, deux attributs de type "ID" ne doivent pas avoir la même valeur dans une même instance de documents. Toutefois, dans notre corpus, 19 valeurs de ID sont répétées au moins une fois. Toutes ces occurrences furent analysées minutieusement, et les correctifs nécessaires furent apportés. Les détails se retrouvent dans le Tableau I, page 136.
Lorsqu'un attribut de type IDREF est défini dans un document SGML, sa valeur doit correspondre à la valeur d'un attribut de type ID dans le même document. Pour des raisons inconnues, 9 IDREF étaient indéfinis dans le corpus, et des corrections se sont avérées nécessaires. Elles sont expliquées dans le Tableau II, page 137.
Tableau I: Correction des valeurs d'attributs "ID"
ID | Livre | Ligne | Action | Commentaires |
FM72389 | getstfra | 1922 | Supprimé | - |
- | utlrffra | 24172 | FM72390 | Référence de la ligne 24162 modifiée. |
FM41940 | cncptfra | 28994 | - | - |
- | cncptfra | 28995 | Supprimé | Inutile dans ce contexte. |
FM88007 | cncptfra | 29133 | - | - |
- | cncptfra | 29134 | Supprimé | Inutile dans ce contexte. |
FM61724 | cncptfra | 28951 | FM61725 | Modifié car son contenu ferait référence à lui-même. |
- | cncptfra | 29509 | - | - |
FM83174 | cncptfra | 25775 | - | - |
- | cncptfra | 29669 | FM83175 | Aucun lien vers ces éléments. |
FM66501 | cncptfra | 30788 | - | - |
- | cncptfra | 31531 | FM66502 | Aucun lien vers ces éléments. |
FM17174 | cncptfra | 26109 | FM17175 | Aucun lien vers cet élément. |
- | cncptfra | 31719 | - | - |
FM54190 | cncptfra | 29834 | FM54191 | Aucun lien vers cet élément. |
- | cncptfra | 31873 | - | - |
FM27501 | utlrffra | 17040 | - | - |
- | wsd1fra | 35085 | FM27502 | La référence de la ligne 33301 modifiée en conséquence. |
FM39204 | wsgetfra | 40423 | - | - |
- | wsgetfra | 40428 | FM39205 | Aucun lien vers cet élément. |
FM76561 | cncptfra | 26559 | - | - |
- | wsgetfra | 40444 | FM76562 | Aucun lien vers cet élément. |
- | wsgetfra | 40476 | FM76563 | Aucun lien vers cet élément. |
FM99067 | wsgetfra | 40600 | - | - |
- | wsgetfra | 40601 | Supprimé | Inutile dans ce contexte. |
FM19023 | printfra | 32074 | - | - |
- | wsgetfra | 40615 | FM19024 | Aucun lien vers cet élément. |
FM96914 | cncptfra | 31834 | - | - |
- | wsgetfra | 40910 | FM96915 | Les références des lignes 40739, 40740 et 40878 (deux fois) furent modifiées. |
FM65627 | wsgetfra | 41225 | FM65628 | Aucun lien vers cet élément. |
- | wsgetfra | 41238 | - | - |
FM38025 | wsgetfra | 41707 | - | - |
- | wsgetfra | 41708 | Supprimé | Inutile dans ce contexte. |
- | wsgetfra | 41710 | Supprimé | Inutile dans ce contexte. |
- | wsgetfra | 41711 | Supprimé | Inutile dans ce contexte. |
- | wsgetfra | 41712 | Supprimé | Inutile dans ce contexte. |
FM90992 | wsgetfra | 41896 | - | - |
- | wsgetfra | 41916 | FM90993 | Aucun lien vers cet élément. |
FM66968 | tcpipfra | 43968 | - | - |
- | tcpipfra | 44076 | FM66969 | Aucun lien vers cet élément. |
FM26063 | wsd1fra | 38958 | FM26064 | La référence de la ligne 38956 fut modifiée en conséqence. |
- | tcpipfra | 44536 | FM26064 | - |
Tableau II: Correction des valeurs d'attributs "IDREF"
IDREF | Livre | Ligne | Action | Commentaires | ||||||
FM77360 | utlrffra | 13107 | Supprimé | Impossible de trouver une référence valable. (Indéfini dans Dynatext) | ||||||
FM36937 | tcpipfra | 44483 | FM36273 | Arrivée logique pour ce lien. | ||||||
FM87545 | instlfra | 5049 | Supprimé | Impossible de trouver une référence valable. (Indéfini dans Dynatext) | ||||||
FM34285 | tcpipfra | 44928 | FM27710 | Arrivée logique pour ce lien. | ||||||
- | tcpipfra | 45146 | FM27710 | Arrivée logique pour ce lien. | ||||||
FM70191 | printfra | 33049 | FM27104 | Arrivée logique pour ce lien. | ||||||
FM40835 | tcpipfra | 44091 | FM27710 | Arrivée logique pour ce lien. | ||||||
FM30497 | printfra | 32867 | Supprimé | Impossible de trouver une référence valable. (Indéfini dans Dynatext) | ||||||
FM19283 | tcpipfra | 44088 | FM19491 | Arrivée logique pour ce lien. | ||||||
FM31955 | printfra | 33045 | FM27104 | Arrivée logique pour ce lien. |
Les opérations précédentes nous ont permis d'obtenir un fichier (situé sur le disque dur de lordinateur ayant servi à ce projet: c:\sources\netware\trad\td.sgm) qui contient les sources SGML corrigées et prêtes à être traitées. Il faut ensuite traiter ce fichier à l'aide d'un programme Omnimark.
Ce programme Omnimark est relativement simple, car le traitement nécessaire est le même pour tous les éléments de la base, peu importe leur identificateur générique. Il s'agissait essentiellement de compter les éléments et les attributs, et de produire les tables de liens, déléments et d'attributs, et les tables des identificateurs génériques et des noms d'attribut.
Il faut mentionner quune attention toute spéciale fut portée aux éléments à contenu textuel (#PCDATA). En effet, normalement le contenu textuel est associé à lélément qui le contient et nest pas un élément en lui-même. Toutefois, nous avons créé un identificateur générique artificiel (PCDATA) pour chaque suite de caractères #PCDATA non entrecoupée par un autre élément.
De cette façon, les éléments à contenu mixte voyaient toutes leurs parties clairement identifiées. Sans cette approche, il naurait pas été possible de reconstituer intégralement ces éléments à des fins de présentation par exemple: aucune information naurait été disponible sur la segmentation des bouts de texte.
Le programme conçu est présenté à la fin de cette annexe et se retrouve sur la disquette (fichier \omni\td.xom).Il produit les fichiers suivants:
Ces fichiers sont des fichiers ASCII délimités, et peuvent être lus directement par le logiciel Access.
Le programme Omnimark ayant servi à la compilation des documents SGML et à leur traduction en fichiers d'entrée est présenté intégralement ici:
; PROGRAMME: TD.XOM ; LOGICIEL: OMNIMARK V2R4 ; AUTEUR: Martin Sévigny ; DATE: mars 1995 ; DESCRIPTION: ; ; Ce programme crée la table des noeuds, la table des attributs, la ; table des liens, la table des noms d'attributs et la table des ; identificateurs génériques, sous la forme d'un fichier "texte ; délimité" qui peut ensuite être importé dans une base de données ; Access. ; ; On peut l'exécuter de la facon suivante: ; omnimark -s td.xom nom_de_la_source_sgml ; ; Cinq fichiers sont produits: ; tdatt.out --> Table des attributs ; tdnoe.out --> Table des noeuds ; tdlie.out --> Table des liens ; tdgid.out --> Table des identificateurs génériques ; tdaid.out --> Table des noms d'attribut ; ; On y trouve l'information suivante: ; ; TABLE DES NOEUDS: ; NoeudID --> Cle primaire numérique ; GenID --> Numéro de l'identificateur générique ; Profondeur --> Niveau hiérarchique de l'élément, en partant du haut ; Contenu --> Contenu textuel de l'élément ; ; TABLE DES ATTRIBUTS: ; AttID --> Cle primaire numerique de l'attribut ; AttNameID --> Numéro du nom de l'attribut ; AttValue --> Valeur de l'attribut ; NoeudID --> Cle primaire numérique du noeud ; ; TABLE DES LIENS: ; Source --> Cle primaire textuelle de la source ; Cible --> Cle primaire textuelle de la cible ; Seq --> Ordre du lien ; Hyper --> Lien hypertextuel (Oui) ou non (Non) ; ; TABLE DES IDENTIFICATEURS GÉNÉRIQUES: ; GenID --> Numéro de l'identificateurs générique ; GenName --> Nom de l'identificateur ; ; TABLE DES NOMS D'ATTRIBUT: ; AttNameID --> Numéro du nom d'attribut ; AttName --> Nom de l'attribut ; ; ;**************************************************************************** down-translate ; Traduction de SGML vers autre chose ;**************************************************************************** ; ; global stream FichierAtt ; Fichier de sortie pour la table des attributs global stream FichierNoeuds ; Fichier de sortie pour la table des noeuds global stream FichierLiens ; Fichier de sortie pour la table des liens global stream FichierGenID ; Fichier de sortie pour la table des GI global stream FichierAName ; Fichier de sortie pour la table des noms d'attribut ; global stream HyperOui ; Valeur vraie d'un champ Oui/Non global stream HyperNon ; Valeur fausse d'un champ Oui/Non global stream FS ; Caractères de séparation entre les champs global stream NoeudID ; Identificateur textuel unique des noeuds global stream ParentID ; Identificateur textuel unique du parent global stream Grand-ParentID ; Identificateur textuel unique d'un grand-parent global stream CurEleName ; Nom de l'élément traité dans une boucle global stream GenName ; Nom du GI ; global counter ListeNoeuds variable ; Liste des noeuds global counter ListeGenID variable ; Liste des GI global counter ListeAName variable ; Liste des noms d'attribut ; global counter CurEleOrd ; Ordre de l'élément traité dans une boucle global counter Noeud ; Compteur de boucle global counter Seq ; Ordre de l'élément par rapport à ses frères global counter AttID ; Clé primaire de la table des attributs global counter NoeudSeq variable ; Compteur pour les enfants d'un noeud global counter NID ; Numéro du noeud courant global counter PID ; Numéro du parent courant global counter GPID ; Numéro du grand-parent courant global counter GID ; Numéro du GI global counter AID ; Numéro de l'attribut global counter CompteNID ; Compteur des noeuds global counter CompteGID ; Compteur des GI global counter CompteAID ; Compteur des nos d'attribut ; ; ;**************** Génération des identificateurs de noeud ******************* macro Trouve-NoeudID is set buffer NoeudID to "" repeat over current elements as Noeud set buffer CurEleName to name of current element Noeud do when current element Noeud isnt "set" reset CurEleOrd to children of parent of current element Noeud else reset CurEleOrd to 1 done set buffer NoeudID to "%g(NoeudID)_%g(CurEleName)%d(CurEleOrd)" again macro-end ; ; ;*********** Identification de la clé numérique d'un noeud ****************** macro Trouve-NID is do when counter ListeNoeuds has key "%g(NoeudID)" reset NID to counter ListeNoeuds key "%g(NoeudID)" else new counter ListeNoeuds key "%g(NoeudID)" increment CompteNID reset ListeNoeuds key "%g(NoeudID)" to counter CompteNID reset NID to counter ListeNoeuds key "%g(NoeudID)" done macro-end ; ; ;***** Identification de la clé numérique d'un identificateur générique ***** macro Trouve-GID is do when counter ListeGenID has key "%g(GenName)" reset GID to counter ListeGenID key "%g(GenName)" else new counter ListeGenID key "%g(GenName)" increment CompteGID reset ListeGenID key "%g(GenName)" to counter CompteGID put FichierGenID "%d(CompteGID)%g(FS)%g(GenName)%n" reset GID to counter ListeGenID key "%g(GenName)" done macro-end ; ; ;*********** Génération de l'identificateur textuel d'un parent ************* macro Trouve-ParentID is set buffer ParentID to "" repeat over current elements of parent as Noeud set buffer CurEleName to name of current element Noeud do when current element Noeud isnt "set" reset CurEleOrd to children of parent of current element Noeud else reset CurEleOrd to 1 done set buffer ParentID to "%g(ParentID)_%g(CurEleName)%d(CurEleOrd)" again reset PID to counter ListeNoeuds key "%g(ParentID)" macro-end ; ; ;******** Génération de l'identificateur textuel d'un grand-parent ********* macro Trouve-Grand-ParentID is set buffer Grand-ParentID to "" repeat over current elements of parent of parent as Noeud set buffer CurEleName to name of current element Noeud do when current element Noeud isnt "set" reset CurEleOrd to children of parent of current element Noeud else reset CurEleOrd to 1 done set buffer Grand-ParentID to "%g(Grand-ParentID)_%g(CurEleName)%d(CurEleOrd)" reset GPID to counter ListeNoeuds key "%g(Grand-ParentID)" again macro-end ; ; ;*************** Génération du numéro séquentiel d'un noeud ***************** macro Trouve-Seq-Element is do when counter NoeudSeq has key "%g(NoeudID)" increment NoeudSeq key "%g(NoeudID)" else new counter NoeudSeq key "%g(NoeudID)" done reset Seq to counter NoeudSeq key "%g(NoeudID)" macro-end ; ; ;*************** Génération du numéro séquentiel d'un parent **************** macro Trouve-Seq-Parent is do when counter NoeudSeq has key "%g(ParentID)" increment NoeudSeq key "%g(ParentID)" else new counter NoeudSeq key "%g(ParentID)" done reset Seq to counter NoeudSeq key "%g(ParentID)" macro-end ; ; ;*********************** Gestion des liens hypertextuels ******************** ; ; À noter que seuls les liens définis par l'élément IXREF sont traités ; par ce programme. Les liens définis par BXREF et TEXREF seront traités ; une fois dans la base de données. ; macro Hypertexte is do when element is ixref and attribute idref is specified put FichierLiens "%d(NID)%g(FS)" put FichierLiens referent "%v(idref)" put FichierLiens "%g(FS)%d(Seq)%g(FS)%g(HyperOui)%n" done macro-end ; ; ;*************************** Gestion des attributs ************************** macro Attributs is repeat over attributes as Att ; Boucle sur les attributs. do when attribute Att isnt implied ; Doit se faire avant le set buffer AttName to key of attribute Att ; traitement de %c increment AttID do when counter ListeAName has key "%g(AttName)" reset AID to counter ListeAName key "%g(AttName)" else new counter ListeAName key "%g(AttName)" increment CompteAID reset ListeAName key "%g(AttName)" to counter CompteAID reset AID to counter ListeAName key "%g(AttName)" put FichierAName "%d(CompteAID)%g(FS)%g(AttName)%n" done put FichierAtt "%d(AttID)%g(FS)%d(AID)%g(FS)%v(Att)%g(FS)%d(NID)%n" done again macro-end ; ; ;************************** Tables de traduction **************************** translate "%n" output "%_" ; Supprime les CR/LF du contenu des éléments ; et les remplace par une espace translate "~" output "/__/" ; Supprime le séparateur de champ ; ; ;****************************** Initialisations ***************************** document-start ; Actions exécutées avant la lecture du document reset AttID to 0 reset CompteNID to 0 reset CompteGID to 0 reset CompteAID to 0 set buffer FS to "~" set buffer HyperOui to "Oui" set buffer HyperNon to "Non" open FichierAtt as "tdatt.out" open FichierNoeuds as "tdnoe.out" open FichierLiens with referents-allowed as "tdlie.out" open FichierGenID as "tdgid.out" open FichierAName as "tdaid.out" ; ; ;********************* Traitement des éléments XMARK *********************** element XMARK do when parent is "title" Trouve-Grand-ParentID set referent "%v(id)" to "%d(GPID)" when attribute id is specified else Trouve-ParentID set referent "%v(id)" to "%d(PID)" when attribute id is specified done suppress ; ; ;***************** Traitement de tous les autres éléments ****************** element #IMPLIED ; S'applique à tous les éléments qui n'ont ; pas de règles... Donc tous les éléments! local stream AttName local counter Att local counter NoeudProf reset NoeudProf to number of current elements do when element isnt "set" ; Le numéro d'ordre n'est pas utilisé lorsque Trouve-ParentID ; c'est l'élément supérieur Trouve-Seq-Parent ; Définit la variable Seq done Trouve-NoeudID Trouve-NID Hypertexte ; Gestion des liens hypertextuels Attributs ; Gestion des attributs do when element isnt "set" put FichierLiens "%d(PID)%g(FS)%d(NID)%g(FS)%d(Seq)%g(FS)%g(HyperNon)%n" done set buffer GenName to "%q" Trouve-GID put FichierNoeuds "%n%d(NID)%g(FS)%d(GID)%g(FS)%d(NoeudProf)%g(FS)\%c" ; ; ;************************** Gestion des PCDATA ****************************** data-content local stream CleP local counter NoeudProf reset NoeudProf to number of current elements + 1 set buffer GenName to "PCDATA" Trouve-GID Trouve-NoeudID reset PID to counter ListeNoeuds key "%g(NoeudID)" Trouve-Seq-Element set buffer CleP to "%g(NoeudID)_%g(GenName)%d(Seq)" do when counter ListeNoeuds has key "%g(CleP)" reset NID to counter ListeNoeuds key "%g(CleP)" else new counter ListeNoeuds key "%g(CleP)" increment CompteNID reset ListeNoeuds key "%g(CleP)" to counter CompteNID reset NID to counter ListeNoeuds key "%g(CleP)" done put FichierLiens "%d(PID)%g(FS)%d(NID)%g(FS)%d(Seq)%g(FS)%g(HyperNon)%n" put FichierNoeuds "%n%d(NID)%g(FS)%d(GID)%g(FS)%d(NoeudProf)%g(FS)\%c" ; ; ; C'est tout! |
Une fois traités avec le programme Omnimark, il était relativement simple dimporter les "documents" avec le logiciel Access, à laide de la fonction "Importer".
Les fichiers produits par Omnimark étaient de type "texte délimité". Par conséquent, tous les enregistrements étaient séparés par un caractère de fin de ligne. De plus, les champs étaient délimités par un caractère particulier. Nous avons choisi le caractère ~ car il nétait pas utilisé dans les documents, ce qui a évité de lui accorder un traitement particulier. Avec ces informations, Access peut importer les documents sans problèmes.
Il faut toutefois souligner quen importation, Access supprime les espaces répétées au début des champs de type texte ou mémo; il ne laisse que la première. Pour contourner ce problème, nous avons prévu dans le programme Omnimark linsertion dun caractère "\" au début du champ "contenu". Par la suite, avec une requête SQL simple, nous avons supprimé ce caractère.
La DTD Docbook permet de définir des liens hypertextuels de différentes façons. La plupart du temps, les auteurs des documents chez Novell ont utilisé les attributs ID et IDREF. Toutefois, il était possible dutiliser deux autres mécanismes:
Identificateur générique "BXREF"
Les attributs "collection" et "book" associés à cet élément permettent didentifier sans équivoque un livre tel que perçu par le lecteur Dynatext. Il sagit donc dun lien hypertextuel dont la cible est un livre au complet.
Identificateur générique "TEXREF"
Comme pour lélément précédent, les attributs "collection" et "book" permettent didentifier un livre, mais de plus, le contenu textuel de cet élément doit correspondre au contenu dun élément "TITLE" dans ce livre. La cible du lien devient donc ce titre, ou plutôt son contexte.
La gestion des liens définis avec BXREF est relativement simple. Nous avons simplement créé un enregistrement dans la table Liens dont la source est cet élément BXREF et la cible est le livre en question. Bien entendu, nous avons laissé de côté les liens qui pointaient vers des livres exclus de la base de documents; dans ce cas, nous leur avons donné lidentificateur générique "lien hypertextuel non résolu" (numéro 60). Un programme Visual Basic (\vbcode\util\bxref.mak) sest chargé de cette tâche.
Dans le cas des liens définis avec TEXREF, la situation était plus complexe. En effet, non seulement certains livres étaient exclus, mais en plus il nétait pas toujours évident de relier la source et la cible des liens hypertextuels. En effet, à plusieurs reprises il ny avait aucun titre correspondant au contenu de lélément TEXREF. Dans dautres cas, certains titres se rapprochaient de ce contenu, mais il fallait tout de même prendre une décision.
Nous avons conçu un programme Visual Basic (\vbcode\util\texref.mak) pour gérer ces liens. Lorsquil réussissait à identifier la source convenablement, il procédait de la même façon que le programme utilisé pour les liens de type BXREF. Lorsquil ne réussissait pas, il donnait lidentificateur générique "lien hypertextuel non résolu" (numéro 61) à lélément.
Le programme utilisait un algorithme simple et imparfait pour décider si le lien avait une cible bien identifiée:
Cet algorithme est imparfait, puisque dans plusieurs cas il ne pouvait trancher. Nous lavons fait nous mêmes et les décisions prises sont présentées dans le tableau suivant. Les corrections furent apportées à la main dans la base de données.
Tableau III: Interventions humaines pour les liens de type TEXREF
Sources | Cible | Contenu | Commentaires |
1480 | 17507 | Utilitaires du serveur | Premier intéressant. |
2319, 3261, 4232, 50397 | 4653 | Installation d'un nouveau serveur Netware 4.0 | Premier intéressant. |
3115, 29552 | 57290 | Synchronisation temporelle | Premier intéressant. |
3198, 4179 | 49114 | Filtre des droits hérités | Premier intéressant. |
7953 | 2974 | Organisation de la synchronisation temporelle du réseau | Premier intéressant. |
8398, 14213 | 47912 | Droits | Premier intéressant. |
8401, 28790 | 44952 | Abonné | Seul titre au singulier. |
8608, 27298 | 52719 | Partition | Seul titre au singulier. |
14757 | 239 | Nouvelles fonctions de Netware 4.0 | Conteneur du deuxième. |
15193, 15429, 20735, 20750, 20765, 21513, 21525, 21537, 21549, 22691, 23579, 23592 | 45701 | Attributs | Plus intéressant que le second. |
20079, 26817, 28047, 59535, 60323, 61119, 61320, 61679, 61993, 62886, 63481, 63820, 63978, 64191, 64801, 64955, 65094, 76021 | 56253 | Serveur d'impression | Premier intéressant. |
21498 | 50504 | Modes de recherche | Premier intéressant. |
23965 | 51530 | bjets feuille | Bon livre et plus intéressant. |
27144, 27311 | 53715 | Réplique | Seul titre au singulier. |
30141, 61332 | 56243 | Serveur NetWare | Premier intéressant. |
59607 | 51414 | Objet | Seul titre au singulier. |
76045 | 57545 | Volume | Premier intéressant. |
76069 | 45334 | Arbre du Répertoire | Premier intéressant. |
Travail dirigé de Martin Sévigny, ©1996 | Section précédente | Section suivante | Page d'accueil | |