5.1.1.

03 junio 2005

¡HTML es estricto!

Categoría
Haciendo amigos por enésima vez. Para evitar problemas, evitaré mencionar la fuente de cada cita —aunque no debería ser muy difícil encontrar gente que represente ese tipo de pensamiento.

XHTML es mucho más estricto que HTML.

Entiéndase que la frase anterior se dice mientras se muestra como todos los elementos tienen que tener su correspondiente etiqueta de cierre.

El siguiente bloque de código es HTML 4 válido y una muestra de lo estricto que es:

<p>
<div>
 Texto
</div>

Si no se dieron cuenta de lo reusable y lo estricto, ¿qué mejor que mirar las especificaciones? El DTD de HTML 4 declara al elemento P:

<!ELEMENT P - O (%inline;)*            -- paragraph -->

El contenido entre paréntesis se refiere al tipo de contenido que el elemento acepta. En este caso, %inline; se refiere a elementos en línea (más conocidos como inline).

<!-- %inline; covers inline or "text-level" elements -->
<!ENTITY % inline "#PCDATA | %fontstyle; | %phrase; | %special; | %formctrl;">

Para que se den una idea, inline se refiere tanto al texto y a ciertos elementos como A, SPAN o STRONG.

Pero volviendo al ejemplo original, ¿qué es un elemento DIV? ¡DIV es un elemento de tipo bloque!

<!ENTITY % block
     "P | %heading; | %list; | %preformatted; | DL | DIV | NOSCRIPT |
      BLOCKQUOTE | FORM | HR | TABLE | FIELDSET | ADDRESS">

Por tal razón, es inadmisible que ocurra dentro de un elemento P. Entonces cuando un navegador con dos dedos de frente se encuentra con un elemento P sin etiqueta de cierre seguido de un elemento de tipo bloque (DIV en ejemplo) sabe perfectamente que P termina donde empieza el siguiente.

Por favor, no crean que esto una locura mía. Fíjense nuevamente la declaración para el elemento P. Luego del nombre del elemento tenemos un guión y una letra O. El guión significa que la etiqueta de apertura es obligatoria, pero que la de cierre es opcional. Si quieren hechos, simplemente defínanle un color de fondo al elemento P y fíjense dónde termina el color. En un navegador decente —cualquiera calculo— el contenido de DIV no se debería ver afectado.

En XHTML el ejemplo anterior tendría que ser reescrito para volverlo más estricto.

<p></p>
<div>Texto</div>

¿Pero por qué tenemos que hacer esto cuando en HTML 4 quedó demostrado que no es necesario? Muy simple. Porque XHTML es XML, o al menos la mayoría cree estar utilizando XML. Un analizador de XML no conoce nada de HTML, sólo distingue etiquetas. Entonces, en el ejemplo de XHTML válido, no tendría problemas en entender que P termina en cuanto encuentra la etiqueta </p>. En cambio, en el ejemplo de HTML válido, no tiene por qué saber que P termina donde empieza DIV, por tal va a considerar a DIV como hijo de P y seguirá analizando el documento con la esperanza de encontrar la etiqueta de cierre para éste último.

XHTML funciona mejor con dispositivos móviles, navegadores antiguos, etc.

Error. Si estamos hablando de navegadores comunes y corrientes (sin importar antigüedad o plataforma), deberían ser perfectamente capaces de leer un documento HTML. Ya quedó claro antes que HTML tiene reglas claras. De ahí a que un navegador tenga errores es una tema ajeno a HTML.

Programar un analizador de XML sin duda sería mucho más fácil que uno de HTML pero la diferencia es mínima. Si el analizador conoce la diferencia entre un P y un DIV, entonces no debería importarle si tiene que trabajar sobre un documento XHTML o uno HTML. Aclaro igualmente que estamos suponiendo que ambos documentos son válidos —analizar un documento no válido puede ser un parto sin importar las reglas que estemos usando.

Otro ejemplo de HTML:

1. <dl>
2. <dt>Termino 1
3.  <dd>Definición 1
4.  <dd>Definición 2
5.   <p>Párrafo 1
6. <dt>Termino 2 
7.  <dd>Definición 3
8. </dl>
9. <p>Párrafo 2

DT sólo puede contener elementos inline, por lo que ante la apertura de DD en la línea 3 sabe que debe cerrarse.

DD no puede contener otro DD por lo que el de la línea 3 se cierra en cuanto empieza el de la linea 4.

DD puede contener tanto elementos de tipo inline como tipo bloque por lo que el elemento DD de la línea 4 puede tener por hijo al elemento P de la línea 5.

Como P sólo puede contener elementos de tipo inline, al ver la apertura de un nuevo DT en la línea 6, sabe que debe cerrarse. Como DD tampoco puede contener a DT, también se cierra.

En la línea 8 cerramos a DL como una forma de avisarle al DD de la línea 7 que también debe cerrarse, y así evitar que contenga al elemento P de la línea 9.

¿Y si quisiéramos reutilizar un documento HTML en una aplicación que sólo recibe XML? Es claro que en principio no se puede. Un analizador no podría entender las reglas de HTML. Pero para eso existen herramientas como Tidy. Tidy es lo bastante inteligente como para entender las reglas de HTML y agregar las etiquetas de cierre donde corresponden y así tener un documento XML bien anidado.

Entonces HTML es tan estricto como XHTML. Las etiquetas de cierre obligatorias —la causa de lo estricto— no van a impedir que haya gente escribiendo <a><h1>Titulo</h1></a> esperando que funcione mientras se sienten orgullosos por estar usando la última tecnología.

Powered by Blogger