Введение
Синтаксически или структурно некорректный код разметки веб-страницы.
В веб-разработке термин "tag soup" (суп тегов) используется как пренебрежительное обозначение для HTML-кода веб-страницы, содержащего синтаксические или структурные ошибки. Исторически веб-браузеры лояльно относились к ошибкам в синтаксисе и структуре HTML, поэтому у веб-разработчиков не было стимула следовать опубликованным стандартам. В связи с этим существует необходимость в том, чтобы все реализации браузеров предоставляли механизмы для обработки "супа тегов", принимая и исправляя недействительный синтаксис и структуру, где это возможно. HTML-парсер (часть веб-браузера), способный интерпретировать HTML-разметку даже при наличии синтаксических или структурных ошибок, может называться парсером "супа тегов". В настоящее время все основные веб-браузеры оснащены парсером "супа тегов" для интерпретации некорректно сформированного HTML, при этом большинство элементов обработки ошибок стандартизированы. "Суп тегов" включает в себя множество распространенных ошибок при создании веб-страниц, таких как некорректно сформированные HTML-теги, неправильно вложенные HTML-элементы и неэкранированные символьные сущности (особенно амперсанды (&) и знаки меньше (<)). Служба проверки разметки является ресурсом для авторов веб-страниц, позволяющим избежать создания "супа тегов".
Обзор
"Тэг-суп" – термин, используемый для критики различных практик в веб-разработке. Некоторые из них (приблизительно упорядоченные от наиболее серьёзных к наименее серьёзным) включают:
Некорректная разметка, при которой теги неправильно вложены или некорректно закрыты. Например: <p>Это некорректный фрагмент <em>HTML.</p></em>
Недопустимая структура, при которой элементы вложены неправильно в соответствии с DTD для документа. Примеры включают вложение элемента "ul" непосредственно внутрь другого элемента "ul" для любого из DTD HTML 4.01 или XHTML. Дэн Коннолли приводит в пример использование элемента `<title>` вне секции `<head>`. Использование проприетарных или неопределённых элементов и атрибутов вместо тех, которые определены в рекомендациях W3C. Например, использование элементов Blink или Marquee, которые изначально были нестандартными элементами, поддерживаемыми только браузерами Netscape и Internet Explorer соответственно.
Invalid structure where elements are improperly nested according to the DTD for the document. Examples of this include nesting a "ul" element directly inside another "ul" element for any of the HTML 4.01 or XHTML DTDs. Dan Connolly cites the use of title element outside the head section. Use of proprietary or undefined elements and attributes instead of those defined in W3C recommendations. For example the use of the Blink element or the Marquee element which were non standard elements originally only supported by Netscape and Internet Explorer browsers respectively.
Неисправная разметка
Неправильная разметка, пожалуй, является самой серьезной проблемой при создании веб-страниц. Однако, благодаря повышению уровня образования и доступности информации, а возможно, и с помощью XHTML, проблема неправильной разметки становится менее распространенной. Браузеры, сталкиваясь с некорректной разметкой, вынуждены догадываться о намерениях автора. Им приходится предполагать наличие закрывающих тегов там, где они ожидаются, а затем и соответствующих открывающих тегов. Интерпретация может существенно различаться в разных браузерах. Хотя многие графические веб-редакторы генерируют корректную разметку, автор, пишущий код вручную в текстовом редакторе и тестирующий его только в одном браузере, может легко не заметить такие ошибки. В результате отображение может сильно отличаться в зависимости от браузера, поскольку каждый из них пытается по-своему "исправить" замысел автора и затем применяет стили к этим "исправлениям".
Недействительная структура документа
Недействительная структура документа в данном случае означает использование атрибутов и элементов не по назначению. Например, добавление атрибута "cite" к элементу "cite" является ошибкой, поскольку спецификации HTML и XHTML DTD не определяют значения для этого атрибута в контексте данного элемента. Аналогично, включение элемента "p" внутрь элемента "em" также недопустимо. В связи с тенденцией к разделению некорректной и недействительной разметки, проблемы, связанные с недействительной разметкой, стали рассматриваться как менее критичные. Некоторые предлагают использовать более гибкие модели содержимого, позволяющие авторам создавать HTML-документы (как в HTML, так и в XHTML) с большей свободой. Однако использование недействительной разметки может исказить первоначальный замысел автора, хотя и не в такой степени, как некорректная разметка. Многие графические веб-редакторы по-прежнему генерируют недействительную разметку. Более того, многие профессиональные веб-дизайнеры и разработчики не обращают достаточного внимания на валидность кода. Недействительную разметку можно встретить на множестве сайтов в интернете.
Использование запатентованных/утраченных элементов
В ранние годы развития веб (большая часть 1990-х годов) разработка официальной спецификации HTML становилась все более затруднительной, в сравнении с потребностью дизайнеров в гибкости при создании визуально выразительных макетов. В ответ на это давление производители браузеров в одностороннем порядке добавляли новые проприетарные функции в HTML, которые не соответствовали стандартам того времени. Это приводило к тому, что в HTML появлялись проприетарные элементы, работающие в одних браузерах, но не в других. В некоторой степени эту проблему удалось замедлить благодаря внедрению новых стандартов W3C, таких как CSS, представленный в 1998 году, который обеспечил большую гибкость в оформлении и компоновке веб-страниц без необходимости использования большого количества дополнительных HTML-элементов и атрибутов. Кроме того, в HTML 4 и XHTML 1 многие элементы были либо заменены единой семантической конструкцией (например, элементы `<object>` заменили проприетарные `<applet>` и `<embed>`), либо признаны устаревшими из-за своей презентационной направленности (например, элементы `<s>`, `<strike>` и `<u>`). Тем не менее, разработчики браузеров продолжали добавлять новые элементы в HTML, когда считали это необходимым. Некоторые браузеры включали атрибут `tabindex` в любой элемент. Разработчики WebKit от Apple представили элемент `<canvas>`, версию которого впоследствии переняла Mozilla. В 2004 году Apple, Mozilla и Opera основали WHATWG с целью создания новой версии спецификации HTML, которой бы соответствовало поведение всех браузеров. Это подразумевало изменение спецификации, если это необходимо, для соответствия существующему консенсусу между различными браузерами. Элементы `<canvas>` и `<embed>` впоследствии были стандартизированы WHATWG. Некоторые элементы (включая `<b>`, `<i>` и `<small>`), которые ранее считались презентационными и устаревшими, были включены, но определены в медианезависимом, а не визуальном формате. Версии спецификации WHATWG были опубликованы W3C под названием HTML5. Версии Microsoft Internet Explorer до 9 не отображают XHTML-документы, поданные как application/xhtml+xml. IE9 и более поздние версии соответствуют стандартам. Подробнее об этой проблеме см. в статье XHTML.
HTML5
HTML5 стремится стать наиболее полным решением проблемы "супа тегов" на сегодняшний день, оставаясь при этом максимально совместимым как с устаревшими, так и с будущими стандартами. В отличие от XHTML, который жертвует обратной совместимостью и считает, что парсеры должны стать менее терпимыми к некорректной разметке, HTML5 признает, что большое количество некорректного HTML-кода уже существует и, вероятно, продолжит использоваться, и поэтому спецификация должна быть расширена для обеспечения максимальной совместимости с таким кодом. Таким образом, спецификация HTML5 изменила определение синтаксиса HTML, чтобы учитывать распространенный синтаксис, используемый сегодня, и явно описать, как парсер должен обрабатывать "некорректный код". Обработка некорректного кода теперь включена непосредственно в спецификацию, что, как ожидается, снизит необходимость для будущих HTML-парсеров реализовывать дополнительные, не предусмотренные спецификацией меры для работы с кодом, который они не распознают.
Валидные отклонения от XHTML
В отличие от строгого XHTML, HTML и его предшественник SGML разработаны для написания человеком и уже обладают значительной гибкостью синтаксиса, чтобы уменьшить объем шаблонного кода. Эти различия не делают документ недействительным и, следовательно, не являются "супом из тегов". Приведенные ниже правила применимы как к HTML 4, так и к HTML5, и примеры восходят к первым дням HTML. Некоторые теги, например, часто можно опускать полностью. Закрывающие теги часто можно опускать, поскольку спецификация не допускает вложение некоторых элементов друг в друга. Например, несколько элементов `<p>` можно записать без закрывающих тегов. Несмотря на допустимость таких упущений, для их разбора все равно требуется специальный парсер, знакомый с HTML (в отличие от более строгого XML). Кроме того, инструменты часто "исправляют" подобные структуры. Например, HTML Tidy позволяет опускать необязательные теги, но по умолчанию этого не делает.