Artykuł pochodzi z czasopisma PHP Solutions. Do ściągnięcia bezpłatnie ze strony:

Podobne dokumenty
H2.cjk { font-family: "Microsoft YaHei"; font-size: 14pt; font-style: italic; font-weight:

Facelets ViewHandler

Laboratorium 1 Wprowadzenie do PHP

Podstawy JavaScript ćwiczenia

Podstawy (X)HTML i CSS

Format HTML. Wybrane działy Informatyki Stosowanej. Definicja i przeznaczenie Struktura dokumentu Znaczniki Formularze i komponenty

Laboratorium 6 Tworzenie bloga w Zend Framework

Laboratorium 7 Blog: dodawanie i edycja wpisów

Programowanie internetowe

PLAN WYNIKOWY PROGRAMOWANIE APLIKACJI INTERNETOWYCH. KL III TI 4 godziny tygodniowo (4x30 tygodni =120 godzin ),

plansoft.org Zmiany w Plansoft.org

2 Podstawy tworzenia stron internetowych

Smarty PHP. Leksykon kieszonkowy

Budowa aplikacji wielowarstwowych. Zastosowanie szablonów

Aplikacje WWW - laboratorium

Sigplus. Galeria w Joomla

INSTALACJA I KONFIGURACJA SERWERA PHP.

Referat z przedmiotu Technologie Internetowe SPIS TREŚCI

Wykład 03 JavaScript. Michał Drabik

Wykład 1: HTML (XHTML) Michał Drabik

Wyrażenie include(sciezka_do_pliku) pozwala na załadowanie (wnętrza) pliku do skryptu php. Plik ten może zawierać wszystko, co może się znaleźć w

Specyfikacja techniczna dot. mailingów HTML

Backend Administratora

AUDYT DOSTĘPNOŚCI STRONY INTERNETOWEJ

Wykład 2 TINT. XHTML tabele i ramki. Zofia Kruczkiewicz

Dane - pobieranie, przekazywanie i przechowywanie. dr Beata Kuźmińska-Sołśnia

Podstawy technologii WWW

MVC w praktyce tworzymy system artykułów. cz. 2

Aplikacje internetowe - laboratorium

Wysyłanie pliku na serwer. Plik na serwerze.

Mailingi HTML. Specyfikacja techniczna

PLAN WYNIKOWY PROGRAMOWANIE APLIKACJI INTERNETOWYCH. KL IV TI 6 godziny tygodniowo (6x15 tygodni =90 godzin ),

Zaawansowana Pracownia Komputerowa - Ćwiczenia. Krzysztof Miernik

Delphi podstawy programowania. Środowisko Delphi

Zawartość specyfikacji:

Szablon główny (plik guestbook.php) będzie miał postać:

PROGRAMOWANIE. WNPiD UAM, Programowanie, inż. Piotr Jabłoński

Modele danych walidacja widoki zorientowane na model

HTML DOM, XHTML cel, charakterystyka

Funkcje i instrukcje języka JavaScript

REFERAT O PRACY DYPLOMOWEJ

Cel ogólny lekcji: Wprowadzenie do tworzenia stron WWW w języku HTML. Wprowadzenie pojęć: strona WWW, język HTML, dokument HTML.

Dokumentacja smsapi wersja 1.4

Programowanie obiektowe

Być może jesteś doświadczonym programistą, biegle programujesz w Javie,

Na początku utworzymy formularz w czystym języku HTML i przetestujemy go za pomocą przeglądarki WWW.

Dokumentacja systemu NTP rekrut. Autor: Sławomir Miller

Technologie Internetowe Raport z wykonanego projektu Temat: Internetowy sklep elektroniczny

Bazy Danych i Usługi Sieciowe

SZYBKI START. Tworzenie nowego połączenia w celu zaszyfrowania/odszyfrowania danych lub tekstu 2. Szyfrowanie/odszyfrowanie danych 4

E.14.1 Tworzenie stron internetowych / Krzysztof T. Czarkowski, Ilona Nowosad. Warszawa, Spis treści

Aplikacje WWW - laboratorium

Tablica zawierająca odniesienia do znajdujących się w dokumencie obiektów typu Anchor.

Tworzenie Stron Internetowych. odcinek 5

Aplikacje WWW - laboratorium

Wykład 5_2 Arkusze stylów dziedziczenie. Technologie internetowe Zofia Kruczkiewicz

I. Informacje ogólne. Jednym z takich systemów jest Mambo.

I. Dlaczego standardy kodowania mailingów są istotne?

Słowem wstępu. Część rodziny języków XSL. Standard: W3C XSLT razem XPath 1.0 XSLT Trwają prace nad XSLT 3.0

Struktura języka HTML ZNACZNIKI. Oto bardzo prosta strona WWW wyświetlona w przeglądarce: A tak wygląda kod źródłowy takiej strony:

spis treści wprowadzenie 9 1. tworzenie bazy danych przeglądanie pracowników przeglądanie z wykorzystaniem technologii ajax 45

Tworzenie witryn internetowych PHP/Java. (mgr inż. Marek Downar)

Programowanie w Sieci Internet Blok 2 - PHP. Kraków, 09 listopada 2012 mgr Piotr Rytko Wydział Matematyki i Informatyki

Aplikacje internetowe laboratorium XML, DTD, XSL

XML i nowoczesne technologie zarządzania treścią 2007/08

Bazy danych i strony WWW

Przewodnik użytkownika (instrukcja) AutoMagicTest

Hosting WWW Bezpieczeństwo hostingu WWW. Dr Michał Tanaś (

O stronach www, html itp..

HTML (HyperText Markup Language) hipertekstowy język znaczników

Zasady programowania Dokumentacja

Kompozycja Proceduralna

Diagnostyka pamięci RAM

media Blitz wydajne sytemy szablonów

Napisy w PHP. Drukowanie napisów instrukcją echo

Podstawowe wykorzystanie Hibernate

Aplikacje WWW - laboratorium

Systemy internetowe HTML

Po zakończeniu rozważań na temat World Wide Web, poznaniu zasad organizacji witryn WWW, przeczytaniu kilkudziesięciu stron i poznaniu wielu nowych

JAVAScript w dokumentach HTML (1) JavaScript jest to interpretowany, zorientowany obiektowo, skryptowy język programowania.

Extensible Markup Language (XML) Wrocław, Java - technologie zaawansowane

Tworzenie stron internetowych z wykorzystaniem HTM5, JavaScript, CSS3 i jquery. Łukasz Bartczuk

CMS- kontakty (mapa)

29. Poprawność składniowa i strukturalna dokumentu XML

Zakres treści Czas. 2 Określenie charakteru i tematyki strony. Rodzaje witryn. Projekt graficzny witryny. Opracowanie skryptów

WYMAGANIA EDUKACYJNE. Witryny i Aplikacje Internetowe klasa I

XHTML - Extensible Hypertext Markup Language, czyli Rozszerzalny Hipertekstowy Język Oznaczania.

Rys. 1. Główne okno programu QT Creator. Na rysunku 2 oznaczone zostały cztery przyciski, odpowiadają kolejno następującym funkcjom:

Dokument hipertekstowy

Obiekt navigator. Dodał Administrator wtorek, 16 marzec :32

Programowanie Multimediów. Programowanie Multimediów JAVA. wprowadzenie do programowania (3/3) [1]

Dodatek Technologie internetowe 1. UTF-8 wg 2. Adresy URL

TECHNOLOGIE INTERNETOWE WYKŁAD 6. JavaScript Funkcje i obiekty

Wykład 6 Skrypty typu JavaScript. Technologie internetowe Zofia Kruczkiewicz

Przykładowa integracja systemu Transferuj.pl

Jak posługiwać się edytorem treści

14. POZOSTAŁE CIEKAWE FUNKCJE

13. Konfiguracja proxy http, smtp, pop3, ftp, ssl

Programy LeftHand - Obsługa plików JPK. Luty 2017

Zaawansowane aplikacje internetowe

Transkrypt:

Artykuł pochodzi z czasopisma PHP Solutions. Do ściągnięcia bezpłatnie ze strony: www.phpsolmag.org Bezpłatne kopiowanie i rozpowszechanie artykułu dozwolone pod warunkiem zachowania jego obecnej formy i treści.

Łukasz Lach Wykorzystanie rozszerzenia Tidy Na CD zostały zamieszczone wszystkie skrypty i działające Tidy do przetestowania na żywo oraz zbiór ciekawych narzędzi związanych z Tidy. Tidy należy do grupy tych rozszerzeń języka PHP, którym warto poświęcić chwilę uwagi. Za jego pomocą można w prosty sposób diagnozować i naprawiać uszkodzone dokumenty HTML, XHTML oraz XML. Tidy może nam znacznie ułatwić zarówno tworzenie kodu HTML, jak i walidację danych pochodzących z zewnątrz. 1. http://www.php.net/tidy manual Tidy na php.net 2. http://tidy.sourceforge. net/ strona domowa projektu Tidy 3. http://tidy.source forge.net/docs/ quickref.html specyfikacja opcji parsera 4. http://pecl.php.net/ package/tidy strona, z której można ściągnąć rozszerzenie Tidy dla PHP5 oraz PHP 4.3.x 5. http://www.w3.org/ People/Raggett/tidy/ tutorial dotyczący wykorzystaniatidy 6. http://users.rcn.com/ creitzel/tidy.html zbiór narzędzi do Tidy 7. http://perso. wanadoo.fr/ ablavier/tidycom/ index.html GUI do Tidy Tidy to nazwa nowego rozszerzenia PHP stworzonego przez Johna Coggeshalla (http://www.coggeshall.org/). Za jego pomocą można w prosty sposób diagnozować, oczyszczać, jak również naprawiać uszkodzone dokumenty HTML, XHTML oraz XML. Dodatkowo posiada parser działający na dokumentach HTML, co pozwala nam na stworzenie drzewa DOM (Document Object Model) i wyciąganie poszczególnych elementów wraz z atrybutami. Moduł przeznaczony jest dla PHP w wersji 5 (Tidy 2.0), jednak istnieje również wersja dla PHP 4.3.x (Tidy 1.0). Przedstawione w artykule przykłady nie będą jednak poprawnie działać na starszej wersji modułu Tidy z racji, że nie posiada ona wszystkich opisywanych funkcji lub mają one inną strukturę parametrów. Różnice pomiędzy Tidy w wersji 1.0 i 2.0 Najważniejszymi zmianami w porównaniu do wersji 1.0 jest większa funkcjonalność, szybkość działania oraz obiektowość. Tidy dla PHP 4.3.x umoż- Co należy wiedzieć... Czytelnik powinien znać podstawy programowania w PHP, a w przypadku instalacji rozszerzenia na systemie uniksowym, musi posiadać prawa administratora. Artykuł opisuje moduł Tidy w wersji 2.0, tak więc przedstawione listingi będą działać jedynie na PHP5. Co obiecujemy... Po przeczytaniu artykułu Czytelnik będzie potrafił w pełni wykorzystać możliwości rozszerzenia Tidy, parsując, naprawiając kod HTML, jak również stworzyć wtyczkę do systemu szablonów Smarty. 32 www.phpsolmag.org PHP Solutions Nr 5/2004

liwia wykonywanie funkcji jednorazowo dla danego pliku. Tidy 2.0 współpracuje z buforowaniem PHP (ob _ tidyhandler) oraz umożliwia pracę na drzewie znaczników HTML. Od czego zacząć? Rozpoczynając pracę z modułem musimy zapoznać się z jego podstawowymi możliwościami. Stwórzmy dokument PHP, który wygeneruje niepoprawny kod HTML. Nie przejmujmy się nie zamkniętymi tagami, brakiem nagłówka dokumentu czy deklaracji DOCTYPE (patrz Listing 1). Wykorzystując buforowanie przepuścimy nasz kod przez funkcję ob _ tidyhandler(). Przekazana jako argument dla ob _ start() powoduje sparsowanie i naprawę bufora, w którym znajduje się stworzony przez nas dokument. W ten sposób możemy uzyskać poprawny w strukturze kod, interpretowany przez wiekszość przeglądarek internetowych. Co ciekawe, zostają naprawione nie tylko wszystkie napotkane błędy, ale cały kod zostaje zamknięty w dokument HTML ze znacznikami nagłówka i części głównej dokumentu. W praktyce Odbierając od klienta jakiekolwiek dane zazwyczaj usuwamy wszelką niebezpieczną treść za pomocą funkcji strip _ tags czy htmlspecialchars. Jednak odpowiednio użyte niektóre znaczniki HTML pozwoliłyby użytkownikowi na wyróżnienie pewnego fragmentu tekstu (np. za pomocą podkreślenia czy pogrubienia) albo wstawienie linka do wiadomości, ogólnie: zanieczyszczenie naszej strony. Takie problemy pojawiają się często podczas tworzenia forum dyskusyjnego lub księgi gości. Chcąc umożliwić użytkownikowi manipulowanie prostym kodem HTML podczas wysyłania np. nowego tematu na forum zazwyczaj korzystamy z graficznego edytora napisanego w JavaScript. Co zrobić jednak, gdy takie rozwiązanie nas nie satysfakcjonuje? Nie możemy bezgranicznie Listing 1. Wykorzystanie buforowania w połączeniu z ob_tidyhandler ob_start('ob_tidyhandler'); echo '<b>php Solutions</u><br>'; echo '<a href=www.phpsolmag.org><u>kliknij tutaj</a>'; Listing 2. Naprawa kodu HTML wysłanego przez użytkownika echo '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2//EN">'; echo '<html><head><title>listing 2.</title></head><body>'; if (isset($_post['message'])) { echo '<b>wysłany kod HTML:</b><br />'.htmlspecialchars($_post['message']).'<br /><br />'; $_POST['message'] = strip_tags($_post['message'], '<a><b><i><u><font>'); $tidy = tidy_parse_string($_post['message'], null, 'UTF8'); //Tu powinno nastąpić wpisanie poprawionego kodu HTML //np. do bazy danych. My wypiszemy naprawione źródło. echo '<b>poprawiony kod HTML:</b><br />'; echo htmlspecialchars(substr(tidy_get_body($tidy)->value, 6, -10)); echo '<h3>dodaj post</h3>'; echo '<form method="post" action="4.php5">'; echo '<textarea name="message" rows="10" cols="50"></textarea><br />'; echo '<input type="submit" value="ok" /></form>'; echo '</body></html>'; Rysunek 1. Wynik działania skryptu z Listingu 2 PHP Solutions Nr 5/2004 www.phpsolmag.org 33

Listing 3. Opcje parsera $tidy = tidy_parse_string('<b>php Solutions</u><img src=foo.png>', array('output-xhtml' => 1, 'alt-text' => ''), 'UTF8'); echo $tidy; Listing 4. Kod XHTML zwrócony przez skrypt z Listingu 3 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title></title> </head> <body> <b>php Solutions</b><img src="foo.png" alt="" /> </body> </html> Listing 5. Wyszukiwanie plików graficznych w kodzie HTML $html = '<html><head><title></title></head><body>'; $html.= '<img src=1.png><b>php Solutions</u>'; $html.= '<img alt="" src=2.png width=20 height=20>'; $html.= '</body></html>'; $tidy = tidy_parse_string($html); $html = tidy_get_html($tidy); var_dump(get_images($html)); function get_images($node) { $images = array(); if ($node->id == TIDY_TAG_IMG) { if (($attr = @$node->attribute['src'])!== null) $images[] = $attr; if ($node->haschildren()) foreach($node->child as $child) foreach(get_images($child) as $img) $images[] = $img; return $images; zaufać internaucie i pozwolić mu wpisywać kod HTML, bo nie mamy pewności, czy na pewno zamknął wszystkie znaczniki (Rysunek 1). Oczywiście można stworzyć własny parser, tylko po co, skoro mamy do dyspozycji Tidy? Z jego pomocą naprawimy kod wysłany przez formularz, a struktura głównego dokumentu nie ulegnie zmianie. Na Listingu 2 znajduje się przykład skryptu PHP symulującego dodawanie nowej wiadomości do forum dyskusyjnego. Przyjrzyjmy mu się bliżej. Opiera się on na odebraniu od użytkownika dowolnej treści, włączając w to HTML. Najważniejsza część kodu zawiera się jednak w pierwszych linijkach. Na początku wypisujemy odebrany kod w niezmienionej formie. Chcąc pozbyć się niechcianych znaczników wykorzystujemy funkcję strip _ tags() i pozostawiamy jedynie tagi odpowiedzialne za formatowanie tekstu i tworzenie hiperłączy. Teraz następuje pierwsze wykorzystanie modułu Tidy wywołanie funkcji tidy _ parse _ string(). Powoduje ona stworzenie parsera Tidy, co stanowi jednocześnie zwracaną przez omawianą funkcję wartość. Wymaganym argumentem tejże funkcji jest zmienna typu string zawierająca kod HTML, z którym będziemy pracować. Pozostałe dwa argumenty są opcjonalne i opisują kolejno zdefiniowaną przez nas tablicę zawierającą opcje konfiguracji parsera (o tym w kolejnym rozdziale) oraz zastosowane kodowanie znaków. Dozwolone wartości dla trzeciego argumentu to: ascii (wartość domyślna), latin1, raw, utf8, iso2022, mac, win1252, utf16le, utf16be, utf16, big5 oraz shiftjis. Po stworzeniu parsera wywołujemy funkcję tidy _ clean _ repair() w celu wyczyszczenia i naprawienia kodu, a następnie wypisujemy nowy ciąg usuwając przedtem tagi otwarcia i zamknięcia znacznika body. Początki Rysunek 2. Raportowanie o błędach Opcje parsera Wróćmy do funkcji tidy _ parse _ string(), a ściślej do trzeciego parametru jej wywołania, w którym możemy umieścić opcje parsowania, naprawy i czyszczenia kodu. Warto w tym miejscu wspomnieć, że podobny parametr zawiera funkcja tidy _ parse _ file(), z tą tylko różnicą, że dokument HTML czytany jest w tym wypadku z zewnętrznego pliku. Parametr zawierający konfigurację może być ciągiem znaków (oznaczać to będzie, że dane znajdują się w pliku o podanej nazwie) albo tablicą. W Ram- 34 www.phpsolmag.org PHP Solutions Nr 5/2004

Tidy Listing 6. Czyszczenie dokumentu HTML stworzonego w Wordzie $tidy = tidy_parse_file('word.htm', array( 'word-2000' => 1, 'output-xhtml' => 1, 'doctype' => 'strict')); echo $tidy; Rysunek 3. Porównanie wielkości wyeksportowanych do HTML dokumentów ze znanych edytorów (1) tekstu oraz przepuszczonych przez Tidy(2) CMS Tworząc systemy zarządzania treścią (czyli CMS Content Managment System) poprzez stronę WWW problem edycji dokumentów HTML rozce Najczęściej używane opcje parsera zostały wypisane przełączniki, z których będziemy najczęściej korzystać. Przykład ustawienia opcji parsera znajduje się na Listingu 3, a jego wynik w postaci kodu XHTML przedstawiony jest na Listingu 4. Pozostałe opcje konfiguracji znajdują się w dokumentacji Tidy [3]. Drzewko obiektów Jedną z ciekawszych możliwości Tidy jest opcja konwersji kodu HTML na tablicę obiektów typu tidy _ node. Każdy obiekt tego typu zawiera szereg zmiennych i funkcji, które możemy w praktyczny sposób wykorzystać. Zobrazujmy to na przykładzie. Kod z Listingu 5 przeprowadza konwersję dokumentu HTML na drzewo obiektów wspomnianego typu i wyciąga nazwy wszystkich plików graficznych. Zaczynamy od zdefiniowania zmiennej $html, w której umieszczamy przykładowy kod HTML. Następnie korzystamy z poznanych już funkcji Listing 7. Filtr Smarty function smarty_outputfilter_tidy($source, &$smarty) { if (extension_loaded('tidy')) { $tidy = tidy_parse_string($source); return return $source; Listing 8. Obsługa będów i raporty w Tidy $html = '<b>php Solutions</u><br>'; $html.= '<a href=http://www.phpsolmag.org><u>kliknij tutaj</ax>'; $html.= '<img src="file.jpg" /><a href=http://php.net></a>'; $tidy = tidy_parse_string($html, array('accessibility-check' => 3)); tidy_diagnose($tidy); echo '<tt>'.nl2br(htmlspecialchars(tidy_get_error_buffer($tidy))). '</tt>'; tidy _ parse _ string() oraz tidy _ clean _ repair() w celu dokonania parsowania i naprawy. Wywołanie funkcji tidy _ get _ html() odpowiedzialne jest za wspomnianą konwersję kodu HTML na drzewo obiektów, które zapisujemy do zmiennej $html i przekazujemy jako parametr stworzonej przez nas funkcji get _ images(). Działanie owej funkcji opiera się na przechodzeniu przez kolejne elementy drzewa w poszukiwaniu znacznika typu TIDY _ TAG _ IMG i posiadającego argument src. W przypadku znalezienia elementu spełniającego te warunki uzupełniamy tablicę $images i przechodzimy do kolejnego obiektu. Zapełniona tablica jest zwracana przez funkcję i wyświetlona w przeglądarce za pomocą funkcji var _ dump(). Jak widać za pomocą Tidy można nie tylko czyścić i naprawiać dokumenty HTML, ale również wyciągać szukane przez nas elementy kodu wraz z ich wartościami. Jest to kolejne, bardzo praktyczne zastosowanie tego rozszerzenia, jednak to jeszcze nie wszystko... Instalacja Wersję dla systemów uniksowych można ściągnąć jako rozszerzenie PECL z http://pecl.php.net/package/tidy. Wersja dla użytkowników Windows dostępna jest pod adresem http://snaps.php.net/win32/pecl_stable/ w postaci pliku o nazwie php _ tidy.dll, który należy skopiować do katalogu z rozszerzeniami, a do php.ini dopisać linię w postaci extension=php _ tidy.dll. W przypadku kompilacji PHP5 wystarczające jest dodanie parametru --with-tidy. Konfiguracja Tidy posiada jedynie dwie opcje możliwe do ustawienia w pliku php.ini. Wartości tych zmiennych możemy sprawdzić np. uruchamiając funkcję phpinfo(). tidy.default_config Za pomocą tej zmiennej możemy ustalić położenie pliku konfiguracyjnego, z którego funkcje rozszerzenia będą korzystać. tidy.clean_output Jeżeli ta opcja zostanie włączona, Tidy będzie parsował i naprawiał każdy dokument HTML wysłany za pomocą skryptu PHP. Domyślną wartością jest 0 i tak też powinno pozostać, gdy generujemy nie tylko kod HTML, ale np. pliki graficzne z wykorzystaniem biblioteki GD. W takim wypadku mogą pojawić się pewne problemy w funkcjonowaniu skryptów. PHP Solutions Nr 5/2004 www.phpsolmag.org 35

Listing 9. Dokument programu Word XP zapisany w formacie HTML <html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns="http://www.w3.org/tr/rec-html40"> <head> <meta http-equiv=content-type content="text/html; charset=windows-1250"> <meta name=progid content=word.document> <meta name=generator content="microsoft Word 10"> <meta name=originator content="microsoft Word 10"> <link rel=file-list href="php%20solutions_files/filelist.xml"> <title>php Solutions</title> <!--[if gte mso 9]><xml> <o:documentproperties> <o:author>lach</o:author> <o:lastauthor>lach</o:lastauthor> <o:revision>1</o:revision> <o:totaltime>0</o:totaltime> <o:created>2004-04-30t13:08:00z</o:created> <o:lastsaved>2004-04-30t13:08:00z</o:lastsaved> <o:pages>1</o:pages> <o:words>2</o:words>...i tak dalej przez osiemdziesiąt linii... Listing 10. Kod z Listingu 9 po przepuszczeniu przez Tidy <!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> <title>php Solutions</title> </head> <body xml:lang="pl"> <div class="section1"> <p><b>php Solutions</b></p> <p>cms</p> </div> </body> </html> wiązujemy tworząc graficzny edytor HTML w JavaScripcie. Kłopoty pojawiają się jednak, gdy stworzony przez nas edytor nie działa poprawnie z rzadziej używanymi przeglądarkami internetowymi typu Konqueror czy Lynx lub klienta po prostu nie stać na wykupienie tego rodzaju rozwiązania. W takim wypadku w ruch najczęściej idzie FrontPage lub Word. Niestety obydwie ze wspomnianych aplikacji tworzą niepotrzebne znaczniki, a kod wynikowy jest często źle sformatowany i niezgodny z żadnymi specyfikacjami. Po raz kolejny z pomocą przychodzi nam Tidy a to dzięki zdolności wyczyszczenia dokumentu HTML stworzonego np. w Wordzie, łącznie z naprawieniem kodu i konwersji na XHTML. Co ciekawe, to wszystko zamyka się w trzech linijkach kodu (patrz Listing 6). Jak widać, jedyne co musieliśmy zrobić, to przekazać odpowiednie opcje konfiguracji parsowania omówionej wcześniej funkcji tidy _ parse _ file(). Opcja word-2000 odpowiedzialna jest za usunięcie niepotrzebnych znaczników, mających znaczenie jedynie dla programu Word (m.in. nagłówka dokumentu, w którym zapisane zostają dane o autorze dokumentu, ilości wyrazów, znaków i paragrafów czy stanie sprawdzania dokumentu pod względem gramatyki i ortografii). Poprzez włączenie output-xhtml i ustawienie odpowiedniej wartości doctype otrzymujemy czysty, przejrzysty i poprawny dokument XHTML. Różnicę widać gołym okiem, wystarczy spojrzeć na Listingi 9, 10, 11 i 12. Początki Listing 11. Identyczny dokument wyeksportowany do formatu HTML w OpenOffice.org 1.1.1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD> <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1250"> <TITLE></TITLE> <META NAME="GENERATOR" CONTENT="OpenOffice.org 1.1.1 (Win32)"> <META NAME="CREATED" CONTENT="20040608;22074940"> <META NAME="CHANGED" CONTENT="20040608;22083634"> <STYLE> <!-- @page { size: 21cm 29.7cm; margin: 2cm P { margin-bottom: 0.21cm --> </STYLE> </HEAD> <BODY LANG="pl-PL" DIR="LTR"> <P><B>PHP Solutions</B></P> <P>CMS</P> </BODY> </HTML> Smarty W przypadku, gdy korzystamy z systemu szablonów Smarty (http:// smarty.php.net) możemy w prosty sposób zautomatyzować proces parsowania i naprawy kodu HTML przez Tidy. W tym celu stworzymy filtr, przez który przechodzić będzie każdy dokument HTML stworzony przy pomocy Smarty. Jego pełen kod źródłowy znajduje się na Listingu 7, a schemat działania jest identyczny z poprzednimi źródłami z tą tylko różnicą, że na początku sprawdzamy, czy rozszerzenie Tidy jest dostępne (wywołanie extension _ loaded). Instalacja stworzonego filtra sprowadza się do wywołania $smarty-> load _ filter('output','tidy'); Raportowanie o błędach Podczas naprawiania kodu HTML z wykorzystaniem rozszerzenia Tidy nie 36 www.phpsolmag.org PHP Solutions Nr 5/2004

Tidy otrzymujemy żadnych informacji o błędach czy ostrzeżeniach związanych z parsowaniem dokumentu. Jednak wykorzystując funkcje tidy _ diagnose() oraz tidy _ get _ error _ buffer() możemy takie informacje uzyskać w celu późniejszego wypisania ich na stronie. Raporty o błędach zawierają wszystkie wprowadzone zmiany i poprawki, które mają jakikolwiek wpływ na poprawność wyświetlania dokumentu oraz jego zgodność ze standardami W3C (http://www. w3c.org/). Co ciekawe możemy również sprawdzić nasz kod pod względem dostępności (tzw. Accessibility Check) w różnych typach przeglądarek. Listing 8 przedstawia, w jaki sposób wyświetlić listę błędów oraz raport dotyczący dostępności. W zmiennej $html zapisujemy błędny pod różnymi względami kod HTML, który następnie przekazujemy jako parametr do znanej nam już funkcji tidy _ parse _ string(). Jedyną ustawioną przez nas opcją parsera jest accessibility _ check, której wartość określa stopień sprawdzania dostępności (listę oraz opis stopni dostępności kodu HTML można znaleźć na stronie Uniwersytetu w Toronto pod adresem http://www.aprompt.ca/tidy/ accessibilitychecks.html). Wywołanie tidy _ diagnose() powoduje sparsowanie kodu w poszukiwaniu ewentualnych błędów. Wypełniony zostaje wówczas bufor z infomacjami o błędach, który odczytujemy wywołując funkcję tidy _ get _ error _ buffer(). Listing 12. Kod z Listingu 11 po przepuszczeniu przez parser Tidy (format XHTML) <!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=us-ascii" /> <title></title> <meta name="generator" content="openoffice.org 1.1.1 (Win32)" /> <meta name="created" content="20040608;22074940" /> <meta name="changed" content="20040608;22083634" /> <style type="text/css"> /*<![CDATA[*/ <!-- @page { size: 21cm 29.7cm; margin: 2cm P { margin-bottom: 0.21cm --> /*]]>*/ </style> </head> <body lang="pl-pl" dir="ltr" xml:lang="pl-pl"> <p><b>php Solutions</b></p> <p>cms</p> </body> </html> Listing 13. Wykorzystanie Tidy w aplikacji konsolowej #!/usr/local/bin/php-cgi -q if ($_SERVER['argc'] < 2) die('usage:./'.basename($_server['argv'][0])." file1.htm file2.htm filex.htm\n"); $done = 1; for ($nr = 1; $nr < $_SERVER['argc']; $nr++) { if (file_exists($_server['argv'][$nr])) { $tidy = tidy_parse_file($_server['argv'][$nr], array('output-xhtml' => 1, 'doctype' => 'strict')); if ($hfile = @fopen($_server['argv'][$nr], 'w')) { fwrite($hfile, $tidy); fclose($hfile); echo "[ OK ] File '".$_SERVER['argv'][$nr]."' repaired successfully.\n"; $done++; else echo "[ ERR ] Unable to open '".$_SERVER['argv'][$nr]."' for input.\n"; else echo "[ ERR ] File '".$_SERVER['argv'][$nr]."' does not exist.\n"; if ($done!= $_SERVER['argc']) echo "Errors: ".($_SERVER['argc']-$done); echo "\n\n"; Nie tylko WWW PHP nie musi służyć wyłącznie jako narzędzie pracy z dynamicznymi stronami internetowymi za jego pomocą można również stworzyć rozbudowaną aplikację konsolową dla systemów uniksowych. Napiszmy prosty skrypt, który będziemy mogli uruchomić z poziomu konsoli, a który ułatwi nam naprawę plików HTML za pomocą Tidy. W ramach przypomnienia należy wspomnieć o pewnych zasadach tworzenia tego typu skryptów. Najważniejszą rzeczą jest to, aby PHP zostało skompilowane z parametrem --enablecgi otrzymamy wówczas dostęp do php-cgi, za pomocą którego uruchomimy nasz skrypt (Listing 13). Jeżeli chodzi o sam plik, to musi mieć on ustawioną flagę uruchamiania (ustawianą za pomocą komendy chmod +x file.php). Jego pierwsza linijka powinna zawierać ciąg w postaci #!/usr/local/bin/php-cgi -q, w którym zawiera się ścieżka do wspomnianej aplikacji php-cgi (możemy ją otrzymać wywołując komendę whereis php-cgi). Dalsza część kodu źródłowego to zwykły kod PHP. Parametry wywołania skryptu odczytujemy z tablicy $ _ SERVER['argv'] (pierwszym jest zawsze nazwa uruchamianego pliku), a ich ilość znajduje się w zmiennej $ _ SERVER['argc']. PHP Solutions Nr 5/2004 www.phpsolmag.org 37

Rysunek 4. Aplikacja konsolowa Wykorzystując nabytą przed chwilą wiedzę stworzymy skrypt, z pomocą którego otrzymamy możliwość naprawy dowolnej ilości plików HTML i konwersji ich na format XHTML 1.0 Strict (http://www.w3.org/tr/xhtml1/ #a_dtd_xhtml-1.0-strict). W pierwszych linijkach sprawdzamy czy podana została przynajmniej jedna nazwa pliku, na którym przeprowadzone mają być operacje jeśli tak, to wyświetlamy instrukcje pracy z programem. Następnie, korzystając z pętli, parsujemy i naprawiamy kolejne pliki. Całość kończymy wyświetlając informację o ilości napotkanych błędów. Podsumowanie Porównując wielkości plików nietrudno zauważyć, że wykorzystanie Tidy się opłaca parser w znaczącym stopniu zredukował rozmiar dokumentu Worda w formacie HTML. Głównymi powodami prawie ośmiokrotnej redukcji wielkości jest usunięcie niepotrzebnych znaczników wykorzystywanych jedynie podczas ponownej edycji pliku w programie Microsoft Word. Kasowane są również wszelkie wcięcia i marginesy kodu, a w wyniku otrzymujemy w pełni poprawny i zgodny ze specyfikacją dokument XHTML. Bardzo ciekawie wygląda sprawa parsowania dokumentu HTML stworzonego przy pomocy OpenOffice.org 1.1.1. W przeciwieństwie do produktu firmy Microsoft OpenOffice eksportuje dokument do w pełni poprawnego pliku HTML 4.0. Jako że my chcemy otrzymać kod XHTML, musimy liczyć się z tym, że Tidy zmieni deklarację DOCTYPE (która jest dłuższa niż HTML 4.0), doda atrybut xml:lang (wymagany zgodnie ze specyfikacją W3C) oraz znacznik tytułu dokumentu stąd wzrost wielkości pliku. Wniosek jest prosty: kiedy mamy do czynienia z niezbyt klarownym kodem, warto zaprząc do pracy Tidy. Początki Najczęściej używane opcje parsera add-xml-decl W przypadku włączenia tej opcji Tidy doda deklarację XML do zwracanego kodu XML lub XHTML. Jeśli przekazany do parsowania kod zawiera deklarację <?xml..., opcja jest ignorowana. alt-text Za pomocą tej opcji możemy ustalić domyślną wartość parametru alt znacznika img. Pomocne przy tworzeniu kodu zgodnego z przeglądarkami nie obsługującymi obrazków (np. Lynx). doctype Rozpoznawane wartości: auto, omit, strict, loose, transitional, niestandardowe (ciąg znaków); domyślnie: auto. Ta opcja opisuje deklarację DOCTYPE dla zwracanego przez Tidy kodu źródłowego. W przypadku ustawienia omit zostanie ona pominięta; auto oznacza, że wartość zostanie automatycznie wykryta na podstawie treści pliku. Pozostałe wartości oznaczają typy strict oraz transitional DTD dokumentów HTML i XHTML. hide-comments Kiedy opcja ta zostanie włączona, z dokumentu HTML zostaną usunięte wszystkie komentarze.logical-emphasis Po włączeniu tej opcji wszystkie tagi <i> zostaną zamienione na <em> oraz <b> na <strong>. output-xhtml Kiedy włączymy tę opcję, Tidy przeprowadzi konwersję naszego kodu na XHTML, łącznie z ustawieniem odpowiedniej deklaracji DOCTYPE. Wszystkie znaczniki HTML zostaną poprawione tak, aby były zgodne z zasadami rozszerzonego HTML. output-xml Odpowiada za zwrócenie kodu źródłowego w postaci XML, w pełni zgodnego z XML 1.0. char-encoding Rozpoznawane wartości: ascii, latin1, raw, utf8, iso2022, mac, win1252, utf16le, utf16be, utf16, big5, shiftjis; domyślnie: ascii. Ta opcja opisuje kodowania znaków, jakiego powinien używać moduł Tidy dla pobieranego i zwracanego dokumentu. repeated-attributes Rozpoznawane wartości: keep-first/keep-last; domyślnie: keep-last. Za pomocą tej zmiennej możemy ustalić, który atrybut HTML zostanie zachowany, w przypadku, gdy element ma np. dwa atrybuty align. show-body-only Rozpoznawane wartości: yes/no; domyślnie: no Bardzo użyteczna opcja, kiedy wykorzystujemy Tidy do stworzenia kodu, który będzie stanowił element istniejącego już dokumentu HTML. Po włączeniu omawianej opcji, wartością zmiennej przekazanej jako parametr funkcji tidy _ clean _ repair() lub innej będzie jedynie część BODY dokumentu HTML. 38 www.phpsolmag.org PHP Solutions Nr 5/2004