Sommaire
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 :
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.
Sont traités dans cette section les aspects concernant la syntaxe des éléments, attributs et commentaires HTML.
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.
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.
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 (") soit les apostrophes ('). Les guillemets pourront en outre être insérées par l'expression ".
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.
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>).
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".
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 :
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.
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.
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".
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 :
Danscet exemple :
<!ELEMENT UL - - (LI)+>
L'exemple suivant illustre la définition d'éléments vides :
<!ELEMENT IMG - O EMPTY>
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 :
Voici quelqes exemples tirés de la DTD HTML :
L'élément SELECT doit contenir "au moins un" élément OPTION.
L'élément DL doit contenir au moins un des éléments DT ou DD dans n'importe quel ordre.
L'élément OPTION ne peut contenir que du texte et des entités telles que &
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)>
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 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.
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>
<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.