SGML les pieds sur terre

Le langage

Cette présentation est courte. Elle permet de faire le tour du sujet de manière superficielle.

SGML signifie, en anglais: Standard Generalized Markup Language et sa traduction en français: Langage Normalisé et Généralisé de balisage. SGML est une méthode appliquée pour structurer une classe de documents. SGML conduit à définir une grammaire qui réglemente le marquage des éléments de texte conformément à cette structure. La grammaire s'appelle: DTD: Définition de Type de Document, ou en anglais: DTD: Document Type Definition. La page que vous êtes en train de lire est réalisée sous cette norme, et la grammaire qui en spécifie les règles de structuration des composants s'appelle: HTML.

La présentation qui suit est une aide à l'usage du débutant. Rien ne peut remplacer le travail personnel d'étude et de documentation. Vous trouverez ici les conseils pour aller un peu plus vite, et quelques pointeurs vers les pros du SGML, vers les banques de données, les outils du domaine public ou de faible budget. Que l'on ne se rassure pas ! SGML est complexe et nécessite de ce fait une abondante documentation, et des logiciels hors de la portée de l'amateur. Ce guide se limite à une présentation SGML orientée HTML et publication sur le Web.
Si vous aussi, avez développé ce genre de conseils, faites le moi savoir, je mettrai un lien ici vers vos pages.

Dernière recommandation.... il faut pouvoir lire l'anglais pour accéder aux références qui sur Internet, sont presque toutes situées aux Etats-Unis

C'est IBM (International Business Machines) qui a commandé les premières recherches sur les Systèmes de gestion de l'information juridique à un groupe de travail interne composé de : Edward Mosher et Raymond Lorie, placés sous la direction de Charles Goldfarb (un juriste). En 1978, Goldfarb soumit son idée à l'ANSI (X3J6) (American National Standard Institute) comme format de gestion de documents complexes. Le principe fut retenu et passa dans le domaine public sous le sigle: Standard "GML" (Goldfarb, Mosher, Lorie)

EN 1980, Le département de défense américain (DoD) noyé sous la documentation liée aux approvisionnements, fît un appel d'offre pour la réalisation de manuels, sous le format de Goldfarb, destinés aux frégates anti-missiles, hélicoptères etc.
C'est l'Initiative CALS (Continuous Acquisition and Life Cycle Support).

Le projet fut repris la même année par l'ISO (International Standard Organisation, Genève) dans le groupe de travail ISO/IEC/SC18/WG8.

En 1986, la norme fut entérinée et publiée par l'ISO sous le sigle "SGML" : Standard Generalized Markup Language: ISO 8879:1986

effaçant ainsi le trigramme des inventeurs.

Elle se situe dans la manière de repérer des portions de texte, non seulement pour leur attribuer une apparence à l'écran, mais aussi pour leur attribuer une fonction et une place dans la hiérarchie des composants documentaires. Deux méthodes principales sont employées (il en existe d'autres): la méthode propriétaire qui place des codes informatiques (propres au propriétaire du logiciel) dans le texte pour en repérer le début et la fin: un titre en gras est repéré de cette façon (Microsoft Word, WordPerfect etc..), et la méthode générique qui se contente d'en décrire le contenu.

Dans le premier cas, il est aisé de comprendre que le document est difficilement portable (il ne peut être lu par un logiciel qui ne reconnaît pas les codes informatiques de repérage), tandis que la méthode générique présente l'avantage de pouvoir être interprétée par un logiciel capable de confronter les balises à un jeu de réactions appropriées, c'est le cas pour SGML.
Les réactions concernent, comme cela est indiqué plus haut : le format (apparence : gras, italique, couleur, etc.), le traitement qui doit être appliqué à la portion de texte balisé (fonction : extraction, compilation de glossaire, liens hypertextes etc.) et sa position dans le document (hiérarchie: exemples: deux titres ne se suivent pas sans texte, les images sont autorisées dans les listes etc.). Le vocable "réaction appropriée" laisse un degré d'initiative au logiciel chargé de l'interprétation des balises. Exemple: les différences perceptibles dans l'affichage des documents par MSIE4 et NETSCAPE.

La portabilité est assurée en limitant les codes des caractères employés dans les documents SGML à la portion 32 à 127 du jeu de caractères ASCII (American Standard Code for Information Interchange) - ISO 646 (ISO/IEC 646:1991 Information technology -- ISO 7-bit coded character set for information interchange). Ainsi, le texte d'un fichier SGML est lisible par un traitement de texte ordinaire (notepad.exe sur PC, ou SimpleText sous MAC) et les caractères dont le code est supérieur à 127 sont représentés par des entités exemple: le caractère "e accent aigu" (code 131) est représenté par l'entité "é" qui est composée à l'aide de caractères de ce jeu. On retrouve ces caractères dans les fichiers HTML. D'autres méthodes existent

SGML est un système de balisage de texte. Le balisage confère à un texte constitué d'une suite de caractères, d'entités et d'images, une capacité de base de données qui en permette le traitement informatique.

Vous pouvez dès à présent visualiser une page SGML/HTML en affichant le code source de la page à l'aide de votre navigateur préféré. Avec NETSCAPE navigator, choisir l'option "Affichage puis, Code source".

La grammaire

Il s'agit de définir les balises à placer, et où les placer pour obtenir le résultat souhaité. SGML donne les règles de construction de la grammaire appelée Document Type Definition, ou DTD en abrégé. La DTD est un fichier SGML (mêmes caractéristiques de portabilité) qui est utilisé par un petit programme chargé de contrôler la position des balises dans le texte SGML. Le programme est nommé Parser (du verbe to parse) en Anglais, ou Analyseur en français.

Le Parser

La fonction de ce programme est de fournir l'ESIS (Element Structure Information Set - Le standard ISO (ISO/IEC 13673:1995) qui décrit le contenu et la structure d'un document) c'est-à-dire l'enchaînement de toutes les balises contenues dans le texte, et dont les caractéristiques sont conformes à la DTD. Le parser attribue la qualité de "document conforme à la DTD", au texte soumis à son analyse. James Clark a développé un parser disponible par ftp sur son site

Les pièces du puzzle

TexterightTextes et
Balises
rightTexte SGMLrightParserrightESISrightDocument Conforme
up down
DTD Rejets
up
Projet de
Documentation

La DTD SGML

Ecrire la DTD

Pour écrire une DTD SGML, il faut connaître quatre domaines: primo: SGML bien sur, les règles d'écriture et la syntaxe (apprentissage des bases: 2 jours); secundo: le domaine auquel la documentation s'applique; tertio: le logiciel de visualisation ou de saisie des documents; quarto: les moyens informatiques de traitement de la classe de documents.

Non, ne coupez pas votre liaison Web maintenant.. relisez lentement le paragraphe ci-dessus. Pour HTML c'est un peu plus simple, mais le principe s'applique en totalité. La DTD est déja écrite, le logiciel de visualisation est un navigateur Web, le domaine de la documentation vous est connu (c'est votre documentation). Il ne reste que le traitement informatique à digérer et ce n'est pas toujours compliqué ni obligatoire.

Si vous êtes encore là, bravo ! La DTD HTML est déja écrite, mais il faut savoir la lire... le navigateur Web a des particularités qu'il faut connaitre... il vous reste donc encore un peu de travail.

Lire la DTD

Elle comporte au moins 3 lignes de code indispensables

  1. <!ELEMENT - - nom de l'élément (ELEMENTS CONTENUS [OCCURRENCE][type de donnée contenue])[Fréquence]>.
    C'est la déclaration d'un élément et de son contenu
  2. <!ATTLIST nom de l'élément "Liste des attributs, suivis d'une régle d'emploi">. C'est la liste d'attributs d'un élément
  3. <!ENTITY % nom de l'entité (contenu)>. C'est la déclaration d'une entité

En option, un commentaire peut etre utilisé pour augmenter la lisibilité de la DTD: <!-- commentaire libre -->

L'ELEMENT contient deux signes (- et -) qui signifient que les balises de début et de fin sont obligatoires.
Le contraire se note (O O)(lettre "O") , on trouve (- O) pour un élément vide (une image par exemple) mais jamais (O -). La liste des éléments contenus est séparée par des indicateurs d'occurence qui peuvent être: "," pour une suite, "|" pour un OU logique, "&" pour un ET logique.
La Fréquence détermine le nombre d'apparitions de l'élément: ? = optionnel, * = 0 ou plus, + = 1 ou plus.

L'attribut est la troisième dimension de l'élément: il le qualifie par des paramètres dont le renseignement peut être: Obligatoire (#REQUIRED), Hérité d'un élément supérieur (#IMPLIED) (d'autre déclarations existent).

L'entité est équivalente à une macro: <!ENTITY % replace "lala"> insère le texte "lala" à l'endroit ou se trouve l'appel à entité: %replace;. Exemple: <!ELEMENT - - (%replace;)> devient: <!ELEMENT - - lala >

Note:Attention à l'espace entre le nom de l'entité et le signe "%". Il y a UN espace dans la déclaration, et PAS d'espace dans l'appel à l'entité

Lire une DTD contenant de nombreuses entités est difficile. Une DTD lisible est souvent rédigée sous la forme CANONIQUE, toutes entités résolues.

Exemple: DTD SGML

En SGML, le choix du nom des balises n'est pas imposé. Ici, le but est différent: il s'agit de baliser une classe de documents en vue d'un traitement en séparant la forme du fond. La visualisation est secondaire, contrairement à HTML ou elle constitue l'unique objectif.

Un classique "mémo" comportant un expéditeur (balise:<EXP>), un destinataire (balise <DEST>), une date (balise <DATE>) et plusieurs paragraphes (balise: <TEXTE>) pouvant contenir soit du texte (balise: <P>), soit des images (balise: <IMG>) peut être défini par la DTD suivante:

			Fichier "memo.mod" (fichier de la dtd)
			<!ELEMENT MEMO - - (EXP, DEST, TEXTE)>
			<!ATTLIST MEMO
						 DATE 	NUMBER  #REQUIRED
						 PROC 	CDATA	#IMPLIED >
			<!ELEMENT (EXP, DEST) - - (#PCDATA)>
			<!ELEMENT TEXTE - - (P | IMG)+>
			<!ELEMENT P - - (#PCDATA)>
			<!ELEMENT IMG - O EMPTY>
			<!ATTLIST IMG
			 FILE   CDATA   #REQUIRED>
			

			

#PCDATA (Parsable character data) signifie au parser la présence d'autres éléments SGML dans le texte (entités, autres balises etc..). CDATA (character data) ne contient que des caractères non SGML. Remarquer l'élément IMAGE (IMG) vide (EMPTY). MEMO est l'élément contenant d'ordre supérieur. Le contenant d'ordre supérieur figure toujours sur la dernière ligne de déclaration d'éléments de la DTD.

Voici un texte rédigé à l'aide de cette DTD. La pose des balises est assez rébarbative lorsque la saisie est manuelle. Il existe des logiciels "d'édition structurée" capables de contraindre la pose des balises en conformité avec la DTD.

			Fichier "textmod.sgm"
			<!DOCTYPE MEMO SYSTEM "memo.mod">
			<MEMO DATE=060199>
			<EXP>Philippe LOTZ</EXP>
			<DEST>Fans de SGML</DEST>
			<TEXTE><P>texte concernant la pratique de SGML, bla bla bla..</P>
			<P>encore du texte</P>
			<IMG FILE="image.gif"></TEXTE>
			</MEMO>
			

Le memo peur recevoir un attribut (PROC) qui peut servir a définir l'urgence (URGENT par exemple) car le champ PROC est CDATA. Le texte peut alors s'écrire:

						Fichier "tmod1.sgm"
						<!DOCTYPE MEMO SYSTEM "memo.mod">
						<MEMO DATE=060199  PROC="NORMAL"
						<EXP>Philippe LOTZ</EXP>
						<DEST>Fans de SGML</DEST>
						<TEXTE><P>texte concernant la pratique de SGML, bla bla bla..</P>
						<P>encore du texte</P>
						<IMG FILE="image.gif"></TEXTE>
						</MEMO>
			

Exercice: Les fichiers memo.dtd, text.sgm et memo.mod se trouvent dans le répertoire:SiteFree\Docs\Exos.. Testez la validité du document avec nsgmls (J. Clark) en tapant sous DOS dans le répertoire des exos: "nsgmls -s text.sgm" qui ne devrait produire aucun commentaire. Pour voir l'ESIS, tapez: "nsgmls test.sgm". Ensuite, pour provoquer une erreur, changez une seule balise dans test.sgm, par exemple: EXP changé en EXPP (faute de frappe par exemple) et recommencez les tests.

Le document de classe MEMO est conforme à la DTD. Un seul document n'est pas significatif, imaginez que vous ayez 1000 memo à saisir et à contrôler!. Dans la pratique, le parser est intégré aux logiciels d'édition structurée, et la pose des balises n'est permise qu'aux endroits prévus par la DTD.

Il est dès lors aisé de comprendre qu'un logiciel d'édition HTML dont la DTD est interne ne peut être à jour des dernières modifications, alors qu'un logiciel dont la DTD est externe, ne rencontre pas de problème de mise à jour. La différence entre ces deux types de logiciels est:....le prix !

Test de la DTD

La DTD est un document SGML, il est donc possible de tester la DTD à l'aide du parser à la condition de faire apparaitre la DTD comme un document SGML. Pour cela, appliquez la procédure suivante:

  1. renommer "memo.dtd" en "memo.mod" (mod pour "modèle").
  2. créez un troisième fichier dans le répertoire "test": "memo.dtd" contenant la déclaration d'un document SGML comme suit:
    				Fichier "memo.dtd"
    				<!DOCTYPE MEMO [
    				<!ENTITY % mod SYSTEM "memo.mod">
    				%mod;
    				]>
    				
  3. Parser la DTD: nsgmls -p memo.dtd
  4. RemarquerLa création et l'utilisation de l'entité mod

Résumé des contrôles et commandes:

Contrôle à effectuerCommande
Contrôle du document SGMLnsgmls -s textmod.sgm
Contrôle de la dtdnsgmls -p memo.dtd
Sortie de l'ESISnsgmls textmod.sgm

Si la DTD est conforme, il ne devrait pas avoir de commentaires du parser
Explication: le document SGML contient la déclaration de l'élément contenant d'ordre supérieur, puis une entité (mod) est déclarée (<!ENTITY % mod SYSTEM "memo.mod">) et invoquée immédiatement (%mod;), ce qui à pour effet d'insérer le modèle dans le nouveau document SGML "memo.dtd". Le parser ne doit voir que le prologue du document, ce qui est obtenu par l'usage du parametre "p" dans la ligne de commande nsgmls

Cette dernière expérience nous permet de redéfinir "le document SGML". Il comporte:

  1. Un prologue contenant la DTD
  2. une référence à la déclaration SGML (voir ci-dessous
  3. Le document SGML ou instance SGML

Un dernier composant du document est "la déclaration SGML" qui comprend toutes les commandes concernant le traitement des balises, le contenu des attributs, les jeux de caractères etc.. On se rapportera pour "décoder" cette déclaration à l'excellent livre de Eve Maler et Jeanne El Andalussi: Developing SGML DTD aux éditions Prentice HALL.
Le parser applique une déclaration par défaut dans le cas ou elle ne figure pas sur la ligne de commande. En voici un exemple:

			Voir répertoire D:\dev\SiteFree\Docs\sgmlRef\Decl
			<!SYSTEM "ISO 8879:1986"
			CHARSET BASESET  "ISO 646-1983//CHARSET International
			Reference Version (IRV)//ESC 2/5 4/0"
			DESCSET  0 128 0
			CAPACITY PUBLIC  "ISO 8879:1986//CAPACITY Reference//EN"
			FEATURES
			MINIMIZE DATATAG NO        OMITTAG  YES     RANK     YES   SHORTTAG YES
			LINK     SIMPLE  YES 65535 IMPLICIT YES     EXPLICIT YES 1
			OTHER    CONCUR  NO        SUBDOC   YES 100 FORMAL   YES
			SCOPE    DOCUMENT
			SYNTAX   PUBLIC  "ISO 8879:1986//SYNTAX Reference//EN"
			SYNTAX   PUBLIC  "ISO 8879:1986//SYNTAX Core//EN"
			VALIDATE
				 GENERAL YES       MODEL    YES     EXCLUDE  YES   CAPACITY NO
				 NONSGML YES       SGML     YES     FORMAL   YES
						   SDIF     PACK    NO       UNPACK   NO
			>
			

Le prologue du document SGML contient la DTD, la déclaration SGML et l'instance. Mais ces trois informations peuvent être situées dans des fichiers séparés pour diminuer la taille de chaque instance et faciliter la maintenance du système. Le parser aura alors recours à un fichier de renseignements pour retrouver toutes les pièces du puzzle: le catalogue. C'est aussi un fichier texte, décrit dans la documentation du parser de James Clark.

Résumé

SGML s'adresse à une classe de documents. La pose des balises est règlementée par une DTD, et le contrôle de la pose est effectué par un parser. Un traitement de texte suffit pour saisir (créer) un document SGML. Cependant, la difficulté de faire va croissant avec la complexité de la DTD. Il faut alors avoir recours a un éditeur structuré qui guide et contraint la saisie des balises en conformité avec la DTD.
(Exemple: FrameMaker+SGML d'Adobe).

Un document SGML contient une déclaration SGML, une DTD et l'instance proprement dite. Lorqu'ils sont situés dans des fichiers différents, le parser accède aux informations à l'aide d'un catalogue

HTML est une application de SGML, orientée présentation, pour la diffusion de l'information sur le Web.