Hlavní navigace

Mix posvátné validity a X

13. 3. 2007
Doba čtení: 8 minut

Sdílet

 Autor: 29
Vytváříte stránky v XHTML? W3C vám již sedm let záměrně lže. Pokusím se vyvrátit mýtus, bez jehož existence by se dnes o XHTML zřejmě nikdo nezajímal. Výsledkem bude soulad teorie a praxe, který spoustě webmasterů nebude vonět.

V tomto článku se zaměřím na XHTML dokumenty posílané s MIME typem text/html. Posíláte-li své stránky všem návštěvníkům s XML MIME typem, berte následující text jako historickou povídku a přečtěte si raději sci-fi z minulého týdne.

Mýtus č. 5: XHTML je zpětně kompatibilní s HTML

Každá zpětná kompatibilita vyžaduje alespoň drobné společné rysy mezi něčím novým a něčím překonaným. Novinka nemusí nutně dodržovat všechna pravidla svého předchůdce, stačí, když staví na jeho stabilním základu. Vývoj HTML probíhal plynule, jeho očíslované verze můžeme považovat za dostatečně zpětně kompatibilní i přesto, že dokument psaný v HTML 4.01 většinou nevyhovuje všem požadavkům v doporučení HTML 3.2. Ačkoliv se k tomu HTML nikdy normativně nedoznalo, stojí na podobných zákonitostech jako XHTML modularizace (= „neznámé ignoruj“). Jeho stavební kameny (syntaxe, parsovací gramatika) zůstávají neměnné, mění se pouze sortiment elementů a atributů.

Jazyk XHTML se, jakožto deklarovaný následník trůnu majoritního hypertextového značkovacího jazyka, snaží nahradit jen ty základní stavební kameny. Proto by také měl mít jiný MIME typ. V dobách, kdy se začínalo o XHTML mluvit, tuhle drobnost všichni přehlíželi. Panovalo přesvědčení, že se v dokumentu jenom upraví <!DOCTYPE> + pár dalších drobností a že se časem objeví prohlížeče méně tolerantní k nově vymyšleným prohřeškům. Dodnes takto mnoho lidí uvažuje. Možná i vy. Zkusím malý test. Pohleďte na následující zdrojový kód:

<?xml version="1.0" encoding="windows-1250"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=windows-1250">
<title></title>
</head>
<body>
<p>Takhle budete vypadat, až článek dočtete:
<img src="bez-oka.gif" alt="Zelený obličej"></p>
</body>
</html>

Představte si, že takovou stránku posílám s MIME typem text/html. A že se při tom chválím, jakou jsem odvedl dobrou práci. Vy snad nesouhlasíte? Říkáte cosi o chybějících lomítkách v elementech <meta> a <img>? Nechápu vás. Mně tam přece žádná lomítka nechybí. Fakt.

Můžete mi snad nastínit nějaký scénář, kdy se mi vynechání lomítek vymstí? Jsem si vědom toho, že to není správně sestavený XML dokument, takže nelze použít XML nástroje. Stejně tak to není platný PNG obrázek, takže na něj nelze použít „požírače“ obrázků. To je mi jedno, návštěvník na tu stránku neleze se speciálním programem. Užívá webový prohlížeč, který má MIME typy respektovat. Žádný prohlížeč nesmí při MIME typu text/html lomítka vyžadovat. Porušil by HTML specifikaci. Má stránka se nespoléhá na blbuvzdornost prohlížečů, ale na zcela korektní interpretaci základů HTML. Tak co, pořád na ní vidíte mouchy?

Zakleté lomítko

XML syntaxe samozřejmě není plně kompatibilní s HTML syntaxí. Konsorcium tvrdí, že existuje průnik, který musí fungovat shodně při HTML i XML MIME typech:

„XHTML dokumenty mohou být zapsány tak, aby běžely stejně či lépe než dříve v existujících vyhovujících HTML 4 prohlížečích stejně jako v nových vyhovujících XHTML 1.0 prohlížečích.“

Zdroj: Doporučení XHTML 1.0

.

Onomu průniku se blíže věnuje nenormativní Dodatek C v doporučení XHTML 1.0. Dodatkem C se nyní řídí cca 8 procent ze všech webových stránek. V praxi kompatibilita netrpí, těch osm procent si „trénuje“ na potenciální budoucnost (ač si mnozí myslí, že už v té budoucnosti jsou). I teorie by byla v pořádku, v souladu s praxí. Kdyby vám ovšem konsorcium nelhalo.

Vyhovující HTML 4 prohlížeč nesmí lomítko v prázdných elementech přehlížet. Ono totiž má svoji funkci. Ukončuje počáteční značku. Jde o takzvaný NET zápis. Jakýkoliv HTML element můžete podle specifikace zapsat buď jako <značka>Obsah</značka>, nebo jako <značka/Obsah/. U prázdných elementů pak buď jako <značka>, nebo jako <značka/. Z čehož plyne, že <hr/> je horizontální čára následovaná většítkem. Tak praví IETF standard HTML 2.0, tak praví W3C doporučení HTML 3.2, tak praví obě W3C doporučení HTML 4.0, tak praví W3C doporučení HTML 4.01.

Ačkoliv tomuto druhu zápisu běžné prohlížeče neholdují, stále je normativně platný. Žádný prohlížeč není oficiálně oproštěn od požadavku podporovat jej. To, že existuje nějaké další doporučení, které by rádo přidělilo lomítku při úplně jiném značkovacím jazyku jiný význam, absolutně nic neznamená. HTML prohlížeč – nový, starý, tlustý, tenký, chytrý, hloupý, s kometou i bez – by měl následovat HTML doporučení.

Je přinejmenším zvláštní, že XHTML 1.0 — specifikace připravovaná souběžně s HTML 4.01 stejnou pracovní skupinou — říká uklidňující nesmysly o vyhovujících HTML 4 prohlížečích a pak vyloženě nabádá webmastery ke zneužívání nedostatečné podpory HTML v těch nevyhovujících.

Zmíněných osm procent stránek, co je psáno XML syntaxí při MIME typu text/html, se nespoléhá na blbuvzdornost prohlížečů, ale na jejich chyby. Užitá lomítka v zápisech <img/>, <hr/>, <link/>, <meta/> mají jiný význam, než autoři předpokládají. Můžu vám nastínit triviální scénář, kdy se mrzačení syntaxe vymstí: stačí, když libovolný výrobce prohlížeče svoji chybu napraví. Chcete přece, aby prohlížeče dodržovaly webové standardy, ne?

Nyní na mě asi část z vás kouká jako na zfanatizovaného standardizačního blázna, který vidí velký teoretický výkal tam, kde v praxi kvetou pampelišky. Vězte, že moc dobře vím — stejně jako vy — že si žádný rozumný výrobce prohlížeče netroufne dodržet ony „nevhodné“ pasáže HTML 4. Přesto se domnívám, že se na tu hromádku, co se schovává pod pampeliškami, brzy mnoho lidí zblízka podívá.

Pravidla HTML nejsou směrodatná výhradně pro známé desktopové prohlížeče. NET zápis by měly pochopitelně správně podporovat i hlasové čtečky a jiné alternativní nástroje, s nimiž sjíždějí hypertextové vody minority. Stejně tak roboti. Nejen ti vyhledávací.

Existuje jeden robot, který má stoprocentní dodržování syntaxe ve své pracovní smlouvě. Jeho posláním je upozorňovat webmastery na chyby. Během posledních let si získal vynikající renomé nejen u dodavatelů kódu stránek, ale i u objednavatelů. Stal se metlou pro začátečníky a vizitkou pro profesionály. Ano, je to on! Na scénu přichází slavný W3C Validátor!

W3C Validátor lže

Navzdory občasnému skeptickému reptání známých osobností je W3C Validátor dost kvalitní kousek softwaru. Většina nedostatků, které jsou mu vytýkány, pochází z omezení architektury či z neinformovanosti těch, kdo vytýkají.

Ačkoliv se mu běžně říká (X)HTML Validátor, pod jeho kapotou vrčí robustní SGML/XML validující parser. Nestará se o to, co validuje. Čapne do jedné ruky odkázanou definici typu dokumentu (DTD), do druhé dokument a tou třetí vám čmáře na obrazovku vše, co se mu na kombinaci DTD a dokumentu nezdá.

Formát DTD pochází ze SGML a jeho základy jsou v XML podobné. Popisuje elementy, jejich povolené obsahy, atributy, (omezeně) i typy atributů a entity. Nepopisuje ovšem syntaxi, tedy ty základní stavební kameny jazyka. Nenajdete v něm žádný příkaz, který by řekl „hodnoty atributů musí být vždy v uvozovkách“ nebo „na velikosti písmen záleží“. Zrovna tak DTD neříká, že lomítko značí samouzavírací značku nebo NET zápis. Syntaxe je určená vyšším protokolem. Zpravidla MIME typem.

Přiložíte-li k HTML dokumentu DTD XHTML 1.0 Strict, validátor by ji správně měl pochopit jako DTD pro HTML dokument. To jsem udělal já ve své ukázce kódu na začátku článku. Co na ni říká nástroj konsorcia?

validita 1

Ano, dokument není validní. Ale ten důvod? Chybí lomítka?! Hloupost. Lomítka tam být nemají — přece nebudu spoléhat na vadné prohlížeče jako těch trénujících osm procent.

V březnu roku 1999 byl W3C Validátor úmyslně pokažen. Přestal ctít MIME typ text/html, volí při něm parser podle toho, jestli najde ve veřejném identifikátoru <!DOCTYPE> deklarace řetězec „XHTML“. Obskurní chování. Paradoxně i sama pracovní skupina zodpovědná za XHTML něco takového odsuzuje. Ptáte se, proč takto nejde XHTML rozeznat?

K tomu, abyste vůbec našli <!DOCTYPE>, musíte kus dokumentu rozebrat. Před deklarací mohou být umístěné komentáře a procesní instrukce, jejichž syntaxe se rovněž mezi HTML a XML změnila. Lze tedy vytvořit dokument, v němž HTML parser uvidí jinou deklaraci než XML procesor. Validátor by měl — stejně jako vyhovující prohlížeč — vnímat syntaxi podle MIME typu, jinak je jeho vyhodnocení zavádějící. V případě W3C Validátoru skutečně zavádějící je a lidé kvůli němu neoprávněně upozorňují na chyby v HTML parserech prohlížečů.

Jak chybu obejít?

Změním v kódu své bezchybné stránky deklaraci z této:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

… na tuto:

<!DOCTYPE html SYSTEM
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

Jelikož je odkázaná DTD stále stejná, měl by bezchybný validátor ukázat totožný výsledek. Robot od konsorcia náhle změnil názor:

validita 2

Tak se mi to líbí, nula chyb. Červené hlášky se bohužel nikdy zbavit nemůžu, neb je odkázaná DTD vadná: postrádá informaci o volitelnosti značek, která je v HTML DTD povinná. I těch osm trénujících procent při správném validování obdrží jiné vysvědčení, než na jaké jsou zvyklá:

validita 3

Styď se, zasněná menšino. Nejenže se spoléháš na chyby klasických prohlížečů, ty se opíráš i o chyby validátoru. Za nadbytečná lomítka skončíš v pekle, kde si můžeš s nevrlými nealtoidy, arogantními antiampersandéry a chlípnými bezdoktajpníky popovídat o smyslu validity. Neznalost specifikací neomlouvá.

Zauvažujte, jak by asi dnes vypadal obor webdesignu, kdyby konsorcium neklamalo Dodatkem C a validátorem. Nástroj ověřující dodržování specifikací se stal pro webmastery mnohem mocnější než specifikace samotné. Když vám kodér užívající text/html řekne, že ho XHTML nutí vždy psát koncové značky, představí si červenou hlášku validátoru, nikoliv fatální chybu prohlížeče. Trénujících osm procent totiž rádo validuje. Když se chce začátečník učit XHTML, validuje. Když chce zadavatel prověřit dodané dílo, validuje.

Opraví-li nyní někdo klasický prohlížeč, poškodí spolupráceschopnost a udělá z návštěvníků rukojmí. Opraví-li nyní někdo validátor, uvede praxi a teorii do souladu, což je určitě chvályhodný krok, který z definice musí každého zastánce validity potěšit. Nebo ne? Uvidíme.

BRAND24

Šachmat

Ať už je budoucnost černá nebo růžová, XHTML dodávané jako text/html je zavrženíhodný švindl bez perspektivy.

Český validátor opravím tento čtvrtek.

Byl pro vás článek přínosný?

Autor článku

Autor je nezávislý publicista zaměřený na historii. Webdesignu, značkovací jazyky, JavaScript a W3C specifikace. Na svém webu Webylon.
Upozorníme vás na články, které by vám neměly uniknout (maximálně 2x týdně).