XHTML je mrtvé! Ať žije HTML5! Nebo ne?

Před deseti lety bylo moderní dělat weby v XHTML a v tento jazyk byly vkládány velké naděje. Pak nastalo jisté vystřízlivění a s mohutnou propagací HTML5 v posledních několika letech i jisté zatracení XHTML. Nenechme se však zmást. HTML5 a XHTML se nevylučují, naopak specifikace HTML5 je v mnoha ohledech nejlepší specifikací XHTML, jaká kdy existovala.

Vývoj syntaxe HTML/XHTML

Pro lepší pochopení souvislostí se na chvíli vydáme do historie jazyka HTML. Při návrhu první verze jazyka HTML se jeho autor Tim Berners-Lee inspiroval jazykem SGML. SGML je poměrně složitý jazyk pro definici dalších značkovacích jazyků. Z tohoto důvodu se již od dob prvních prohlížečů nepoužívá pro čtení HTML plnohodnotný parser SGML, ale mnohem jednodušší parser HTML.

Další verze jazyka HTML, počínaje verzí HTML 2.0 a konče verzí HTML 4.01, definovaly syntaxi jazyka právě odvozením od SGML. Prohlížeče však stále používaly specializované parsery HTML. Jejich složitost navíc neustále rostla, protože se snažily co nejlépe automaticky vypořádávat s chybami v kódu. Webové stránky chtěl psát každý, takže se běžně stávalo, že tu nějaký tag chyběl, tu se někde neukončila hodnota atributu,… Takový syntakticky špatný kód se začal označovat pěkným termínem „tag soup“.

Na konci devadesátých let minulého století se pak časově sešlo několik faktorů, které ovlivnily další směřování jazyka HTML:

  • potřeba bezpečného rozšiřování jazyka (žádné divoce přidávané elementy jednotlivými výrobci prohlížečů jako dříve);

  • snaha o vymýcení syntakticky nekorektních stránek;

  • snaha o sjednocení toho, jak je syntaxe definována a jak je skutečně zpracovávána prohlížeči;

  • snaha o zjednodušení parseru, tak aby jej bylo snazší provozovat na zařízeních s omezenými zdroji.

V té době se jako správná cesta pro řešení těchto požadavků zdálo XHTML. Elementy a atributy jazyka HTML se nechaly beze změny, jen se řeklo, že syntaxe musí splňovat přísnější pravidla XML. Oproti SGML je XML jednoduché, existuje spoustu hotových parserů, takže výrobcům prohlížečů teoreticky nic nebránilo v tom je použít a celkem snadno implementovat podporu XHTML v prohlížeči.

Bohužel cíle XHTML se dílem kvůli nedomyšlené specifikaci a dílem kvůli šlendriánu výrobců prohlížečů nepodařilo dosáhnout. Cílem článku není podrobně se zabývat přínosy a problémy XHTML. Připomeňme však alespoň nejdůležitější fakta. Hlavní problém XHTML byl v tom, že přinášelo mnoho problémů, ale nenabízelo žádné nové funkce a elementy, kvůli kterým by stálo za to vypořádat se s problémy jazyka.

Netolerantní XHTML

Z historie přístupů k ošetření chyb na webových stránkách

Asi největším problémem XHTML byl přístup implementací k obsluze chyb. Sebemenší syntaktická chyba v dokumentu vedla k odmítnutí jeho zpracování. Představme si jednoduchou XHTML stránku s překříženými elementy:

<?xml version="1.0" encoding="utf-8"?>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="cs">
  <head>
    <title>Pokusná XHTML stránka s chybou</title>
  </head>
  <body>
    <p>A <b>teď to <i>přijde</b></i>.</p>
    <p>Druhý odstavec</p>
  </body>
</html>

Bohužel, když se podíváme, co místo této stránky zobrazí webové prohlížeče, není výsledek zrovna radostný. Každý zobrazí něco jiného a navíc naprosto neužitečného pro běžného konzumenta stránek.

Internet Explorer
Firefox
Chrome
Opera

Příčinou tohoto striktního chování prohlížečů je poněkud úzkoprsý výklad specifikací XHTML a XML. Prohlížeče používají tzv. „draconian error handling“ – jakmile je na stránce sebemenší chyba, stránka se dále nezpracovává. Proč by však autor webových stránek na sebe dobrovolně pouštěl bič striktní syntaxe XHTML, když mu to nepřinese žádné nové možnosti.

Dalším problémem XHTML bylo, že ve svých verzích 1.0 a 1.1 nepřinášelo žádnou novou funkcionalitu oproti HTML 4.01, která by motivovala vývojáře k přechodu. Navíc specifikace XHTML byla napsaná v některých místech tak nešťastně, že formálně znemožňovala si do XHTML přidávat nové elementy/atributy, což měla být jedna z výhod nového jazyka.

Nicméně pokud bychom hledali hlavního viníka neúspěchu XHTML, budou to výrobci prohlížečů. Ač bylo na začátku nového milénia XHTML masově propagováno, výrobce nejmenovaného prohlížeče podporu XHTML přidal až do jeho verze číslo 9, která vyšla letos – o pouhých 10 let později než měla. Ani alternativní prohlížeče však nemají ohledně XHTML čisté svědomí. Kromě již zmíněné uživatelsky nešikované obsluhy chyb, bylo zpracování XHTML věnováno mnohem méně péče než HTML. Například se XHTML stránky dlouhou dobu vykreslovaly pomaleji než HTML, protože se čekalo až se celá stránka načte do paměti a teprve kompletně vybudovaný DOM se poslal k vykreslení. U HTML se přitom vykresluje stránka postupně během načítání. Podobný mechanismus se pro XHTML do prohlížečů dostal až v roce 2006.

HTML5 – napravíme 15 let staré problémy

O HTML5 se poslední čtyři roky mluví stále častěji, někdy možná až moc často. Rozebírají se nové možnosti pro práci s multimédii, nová javascriptová API usnadňující tvorbu webových aplikací nebo se ukazují oslňující grafické efekty v prohlížeči (ty však nemají přímo s HTML5 moc společného, jedná se většinou o funkcionalitu CSS3 a SVG). Nikde se však nedočtete, že by se snad vaše HTML5 stránka neměla zobrazit, pokud v ní někde uděláte malý překlep.

Dnešní rozruch okolo HTML5 je naprosto pochopitelný. I když některé části HTML5 nejsou zdaleka stabilní, i tak pořád zbývá spoustu nových užitečných funkcí, které podstatně ulehčí tvorbu moderních webových stránek a aplikací. O výhodách samotného HTML5 a přechodu na něj tak není potřeba téměř nikoho dlouho přesvědčovat.

V mnoha článcích o HTML5 se dočtete, že jazyk navazuje na „staré dobré“ HTML 4.01, že XHTML se nepovedlo. Ona to přitom není tak úplně pravda. HTML5 sice původně vzniklo jako reakce na vývoj nové verze XHTML 2.0, která zcela rušila zpětnou kompatibilitu a odtrhla se tak zcela od reality běžného webového vývojáře i výrobce prohlížeče. HTML5 je přitom v tomto ohledu velice konzervativní, snaží se navázat na existující osvědčené postupy a jen je vylepšit nebo lépe definovat.

Proč je algoritmus čtení a analýzy HTML5 tak složitý?

Oproti předchozím verzím HTML je přesně definováno, co se má stát (jak se konstruuje DOM) v případě, že je ve stránce syntaktická chyba. Navíc toto chování je navrženo tak, aby bylo co nejvíce v souladu s chováními existujících prohlížečů. Hodně zjednodušeně řečeno se jedná o algoritmus, který vznikl studiem chování IE6 metodou reverzního inženýrství.

Duální syntaxe HTML5

Zcela v tomto duchu tak HTML5 nabízí možnost stránky zapisovat dvěma různými způsoby. První syntaxe navazuje na klasické HTML, kde se například nemusí uzavírat většina elementů. Na rozdíl od dřívějších verzí HTML však jazyk není formálně definován pomocí SGML. Místo toho je velice přesně definováno, jak se mají prohlížeče chovat i v případě, že naleznou chybu v kódu HTML. Tím by mělo být zaručeno konzistentní zpracování stránek v různých prohlížečích. Konečně se tak formální definice jazyka sjednotila s praxí.

V některých aspektech je tato syntaxe dokonce jednodušší než HTML 4.01, zejména v oblasti nastavení !DOCTYPE nebo určení kódování.

HTML5 HTML 4.01
<!DOCTYPE html>
<html lang="cs">
  <head>
    <meta charset=utf-8>
    <title>Pokusná stránka v HTML5</title>

  </head>
  <body>
    <p>A <b>teď to <i>přijde</i></b>.</p>

    <p>Druhý odstavec</p>
  </body>
</html>
<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN'>
<html lang="cs">

  <head>
    <meta http-equiv="Content-type" content="text/html;charset=utf-8">
    <title>Pokusná stránka v HTML</title>
  </head>
  <body>

    <p>A <b>teď to <i>přijde</i></b>.</p>
    <p>Druhý odstavec</p>

  </body>
</html>

Pokud však ve stránce uděláme nějakou chybu, třeba překřížíme elementy, specifikace HTML5 přesně říká, jak se má v takovémto případě zkonstruovat DOM a v různých prohlížečích tak dosáhneme konzistentního zpracování a zobrazení stránek.

Co však už na HTML5 není tolik známé, je možnost stránky nezapisovat v HTML syntaxi, ale pomocí syntaxe XML – tedy v XHTML. K dispozici máme všechny nové elementy a funkce HTML5, ale pokud z nějakého důvodu preferujeme striktnější syntaxi XML, nic nám nebrání. Pro stručné označení HTML5 kódu používajícího syntaxi XML se často používá označení XHTML5. Pokud tedy z nějakého důvodu preferujeme striktnější syntaxi, můžeme předchozí ukázku zapsat jako

<?xml version="1.0" encoding="utf-8"?>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="cs">
  <head>
    <title>Pokusná stránka v XHTML5</title>
  </head>
  <body>
    <p>A <b>teď to <i>přijde</i></b>.</p>
    <p>Druhý odstavec</p>
  </body>
</html>

Specifikace HTML5 přitom řeší některé dřívější problémy spojené s XHTML. V maximální možné míře se sjednotil způsob vytvoření DOM reprezentace dokumentu pro vstupy v HTML5 a XHTML5. Byly odstraněny některé historické relikty jako nutnost používat !DOCTYPE v XHTML5.

Pro zjištění toho, zda nějaká stránka splňuje formální pravidla HTML5 nebo XHTML5, lze stejně jako u předchozích verzí využít různé validační služby. Klasický validátor konsorcia W3C (validator.w3­.org) už HTML5 podporuje, ale v tuto chvíli je lepší používat validator.nu, který pružněji reaguje na rychlý vývoj specifikace HTML5.

Pokud jste si z nějakého důvodu na otázku „Budu používat striktnější syntaxi XHTML5?“ odpověděli „ano“, zdá se, že s HTML5 máte vyhráno. Není to však tak úplně pravda. XHTML5 tak, jak jsme ho dosud předvedli, funguje dobře v novějších prohlížečích, které přímo podporují XHTML zasílané s odpovídajícím MIME typem  application/xhtml+xml.

Některé starší prohlížeče však XHTML nepodporují a pak je potřeba se uchýlit k postupům, kdy do prohlížeče posíláme XHTML kód se špatným MIME typem text/html, a prohlížeč jej proto čte jako trochu chybné HTML a nakonec většinou získá výsledek, který jsme zamýšleli. Na tuto problematiku a nové možnosti, které v tomto směru přináší HTML5, se proto podíváme někdy příště.

Věděli jste, že nám můžete zasílat zprávičky? (Jen pro přihlášené.)

Komentáře: 92

Přehled komentářů

David Grudl Super článek.
František Kučera Re: Super článek.
Sten Re: Super článek.
František Kučera Re: Super článek.
Oldisy3 Re: Super článek.
Mordae doctype u XHTML5
ano Re: doctype u XHTML5
juraj Re: doctype u XHTML5
petr_p Mozilla
Rado2 prečo zlyhalo XHTML
František Kučera Re: prečo zlyhalo XHTML
Rado2 Re: prečo zlyhalo XHTML
juraj Re: prečo zlyhalo XHTML
František Kučera Re: prečo zlyhalo XHTML
juraj Re: prečo zlyhalo XHTML
langpa Re: prečo zlyhalo XHTML
David Grudl Re: prečo zlyhalo XHTML
František Kučera Re: prečo zlyhalo XHTML
David Grudl Re: prečo zlyhalo XHTML
František Kučera Re: prečo zlyhalo XHTML
langpa Re: prečo zlyhalo XHTML
juraj Re: prečo zlyhalo XHTML
langpa Re: prečo zlyhalo XHTML
Timy Re: prečo zlyhalo XHTML
langpa Re: prečo zlyhalo XHTML
langpa Re: prečo zlyhalo XHTML
langpa Re: prečo zlyhalo XHTML
langpa double post
juraj Re: prečo zlyhalo XHTML
langpa Re: prečo zlyhalo XHTML
juraj Re: prečo zlyhalo XHTML
langpa Re: prečo zlyhalo XHTML
František Kučera Re: prečo zlyhalo XHTML
langpa Re: prečo zlyhalo XHTML
langpa Re: prečo zlyhalo XHTML
bauglir Re: prečo zlyhalo XHTML
langpa Re: prečo zlyhalo XHTML
bauglir Re: prečo zlyhalo XHTML
langpa Re: prečo zlyhalo XHTML
bauglir Re: prečo zlyhalo XHTML
langpa Re: prečo zlyhalo XHTML
David Grudl Re: prečo zlyhalo XHTML
bauglir Re: prečo zlyhalo XHTML
langpa Re: prečo zlyhalo XHTML
František Kučera Re: prečo zlyhalo XHTML
David Grudl Re: prečo zlyhalo XHTML
langpa Re: prečo zlyhalo XHTML
David Grudl Re: prečo zlyhalo XHTML
František Kučera Re: prečo zlyhalo XHTML
David Grudl Re: prečo zlyhalo XHTML
langpa Re: prečo zlyhalo XHTML
David Grudl Re: prečo zlyhalo XHTML
langpa Re: prečo zlyhalo XHTML
František Kučera Re: prečo zlyhalo XHTML
František Kučera Re: prečo zlyhalo XHTML
langpa Re: prečo zlyhalo XHTML
David Grudl Re: prečo zlyhalo XHTML
langpa Re: prečo zlyhalo XHTML
langpa Re: prečo zlyhalo XHTML
langpa Re: prečo zlyhalo XHTML
David Grudl Re: prečo zlyhalo XHTML
langpa Re: prečo zlyhalo XHTML
Jiří Kosek Re: prečo zlyhalo XHTML
juraj Re: prečo zlyhalo XHTML
langpa Re: prečo zlyhalo XHTML
František Kučera Re: prečo zlyhalo XHTML
langpa Re: prečo zlyhalo XHTML
Marek Knápek Re: prečo zlyhalo XHTML
To je omyl Re: prečo zlyhalo XHTML
RadekN Proč dělat chyby
acko Re: Proč dělat chyby
Bubák Re: Proč dělat chyby
František Kučera Re: Proč dělat chyby
NN Re: Proč dělat chyby
lojza Re: Proč dělat chyby
biggringo Re: Proč dělat chyby
alancox Re: Proč dělat chyby
Pooky Re: Proč dělat chyby
Jerry12 Re: Proč dělat chyby
Pooky Re: Proč dělat chyby
fari Re: Proč dělat chyby
Naith_cz Re: Proč dělat chyby
Jiří Kosek Re: Proč dělat chyby
bauglir Re: Proč dělat chyby
Jiří Kosek Re: Proč dělat chyby
bauglir Re: Proč dělat chyby
juraj niekoľko nepresností (?)
František Kučera Zaostalé prohlížeče
maryo Re: XHTML je mrtvé! Ať žije HTML5! Nebo ne?
emilk hrobarem je specifikace nebo implementatori?
Pavel Šimerda Re: hrobarem je specifikace nebo implementatori?
bauglir Re: hrobarem je specifikace nebo implementatori?
Zdroj: https://www.zdrojak.cz/?p=3534