Decisión de diseño: ¿por qué generar <p> sin </p>?

14

tl; dr

Algunos programas ampliamente utilizados, que generan html, solo generarán etiquetas de párrafo de apertura y no de cierre, suponiendo que el navegador cierre los párrafos correctamente.

A primera vista, me parece que la suposición de que los navegadores cerrarán los párrafos correctamente no es correcta. ¿Es correcta mi interpretación? En términos más generales, ¿qué compensaciones están involucradas en este tipo de decisión?


Al examinar el código fuente de moinmoin, me llamó la atención la siguiente línea de código:

# We only open those tags and let the browser auto-close them:
_auto_closing_tags = set(['p'])

( fuente )

Después de leer el resto de la implementación, me he convencido de que sí, de hecho, cuando moinmoin genera código html para una de sus páginas, generará correctamente etiquetas abiertas de párrafo, cuando corresponda, mientras que al mismo tiempo evita deliberadamente las etiquetas de cierre de párrafo (a pesar de poder hacerlo trivialmente).

Para mi caso de uso específico, bastante inusual, este comportamiento no es correcto. Estoy tentado a enviar un informe de error y / o cambiar el comportamiento. Sin embargo, parece que esta decisión de diseño se tomó cuidadosamente. No estoy lo suficientemente versado en las complejidades del estándar html, o las diversas implementaciones del navegador, para poder decir si este es el comportamiento correcto en general, y tengo la sensación de que mi instinto para corregir / cambiar este comportamiento podría ser equivocado.

¿Este código hace una suposición válida sobre las implementaciones del navegador? ¿Es válido el html generado? En términos más generales, ¿qué compensaciones podría estar perdiendo aquí?

blueberryfields
fuente
2
A pesar de las respuestas actuales, esto parece un diseño imbécil. "Sé liberal en lo que aceptas y conservador en lo que envías" y todo eso. También es completamente innecesario. Yo definitivamente presentar una (enérgico) informe de error a moinmoin. Como mínimo, deberían documentar y comentar claramente este comportamiento poco intuitivo.
Konrad Rudolph

Respuestas:

33

Las etiquetas finales para los pelementos eran opcionales en HTML y solo se requerían en XHTML. Sin embargo, el borrador HTML5 presenta un conjunto de condiciones para cuando la petiqueta final es realmente opcional:

La etiqueta final de un elemento p puede omitirse si el elemento p es seguido inmediatamente por una dirección, artículo, aparte, comilla de bloque, dir, div, dl, conjunto de campos, pie de página, formulario, h1, h2, h3, h4, h5, h6, encabezado , hgroup, hr, menu, nav, ol, p, pre, section, table o ul, element, o si no hay más contenido en el elemento padre y el elemento padre no es un elemento.

Fuente: especificación HTML5

Dicho esto, el único argumento que he escuchado para omitir las etiquetas finales para los pelementos es el tamaño del documento. Depende completamente de usted decidir si eso tiene sentido para su documento o no. Personalmente, tiendo a incluir todas las etiquetas finales opcionales, en caso de que no cumpla con los requisitos para cuando la etiqueta final es opcional.

Yannis
fuente
55
Grandes mentes piensan igual, supongo. :)
Robert Harvey
@RobertHarvey Ganas esta ronda, por 12 segundos ...
yannis
2
Otro argumento a favor de omitir las etiquetas finales: son evidentes a partir de la estructura del documento y, cuando se usan incorrectamente, también pueden introducir espacios en blanco espurios.
Jon Purdy
1
Poder omitir etiquetas finales fue explícitamente una característica de diseño de SGML, en la que se basaba HTML. También explícitamente NO era una característica de XML, en la que se basa XHTML.
Alan Shutko
44
Un argumento que veo mucho es que se ve más limpio. Particularmente en el caso de las <li>etiquetas, las etiquetas actúan más como viñetas.
DisgruntledGoat
16

La especificación W3C para HTML5 establece específicamente que:

La etiqueta final de un elemento p puede omitirse si el elemento p es seguido inmediatamente por una dirección, artículo, aparte, comilla de bloque, dir, div, dl, conjunto de campos, pie de página, formulario, h1, h2, h3, h4, h5, h6, encabezado , hr, menu, nav, ol, p, pre, section, table o ul element, o si no hay más contenido en el elemento padre y el elemento padre no es un elemento.

Entonces, básicamente, la especificación ha proporcionado muchas formas en que se puede evitar la complejidad (grande o pequeña que sea) de cerrar la etiqueta. Cualquier implementación de navegador conforme tendría que acomodar estas excepciones.

Robert Harvey
fuente