Blog

Kanałem do perfekcji: od RSS do XHTML

Ostatnim razem obiecałem, że na stronie wkrótce pojawi się kanał RSS, a dziś dotrzymałem słowa. Posiadacze najnowszych wersji Firefoksa mogą zrobić użytek z Livemarks :).

Plik RSS jest generowany dynamicznie przy pomocy PHP i Smarty. Coraz bardziej podoba mi się ten wynalazek – stworzenie odpowiedniego szablonu, który wyświetli dane otrzymane ze skryptów PHP, jest łatwe i szybkie. A przede wszystkim: eleganckie. Skrypty zajmują się tylko odczytaniem danych z bazy i nie są “zaśmiecane” kodem XHTML.

Skoro jestem przy elegancji, to jeszcze wspomnę o przyczynie, dla której stworzenie kanału RSS zajęło mi ponad godzinę, a nie 15 minut. RSS jest odmianą XML i savoir-vivre wymaga, aby był wysyłany z typem mime application/xml. W przeglądarkach, które reagują na typy mime (a więc nie dotyczy to IE), dokument taki zostanie wyświetlony w postaci drzewa XML, a nie zwykłego tekstu. Można się o tym przekonać, klikając na link do kanału np. w Firefoksie czy Mozilli. Przy pierwszym podejściu przeglądarka wyświetliła mi błąd parsowania:

Błąd parsowania XML w Firefoksie
Błąd parsowania XML w Firefoksie

Okazało się, że jeden z moich skryptów PHP drukuje na ekranie spację, która pojawia się przed prologiem XML. Dobrze uformowany dokument XML nie ma prawa zawierać w tym miejscu niczego, więc trzeba było namierzyć błąd w skrypcie. Najpierw podjąłem się przeglądania źródeł wszystkich skryptów, które są używane na stronie – ponieważ korzystam ze Smarty i paru pomocniczych klas, wysiłek byłby naprawdę heroiczny. Tudzież bez sensu: wystarczy wyłączyć buforowanie wyjścia w php.ini, wywołać w którymś miejscu funkcję header() i PHP samo pokaże, gdzie jest błąd polegający na przedwczesnym wysyłaniu tekstu do przeglądarki. I tak właśnie zrobiłem i szybko znalazłem usterkę, ale cała sytuacja daje trochę do myślenia.

Przecież do przeglądarki można wysyłać jako XML nie tylko RSS, ale także XHTML. Jeśli ktoś korzysta z wersji 1.1 XHTML, jest to nawet konieczne. Zalety: satysfakcja z czystego kodu (niewątpliwie jest to zboczenie, na które jednak cierpi wielu programistów, i którego pierwsze symptomy zauważam u siebie) oraz szybkie wykrywanie błędów w kodzie. Jeśli takowy się pojawi, użytkownik zobaczy na ekranie, o ile oczywiście używa porządnej przeglądarki, komunikat o błędzie parsowania, zamiast strony. Webmaster dość szybko dowie się więc od swoich gości, że popełnił błąd, może go zatem poprawić i dalej napawać się własnym perfekcjonizmem. Takie rozwiązanie stosuje np. Simon Willson na swoim blogu (swoją drogą, polecam). Nie ma chyba potrzeby tłumaczyć, że jeśli strona ma charakter komercyjny, lepiej nie eksperymentować w ten sposób, bo mogłoby się to pewnie okazać szybką i skuteczną drogą do bankructwa.

Inne wady (hmm… czyżby zalety gdzieś umknęły?): IE i tak nie przełknie takiego dania, należy więc dla niego zrobić wyjątek i wysłać stronę z typem text/html, zamiast application/xhtml+xml.

Już wspomniałem, że każde odstępstwo od specyfikacji XML zostanie niemiłosiernie wytknięte przez parsery wbudowane w nowoczesne przeglądarki. Takim odstępstwem jest spacja na początku strony (patrz wyżej) czy używanie w kodzie znaku & zamiast odpowiedniej encji. Dochodzą do tego kolejne, bardziej subtelne detale. Np. nie wolno wówczas stosować znacznika <meta> z atrybutem http-equiv. Można więc zapomnieć o prostym, powszechnie akceptowanym sposobie deklaracji kodowania:

<meta http-equiv="content-type
  content="text/html; charset=iso-8859-2" />

Zamiast tego, należy zadeklarować kodowanie w prologu XML:

<?xml version="1.0" encoding="iso-8859-2"?>

Tak na marginesie, po napotkaniu go na początku strony IE zaczyna się zachowywać mało przewidywalnie, więc należy mu zapewnić alternatywę w postaci <meta />.

Sporo tych niuansów. Ale to jeszcze nie koniec. Kiedy już wyślemy do odpowiedniej przeglądarki dokument XHTML z odpowiednim typem mime, może ona wyświetlić coś takiego:

Drzewo XML dokumentu XHTML
Drzewo XML dokumentu XHTML

Nie jest to do końca to, czego chciałem.

The XML stylesheet PI SHOULD be used to associate style sheets. XHTML Media Types

Innymi słowy, należy zaimportować pliki CSS zaraz po prologu XML, w sposób zrozumiały dla parserów XML:

<?xml-stylesheet href="style.css" type="text/css"?>

Podsumujmy. Żeby strona była naprawdę koszerna i zgodna z XHTML 1.1, a przy tym nie rozlatywała się na ekranach 95% użytkowników należy:

  • wysłać plik z typem mime application/xhtml+xml, pamiętając by IE serwować text/html
  • umieścić na początku prolog XML i zadeklarować w nim kodowanie; użytkownikom IE (i tylko im) zapewnić alternatywę w postaci <meta />
  • arkusze stylów zaimportować za pomocą instrukcji przetwarzania XML; nie wspomniałem o tym, że IE jej nie zrozumie, ale chyba każdy zdążył się już tego domyśleć?
  • unikać jak ognia wszelkich błędów i odstępstw od specyfikacji, ponieważ natychmiast uniemożliwią one wyświetlenie strony w przeglądarkach poprawnie interpretujących XHTML.

I to już wszystko! Wnioski pozostawiam Wam.

Comments are closed