Une brève présentation du SGML

Sommaire

  1. A propos de SGML
  2. Syntaxe HTML
    1. Entités
    2. Eléments
    3. Attributs
    4. Commentaires HTML
  3. Comment lire la DTD HTML
    1. Niveau "bloc" et éléments "en ligne"
    2. Commentaires sur la DTD
    3. Définition d'entité
    4. Définition d'élément
    5. Définition d'attribut
Cette section présente une explication préliminaire des concepts de base de SGML ainsi que les relations qu'il entretient avec le HTML. Il traite essentiellement de :

A propos de SGML

Le Langage Standard Généralisé de Balisage (Standard Generalized Markup Language ou SGML, défini par le document [ISO8879]), est un langage permettant de définir des langages de balisage. HTML est une application du SGML.

Une application de SGML comporte plusieurs parties :

  1. Une déclaration SGML. La déclaration SGML spécifie quels caractères et quels délimiteurs peuvent apparaître dans le langage.
  2. La Définition des Types du Document (DTD). La DTD définit la syntaxe des balises. La DTD pourra inclure des définitions additionnelles telles qu'entités numériques ou textuelles.
  3. Un spécification qui décrit la sémantique à associer à la balise. Cette spécification introduit des restrictions de syntaxe ou d'usage qui ne pourraient pas être exprimées dans la DTD.
  4. Des instances de documents contenant des données (contenu) et des balises. Chaque instance contiendra une référence vers la DTD à utiliser pour l'interpréter.

La déclaration SGML pour HTML 4.0 et la DTD HTML 4.0 sont incluses dans la présente distribution, ainsi que les diverses entités citées par la DTD.

La syntaxe HTML

Sont traités dans cette section les aspects concernant la syntaxe des éléments, attributs et commentaires HTML.

Entités

Les entités caractères sont définies pour encoder des noms symboliques ou numériques de glyphes pouvant être utilsiés dans des documents HTML. Elles peuvent être utiles à ceux à qui leur éditeur HTML n'offre pas la possibilité d'écrire certains de ces caractères simplement (certains caractères exotiques ne sont en effet utilisés que très rarement). Vous rencontrerez de telles entiotés tout au long de ce document ; elles commencent par un caractère "&" et se terminent par un point-virgule (;).

Une discussion détaillée aura lieu à paropos des entités caractères du HTML dansun document ultérieur traitant des jeux de caractères utilisés dans les documents.

Eléments

Une application de SGML doit définir des éléments qui représentent des "structures" ou des "comportements attendus". Un élément est typiquement composé de trois parties : une balise de début, un contenu, et une balise de fin.

La balise de début d'un élément est écrite <nom_d_element>, dans laquelle nom_d_element représente le nom de l'element. La balise de fin d'element est écrite en ajoutant un slash avant le nom d'élément : </nom_d_element>. Par exemple,

<pre>Le contenu de l'élément PRE est du texte préformaté.</pre>

La définition SGML du HTML spécifie que certains éléments HTML peuvent être écrits sans balise de fin. Les définitions de chacun des éléments proposées par la présente spécification précisent si cette balise de fin est requise ou non.

Certains éléments HTML n'ont pas de contenu. C'est par exemple le cas de l'élément "saut de ligne" BR ; sa seule fonction est de terminer une ligne de texte. De tels éléments "vides" n'ont jamais de balise finale. Les définitions des éléments proposées par la présente spécification précisent si les éléments ont un contenu (sont vides ou non), et, dans ce cas, quel est le contenu valide.

Les noms d'éléments ne tiennent jamais compte de la casse.

Eléments et balises sont deux choses différentes. D'aucuns confondent les élements et les balisesn par exemple en parlant de la balise HTML "P". Souvenez-vous toujours qu'un élément est une chose, et une balise (de début ou de fin) en est une autre. Par exemple, l'élément HEAD (en-tête de document) est toujours présent, même lorsqu'aucune des deux balises n'apparait dans le document.

Attributs

Les éléments peuvent disposer de propriétés associées, appelées attributs, auxquels les auteurs donneront des valeurs. Toutes les paires attribute/valeur doivent apparaître avant le ">" de fermeture de la balise de début de l'élément. Il peut être mentionné ici tout nombre de paires attribut/valeur (licites), séparées par des espaces. Les attributs peuvent être mentionnés dans n'importe quel ordre.

Dans cet exemple, l'attribut align est défini pour l'élément H1 :

<H1 align="center">
Un titre centré grâce à l'attribut align
</H1> 

Par défaut, le SGML demande à ce que toutes les valeurs d'attributs soient encadrées soit de guillemets (") soit de simples apostrophes ('). Des apostrophes litérales peuvent être incluses dans la valeur d'attribut si celle-ci est délimitée par des guillemets et vice-versa. A l'intérieur des délimiteurs, vous pourrez aussi utiliser des entités caractères pour représenter soit les guillemets (&#34;) soit les apostrophes (&#39;). Les guillemets pourront en outre être insérées par l'expression &quot;.

Dans certains cas, il sera possible en HTML de spécifier la valeur d'un attribut sans aucun délimiteur. Pour cela, l'attribut ne doit contenir que des lettres (a-z et A-Z), des digits (0-9), des tirets (ASCII décimal 45), ou des points (ASCII decimal 46). Nous suggerons néanmoins l'utilisation systématique des délimiteurs afin d'éviter des recherches d'erreur fastidieuses.

Les noms d'atributs ne sont JAMAIS dépendantes de la casse.

Les valeuirs d'attributs ne sont en général pas dépendantes de la casse. La description des valeurs admises pour chaque attribut dans la présente spécification indiquera si tel n'est pas le cas.

Note : Les documents HTML pourront être compressés plus efficacement si vous utilisez des caractères minuscules pour les noms d'éléments et d'attributs. La raison en est que les algorithmes de compression travaillent mieux lorsqu'ils rencontrent un "motif" fréquemment répété, et les caractères minuscules seront plus utilisés que les majuscules, si l'on compte le texte du document lui-même.

Commentaires du HTML

Les commentaires s'écrivent en HTML en suivant la syntaxe suivante :

    
<!-- ceci est un commentaire -->
<!-- celui-là aussi,
    même s'il est sur plus d'une ligne -->

Les commentaires doivent être ignorés par les agents utilisateurs, lorqu'il s'agit de visualiser le document. Les agents utilisateurs ne devront pas plus afficher les instructions de traitement SGML (ex., <?full volume>).

Comment lire la DTD HTML

Cette spécification utilise, lorsque c'est pertinent, des extraits de la DTD pour chaque d'finition d'élément ou d'attribut. Bien que "cryptés" et "dissuasifs" en première lecture, ces extraits de la DTD donent cependant des informations concises et extrêmement précises sur la syntaxe de l'élément ou l'attribut. Nous avons choisi d'inclure ces extraits de la DTD dans cette spécification, plutôt que de rechercher une méthode plus "abordable", mais certazinement beaucoup moins rigoureuse, de présenter les choses. Toutes ces définitions contiennent suffisament de texte (en anglais, malheureusement pour les anglophobes ;-) pour pouvoir être compréhensibles, mais pour ceux qui nécessitent une information complète et définitive, nous avons complété ces documents par un bref enseignement sur "comment lire cette DTD HTML".

Eléments de niveau "bloc" et éléments "en ligne"

Certain éléments HTML sont spécifiés comme étant de niveau "bloc" tandis que d'autre sont dits "en ligne" (ou encore de niveau "texte"). Cette distinction s'appuie sur un certain nombre de considérations :

Modèle conceptuel
En général, des éléments de niveau "bloc" contiennent des éléments "en ligne" et d'autres éléments de niveau "bloc". encore en général, des éléments "en ligne" contiennent des données brutes (du texte litéral) ou d'autres éléments "en ligne". L'idée inhérente dans cette distinction structurelle est que des blocs créent des structures plus "grandes" que des éléments "en ligne".
Mise en forme
Par défaut, les éléments de niveau "bloc" ont une forme et un emploi différents de ceux des éléments "en ligne". On commencera en général un élément "bloc" sur une nouvelle ligne, tandis que les éléments "en ligne" apparaîtront souvent (c'est le cas de le dire) au milieu de la ligne de texte. Un élément de niveau bloc termine un paragraphe non explicitement refermé. Cette propriété vous permet d'omettre les balises de fin de paragraphes dans la plupart des cas.
Directionnalité
Pour des raisons techniques dans lesquelles l'algorithme de texte bidirectionnel de l'[UNICODE] à sa part, les éléments de "bloc" zet "en ligne" diffèrent en outre dans la manière d'hériter des informations de direction d'écriture. Pour plus de détails, voir la section traitant de l'héritage de la direction d'écriture de texte.

Les feuilles de style sont un bon moyen de préciser comment des éléments arbitraires sont visualisés, et si un élément est considéré au vu de ce style comme un élément de "bloc" ou un élément "en ligne". Dans certains cas, par exemple un style "en ligne" pour l'élément de liste, ceci peut être intéressant, mazis dans l'usage général, nous décourageons les auteurs de chercher à surcharger l'interprétation conventionnelle des éléments HTML par cette méthode.

Un changement des méthodes traditionnelles de présentation, tant dans des éléments de niveau "bloc" que "en ligne" peut également avoir des conséquences sur l'algorithme de texte bidirectionnel. Voir la section concernant l'effet des feuilles de style sur la bidirectionnalité pour plus de précisions.

Commentaires dans la DTD

Dans les DTD, les commentaires peuvent être multi-lignes. Ils sont délimités par une paire de tirets "--", ex.

<!ELEMENT PARAM - O EMPTY       -- valeur de paramètre nommé -->
Ici, le commentaire "valeur de paramètre nommé" explique l'utilisation de l'élément PARAM. Les commentaires DTD pour le HTML ne sont pas normalisés.

Définition d'entité 

La DTD HTML commence par une série de définitions d'entités. Une définition d'entité (à ne pas confondre avec une "entité SGML") définit une sorte de "macro" qui peut être substituée ailleurs dans la DTD. Lorsque la DTD se réferrera plus loin à cette entité, cette référence pourra être expansée en une chaîne de caractères.

Une définition d'entité commence par le mot-clef <!ENTITY % suivi du nom d'entité, de la chaîne délimitée par laquelle cette entité se substitue, et enfin un caractère > de fermeture. L'exemple qui suit décrit la chaîne par laquelle on pourra remplacer l'entité %font.

<!ENTITY % font "TT | I | B | U | S | BIG | SMALL">

La chaîne par laquelle l'entité peut être explicitée peut contenir des références à d'autres entités. Ces entités seront expansées récursivement. Dans l'exemple qui suit, l'entité %inline est définie comme incluant les entités %font, %phrase, %special et %formctrl.

<!ENTITY % inline "#PCDATA | %font | %phrase | %special | %formctrl">

Deux entités DTD apparaîtront fréquemment dans la DTD HTML: %inline et %block. Elles sont utilisées lorsque le modèle de contenu contient respectivement des éléments de niveau "bloc" et "en ligne".

Définition d'élément

Le "gros" de la DTD HTML consiste en des définitions des éléments et de leurs attributs. Le mot-clef <!ELEMENT commence une définition d'élément et le caractère > l'achève. Entre ces deux marqueurs sont spécifiés :

  1. Le nom de l'élément.
  2. Si la balise de fin de l'élément est optionnelle ou non. Deux tirets après le nom d'élément signifient que les deux balises de début et de fin sont obligatoires. Un tiret suivi de la lettre "O" (et non pas zéro) indiquent que la balise de fin peut être omise. Une paire de "O" signifient que les deux balises (c'est à dire la définition explicite de l'élément) peuvent ête omises dans un document.
  3. Le contenu attendu pour l'élément, s'il en existe un. L'ensemble des valeurs de contenu acceptées pour un élément particulier est défini par un modèle de contenu. Les éléments sans contenu seront appelés des éléments vides. Les élements vides seront explicités de plus par la mention "EMPTY".

Danscet exemple :

    <!ELEMENT UL - - (LI)+>

L'exemple suivant illustre la définition d'éléments vides :

    <!ELEMENT IMG - O EMPTY>

Définition du modèle de contenu

Le modèle de contenu indique ce qui est attendu comme contenu d'un élément. Les définitions de contenu peuvent inclure :

Les modèles de contenu utilisent la syntaxe suivante pour définir quelles constructions sont acceptées dans le contenu de l'élément :

( ... )
Spécifie un groupe.
A | B
Les constructions A et/ou B permises dans n'importe quel ordre.
A , B
Les constructions A et B, mais A doit apparaître avant B.
A & B
A et B en un seul exemplaire chacun, dans n'importe quel ordre.
A?
A, 0 ou une fois (0,1)
A*
A au moins 0 fois (0,n)
A+
A au moins une fois (1,n)

Voici quelqes exemples tirés de la DTD HTML :

<!ELEMENT SELECT - - (OPTION+)>

L'élément SELECT doit contenir "au moins un" élément OPTION.

<!ELEMENT DL - - (DT|DD)+>

L'élément DL doit contenir au moins un des éléments DT ou DD dans n'importe quel ordre.

<!ELEMENT OPTION - O (#PCDATA)*>

L'élément OPTION ne peut contenir que du texte et des entités telles que &amp;

Quelques éléments HTML utilisent des fonctionnalités SGML moins courantes pour exclure certaines constructions du modèle de contenu. Les éléments à exclure sont précédés d'un tiret. Des exclusions explicites outrepassent des inclusions.

Dans l'exemple suivant, la mention -(A) signifie que l'élément A ne peut pas être inclus dans un autre A (c-à-d. les ancres ne peuvent être imbriquées).

   <!ELEMENT A - - (%inline)* -(A)>

Notez que l'élément A fait pourtant partie de l'entité DTD %inline, mais l'exclusion -(A) prévaudra.

De même, la définition suivante pour l'élément FORM interdit l'usage de formulaires imbriqués :

   <!ELEMENT FORM - - %block -(FORM)>

Définition d'attribut

Le mot-clef <!ATTLIST commence une définition des attributs qui peuvent être associés à un élément. Il est suivi par le nom de l'élément en question etla liste des définitions d'attributs. Une définition d'attribut est un triplet qui définit :

Dans l'exemple suivant, l'attribut name est défini pour l'élément MAP. Il est optionnel pour cet élément.

<!ATTLIST MAP
  name        CDATA     #IMPLIED
  >

Le type des valeurs autorisées pour cet attribut est donné par CDATA, qui est un type SGML de données. CDATA représente du texte littéral dans lequel peuvent apparaître des entités caractère.

Pour plus d'information sur les syntaxes "CDATA", "NAME", "ID", et autres types de données, consultez la section concernant les types de données HTML.

Les exemples suivants illustrent des définitions d'attribut possibles :

rowspan     NUMBER     1         -- nombre de colonnes prises par la cellule --
http-equiv  NAME       #IMPLIED  -- nom de l'en-tête de réponse HTTP  --
id          ID         #IMPLIED  -- identificateur unique de portée document -- 
valign      (top|middle|bottom|baseline) #IMPLIED

La valeur de l'attribut rowspan est nécessairement de type NUMBER. La valeurpar défaut est explicitement mentionnée comme valant "1". La valeur de l'attribut http-equiv optionnel est du type NAME. La valeur de l'attribut optionnel id est de type ID. L'attribut optionnel valign doit nécessairement choisir une valeur dans l'ensemble {top, middle, bottom, baseline}.

Les entités DTD dans les définitions d'attributs

Les définitions d'attributs pourront aussi inclure des entités DTD.

Dans l'exemple ci-dessous, nous voyons que la liste de définition d'attributs pour l'élément LINK commence par une entité %attrs.

<!ATTLIST LINK
  %attrs;                          -- id, class, style, lang, dir, title --
  href        %URL       #IMPLIED  -- URL de la ressource liée --
  ...suite de la définition...
  >

L'entité %attrs se substitue en la définition suivante :

<!ATTLIST P
  id          ID         #IMPLIED  -- document-wide unique id --
  class       CDATA      #IMPLIED  -- comma list of class values --
  style       CDATA      #IMPLIED  -- associated style info --
  title       CDATA      #IMPLIED  -- advisory title/amplification -- 
  lang        NAME       #IMPLIED  -- [RFC1766] language value --
  dir         (ltr|rtl)  #IMPLIED  -- direction for weak/neutral text --
  align (left|center|right|justify)  #IMPLIED
  >

L'entité %attrs a été définie pour des raisons de commodité, du fait que ces sept attributs se répètent dans de nombreux éléments HTML.

De même, la DTD définit l'entité %URL qui sera substituable par une chaîne de caractère de type CDATA.

<!ENTITY % URL "CDATA"
        -- Le terme URL sous-entend un attribut CDATA dont la valeur
           est une "Uniform Resource Locator",
           Voir [RFC1808] et [RFC1738]
        -->

Comme cet exemple le montrera, l'entité %URL procure aux lecteurs de la DTD plus d'informations que le seul type de donnée attendu pour l'attribut. Des entités similaires ont été définies telles que %color, %Content-Type, %Length, %Pixels, etc.

attributs booléens

Certains attributs jouent le rôle de commutateurs booleéns (ex., selected). Leur mention dans la balise de début d'un élément affecte explicitement une valeur "true" à cet attribut. Leur absence se traduit par une valeur "false" implicite.

Il sera licite d'affecter à un attribut booléen son unique valeur possible : son propre nom (ex., selected="selected").

L'exemple suivant définit l'attribut selected comme un attribut booléen.

selected     (selected)  #IMPLIED  -- sélectionne l'élément --

Cet attribut est alors considéré comme ayant la valeur "true" s'il apparaît dans la balise de début de l'élément :

<OPTION selected="selected">
...contenu...
<OPTION>
Attributs booléens minimaux En HTML, les attributs booléens peuvent apparaître sous leur forme "minimale" -- La valeur d'attribut apparaît toute seule dans la balise de début de l'élément. Ainsi :
<OPTION selected>

est aussi valide que

<OPTION selected="selected">

Les auteurs devront prendre garde au fait que de nombreux agents utilisateurs ne reconnaissent que la forme minimale et pas la forme complète.