Český validátor kódu nerespektuje normy

Školení, která pořádám

Chamurappiho si vážím pro jeho hluboké znalosti norem a také znalosti historie veškerého dění okolo. Měl jsem radost i z toho, když představil vlastní Validátor XHTML a HTML kódu, který jednak vypisuje chyby v češtině (což zlepšuje využitelnost této služby) a dále doplňuje další kontroly, např. kontrolu hodnoty atributů.

Tento validátor nicméně nepoužívám proto, že typ dokumentu text/html používá výhradně pro HTML dokumenty a pokud je s tímto typem poslán XHTML dokument, tak validátor ohlásí chybu. S tímto chováním nesouhlasím, protože XHTML norma připouští použití tohoto typu.

Chamurappiho jsem na to již upozorňoval, on na to podle svého zvyku u sebe odpověděl, chování validátoru ale nezměnil a podložil to obsáhlou argumentací. V této argumentaci se ale plete, konkrétně v pasáži:

(Oficiální validátor) nyní postupuje tak, že začne každou „text/html“ stránku rozebírat jako XML. Jakmile najde deklaraci <!DOCTYPE>, nakoukne do jejího veřejného identifikátoru a s ohledem na něj zvaliduje dokument buď jako XML, nebo jako HTML. Takové očichávání kódu mu žádná specifikace nedovoluje a lidé z W3C jej všude možně odsuzují.

Využití MIME typů standardizuje organizace IANA, konkrétně typ text/html je popsán v RFC 2854. A toto RFC v kapitole 2 říká:

Typ text/html je v současné době definovaný jako Doporučení W3C, nejnovější publikovaná verze je 4.01. Kromě toho XHTML 1.0 definuje profil použití XHTML, který je kompatibilní s HTML 4.01 a který může být také označen jako text/html.

V kapitole 5 se potom mluví o tom, jak se HTML dokumenty rozpoznávají:

Dokumenty odpovídající HTML 2.0, HTML 3.2 a HTML 4.0 začínají deklarací DOCTYPE „<!DOCTYPE HTML“ … XHTML dokumenty (volitelně) začínají XML deklarací, která začíná „<?xml“, a musí obsahovat deklaraci DOCTYPE „<!DOCTYPE html“.

Norma tedy jasně říká, že očichávání dokumentů je povolené a že to je způsob, jak od sebe HTML a XHTML dokumenty rozlišit – HTML dokumenty mají DOCTYPE s velkým HTML, XHTML dokumenty s malým html.

Chamurappi tvrdí, že autoři této normy časem své smýšlení změnili, a já mu nemám důvod nevěřit (jistě by dokázal dohledat mail, který by jeho slova potvrzoval), ale norma je norma a dokud nebude RFC 2854 nahrazené něčím jiným, tak by ho validátor měl respektovat. Pak bych ho alespoň mohl začít používat i já.

Dovětek

Proč vlastně osobně používám XHTML a ne HTML? Důvod je ten, že editor SciTE dovoluje automaticky vkládat uzavírací značku při napsání otvírací XML značky. Stejně tak dovoluje schovat bloky kódu na základě těchto značek. Seznam nepárových HTML značek neobsahuje, některé značky se navíc v HTML zavírají pouze volitelně, proto by bylo zajištění těchto vlastností u HTML dokumentů poměrně pracné. Proto je pro mě pohodlnější používat XHTML.

Jakub Vrána, Osobní, 28.3.2008, diskuse: 29 (nové: 0)

Diskuse

Zatím-Anonym:

Ano, ale pořád se mi zdá, že si pleteš realitu od pár řádků textu. Jestliže pošleš dokument s XHTML syntaxí s mime typem text/html bude brán také jako HTML a tak na něj budou pohlížet prohlížeče a je docela fuk, co si píše specifikace -> Můžeš vyzkoušet jaký je rozdíl mezi tím, když se rozebírá XHTML se správným mimetypem a bez.

wnc:

Od validátoru bych však očekával, že bude kontrolovat soulad s normou, nikoliv soulad s prohlížečem. Dokument RFC má navíc pro mě vyšší váhu než e-mailové (byť oficiální) vyjádření člena W3C. Jinak Chamurappimu děkuji za zajímavou dnešní přednášku.

ikona Chamurappi:

K čemu ti ale bude soulad s jednou normou, když má prohlížeč dodržovat normu jinou? Dodržování normy by mělo být prostředkem k souladu, nikoliv cílem.

Dotyčné e-mailové vyjádření byl výsledek dohody celé pracovní skupiny (včetně spoluautora RFC 2854), nikoliv zbrklý výkřik jednotlivce. Snaha vývojářů prohlížečů protlačit toto jasné stanovisko do druhého vydání XHTML 1.0 byla bohužel marná.

ikona Jakub Vrána OpenID:

Pokud by měl validátor kontrolovat dokumenty na základě toho, jak se chovají prohlížeče, tak nemusí vypisovat skoro žádné chyby, protože prohlížeče se s většinou chyb vypořádají.

ikona Chamurappi:

Validátor by měl kontrolovat dokumenty podle stejných pravidel, která by měly v ideálním stavu dodržovat prohlížeče. Prohlížeče chyby přecházejí, validátor je má hlásit.

ikona Chamurappi:

Pěkný článek, taková oponentura se mi líbí.

Mohl bys prosím doplnit, co skryla ta trojtečka uvnitř citace z kapitoly 5?

ikona Jakub Vrána OpenID:

Pravděpodobně máš na mysli větu "These dialects are case insensitive." Ta je ale zjevně v rozporu s HTML normou, která uvádí, že např. u entit se velikost písma rozlišuje. Takže tuto větu lze chápat pouze jako informativní přiblížení jazyka.

Nicméně to nic nemění na hlavní myšlence tohoto článku – text/html je podle normy použitelný jak pro HTML, tak pro XHTML a tvůj validátor to nerespektuje.

ikona Chamurappi:

Nedává smysl, aby uprostřed odstavce o obvyklých rysech, podle nichž jde poznat HTML dokument, bylo informativní přiblížení jazyka nijak nesouvisející se těmito rysy. Na velikosti písmen nezáleží kvůli parametru NAMECASE v SGML deklaraci pro HTML u všech „jmen“ (GENERAL YES), jedinou výjimkou jsou jména entit (ENTITIES NO). Zápis <!DOCTYPE html> je stejně OK jako <!dOcTyPe hTmL> či <!DOCTYPE HTML>, tudíž popis v kapitole „Rozpoznávání HTML dokumentů“ není použitelný pro rozlišení XHTML od HTML (a ani nebyl s tímto záměrem psán).

Hlavní myšlenka článku je, že RFC dovoluje očichávání. Ve zmíněné kapitole ovšem žádný použitelný postup nevidím. I kdyby tam byl, tak pokud není očichávání povinné, postupují český validátor a prohlížeče v naprostém souladu s normami.

Pokud použiješ „profil XHTML, který je kompatibilní s HTML 4.01“ (jak uvádí kapitola 2), tak musí být zákonitě výsledek validace pomocí HTML parseru pozitivní a můj validátor ukáže zelenou hlášku. Pokud není pozitivní, tak nepoužíváš profil kompatibilní s HTML 4.01.

ikona Jakub Vrána OpenID:

Dávám ti za pravdu, že v RFC žádné univerzální pravidlo pro rozpoznání HTML od XHTML není. V tom případě by ale validátor měl validovat podle obou norem. Je to stejné, jako kdyby jsi u typu image/gif uznával pouze statické obrázky a animované odmítal, přestože norma připouští oba.

ikona Chamurappi:

Jak by měl validovat podle obou norem? Zároveň? Nebo mám zdroják očichávat? Jak? Není na to žádná specifikace, proto jsem si na podkladě onoho „výkřiku“ pracovní skupiny vybral takové očichávání, které je shodou okolností kompatibilní s realitou. Tedy žádné. Neporušuji tím žádnou normu, z možných postupů je to ten nejčistší.

Analogie s animovanými GIFy mi připadá mimoběžná, musel bych k ní doplnit hodně „ale“ a „kdyby“, aby začala připomínat situaci MIME typu „text/html“.

ikona Jakub Vrána OpenID:

„Profil XHTML, který je kompatibilní s HTML 4.01,“ používám, jediným problémem jsou nepárové značky, u kterých tvůj validátor zcela v rozporu s chováním prohlížečů rozumí koncovému lomítku jako NET zápisu.

NET zápis kromě prohlížečů nedoporučuje ani norma, konkrétně http://www.w3.org/TR/html401/appendix/notes.html#h-B.3.7: „Přestože je SGML konstrukce SHORTTAG týkající se atributů široce používaná a implementovaná, u značek to neplatí.“ Já chápu, že to je informativní pasáž určená pro autory dokumentů, a norma formálně vzato NET zápis umožňuje, ale realita je prostě jiná.

ikona Chamurappi:

Profil kompatibilní s HTML 4.01 nepoužíváš, neb máš z pohledu vyhovujícího HTML parseru znaková data (většítka) v <head> a v odkázané DTD ti chybí u definic elementů údaj o volitelnosti značek, který se v HTML DTD nesmí vynechávat (proto hláška „definice typu dokumentu obsahuje chyby“). Z pohledu nevalidujícího vyhovujícího HTML 4 parseru máš <title> mimo <head>. Nerespektuješ tedy kapitolu 2 z RFC 2854, používáš pouze profil kompatibilní s existujícími HTML prohlížeči.

NET zápis kromě prohlížečů nedoporučuje ani norma, proto hlásí český validátor varování (podobně jako na <> a </>). Kdyby SHORTTAG konstrukce neexistovaly nebo byly zakázané, hlásil by pochopitelně na koncovém lomítku chybu. V důsledku na tom moc nezáleží.

ikona Jakub Vrána OpenID:

Já se rád nechám poučit, jen to prosím trochu rozveď. Chápu to správně tak, že oficiální DTD pro XHTML bych si musel upravit tak, aby obsahovalo údaj o volitelnosti koncových značek (všude povinné)? Druhá věc - většítka jsou předpokládám způsobena NET zápisem. A třetí věc - čím je ukončen <head>, že se <title> dostal mimo něj?

ikona Chamurappi:

1) Ano, musel bys upravit DTD. Nebo přilinkovat jinou, která je kompatibilní s formátem HTML DTD.
2) Nadbytečná většítka jsou způsobena NET zápisem. Ale jak jsem již psal — nebýt NETu, byla by chybná přímo lomítka.
3) Pokud by ideální HTML klient nečetl externí DTD (což je očekávané chování prohlížeče), musel by mít nějakou fixní DTD už v sobě a měl by si tedy myslet, že elementy <head> a <body> nemají povinné obě značky => při prvních znakových datech se samo zavře <head> a otevře <body>, takže <title> za <meta/> už je uvnitř <body>.

V článku [K.37] na Webylonu jsi viděl trik s procesními instrukcemi a komentáři. Pomocí něj jde sestavit XHTML kód, který bude skutečně kompatibilní s HTML 4.01 a projde českým validátorem jako validní HTML 4.01. Není to příliš praktický zápis, ale do puntíku splňuje definici z RFC.

Jan Krejčík:

Doporučuji na vyzkoušení validátor Relaxed (http://relaxed.vse.cz/relaxed/).

K článku:
Věta "XHTML dokumenty (volitelně) začínají XML deklarací" znamená, že XML deklaraci lze vynechat v případě, kdy je dokument v UTF-8 či UTF-16.

ikona Chamurappi:

… a nebo určí-li kódování parametr charset u MIME typu.

emilk:

v zivote (x)html dokumentu jsou obycejne dve faze:
jeho vytvareni autorem
a jeho konzumace klientem

validator zjevne slouzi autorovi
posilani xhtml s mime html zjevne slouzi k hladke konzumaci
s ohledem na chovani dnesnich klientu

vadi vam, ze kdyz dokument v hlavicce oznacite jako html, tak
ze se kontroluje jako html, ostatne tak jak ho taky budou parsovat vsichni klienti?

nechapu

ikona rarouš:

Pozor MIME text/html je jak pro HTML tak pro XHTML, tudíž neříká že se k dokumentu posílaném s tímto MIME máte chovat jako k HTML, ale "očichat" dokument a na základě XML prologu nebo DOCTYPE html se k němu chovat jako k XHTML, nebo v opačném případě jako k HTML.

emilk:

nemuzu si ted vzpomenout na zadneho user agenta, ktery by to, co popisujete, opravdu delal. pomuzete mi?

ikona Jakub Vrána OpenID:

Ale tady přece vůbec nejde o prohlížeče. To by validátor nemusel vypisovat skoro žádné chyby, protože prohlížeče si s většinou poradí. Validátor by podle mého názoru měl validovat podle normy a ne podle toho, jak se chová většina prohlížečů.

emilk:

myslim, ze bysme se mohli shodnout na tom, ze onen mime typ pro xhtml je dodefinovan z jistych zcela specifickych duvodu:
a to je stanovisko MS k podpore xhtml.

kdyz validujete svuj dokument, tak nazor jednoho konkretniho vyrobce user agenta se na procesu nijak neprojevuje. hraci jsou tu jen dva: vas server servirujici dokument a validator.

pozadovat, aby validator provadel s mime typem neco, co efektivne popira jeho smysl, mi neprijde logicke.

ikona Chamurappi:

V době vydání XHTML 1.0 těžko mohlo budoucí čekání Microsoftu ovlivnit povolené MIME typy. Explorer 6 vyšel o rok a půl později a tou dobou byl „text/html“ stále jediným dovoleným typem pro XHTML. S nesmyslem „Dali to tam jen kvůli línému MS!“ se poslední dobou setkávám podezřele často, odkud se bere?

ikona rarouš:

V tom případě je něco špatně...

emilk:

osobne si myslim, ze spatne bylo dodefinovat stejny mime typ pro ruzne druhy dokumentu

ikona Chamurappi:

Kde ale norma říká, že máme dokument očichávat? Jestliže Dan Connolly v červnu 2000 při psaní RFC věděl, že se má v dokumentu zohledňovat <!DOCTYPE>, proč koncem července radil Davidu Baronovi hlídat atribut xmlns? Věděl, že v RFC o očichávání nemluví.

XML deklarace syntakticky neodporuje pravidlům HTML. Zápis „<!DOCTYPE html“ též smí být i v HTML, RFC zmiňuje, že na velikosti písmen nezáleží.

emilk:


ad dovetek:
slovo 'volitelny' podle me znamena, ze
si muzete vybrat, jestli ony nektere uzaviraci znacky
budete explicitne psat nebo ne.

staci, abyste si vy osobne vybral 'vzdy ano' a vase problemy s html zmizi bez zavleceni problemu, ktere prinasi xhtml (napr drakonicnost ve fazi konzumace dokumentu)

ja osobne jsem si vybral napr 'ano u odstavcu'
'ne u td a li' a nelibi se mi, ze prehlednost kodu,
ktera pro me osobne z tohohle rozhodnuti plyne, xhtml neumoznuje, a to jen s vymluvou na "jednoduchost parseru v mobilnich zarizenich".

ikona Jakub Vrána OpenID:

Oba problémy bohužel zůstanou, protože HTML nedovoluje označovat nepárové značky a SciTE jejich seznam neobsahuje. Takže když bych napsal <img>, SciTE doplní </img>, stejně tak při schovávání bloků kódu by hledal koncovou značku </img>.

emilk:

v HTML Compatibility Guidelines w3c empiricky overilo, ze prohlizecum HTML uzavirani ve stylu <img /> nevadi a doporucuje to.

Jediny problem tady asi dela validator se svych ocichavanim :)

ikona Chamurappi:

Ano, pohodlnost autorů kódu a nedokonalost výrobních nástrojů jsou častými příčinami nevalidity :-)

Můžeš si v českém validátoru vyžádat validaci proti konkrétnímu typu (v rozšířeném rozhraní na http://validator.w3.cz/detailed.html) a spokojit se s výsledkem „předběžně validní“.

Smysluplnější mi však připadá projít si výsledky při validaci HTML parserem a vlastní hlavou zvážit, která chyba tě trápí a která ne. Zelená hláška přeci nemusí být cíl, na počtu chyb nezáleží.

Vložit komentář

Používejte diakritiku. Vstup se chápe jako čistý text, ale URL budou převedeny na odkazy a PHP kód uzavřený do <?php ?> bude zvýrazněn. Pokud máte dotaz, který nesouvisí s článkem, zkuste raději diskusi o PHP, zde se odpovědi pravděpodobně nedočkáte.

Jméno: URL:

avatar © 2005-2018 Jakub Vrána. Publikované texty můžete přetiskovat pouze se svolením autora. Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení Creative Commons. Můžeme si tykat. Skripty předpokládají nastavení: magic_quotes_gpc=Off, magic_quotes_runtime=Off, error_reporting=E_ALL & ~E_NOTICE a očekávají předchozí zavolání mysql_set_charset. Skripty by měly být funkční v PHP >= 4.3 a PHP >= 5.0.