<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>z720.net &#187; WebStandards</title>
	<atom:link href="http://z720.net/blog/categories/web/webstandards/feed" rel="self" type="application/rss+xml" />
	<link>http://z720.net</link>
	<description>WebDesign &#38; WebConsulting</description>
	<lastBuildDate>Wed, 11 Nov 2009 08:36:10 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Liens interessants</title>
		<link>http://z720.net/blog/archives/2005/06/18/liens-interessants</link>
		<comments>http://z720.net/blog/archives/2005/06/18/liens-interessants#comments</comments>
		<pubDate>Sat, 18 Jun 2005 09:12:17 +0000</pubDate>
		<dc:creator>Seb</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Développement]]></category>
		<category><![CDATA[Traductions]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[WebStandards]]></category>

		<guid isPermaLink="false">http://v05.z720.net/blog/archives/2005/04/26/embellir-les</guid>
		<description><![CDATA[Voici quelques liens intéressants. Relooker la balise select : comment faire pour modiifer l&#8217;aspect des select dans les formulaires Relooker la balise select le retour : La suite de l&#8217;article précédent qui se penche sur les problèmes d&#8217;accessibilités Top 50 des sites francophones non-conforme : Petite étude lancée par Denis Boudreau il y a quelques [...]]]></description>
			<content:encoded><![CDATA[<p>Voici quelques liens intéressants.</p>
<p><span id="more-83"></span></p>
<ul>
<li><a href="http://easy-designs.net/articles/replaceSelect/">Relooker la balise select</a> : comment faire pour modiifer l&#8217;aspect des select dans les formulaires</li>
<li><a href="http://easy-designs.net/articles/replaceSelect2/">Relooker la balise select le retour</a> : La suite de l&#8217;article précédent qui se penche sur les problèmes d&#8217;accessibilités</li>
<li><a href="http://www.cybercodeur.net/weblog/commentaires/detailsCarnet.php?idmessage=1158">Top 50 des sites francophones non-conforme</a> : Petite étude lancée par Denis Boudreau il y a quelques jours.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://z720.net/blog/archives/2005/06/18/liens-interessants/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Déclencheurs JavaScript</title>
		<link>http://z720.net/blog/archives/2005/04/29/declencheurs-javascript</link>
		<comments>http://z720.net/blog/archives/2005/04/29/declencheurs-javascript#comments</comments>
		<pubDate>Fri, 29 Apr 2005 06:34:21 +0000</pubDate>
		<dc:creator>Seb</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[Traductions]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[WebStandards]]></category>

		<guid isPermaLink="false">http://v05.z720.net/blog/archives/2005/04/29/declencheurs-javascript</guid>
		<description><![CDATA[En dépit de la stricte séparation, les couches de présentation et de comportement ont besoin d&#8217;instructions de la couche structurelle. Elles ont besoin de savoir où ajouter cette jolie touche de style, quand initier ces petites actions qui font la différence. Elles ont besoin de déclencheurs. Traduction de l&#8217;article JavaScript Triggers. Translated with the permission [...]]]></description>
			<content:encoded><![CDATA[<p> En dépit de la stricte séparation, les couches de présentation et de comportement ont besoin d&#8217;instructions de la couche structurelle. Elles ont besoin de savoir où ajouter cette jolie touche de style, quand initier ces petites actions qui font la différence. Elles ont besoin de déclencheurs. </p>
<p>Traduction de l&#8217;article <a href="http://alistapart.com/articles/javascripttriggers/" hreflang="en">JavaScript Triggers</a>. <br />Translated with the permission of A List Apart Magazine (<a href="http://www.alistapart.com" hreflang="en">http://alistapart.com</a>) and the author[s].</p>
<p><span id="more-69"></span>
<p> L&#8217;affichage d&#8217;une page web consiste en 3 couches. Le fichier XHTML représentent la couche structurelle qui contient la structure, la sémantique et le contenu du site. &Agrave; cette couche, il est possible de joindre une couche de mise en page (CSS) et une couche comportementale (JavaScript) afin de rendre le site plus beau et plus facile à utiliser. Ces trois couches doivent rester strictement séparées. On peut de cette façon changer toute la mise en page sans toucher ni à la structure ni aux comportements. </p>
<p>En dépit de la stricte séparation, les couches de présentation et de comportement ont besoin d&#8217;instructions de la couche structurelle. Elles  en ont besoin pour savoir où ajouter cette jolie touche de style, quand initier cette petite action qui fait la différence. Elles ont besoin de déclencheurs</p>
<p>Les déclencheurs CSS sont bien connus. Les attributs <code>class</code> et <code>id</code> vous permettent de contrôler totalement la présentation de vos sites web. Bien qu&#8217;il soit possible de travailler sans ces déclencheurs, en plaçant les instructions en ligne dans l&#8217;attribut <code>style</code>, cette méthode de codage est à proscrire. Si vous voulez redéfinir la présentation de votre site avec cette méthode, vous allez devoir modifier la couche structurelle en même temps, il s&#8217;agit d&#8217;une entorse à la régle de séparation de la présentation et de la structure.</p>
<h2>Déclencheurs JavaScript</h2>
<p>La couche comportementale doit fonctionner de la même manière. Il faut <a href="http://www.digital-web.com/articles/separating_behavior_and_structure_2/" hreflang="en"> séparer le comportement de la structure</a> en vous séparant des gestionnaires d&#8217;évenements en ligne comme celui-ci : <code>onmouseover="switchImages('fearful',6,false)"</code>. &Agrave; la place, comme en CSS, nous allons utiliser des déclencheurs pour informer le script permettant la mise en oeuvre du comportement adéquate.</p>
<p>Le déclencheur JavaScript le plus simple est l&#8217;attribut <code>id</code> :</p>
<pre class="html"><code>&lt;div id="navigation"&gt;
 &lt;ul&gt;
  &lt;li&gt;&lt;a href="#"&gt;Link 1&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="#"&gt;Link 2&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="#"&gt;Link 3&lt;/a&gt;&lt;/li&gt;
 &lt;/ul&gt;
&lt;/div&gt;
</code></pre>
<pre class="javascript"><code>var x = document.getElementById('navigation');
if (!x) return;
var y = x.getElementsByTagName('a');
for (var i=0;i&lt;y.length;i++)
 y[i].onmouseover = addBehavior;
</code></pre>
<p>Avec ce code, le comportement est déclenché par la présence ou l&#8217;absence de <code>id="navigation"</code>. S&#8217;il est absent, il ne se passe rien (<code>if (!x) return</code>), mais s&#8217;il est présent tous les éléments liens qui en descendent auront un comportement au survol. Cette solution est simple et élégante, et elle fonctionne dans tous les navigateurs. Si l&#8217;<code>id</code> permet de couvrir vos besoins, vous n&#8217;avez pas besoin de lire la suite de cet article.</p>
<h2>Déclencheurs avancés</h2>
<p>Malheureusement, dans certaines situations il est impossible d&#8217;utiliser l&#8217;attribut <code>id</code> comme déclencheur:</p>
<ol>
<li>Un <code>id</code> doit être unique dans tout le document et vous pouvez avoir besoin d&#8217;un même comportement pour plusieurs (un groupe) éléments.</li>
<li>Parfois un script a besoin de plus d&#8217;information que simplement &#8220;exécutez-moi ici.&#8221;</li>
</ol>
<p>Prenons pour ces 2 problèmes l&#8217;exemple d&#8217;un script de gestion de formulaire. Il serait pratique d&#8217;ajouter un déclencheur permettant d&#8217;indiquer qu&#8217;un champ est obligatoire. Si nous avions un tel déclencheur, nous pourrions utiliser un script aussi simple que le suivant.</p>
<pre class="javascript"><code>function validateForm()
{
 var x = document.forms[0].elements;
 for (var i=0;i&lt;x.length;i++)
 {
  if (<strong>[ce champ est obligatoire]</strong> &#038;&#038; !x[i].value)
    // Informer l'utilisateur de l'anomalie
 }
}
</code></pre>
<p>Mais comment créer un déclencheur XHTML permettant d&#8217;indiquer au script que certains champs sont obligatoires&nbsp;? Utilisez un <code>id</code> n&#8217;est pas envisageable : car nous avons besoin d&#8217;une solution qui puisse fonctionner sur plusieurs champs. Il serait possible d&#8217;utiliser l&#8217;attribut <code>class</code> pour piloter ce comportement :</p>
<pre class="html"><code>&lt;input name="name" class="required" /&gt;
</code></pre>
<pre class="javascript"><code>
if (<strong>x[i].className == 'required'</strong> &#038;&#038; !x[i].value)
  // Informer l'utilisateur de l'anomalie
</code></pre>
<p>Pourtant, <a href="http://www.w3.org/TR/xhtml1/#C_13" hreflang="en">l&#8217;attribut <code>class</code> est plutôt dédié à la définition de styles CSS</a>. Mélanger des déclencheurs CSS et JavaScript n&#8217;est pas impossible mais peut mener rapidement à un amas de code confus: </p>
<pre class="html"><code>&lt;input name="name" class="largefield required" /&gt;
</code></pre>
<pre class="javascript"><code>
if (
  <strong>x[i].className.indexOf('required') != -1</strong> &#038;&#038;
  !x[i].value
)
</code></pre>
<p>&Agrave; mon avis, l&#8217;attribut <code>class</code> ne devrait être utilisé <em>que</em> pour le CSS. Les classes sont les premiers déclencheurs XHTML pour la couche de présentation et les utiliser aussi pour porter une information de comportement complique les choses. Déclencher la couche de présentation et de comportement avec le même attribut <code>class</code> représente aussi une entorse à la stricte <a href="http://www.digital-web.com/articles/separating_behavior_and_presentation/">séparation du comportement et de la présentation </a>, bien qu&#8217;en fin de compte  c&#8217;est à vous de choisir ce qui est acceptable à ce sujet.</p>
<h2>Déclencheurs porteurs d&#8217;information</h2>
<p>De plus ces déclencheurs peuvent prendre plus d&#8217;importance et être plus compliqués que la simple commande &#8220;déployez ce comportement ici&#8221;. Vous aurez certainement besoin de joindre une valeur à un déclencheur. Une valeur de déclenchement rendrait la couche comportementale beaucoup plus souple, puisqu&#8217;elle pourrait répondre à différentes conditions d&#8217;exécution pour chaque élément XHTML au lieu d&#8217;exécuter bêtement le même script.</p>
<p>Prenez un formulaire dans lequel des zones de texte ont des tailles maximum pour paramètre. Le vieil attribut <code>MAXLENGTH</code> ne fonctionne pas avec les zones de texte, nous devons donc ecrire un petit script pour cela.  De plus toutes les zones de textes n&#8217;ont pas la même  longueur maximum, nous allons donc avoir à renseigner cette information quelque part de façon individuelle pour chaque zone de texte.</p>
<p>Nous voulons avoir quelquechose de la forme :</p>
<pre class="javascript"><code>var x = document.getElementsByTagName('textarea');
for (var i=0;i&lt;x.length;i++)
{
 if (<strong>[cette zone de texte a une longueur max]</strong>)
  x[i].onkeypress = checkLength;
}

function checkLength()
{
 var max = <strong>[Lecture de la longueur max]</strong>;
 if (this.value.length > max)
  // Informer l'utilisateur de l'anomalie
}
</code></pre>
<p>Ce script a besoin de 2 paramètres :</p>
<ol>
<li>Est-ce que cette zone de texte a une longueur maximum? Il s&#8217;agit ici du déclencheur qui informe le script qu&#8217;il y a un comportement à gérer. </li>
<li>Quelle est la longueur max? C&#8217;est la valeur que le script doit vérifier pour valider la saisie utilisateur.</li>
</ol>
<p>Et c&#8217;est typiquement dans ce cas que la solution basée sur les classes montre ses limites. C&#8217;est toujours techniquement possible, mais le code à implémenter devient trop compliqué. Prenez une zone de texte avec la classe CSS &laquo;&nbsp;large&nbsp;&raquo; qui soit aussi obligatoire et dont la longueur max. est de 300 caractères: </p>
<pre class="html"><code>&lt;textarea class="large required maxlength=300"&gt;
&lt;/textarea&gt;
</code></pre>
<p>Non seulement cet exemple mélange de la présentation et 2 types de comportement, mais cela rend la longueur maximum de la zone de texte plus difficile à lire:</p>
<pre class="javascript"><code>var max = <strong>this.className.substring(this.className.indexOf('maxlength')+10)</strong>;
if (this.value.length > max)
 // Informer l'utilisateur de l'anomalie
</code></pre>
<p>&Agrave; noter que ce bout de code ne fonctionne que si le paramètre longueur max. est placé en fin de valeur de classe. Si on veut placer la longueur max. n&#8217;importe où dans la valeur de classe (au cas où on voudrait ajouter un autre déclencheur après celui-ci) le code devient bien plus compliqué.</p>
<h2>Le problème</h2>
<p>C&#8217;est bien notre problème du jour. Comment ajouter de bon déclencheurs JavaScript qui nous permettent à la fois de couvrir le cas d&#8217;un simple déclenchement d&#8217;action (&#8220;exécutez-moi ici&#8221;) et celui du passage de valeur spécifique à l&#8217;éléments ?</p>
<p>Techniquement, nous avons vu qu&#8217;il était possible de gérer ces cas avec l&#8217;attribut <code>class</code>, mais avons-nous le droit de détourner la fonction l&#8217;usage de cet attribut pour porter des informations pour lequel il n&#8217;est pas fait ? Est ce une entorse à la règle de séparation de la présentation et du comportement ? Et même si vous ne voyez pas d&#8217;obstacle à cette solution, elle reste tout de même  compliquée à mettre en oeuvre et requiert un code JavaScript assez ardu.</p>
<p>Il est tout de fois possible d&#8217;utiliser d&#8217;ajouter des déclencheurs sur d&#8217;autres attributs comme <code>lang</code> ou <code>dir</code>, mais , encore une fois, ce serait une utilisation détournée d&#8217;attributs.</p>
<h2>Attributs personnalisées</h2>
<p>Je vos propose une autre solution. Reprenons l&#8217;exemple de la longueur max. de la zone de texte. Nous avons besoin de 2 informations:</p>
<ol>
<li>Est-ce que la zone de texte a une limite de taille ?</li>
<li>Quelle est cette limite ?</li>
</ol>
<p>La manière naturelle et sémantique d&#8217;exprimer cette information serait d&#8217;ajouter un attribut à la zone de texte:</p>
<pre class="html"><code>&lt;textarea  class="large" maxlength="300" &gt;
&lt;/textarea&gt;
</code></pre>
<p>La présence de l&#8217;attribut <code>maxlength</code> informe le script qu&#8217;il faut vérifier la saisie utilisateur dans cette zone de texte et il peut trouver la taille limite pour cette zone dans la valeur de l&#8217;attribut. De la même manière, pour le contrôle d&#8217;obligation de saisie, nous pouvons aussi créer un attribut personnalisé. <code>required="true"</code>, par exemple, même si n&#8217;importe quelle valeur permet de déclencher le contrôle. </p>
<pre class="html"><code>&lt;textarea class="large" maxlength="300" required="true"&gt;
&lt;/textarea&gt;
</code></pre>
<p>Techniquement ce n&#8217;est pas un problème. La méthode DOM du W3C <code>getAttribute()</code> permet de lire n&#8217;importe quel attribut d&#8217;une balise. Seul Opera jusqu&#8217;à <a href="http://www.quirksmode.org/bugreports/archives/2005/01/existing_attrib.html" title="Bug report">sa version 7.54 ne permet pas  </a> de lire un attribut existant sur la mauvaise balise (comme <code>src</code> sur la balise <code>&lt;h2&gt;</code>). Heureusement les version ultérieur assure un support complet de la méthode <code>getAttribute()</code>.</p>
<p>Voici donc ma solution&nbsp;:</p>
<pre class="javascript"><code>function validateForm()
{
 var x = document.forms[0].elements;
 for (var i=0;i&lt;x.length;i++)
 {
  if (<strong>x[i].getAttribute('required')</strong> &#038;&#038; !x[i].value)
    // Informer l'utilisateur que le champ est obligatoire
 }
}

var x = document.getElementsByTagName('textarea');

for (var i=0;i&lt;x.length;i++)
{
 if (<strong>x[i].getAttribute('maxlength')</strong>)
  x[i].onkeypress = checkLength;
}

function checkLength()
{
 var max = <strong>this.getAttribute('maxlength')</strong>;
 if (this.value.length &gt; max)
  // Informer l'utilisateur que la longueur max est atteinte
}
</code></pre>
<p>&Agrave; mon avis cette solution est simple à implémenter et cohérente avec la forme que les déclencheurs JavaScript peuvent prendre: une paire clé/valeur à l&#8217;endroit où la clé déclenche l&#8217;action et la valeur permet de conditionner l&#8217;action en fonction de chaque élément. Finalement, ajouter ces déclencheurs au code XHTML est très simple même  pour des webmaster débutants.</p>
<h2>DTDs personnalisées</h2>
<p>Après l&#8217;implémentation de cette solution vous pourrez noter que la page résultante n&#8217;est pas valide. &Agrave; la validation les attributs <code>required</code> et <code>maxlength</code>  sont rejetés car il ne sont pas autorisées dans le document. C&#8217;est bien sur complètement vrai : le premier attribut ne fait pas partie des spécifications XHTML, tandis  que le second n&#8217;est valide que sur un élément <code>&lt;input&gt;</code>.</p>
<p>Pour résoudre ce problème, il suffit de les <em>rendre</em> valides; en créant une Définition de Type de Document (DTD) personnalisée qui étend XHTML pour inclure ces attributs déclencheurs. Cette DTD personnalisée définit nos attributs spéciaux et leur place dans le document, l&#8217;outil de validation permet de confronter la structure du document à notre version personnalisée de XHTML  Si la DTD déclare les attributs valides, c&#8217;est qu&#8217;ils le sont.</p>
<p>Si vous ne savez pas créer de DTD personnalisée, vous pouvez lire l&#8217;article de J. David Eisenberg&#8217;s intitulé <a href="http://www.alistapart.com/articles/customdtd/" hreflang="en">Creating Custom DTDs</a> (NDT: ou la traduction français <a href="http://v05.z720.net/blog/archives/2005/03/03/valider-une-dtd-personnalisee" hreflang="fr">Valider une DTD personnalisée</a>) pour tout savoir sur le sujet.</p>
<p>&Agrave; mon avis, utiliser des attributs personnalisés pour contrôler la couche comportementale et écrire des DTD personnalisées pour définir ces attributs correctement contribue à séparer comportement et structure et à écrire des scripts simples et efficaces. De plus une fois ces attributs déclarés et les scripts rédigés, même un webmaster débutant est capable d&#8217;ajouter facilement des comportements complexes dans les documents XHTML.</p>
<h3 class="byline">Version originale par <a href="http://alistapart.com/authors/peterpaulkoch/" title="Voir tous les articles de Peter-Paul Koch sur A List Apart" hreflang="en">Peter-Paul Koch</a></h3>
<p id="authorbio">Peter-Paul Koch est développeur web indépendant  à Amsterdam en Hollande. Il écrit et maintient <a href="http://www.quirksmode.org/">www.quirksmode.org</a>, un condensé d&#8217;environ 180 articles, trucs et astuces CSS et JavaScript, ainsi qu&#8217;un système de rapport de bogue et un blog</p>
]]></content:encoded>
			<wfw:commentRss>http://z720.net/blog/archives/2005/04/29/declencheurs-javascript/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Valider une DTD personnalisée</title>
		<link>http://z720.net/blog/archives/2005/03/03/valider-une-dtd-personnalisee</link>
		<comments>http://z720.net/blog/archives/2005/03/03/valider-une-dtd-personnalisee#comments</comments>
		<pubDate>Thu, 03 Mar 2005 12:47:01 +0000</pubDate>
		<dc:creator>Seb</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[Traductions]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[WebStandards]]></category>

		<guid isPermaLink="false">http://v05.z720.net/blog/archives/2005/02/18/valider-une-dtd-personnalisee</guid>
		<description><![CDATA[Comment valider des documents XHTML utilisant une DTD personnalisée. Traduction de l&#8217;article Validating a Custom DTD. Translated with the permission of A List Apart Magazine (http://alistapart.com) and the author[s]. Dans son article de cette même édition (NDT : sur A List Apart &#8211; Edition N°194), Peter-Paul Koch propose l&#8217;ajout d&#8217;attributs personnalisés dans les éléments de [...]]]></description>
			<content:encoded><![CDATA[<p>Comment valider des documents XHTML utilisant une DTD personnalisée.</p>
<p>Traduction de l&#8217;article <a href="http://www.alistapart.com/articles/customdtd/">Validating a Custom DTD</a>. Translated with the permission of A List Apart Magazine (<a href="http://www.alistapart.com">http://alistapart.com</a>) and the author[s].</p>
<p><span id="more-65"></span>
<p>
Dans <a href="http://www.alistapart.com/articles/scripttriggers/">son article de cette même édition</a> (NDT : sur <a href="http://www.alistapart.com/issues/194/" >A List Apart &#8211; Edition N°194</a>), Peter-Paul Koch propose l&#8217;ajout d&#8217;attributs personnalisés dans les éléments de formulaire pour déclencher des évènements spéciaux. Le valideur du W3C ne validera pas un document avec de tels attributs, parce qu&#8217;ils ne font pas partie des spécifications XHTML. </p>
<p>Cet article va vous permettre : </p>
<ul>
<li> de développer des DTD sur mesure afin de déclarer des attributs personnalisés</li>
<li> de valider des documents utilisant ces attributs. </li>
</ul>
<p>Voici un exemple de balisage HTML personnalisé qui nous permettra : </p>
<ul>
<li> de spécifier la longueur maximale de la zone de texte </li>
<li> de déterminer si un élément du formulaire est obligatoire ou non :</li>
</ul>
<pre>
&lt;form action=&quot;http://example.com/cgi-bin/example.cgi&quot;&gt;
&lt;p&gt;
  Name:
  &lt;input type=&quot;text&quot; name=&quot;yourName&quot; size=&quot;40&quot; /&gt;

&lt;/p&gt;
&lt;p&gt;
  Email:
  &lt;input type=&quot;text&quot; name=&quot;email&quot; size=&quot;40&quot;
  required=&quot;true&quot; /&gt;

&lt;/p&gt;
&lt;p&gt;
  Comments:&lt;br /&gt;
  &lt;textarea maxlength=&quot;300&quot; required=&quot;false&quot;
  rows=&quot;7&quot; cols=&quot;50&quot;&gt;&lt;/textarea&gt;

&lt;/p&gt;
&lt;p&gt;
  &lt;input type=&quot;submit&quot; value=&quot;Send Data&quot; /&gt;
&lt;/p&gt;
&lt;/form&gt;
</pre>
<h2> Qu&#8217;est ce qu&#8217;une DTD ? </h2>
<p>
La Définition du Type de Document (DTD) est un fichier qui spécifie quels éléments et attributs existent dans un langage balisé et comment ils apparaissent. Ainsi la DTD XHTML précise que &lt;p&gt; est un élément valide et qu&#8217;il peut apparaître dans une balise &lt;div&gt; mais pas dans &lt;b&gt;. L&#8217;adresse URL, à la fin de la déclaration DOCTYPE, pointe à l&#8217;endroit où l&#8217;on va trouver le fichier de DTD pour la version HTML que l&#8217;on va utiliser. Ni votre navigateur, ni le valideur du W3C ne parcourt le web pour récupérer la DTD &#8211; Ils ont une liste des DOCTYPEs valides en mémoire et utilisent l&#8217;URL pour les identifier uniquement. Comme nous le verrons plus loin, ce comportement change en cas de DTD personnalisée.
</p>
<h2> Spécifier les attributs </h2>
<p>
Ajouter des attributs dans une DTD existante est facile. Pour chaque attribut, vous devez spécifier à quel élément il est associé, quel est son nom, quel type de données il peut contenir et s&#8217;il est obligatoire ou facultatif. Ces informations sont spécifiées suivant le modèle :
</p>
<pre>
&lt;!ATTLIST
  elementName attributeName type optionalStatus
&gt;
</pre>
<p>
Pour ajouter l&#8217;attribut maxlength à l&#8217;élément &lt;textarea&gt;, il suffit d&#8217;écrire :</p>
<pre>
&lt;!ATTLIST textarea maxlength CDATA #IMPLIED&gt;
</pre>
<p>
La spécification CDATA signifie que la valeur de l&#8217;attribut peut contenir n&#8217;importe quels caractères; ainsi maxlength=&nbsp;&raquo;300&#8243; ou maxlength=&nbsp;&raquo;ten&nbsp;&raquo; seront tous les deux valides. Pour les données &laquo;&nbsp;ouvertes&nbsp;&raquo;, les DTD ne nous permettent pas d&#8217;être plus précis. La spécification #IMPLIED signifie que l&#8217;attribut est optionnel. Un attribut obligatoire serait spécifié par #REQUIRED.<br />
Quand un attribut peut contenir une liste de valeurs, vous pouvez les spécifier dans la DTD. C&#8217;est le cas pour notre attribut required, qui ne peut contenir que true ou false. Les valeurs sont sensibles à la casse; dans notre exemple seule les valeurs en minuscules sont spécifiées, donc la valeur TRUE ne sera pas considérée comme valide.
</p>
<pre>
&lt;!ATTLIST textarea required (true|false) #IMPLIED&gt;
</pre>
<p>
Attention à la confusion: l&#8217;attribut s&#8217;appelle &laquo;&nbsp;required&nbsp;&raquo; mais n&#8217;est pas obligatoire dans tous les éléments &lt;textarea&gt;, car c&#8217;est un attribut optionnel. Dans l&#8217;ensemble, les modifications des spécifications dans la DTD ressemblent à ceci :</p>
<pre>
&lt;!ATTLIST textarea maxlength CDATA #IMPLIED&gt;
&lt;!ATTLIST textarea required (true|false) #IMPLIED&gt;
&lt;!ATTLIST input required (true|false) #IMPLIED&gt;
&lt;!ATTLIST select required (true|false) #IMPLIED&gt;
</pre>
<p class="note">
Note: Ajouter de nouveaux attributs à des éléments existants est facile; ajouter de nouveaux éléments est plus compliqué et n&#8217;est pas le sujet de cet article.
</p>
<h2> Placer les attributs </h2>
<p>
Maintenant que vous avez défini des attributs personnalisés, comment les placer pour qu&#8217;ils soient pris en compte à la validation? La meilleure place serait comme un sous-ensemble directement dans votre document:</p>
<pre>
&lt;!DOCTYPE html PUBLIC
&quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot;

&quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;
[
  &lt;!ATTLIST textarea maxlength CDATA #IMPLIED&gt;
  &lt;!ATTLIST textarea required (true|false) #IMPLIED&gt;
  &lt;!ATTLIST input required (true|false) #IMPLIED&gt;
  &lt;!ATTLIST select required (true|false) #IMPLIED&gt;
]&gt;
</pre>
<p>
Si vous passez un tel fichier au travers de la validation du W3C, il va valider merveilleusement bien. Si vous téléchargez les fichiers d&#8217;exemple pour cet article et validez le fichier internal.html, vous pourrez le voir par vous-même. Malheureusement, quand vous affichez ce fichier dans votre navigateur, les caractères <code><br />
]&gt;</code> vont apparaitre à l&#8217;écran. Il n&#8217;y a aucun moyen de contourner ce bug, on peut donc abandonner directement cette méthode.
</p>
<h2> Modifier la DTD </h2>
<p>Une autre méthode consiste à obtenir  la DTD de XHTML Transitional et d&#8217;ajouter les modifications directement dans ce fichier. La version originale de cette DTD est le fichier xhtml1-transitional.dtd dans le répertoire dtd des fichiers d&#8217;exemples accompagnant cet article. Vous y trouverez aussi 3 fichiers avec l&#8217;extension .ent. Ces fichiers définissent toutes les entités que vous utilisez en HTML, comme &amp;rsquo; et &amp;ntilde;. Vous devez garder tous ces fichiers ensemble dans le même dossier.</p>
<p>Le fichier personnalisé, nommé xhtml1-custom.dtd est créé en ajoutant les nouveaux attributs à la fin du fichier xhtml1-transitional.dtd. Quand vous ajoutez des attributs, faites-le à la fin du fichier pour vous assurer que tout ce à quoi vous faites référence a déjà été défini.</p>
<h2> Changer le DOCTYPE </h2>
<p>Vous devez maintenant changer l&#8217;insrtuction &lt;!DOCTYPE &gt; de votre fichier HTML pour indiquer l&#8217;utilisation de votre &laquo;&nbsp;version&nbsp;&raquo; personnalisé de XHTML. Comme la nouvelle DTD ne fait pas partie des DTD public enregistrée, le DOCTYPE n&#8217;utilisera pas le spécificateur PUBLIC. Il sera remplacer par le mot-clé SYSTEM suivi de l&#8217;emplacement de la DTD personnalisée. Ce chemin peut être relatif ou absolu, il peut même être une URL si votre fichier DTD est sur un autre serveur. Le chemin doit pointer vers l&#8217;emplacement exact de votre fichier ! Le fichier custom.html dans les exemples de cet article utilise le chemin relatif:
</p>
<pre>
&lt;!DOCTYPE html SYSTEM &quot;dtd/xhtml1-custom.dtd&quot;&gt;
</pre>
<p>
Quand vous essayez d&#8217;utiliser le valideur du W3C sur ce fichier, il rejette le document parce qu&#8217;il n&#8217;utilise que les DTD qu&#8217;il connait et ne va pas chercher les DTD personnalisées.</p>
<h2> Utiliser un valideur différent </h2>
<p>
La solution consiste à utiliser un valideur différent qui utilisera bien l&#8217;URL spécifiée pour vérifier la validité du document. Comme il s&#8217;agit d&#8217;un document XHTML, il est possible d&#8217;utiliser n&#8217;importe quel analyseur XML qui fait de la validation. Dans cet article nous allons utiliser l&#8217;analyseur Xerces disponible sur <a href="http://xml.apache.org">xml.apache.org</a>. Cet analyseur est écrit en Java(tm), donc Java doit être installé sur votre système. La décompression de l&#8217;archive Xerces va créer un doccier xerces-2_6_2 (ou n&#8217;importe quelle autre version courante). Par la suite, nous supposerons que vous avez décompresser l&#8217;archive à la racine du disque C: sous Windows ou vers /usr/local sous Linux.
</p>
<p>
Le programme Counter fait partie des exemples fournis avec Xerces. Ce programme compte le nombre d&#8217;éléments, d&#8217;attributs, d&#8217;espace ignorables et de caractères apparaissants dans un document XML (ou dans notre cas XHTML). Ce programme permet d&#8217;activer une option de validation lors de l&#8217;analyse, le rendant parfait pour cette tache. Vous pouvez lancer le programme Counter (qui devient notre &laquo;&nbsp;valideur&nbsp;&raquo;) à partir d&#8217;un fichier batch dans Windows ou à partir d&#8217;un script shell dans Linux. Voici le fichier batch, nommé validate.bat. Il n&#8217;y a qu&#8217;une ligne de commande, mais nous l&#8217;afficherons sur plusieurs lignes pour que cela tienne sur la page.<br />
Notez qu&#8217;il y a un espace avant le mot &laquo;&nbsp;dom&nbsp;&raquo; et après &laquo;&nbsp;-v&nbsp;&raquo;.</p>
<pre>
java -cp c:\xerces-2_6_2\xercesImpl.jar; &raquo;
c:\xerces-2_6_2\xmlParserAPIs.jar; &raquo;
c:\xerces-2_6_2\xercesSamples.jar dom/Counter -v &raquo;
%1 %2 %3 %4 %5 %6 %7 %8
</pre>
<p>
Voici le script shell, nommé validate.sh.</p>
<pre>
java -cp /usr/local/xerces-2_6_2/xercesImpl.jar:\
/usr/local/xerces-2_6_2/xmlParserAPIs.jar:\
/usr/local/xerces-2_6_2/xercesSamples.jar \
dom/Counter -v $1 $2 $3 $4 $5 $6 $7 $8
</pre>
<p>
Bien sur si vous avez décompressé l&#8217;archive de Xerces à un autre endroit, vous devrez changer les noms de chemin. Une fois ceci mis en place, il vous suffit de taper la commande suivante sous l&#8217;invite de commande Windows pour valider le fichier custom.html :</p>
<pre>
validate custom.html
</pre>
<p>
Ou celle-ci sous l&#8217;invite de commande Linux:</p>
<pre>
./validate.sh custom.html
</pre>
<p>
Si le fichier est valide, vous recevrez un message donnant le nom du fichier et quelques statistiques à son propos, comme ceci:
</p>
<pre>
custom.html: 543;50;0 ms
  (15 elems, 20 attrs, 9 spaces, 43 chars)
</pre>
<p>
Si le fichier n&#8217;est pas valide, vous obtiendrez des messages d&#8217;erreur. Par exemple, si vous essayer de valider un fichier badfile.html contenant ces erreurs:</p>
<pre>
&lt;p&gt;Email: &lt;input type=&quot;text&quot; name=&quot;email&quot; size=&quot;40&quot;
	required=&quot;yes&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Comments:&lt;br /&gt;
&lt;textarea maxlength=&quot;300&quot; inquirer=&quot;false&quot;
   rows=&quot;7&quot; cols=&quot;50&quot;&gt;&lt;/textarea&gt;
</pre>
<p>
Vous obtiendrez cette sortie de l&#8217;analyseur:</p>
<pre>
[Error] badfile.html:12:70: Attribute &quot;required&quot;
  with value &quot;yes&quot; must have a value from the
  list &quot;true false &quot;.
[Error] badfile.html:14:63: Attribute &quot;inquirer&quot;
  must be declared for element type &quot;textarea&quot;
badfile.html:
  611;82;0 ms (15 elems, 20 attrs, 9 spaces, 43 chars)
</pre>
<h2> Autre méthode de validation </h2>
<p>Si vous utilisez l&#8217;éditeur <a href="http://www.jEdit.org">jEdit</a>, vous pouvez télécharger le plugin XML. Si votre fichier porte l&#8217;extension xhtml, jEdit utilisera la DTD personnalisée pour la validation comme spécifié dans le DOCTYPE.</p>
<h2> Conclusion </h2>
<p>
Il est facile de spécifier des attributs supplémentaires pour des éléments XHTML; avec un peu de travail, vous pourrez mettre en place un valideur pour vérifier vos fichiers avec votre version personnalisée HTML. <a href="http://www.alistapart.com/d/customdtd/custom_dtd_sample_files.zip">Télécharger tous les fichiers d&#8217;exemple de cet article</a> et c&#8217;est parti!
</p>
<h2>&Agrave; propos de l&#8217;auteur</h2>
<p><a href="mailto:catcode@catcode.com">J. David Eisenberg</a> est programmeur et professeur habitant &agrave; San Jose, CA avec son chat, Marco Polo. La plupart de son travail porte sur XML, Java, JavaScript et Perl. Il est aussi l&#8217;auteur d&#8217;un livre sur <a href="http://oreilly.com/catalog/9780596002237/">le format d&#8217;images vectorielles SVG</a>. Plus d&#8217;information sur <a href="http://catcode.com/narrative.html">catcode.com/narrative.html</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://z720.net/blog/archives/2005/03/03/valider-une-dtd-personnalisee/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Introduction XSLT</title>
		<link>http://z720.net/blog/archives/2004/12/08/introduction-xslt</link>
		<comments>http://z720.net/blog/archives/2004/12/08/introduction-xslt#comments</comments>
		<pubDate>Wed, 08 Dec 2004 12:05:17 +0000</pubDate>
		<dc:creator>Seb</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[WebStandards]]></category>

		<guid isPermaLink="false">/?p=13</guid>
		<description><![CDATA[Il y a quelques temps, j&#8217;ai vu un article très intéressant sur Digital-Web traitant d&#8217;une introduction à XSLT côté client. Je trouve cet article vraiment très bien fait, même si ce n&#8217;est pas encore une réalité puique peut de navigateurs supporte correctement XSLT. Cependant cela fait une très bonne introduction transposable aux XSLT côté serveur. [...]]]></description>
			<content:encoded><![CDATA[<p>Il y a quelques temps, j&#8217;ai vu un article très intéressant sur <a href="http://www.digital-web.com" hreflang="en">Digital-Web</a> traitant d&#8217;une <a href="http://www.digital-web.com/articles/client_side_xslt" hreflang="en">introduction à <acronym title="eXtensible Stylesheet Language Transformation">XSLT</acronym> côté client</a>.</p>
<p><span id="more-13"></span></p>
<p>Je trouve cet article vraiment très bien fait, même si ce n&#8217;est pas encore une réalité puique peut de navigateurs supporte correctement <acronym title="eXtensible Stylesheet Language Transformation">XSLT</acronym>. Cependant cela fait une très bonne introduction transposable aux <acronym title="eXtensible Stylesheet Language Transformation">XSLT</acronym> côté serveur. Il ne manque que les indications sur la programmation d&#8217;un parseur qui est censé effectivement réaliser la transformation.</p>
<p>Je trouve cet article tellement bien que je pense en faire une traduction française. Je la proposerai probablement sur <a href="http://www.pompage.net" hreflang="fr">pompage.net</a> mais je ne suis pas encore décidé.</p>
<p>J&#8217;ai commencé la traduction, il est possible de voir le travail avancer et même de participer sur la page wiki dédié à la traduction de cet article</p>
]]></content:encoded>
			<wfw:commentRss>http://z720.net/blog/archives/2004/12/08/introduction-xslt/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>FireFox</title>
		<link>http://z720.net/blog/archives/2004/09/24/firefox</link>
		<comments>http://z720.net/blog/archives/2004/09/24/firefox#comments</comments>
		<pubDate>Fri, 24 Sep 2004 08:25:57 +0000</pubDate>
		<dc:creator>Seb</dc:creator>
				<category><![CDATA[WebStandards]]></category>

		<guid isPermaLink="false">/?p=31</guid>
		<description><![CDATA[ <p>Il est vrai que j'arrive un peu apr&#232;s la bataille mais &#231;a ne fait pas de mal de soutenir un projet int&#233;ressant...</p>]]></description>
			<content:encoded><![CDATA[<p>Il est vrai que j&#8217;arrive un peu apr&egrave;s la bataille mais &ccedil;a ne fait pas de mal de soutenir un projet int&eacute;ressant&#8230;</p>
<p><span id="more-31"></span></p>
<p>Pour ceux qui ne connaissent pas FireFox : il s&#8217;agit du navigateur de Mozilla bas&eacute; sur le moteur Gecko. A savoir que le moteur Gecko est le meilleur interpr&eacute;teur de document HTML dans la mesure o&ugrave; il respecte au mieux les sp&eacute;cifications des standards du web&#8230;</p>
<p>Donc si vous utilisez encore Microsoft Internet Explorer, je vous conseille vivement de changer&#8230; Firefox est une bonne alternative mais pas forcement la meilleure : <a href="http://browsehappy.com/" title="Browse Happy: Switch to a safer browser today">Faites votre choix pour un navigateur alternatif</a>.</p>
<p>
<a href="http://www.spreadfirefox.com/?q=affiliates&amp;id=10125&amp;t=58"><img alt="Get Firefox!" title="Get Firefox!" src="http://www.spreadfirefox.com/community/images/affiliates/Buttons/180x60/get.gif"/></a></p>
]]></content:encoded>
			<wfw:commentRss>http://z720.net/blog/archives/2004/09/24/firefox/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Kalitee.org</title>
		<link>http://z720.net/blog/archives/2004/09/16/kalitee</link>
		<comments>http://z720.net/blog/archives/2004/09/16/kalitee#comments</comments>
		<pubDate>Thu, 16 Sep 2004 20:10:00 +0000</pubDate>
		<dc:creator>Seb</dc:creator>
				<category><![CDATA[WebStandards]]></category>

		<guid isPermaLink="false">/?p=33</guid>
		<description><![CDATA[ <p><a href="http://www.kalitee.org"><img src="/blog/images/kalitee.png" alt="Capture : accueil Kalitee.org" style="float:left; margin: 0 1em 1em 0;" /></a></p>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.kalitee.org"><img src="/blog/images/kalitee.png" alt="Capture : accueil Kalitee.org" style="float:left; margin: 0 1em 1em 0;" /></a></p>
<p><span id="more-33"></span></p>
<h3>Premi&egrave;re impression</h3>
<p>Enfin un joli site francophone &agrave;  la <a href="http://www.cssvault.com" hreflang="en">CSSVault</a>, <a href="http://www.weeklystandards.com" hreflang="en">The Weekly Standards</a> <a href="http://www.webstandardsawards.com/" hreflang="en" title="Web Standards Awards">WSA</a> et consorts.</p>
<p>Le style est assez &eacute;pur&eacute;, et j&#8217;aime bien cela. Je trouve que le canap&eacute; donne une belle impression de confort. cela donne un petit effet &laquo;&nbsp;cosy&nbsp;&raquo; qui est fort agr&eacute;able. Par contre les couleurs sont un peu claires, notamment sur les liens, j&#8217;aurais bien vu quelque chose de plus tranchant afin de mieux les faire resortir.</p>
<h3>Technique et s&eacute;mantique</h3>
<p>Bien &eacute;videment, le site valide bien en <acronym title="eXtensible HyperText Markup Language">XHTML</acronym> 1.0 Strict, ainsi que la <acronym title="Cascading Style Sheets">CSS</acronym>. En plus je trouve que la s&eacute;mantique en elle-m&ecirc;me est bien respect&eacute;e. Le code ne souffre pas trop <a href="http://www.alsacreations.com/blog/index.php?2004/08/15/51-maladies-exotiques-des-css" hreflang="fr" title="Lire sur Alsacreations.com&nbsp;: Maladies exotiques des css">la divite chronique</a> puisqu&#8217;il n&#8217;y a que 5 DIV pour toute la page.</p>
<p>A noter aussi&nbsp;: la <acronym title="Cascading Style Sheets">CSS</acronym> est tr&egrave;s bien faite, pas du tout comment&eacute;e mais tellement claire que les commentaires sont presque inutiles. De plus aucun <acronym title="Technique pour sp&eacute;cifier des attributs pour un navigateur particulier">hack</acronym> n&#8217;a &eacute;t&eacute; employ&eacute;. Cela explique probablement le petit d&eacute;calage de l&#8217;image d&#8217;ent&ecirc;te sur la gauche dans <acronym title="Internet Explorer">IE</acronym>5.5.</p>
<h3>Conclusion</h3>
<p>Je refuse de rentrer dans le d&eacute;bat qui oppose quelques blogger &agrave;  propos de ce site et du site <a href="http://www.w3f.info" hreflang="fr" title="World Wide Web Francophone">W3F</a> qui ont le m&ecirc;me but&nbsp;: la promotion des sites web francophones respectant les standards.</p>
<p>Pour moi <a href="http://www.kalitee.org" hreflang="fr">Kalitee</a> est un site tr&egrave;s bien r&eacute;ussi autant au niveau visuel qu&#8217;au niveau ergonomique.</p>
]]></content:encoded>
			<wfw:commentRss>http://z720.net/blog/archives/2004/09/16/kalitee/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Objectifs WebStandards</title>
		<link>http://z720.net/blog/archives/2004/07/19/objectifs-webstandards</link>
		<comments>http://z720.net/blog/archives/2004/07/19/objectifs-webstandards#comments</comments>
		<pubDate>Mon, 19 Jul 2004 19:14:35 +0000</pubDate>
		<dc:creator>Seb</dc:creator>
				<category><![CDATA[WebStandards]]></category>

		<guid isPermaLink="false">/?p=42</guid>
		<description><![CDATA[ <p>Le but de cette cat&#233;gorie reprend principalement le concept de sites comme&#160;:</p>]]></description>
			<content:encoded><![CDATA[<p>Le but de cette cat&eacute;gorie reprend principalement le concept de sites comme&nbsp;:</p>
<p><span id="more-42"></span>
<ul>
<li><a href="http://www.cssvault.com" hreflang="en">Css Vault</a></li>
<li><a href="http://www.cssbeauty.com" hreflang="en">Css Beauty</a></li>
<li><a href="http://www.weeklystandards.com" hreflang="en">The Weekly Standards</a></li>
<li><a href="http://www.webstandardsawards.com" hreflang="en">Web Standards Awards</a></li>
</ul>
<p>Il s&#8217;agit de faire la promotion de sites réalisés en conformité avec les standards du <acronym title="WorldWide Web Consortium">W3C</acronym> dont la qualité graphique et la sémantique est remarquable.</p>
<p>La seule différence ici, c&#8217;est que les sites proposés seront en français. Malheureusement j&#8217;ai un peu de mal à trouver des sites qui me conviennent donc si vous avez des idées pour ouvrir la série, n&#8217;hésitez pas à me laisser un commentaire.</p>
]]></content:encoded>
			<wfw:commentRss>http://z720.net/blog/archives/2004/07/19/objectifs-webstandards/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
