Strona główna | O nas | Kontakt

W3 Style Technologie serwisów WWW

Model działania serwisów internetowych jest prosty. Użytkownik przeglądarki internetowej wysyła do serwera pojedyncze żądanie o sprowadzenie serwisu internetowego. Serwer natomiast odpowiada, i dostarcza dokumenty serwisu do naszego komputera. Jak widać, koncepcja jest jasna. Równie łatwo jest wyjaśnić, na jej podstawie, działanie wszystkich technologii wykorzystywanych przy tworzeniu serwisów.

Wszystkie elementy serwisu internetowego to, tak naprawdę, zwyczajne pliki tekstowe. Zarówno gdy są przechowywane na odległym serwerze WWW, jak i gdy zostaną skopiowane na naszą własną maszynę. Jednak na ekranie naszego komputera zamiast ciągu niejasnych (a w najgorszym razie niezrozumiałych) znaków, widzimy barwny, niekiedy animowany, interaktywny serwis. Dzieje się tak, ponieważ wszystkie skopiowane dokumenty są zapisane za pomocą ściśle określonych zasad. Zadaniem ich poprawnego zinterpretowania zajmuje się nasza przeglądarka internetowa.

Interpretowanie - client side

Proces interpretacji serwisu WWW przebiega w sposób łańcuchowy, sekwencyjny. O ile przeglądarka nie potraktuje właśnie pobieranego przez nią pliku jako zwyczajnego dokumentu tekstowego, wzbogaci on w jakiś sposób ostateczny efekt podziwiany przez nas na ekranie monitora. Musimy też wiedzieć, że każdy taki dokument, oprócz wzbogacania ostatecznego efektu, może zaproponować nam pobranie na nasz dysk (zazwyczaj za cichym przyzwoleniem naszej przeglądarki) kolejnych plików, które także dekorują naszą witrynę i także potrafią zasugerować sprowadzenie na nasz dysk szeregu nowych dekoracji.

Podstawa - HTML - Hypertext Markup Language (Język Znakowania Hipertekstu)

Kiedy wpisujemy w przeglądarce internetowej adres serwisu WWW, wysyłamy tak naprawdę żądanie o tylko jeden plik. Jest to esencja każdej strony internetowej, dokument utworzony w języku HTML, który dalej będę nazywał dokumentem podstawowym. Dokument podstawowy to nośnik treści serwisu internetowego, czyli informacji, jakie chce nam przekazać jej autor. Możemy tutaj zauważyć, że treść można przekazać użytkownikowi nawet w postaci czystego tekstu. Język HTML jest jednak bogatszy niż zwykły tekst, ponieważ oprócz samych informacji przekazuje on także ich znaczenie. Czyni to otaczając tekst odpowiednimi znacznikami. Jeżeli przeglądarka z powodzeniem rozpozna w przesłanym przez serwer dokumencie język HTML, przedstawi niektóre jego fragmenty jako akapity, inne jako nagłówki, kolejne zaś oznaczy jako odnośniki do innych dokumentów internetowych. Znaczniki, gdy dokument zostanie już zinterpretowany przez przeglądarkę, są dla użytkownika niewidoczne.

Oprócz tego wybrane znaczniki HTML, jak przeczytaliśmy powyżej, potrafią nakłonić przeglądarkę do pobrania dalszych, mniej istotnych dokumentów. To właśnie one dekorują naszą witrynę, formatują, ilustrują, animują, itp. Nazywam je dokumentami pomocniczymi. Najczęściej spotykane typy takich dokumentów opisałem poniżej.

Uwaga: przeglądarka internetowa zawsze będzie usiłowała pobrać na komputer użytkownika dokument HTML, ponieważ jest to jedyny element niezbędny do wyświetlenia serwisu. Będzie to jednak jedyne połączenie z serwerem, które przeglądarka musi wykonać, i jedyny dokument, który musi zinterpretować. Użytkownik ma bowiem prawo nie zgodzić się na wysłanie przez nią kolejnych, zasugerowanych przez dokument podstawowy, żądań o dokumenty pomocnicze. Istnieją różne powody podjęcia takiej decyzji. Może on nie chcieć obciążać swojego połączenia internetowego zbędnymi żądaniami (blokując żądania o pliki graficzne) lub uniemożliwiać manipulowanie oknem przeglądarki (blokując żądania o skrypty JavaScript). Czasami również zdarza się, że przeglądarka użytkownika nie umie wykorzystać pewnego rodzaju dokumentów, np. nie wyświetla plików graficznych, więc zasadniczo nie będzie ich pobierać, zignoruje np. wszelkie sugestie, aby pobierać ilustracje.

Dobry webmaster jest tego świadom i dba, aby najważniejsza treść serwisu zawsze zawarta była przynajmniej wewnątrz dostępnego dla każdego użytkownika dokumentu HTML. Oczywiście, można ją później powielić, na przykład wewnątrz ilustracji. Nie należy jednak przekazywać żadnych treści wyłącznie poprzez ilustracje. Tak samo nie wypada zamieszczać na stronie skryptów JavaScript, nie tłumacząc równocześnie użytkownikom nie posiadającym dostępu do tego języka, jaką funkcjonalność tracą. Poinformowani o dodatkowych możliwościach serwisu użytkownicy mogą bowiem powrócić do niego później, gdy uzyskają dostęp do przeglądarek, które zezwalają na pełniejsze wykorzystanie serwisu.

Odmiany HTML

Zawartość dokumentu HTML jest zawsze opisywana według sztywnych reguł. Istnieją trzy odmiany reguł HTML-a. Zalecane jest użycie odmiany, która nie zezwala na ustalanie wyglądu tekstu poprzez znaczniki HTML, ponieważ dekorować serwis powinny osobne dokumenty pomocnicze. Pozostałe dwie odmiany są mniej rygorystyczne i żadna z nich, oprócz specyficznych zastosowań, nie powinna być wykorzystywana.

Zamienniki HTML

Z reguły każdy utworzony przez człowieka dokument tekstowy jest zrozumiały dla innego człowieka. Tak długo jak jest on używany wyłącznie przez ludzi, nie mamy więc powodu do zmartwień. Jednak gdy nadchodzi potrzeba przetworzenia dokumentu przez maszynę, pojawia się problem zmuszenia jej do właściwej interpretacji jego wszystkich fragmentów. Maszyny nie są w stanie określić przeznaczenia wycinka tekstu bez dodatkowych wskazówek. Rozpatrzmy tekstowe drzewo genealogiczne. Nie umieją one, przykładowo, odróżnić miejsca urodzenia (nazwy szpitala) od miejsca pochówku (nazwy cmentarza), chociaż człowiekowi nie przysporzy to trudności. Dlatego też pojawiła się koncepcja języków opisu treści, lub inaczej języków znaczników. Każdy język znaczników, również HTML, należy do tej szerokiej rodziny języków. Mają one na celu otoczenie wybranych fragmentów dokumentu szczególnymi fragmentami tekstu, tzw. znacznikami. Znaczniki są zazwyczaj niewidoczne dla człowieka, który przegląda dokument. Oprogramowaniu, które je rozumie, pozwalają jednak poprawnie sformatować lub przekształcić dane.

Istnieje wiele różnych języków znaczników, które służą różnym celom. Główna różnica pomiędzy językami znaczników tkwi w sposobie zapisu samych znaczników. Niektóre języki wyróżniają je poprzez nawiasy kwadratowe, inne poprzez nawiasy ostre, jeszcze inne nie wykorzystują nawiasów w ogóle - podobnych różnic jest wiele.

W połowie lat 90. opracowano ścisły zestaw reguł, dzięki któremu ułatwiono oraz ujednolicono tworzenie kolejnych języków znaczników. Wszystkie języki stworzone według tego zbioru zasad mogą współpracować ze sobą nawzajem, czego nie umieją języki, które nie posiadają wspólnych korzeni. Ow zbiór reguł został nazwany XML. Język HTML nie powstał na podstawie XML-a. Gdy stworzono XML, HTML był już jednak ważnym i popularnym językiem znaczników. Dlatego uznano, że warto umożliwić jego współpracę z językami utworzonymi za pomocą zasad XML. Utworzono więc XHTML, nowy język znaczników, który:

Co to znaczy? Po pierwsze, XHTML umożliwia nadawanie fragmentom dokumentów dokładnie tego samego znaczenia co HTML. Obydwa języki posiadają również trzy odmiany. Obydwa języki zalecają również, aby webmaster wykorzystywał ich najbardziej rygorystyczną odmianę. Po drugie, XHTML spełnia zestaw reguł XML, dzięki czemu może współpracować z innymi językami znaczników zgodnymi z XML.

Niestety, na dzień dzisiejszy żadna, nawet najnowsza, wersja najpopularniejszej przeglądarki internetowej, Internet Explorera, nie obsługuje XHTML-a. Stąd wszystkie zalety XHTML-a mogą zostać wykorzystanie jedynie u niewielkiej liczby użytkowników korzystających z innych przeglądarek. Biorąc pod uwagę ten fakt webmasterzy nieczęsto decydują się na wykorzystanie XHTML-a zamiast HTML-a. Na koniec należy wspomnieć, że niektóre przeglądarki potrafią interpretować inne języki znaczników niż HTML lub XHTML. Potrzeba wysłania takiego dokumentu do przeglądarki użytkownika zdarza się jednak bardzo rzadko.

Zastosowanie HTML

Chociaż niekiedy dokumenty napisane w czystym tekście są wygodne do czytania dla ludzi, zawarcie ich wewnątrz znaczników HTML, lub XHTML, ułatwia znacznie korzystanie z nich zarówno maszynom, jak wspomniano powyżej, jak i ludziom. Można wskazać kilka przewag HTML nad tekstem:

Przykład HTML

Przykład poprawnego, opisującego znaczenie znakowanego tekstu, kodu HTML:

<p><dfn>Znacznik <code>&lt;dfn&gt;</code></dfn> &mdash; jeden ze znaczników języka opisu treści <abbr lang='en' title='Hypertext Markup Language'>HTML</abbr>. Oznacza ciąg znaków jako właśnie definiowany termin. Dzięki jego użyciu w kodzie strony <a href='http://www.google.pl'> wyszukiwarka Google </a> wie, że gdzieś w pobliżu znajduje się jego definicja i wypozycjonuje tę stronę wysoko w razie, gdyby ktoś poszukiwał informacji pod hasłem <q>znacznik dfn</q>.

Oraz, poniżej, jego wygląd:

Znacznik <dfn> — jeden ze znaczników języka opisu treści HTML. Oznacza ciąg znaków jako właśnie definiowany termin. Dzięki jego użyciu w kodzie strony wyszukiwarka Google wie, że nieopodal umieszczono jego definicję i wypozycjonuje tę stronę wysoko w razie, gdyby ktoś poszukiwał informacji pod hasłem znacznik dfn.

Dodatki

Dokumenty w językach, które opisane zostały poniżej, usprawniają działanie dokumentu podstawowego, wzbogacają jego wygląd, lub zwiększają możliwości. Ciekawostka: powyżej wspomniałem, że każdy dokument pomocniczny, zasugerowany przez dokument podstawowy, jest pobierany przez przeglądarkę użytkownika. Jak? Poprzez osobne żądanie, skierowane do serwera WWW. W istocie jednak, niemal każdy dokument pomocniczy może być zarówno zasugerowany przez, jak i umieszczony wewnątrz dokumentu HTML.

Gdy dokument pomocniczy jest umieszczony, lub inaczej zagnieżdżony, w dokumencie HTML, przeglądarka nie musi wysyłać wielokrotnych żądań do serwera WWW. Zamiast tego otrzymuje wszystkie dokumenty podczas jednego, zbiorczego żądania. Obydwa modele, dokumentów pomocniczych sugerowanych oraz umieszczonych wewnątrz dokumentu podstawowego, mają swoje specyficzne zastosowania. Nawiasem mówiąc, co dzieje się, gdy wszystkie dokumenty pomocnicze zostaną zagnieżdżone w dokumencie podstawowym, ale użytkownik przeglądarki nie akceptuje dokumentów pomocniczych? Jako że zostały już one pobrane na jego komputer, przeglądarka zwyczajnie nie wykorzystuje ich podczas wzbogacania dokumentu HTML.

CSS - Cascading Style Sheets (Kaskadowe Arkusze Stylów)

Zastosowanie CSS

Arkusze stylów to najważniejsza technologia internetowa oprócz samego języka opisu treści. Są to dokumenty, które nadają treści zaplanowany przez grafika wygląd, wliczając w to kolory tekstu oraz tła, rozmiary sekcji strony, szpalty tekstu, reakcje na przewijanie dokumentu, itp. Każdy arkusz stylów składa się z szeregu reguł. Każda reguła ma za zadanie określić fragmenty dokumentu HTML, do których się odnosi, oraz wyrazić przewidziany dla nich sposób prezentacji. Zadaniem przeglądarki jest nadać odpowiedni wygląd odpowiednim fragmentom dokumentu.

Uwaga: niezalecane odmiany (X)HTML-a zawierają, obok znaczników odpowiadających za znaczenie tekstu, szereg znaczników odpowiadających za wygląd tekstu. Teoretycznie owe znaczniki formatujące można stosować zamiast arkuszy stylów, posiadają one jednak dwie główne wady.

Aspekt Znaczniki formatujące Kaskadowe arkusze stylów
Zakres możliwości Możliwości nieznaczne: głównie zmiana kolorystyki, rozmiaru oraz wyrównania tekstu. Możliwości znaczne: zmiana kolorystyki, rozmiaru, wyrównania oraz zachowania tekstu tekstu, jak również jego pozycji, przezroczystości, obramowań oraz odstępów pomiędzy fragmentami dokumentu.
Efektywność Zmiana wyglądu dokumentów HTML wymaga zmiany wszystkich dokumentów HTML. Zmiana wyglądu dokumentów HTML wymaga zmiany tylko jednego dokumentu pomocniczego, czyli arkusza stylów. Jeden dokument formatujący, czyli jeden arkusz stylów, może zostać zasugerowany przez wiele dokumentów HTML jednocześnie. Stąd zmiany wprowadzone wewnątrz jednego arkusza będą widoczne natychmiast we wszystkich dokumentach.

Uwaga: Arkusze stylów nie wpływają jedynie na wygląd dokumentu na ekranie. Dzięki nim można również ustalić detale rozmieszczenia dokumentu na wydruku lub sposób, w jaki zostanie on odczytany przez przeglądarki głosowe.

Przykład CSS

Poniższy przykład ustala rozmiary czcionki dla dwóch typów nagłówków HTML oraz wybrane inne właściwości czcionek dla wyżej wspomnianych nagłówków oraz określonej odmiany akapitu.

h1 { font-size: 18pt; } h2 { font-size: 14pt; } h1, h2, p.important { color: rgb(255, 0, 0); font-family: serif; letter-spacing: 2px; }

JS – JavaScript

Zastosowanie JS
Zmiana treści

Załóżmy, że weszliśmy na ulubiony portal informacyjny, i pobraliśmy dokument HTML, który omawia najnowsze krajowe wydarzenia. Są one umieszczone pod nagłówkiem Wiadomości. Jeżeli odejdziemy od komputera i odczekamy dwie godziny, prawdopodobnie sekcja Wiadomości zostanie tymczasem uaktualniona. Odświeżamy więc stronę, otrzymujemy nowy dokument, i odczytujemy zawartość sekcji (oraz odkrywamy, że faktycznie zawiera nowe wiadomości). Zauważmy, że chociaż odświeżyliśmy cały dokument, zmodyfikowana została wyłącznie sekcja Wiadomości. Tekst oraz znaczniki opisujące stopkę redaktorską, autorów wiadomości, menu nawigacyjne serwisu, logo graficzne itp. pozostają niezmienione pomiędzy żądaniami. Czy musimy ponownie pobierać niezmienione fragmenty dokumentu, skoro odświeżając stronę mamy zamiar jedynie przeczytać uaktualnione wiadomości?

Zmiana wyglądu

Wyobraźmy sobie, że chcemy, aby fragment dokumentu podstawowego stale, przykładowo co sekundę, zmieniał położenie. Wiemy, że położenie znaczników HTML określają arkusze stylów. Czy oznacza to, że co sekundę mamy prosić serwer o nowy arkusz CSS, który nakaże przeglądarce umieścić tekst parę centymetrów dalej? Twórcy przeglądarek zapobiegli marnotrawieniu ruchu internetowego, ponieważ opracowali wygodniejsze rozwiązanie problemu.

Rozwiązanie

Rozwiązaniem jest zmiana źródła już pobranej strony. Gdy otrzymamy od serwera gotowy dokument podstawowy, wszystkie jego znaczniki HTML zostają wczytane do pamięci systemu operacyjnego. Podobnie zapamiętane zostają wszystkie otrzymane dokumenty pomocnicze, jak arkusze stylów, dekorujące stronę ilustracje, animacje, czy wykresy. Gdy to nastąpi, przeglądarka internetowa może je dowolnie zmieniać. Przykładowe modyfikacje obejmują zmianę kolejności, zawartości oraz nazw znaczników HTML, reguł arkuszy stylów, czy danych wewnątrz wykresów. Wszystkie wprowadzone zmiany widoczne są natychmiast na ekranie monitora. Wszystkie obliczenia wykonywane są lokalnie, na naszym komputerze, więc nie obciążają łączy internetowych.

Co wykonuje obliczenia oraz zmiany? Programy, które zapisujemy wewnątrz osobnych dokumentów pomocniczych, tzw. skrypty. Jak wiadomo, każdy program wymaga algorytmów oraz danych. Algorytmy umieszczamy wewnątrz osobnych dokumentów pomocniczych oraz wyrażamy składnią języka programowania ECMAScript (niektóre przeglądarki rozumieją także skrypty zapisane w składniach innych języków). Dane natomiast stanowią znaczniki dokumentu HTML oraz wszystkie powiązane dokumenty pomocnicze. Wynika stąd, że skrypty mogą, jako dokumenty pomocnicze, modyfikować same siebie. Skrótowo, skrypt JavaScript to:

Zwróćmy uwagę na wymienione powyżej zastosowania skryptów JavaScript. Obydwa przykłady omawiają zmiany, które następują po określonym czasie. W pierwszym przypadku, po momencie, gdy użytkownik zdecyduje się pobrać odświeżoną listę wiadomości, w drugim, po jednej sekundzie. Jest to podstawowa cecha JavaScriptu: zdolność do reagowania na żądania użytkownika w dowolnym momencie. Skrypty zasadniczo wykonują się natychmiast po załadowaniu dokumentu, lecz określone fragmenty kodu JavaScript mogą zostać wykonane dopiero gdy nastąpi określone zdarzenie. Zdarzeniem może być np. poruszenie myszą, minięcie określonej liczby milisekund, zamknięcie okna przeglądarki, zwolnienie klawisza klawiatury.

Dalsze zastosowania

JavaScript może modyfikować znaczniki dokumentu podstawowego, zmieniać jego wygląd, określać poprawność danych zawartych wewnątrz formularza wypełnianego przez użytkownika, umieszczać proste gry wewnątrz dokumentu podstawowego, dyskutować z użytkownikiem poprzez okna dialogowe, a nawet samodzielnie pobierać dokumenty internetowe, podobnie jak pełnoprawne przeglądarki internetowe.

Omówmy ostatnią możliwość rozpatrując przykład, który dotyczy listy wiadomości. Chcemy pobrać najświeższą wersję listy, wiemy jednak, że posiada ją jedynie serwer portalu informacyjnego. Aby zmodyfikować nasz znacznik HTML, i umieścić wewnątrz niego odświeżoną listę, JavaScript musiał więc odwołać się do zewnętrznego serwera. JavaScript jednak, inaczej niż standardowa przeglądarka internetowa, pobrał dokument, który zawiera wyłącznie listę wiadomości (to jest, interesującą nas treść). Tym sposobem zaoszczędził transfer, ponieważ nie pobierał niepotrzebnych znaczników HTML, jak nagłówek i stopka. Powyższa technologia, pobieranie oszczędniejszych wersji dokumentów poprzez JavaScript, nosi nazwę AJAX.

AJAX? Odświeżając, odświeżamy: Odświeżając, wykorzystujemy: Znaczniki, które pobieramy: Transfer:
nie całość dokumentu podstawowego przeglądarkę internetową (program) wszystkie (cały dokument) tracimy
tak część dokumentu podstawowego przeglądarkę JavaScript (skrypt) wybrane (interesująca nas treść) zyskujemy
Przykład JS

Fragment skryptu, który zmienia zawartość znacznika HTML na informację o temperaturze panującej w podanym przez użytkownika mieście.

document.getElementById('start').firstChild.nodeValue = weather[prompt('Twoje miasto?')].temperature;

Ilustracje oraz Adobe Flash

Grafiki również podlegają prawom, które opisują dokumenty pomocnicze. Są one plikami tekstowymi, zapisanymi zgodnie z określonymi regułami składniowymi, i wzbogacają oryginalny dokument HTML. Grafiki, tak samo jak każdy inny dokument pomocniczy, mogą zostać dołączone do serwisu internetowego jako osobne pliki lub zostać umieszczone bezpośrednio w dokumencie HTML.

Generowanie - server side

Przeglądarka WWW, gdy wysyła do serwera żądanie o dokument podstawowy lub dokument pomocniczy, zawsze żąda jednego, konkretnego pliku, zawartego w konkretnym katalogu. Jest to część adresu URL, którą widzimy po nazwie domeny (w przypadku niniejszego dokumentu podstawowego: /strona_technologia_rozwiniecie.html). Ale ścieżka do pliku, albo inaczej jego katalog oraz jego nazwa, to faktycznie jedynie prosty ciąg znaków. Dlatego, gdy serwer odbierze żądanie, może zależnie od jego kształtu podjąć różne schematy działania.

Przekazywanie (istniejącego pliku)

Po pierwsze, serwer może odesłać plik, który znajduje się na jego twardym dysku. Zazwyczaj serwer szuka pliku, o który prosiło żądanie, w katalogu, który zawierało żądanie. Ale może też szukać pliku wewnątrz innego katalogu, albo katalog pozostawić bez zmian, ale szukać pliku pod inną nazwą. Gdy serwer odszuka plik, którego żądała przeglądarka, odsyła doń jego zawartość. Jest to najprostszy, i domyślny, sposób działania serwerów WWW.

Produkowanie

Co składa witrynę?

Po drugie, serwer może uruchomić osobny program, aby wyprodukował dokument, i odesłał go do przeglądarki użytkownika. Program, który wspomoże serwer WWW podczas odpowiadania na żądanie, można utworzyć w dowolnym języku programowania, chociaż najczęściej używane są języki PHP, Perl, Python, Ruby, SSI, C lub C++. Program może wygenerować dowolny rodzaj dokumentu, jeżeli tylko znamy reguły, które rządzą jego składnią. Przykładowo, wygenerować można HTML, XML, kod JavaScript, a także pliki graficzne. Niektóre programy, zależnie od możliwości serwera, na którym są zainstalowane, mogą również generować pliki Adobe Flash lub PDF.

Jak wspomniano, każdy program składa się z kodu oraz z danych. W tym przypadku dane stanowi wszystko, co pozwala programowi określić, jaki kształt przybierze dokument, który należy odesłać przeglądarce. Do danych należy m.in:

Dane wejściowe żądania, oraz ich przykład (na podstawie niniejszego dokumentu)
Katalog w żądaniu  /
Plik w żądaniu  strona_technologia_rozwiniecie.html
Data i godzina żądania  2024-09-19T11:39:11+02:00
Adres IP komputera użytkownika przeglądarki  3.129.23.220
Parametry żądania (opcjonalna część adresu URL, po znaku zapytania)  
Nazwa i wersja przeglądarki użytkownika  Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)

I wiele innych. Na ich podstawie program konstruuje odpowiedź na żądanie.

Co jest składnikiem witryny?

Powyższe dane służą głównie odgadnięciu, czego użytkownik oczekuje od serwera WWW, i zawsze pochodzą od przeglądarki użytkownika. Ale serwer WWW, aby przygotować odpowiedź, musi również wiedzieć co odesłać użytkownikowi (to jest, przygotować treść odpowiedzi). Treść odpowiedzi może zależeć od danych, które wysłał użytkownik, ale nie musi. Użytkownik, przeciwnie do treści żądania, nie ma wpływu na treść odpowiedzi. Do źródeł treści należą m.in:

Zauważmy, że serwer WWW może produkować dokumenty, które przesyła przeglądarce, samemu nie posiadając żadnych plików. Przykładowo, możliwe jest uruchomienie serwera WWW na komputerze, który nie posiada dysku twardego. Wszystkie strony, które będzie odsyłał do użytkowników, będą produkowane na podstawie danych z innych komputerów. Wszystkie niezbędne dane będą pobierane z Internetu albo z sieci lokalnej.


Autor: Aleksander Janeczko, 2007

Poprawny CSSPoprawny CSS i HTMLPoprawny HTML 4 Strict. Powered by W3 Style Serwisy Internetowe Warszawa 2008.