Travail dirigé de Martin Sévigny, ©1996 Section précédente | Section suivante | Page d'accueil |

Annexe B - La compilation des documents

B.1 Introduction

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.

B.2 Constitution de la source SGML

La première étape consiste à prendre l'ensemble des fichiers constituant les sources SGML, à sélectionner les fichiers désirés puis à les fusionner.

B.2.1 Extraction des sources obtenues de Novell et fusion des fichiers

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:

B.2.2 Modification des sources SGML

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 l’instance 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 l’appareil ayant servi à ce projet.

B.3 Correction des erreurs SGML

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.

B.3.1 Valeurs de ID non valide

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.

B.3.2 Caractères non valides

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 d’insérer une espace entre chaque "o" et le chiffre qui le suivait.

B.3.3 Valeurs de ID répétées

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.

B.3.4 Valeurs IDREF indéfinies

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"

IDLivreLigneActionCommentaires
FM72389getstfra1922Supprimé-
-utlrffra24172FM72390Référence de la ligne 24162 modifiée.
FM41940cncptfra28994--
-cncptfra28995SuppriméInutile dans ce contexte.
FM88007cncptfra29133--
-cncptfra29134SuppriméInutile dans ce contexte.
FM61724cncptfra28951FM61725Modifié car son contenu ferait référence à lui-même.
-cncptfra29509--
FM83174cncptfra25775--
-cncptfra29669FM83175Aucun lien vers ces éléments.
FM66501cncptfra30788--
-cncptfra31531FM66502Aucun lien vers ces éléments.
FM17174cncptfra26109FM17175Aucun lien vers cet élément.
-cncptfra31719--
FM54190cncptfra29834FM54191Aucun lien vers cet élément.
-cncptfra31873--
FM27501utlrffra17040--
-wsd1fra35085FM27502La référence de la ligne 33301 modifiée en conséquence.
FM39204wsgetfra40423--
-wsgetfra40428FM39205Aucun lien vers cet élément.
FM76561cncptfra26559--
-wsgetfra40444FM76562Aucun lien vers cet élément.
-wsgetfra40476FM76563Aucun lien vers cet élément.
FM99067wsgetfra40600--
-wsgetfra40601SuppriméInutile dans ce contexte.
FM19023printfra32074--
-wsgetfra40615FM19024Aucun lien vers cet élément.
FM96914cncptfra31834--
-wsgetfra40910FM96915Les références des lignes 40739, 40740 et 40878 (deux fois) furent modifiées.
FM65627wsgetfra41225FM65628Aucun lien vers cet élément.
-wsgetfra41238--
FM38025wsgetfra41707--
-wsgetfra41708SuppriméInutile dans ce contexte.
-wsgetfra41710SuppriméInutile dans ce contexte.
-wsgetfra41711SuppriméInutile dans ce contexte.
-wsgetfra41712SuppriméInutile dans ce contexte.
FM90992wsgetfra41896--
-wsgetfra41916FM90993Aucun lien vers cet élément.
FM66968tcpipfra43968--
-tcpipfra44076FM66969Aucun lien vers cet élément.
FM26063wsd1fra38958FM26064La référence de la ligne 38956 fut modifiée en conséqence.
-tcpipfra44536FM26064-



Tableau II: Correction des valeurs d'attributs "IDREF"

IDREFLivreLigneActionCommentaires
FM77360utlrffra13107SuppriméImpossible de trouver une référence valable. (Indéfini dans Dynatext)
FM36937tcpipfra44483FM36273Arrivée logique pour ce lien.
FM87545instlfra5049SuppriméImpossible de trouver une référence valable. (Indéfini dans Dynatext)
FM34285tcpipfra44928FM27710Arrivée logique pour ce lien.
-tcpipfra45146FM27710Arrivée logique pour ce lien.
FM70191printfra33049FM27104Arrivée logique pour ce lien.
FM40835tcpipfra44091FM27710Arrivée logique pour ce lien.
FM30497printfra32867SuppriméImpossible de trouver une référence valable. (Indéfini dans Dynatext)
FM19283tcpipfra44088FM19491Arrivée logique pour ce lien.
FM31955printfra33045FM27104Arrivée logique pour ce lien.


B.4 Traitement du corpus avec Omnimark

B.4.1 Vue d’ensemble

Les opérations précédentes nous ont permis d'obtenir un fichier (situé sur le disque dur de l’ordinateur 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 qu’une 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 n’est 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 n’aurait pas été possible de reconstituer intégralement ces éléments à des fins de présentation par exemple: aucune information n’aurait é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.

B.4.2 Programme de traitement des documents

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!

B.5 Importation des documents avec Access

Une fois traités avec le programme Omnimark, il était relativement simple d’importer les "documents" avec le logiciel Access, à l’aide 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 qu’en 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 l’insertion d’un caractère "\" au début du champ "contenu". Par la suite, avec une requête SQL simple, nous avons supprimé ce caractère.

B.6 La gestion des liens hypertextuels particuliers

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 d’utiliser deux autres mécanismes:

Identificateur générique "BXREF"

Les attributs "collection" et "book" associés à cet élément permettent d’identifier sans équivoque un livre tel que perçu par le lecteur Dynatext. Il s’agit donc d’un 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 d’identifier un livre, mais de plus, le contenu textuel de cet élément doit correspondre au contenu d’un é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é l’identificateur générique "lien hypertextuel non résolu" (numéro 60). Un programme Visual Basic (\vbcode\util\bxref.mak) s’est 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 n’y avait aucun titre correspondant au contenu de l’élément TEXREF. Dans d’autres 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. Lorsqu’il 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. Lorsqu’il ne réussissait pas, il donnait l’identificateur 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 l’avons 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

SourcesCibleContenuCommentaires
148017507Utilitaires du serveurPremier intéressant.
2319, 3261, 4232, 503974653Installation d'un nouveau serveur Netware 4.0Premier intéressant.
3115, 2955257290Synchronisation temporellePremier intéressant.
3198, 417949114Filtre des droits héritésPremier intéressant.
79532974Organisation de la synchronisation temporelle du réseauPremier intéressant.
8398, 1421347912DroitsPremier intéressant.
8401, 2879044952AbonnéSeul titre au singulier.
8608, 2729852719PartitionSeul titre au singulier.
14757239Nouvelles fonctions de Netware 4.0Conteneur du deuxième.
15193, 15429, 20735, 20750, 20765, 21513, 21525, 21537, 21549, 22691, 23579, 2359245701AttributsPlus intéressant que le second.
20079, 26817, 28047, 59535, 60323, 61119, 61320, 61679, 61993, 62886, 63481, 63820, 63978, 64191, 64801, 64955, 65094, 7602156253Serveur d'impressionPremier intéressant.
2149850504Modes de recherchePremier intéressant.
2396551530bjets feuilleBon livre et plus intéressant.
27144, 2731153715RépliqueSeul titre au singulier.
30141, 6133256243Serveur NetWarePremier intéressant.
5960751414ObjetSeul titre au singulier.
7604557545VolumePremier intéressant.
7606945334Arbre du RépertoirePremier intéressant.



Travail dirigé de Martin Sévigny, ©1996 Section précédente | Section suivante | Page d'accueil |