W tym tutorialu mam zamiar przybliżyć Wam sposób stworzenia własnego języka opisu danych.
Wprowadzenie
Z doświadczenia wiem, iż Internet pełen jest zleceniodawców, którzy nie mają zielonego pojęcia o Sieci. Trudno od takich ludzi wymagać znajomości HTML. Cóż więc możemy zrobić my, programiści aplikacji WWW, by wyjść im na przeciw? Rozwiązań jest kilka… ja z racji swojej awersji do JavaScriptu i jemu podobnych języków interpretowanych po stronie klienta, postanowiłem stworzyć coś maksymalnie kompatybilnego ze wszelkimi przeglądarkami. Efekty przedstawiam poniżej. Z góry przepraszam za mój dość lakoniczny styl, ale jestem zdania, iż najprościej nauczyć się czegoś czytając poprawnie napisany kod, a kwiecista otoczka tylko utrudnia naukę.
Podstawowe założenia
Zanim zaczniemy cokolwiek programować potrzebny jest nam przynajmniej zarys tego, co chcemy uzyskać. W przedstawionym przeze mnie przykładzie programista (w tym wypadku my) dąży do maksymalnego ułatwienia użytkownikowi wprowadzania danych – jest to priorytet od którego musimy wyjść, cel, do którego musimy dążyć uparcie, aczkolwiek zważając na metody.
Wymagania
Skrypt nie może korzystać z JavaScript i musi być możliwie jak najbardziej intuicyjny, a przy tym zastosowane rozwiązanie musi być łatwe do zaimplementowania w istniejących aplikacjach.
Przykładowe rozwiązanie
Oto przykładowa klasa nosząca nazwę parser.class.php:
| <?php // Copyleft Grzegorz Pacan <[email protected]> // v. 0.2, 18 czerwca 2004, 23:37 class Parser { var $sLangEmptyInput = „Parser nie otrzymał danych wejściowych.”; function __construct() { error_reporting(0); return 1; } function error ($sMessage) { echo „<p><b style=”color:red”>BŁĄD:</b> ” . $sMessage . „</p>”; } function parse ($sInput) { if($sInput == „”) { $this->error($this->sLangEmptyInput); } else ” { $sInput = preg_replace(„![kod]rn(.*?)rn[/kod]!es”, 'sprintf(„[kod]%s[/kod]”, htmlspecialchars(„1”))’, $sInput); preg_match(’/.*[kod](.*?)[/kod].*/s’, $sInput, $aOutput); $aFrom = array(„š”, „?”, „?”, „Ľ”, „?”, „?”, $aOutput[’1′], „[kod]”, „[/kod]”, „alternatywa=””, „opis=””, „[pogrubienie]”, „[/pogrubienie]”, „[kursywa]”, „[/kursywa]”, „[/naglowek]rnrn”, „rnrn”, „[naglowek]”, „[obrazek po lewej=””, „[obrazek po prawej=””, „” /]”, „[/odnosnik]”, „[odnosnik=””, „<p><pre>”, „</pre></p>”, „<h2>”, „rn”, „[br /]”, „<p></p>”); $aIn = array („ą”, „ś”, „ź”, „Ą”, „Ś”, „Ź”, str_replace(„rn”, „[br /]”, $aOutput[’1′]), „<pre>”, „</pre>”, „alt=””, „title=””, „<b>”, „</b>”, „<i>”, „</i>”, „</h2><p>”, „</p><p>”, „<h2>”, „<img style=”float:left;” src=””, „<img style=”float:right;” src=””, „”>”, „</a>”, „<a href=””, „<pre>”, „</pre>”, „</p><h2>”, „”, „rn”, „”); $sOutput = str_replace($aFrom, $aIn, strip_tags($sInput)); if(substr($sOutput, 0, 8) == „</p><h2>”) { return substr($sOutput, 4, strlen($sOutput)); } else { return „<p>” . $sOutput; } } } } ?> |
Przykład użycia
| <?php require_once(„include/libs/adodb/adodb.inc.php”); require_once(„include/connect.php”); require_once(„include/mainfile.php”); require_once(„include/classes/parser.class.php”); $rs = $db->Execute(„select body from texts where id='” . $_GET[’id’] . „'”); if(empty($rs->fields)) { error(„Artykuł o żądanym numerze nie istnieje.”); } else if($rs->fields[’0′] == „”) { error(„Artykuł nie zawiera treści.”); } else { $test = new Parser; echo $test->parse($rs->fields[’0′]); } $db->Close(); ?> |
Opis Nasz interpreter w chwili obecnej potrafi: · tworzyć nagłówki, · automatycznie rozpoznawać akapity, · wklejać obrazki przylegające do lewej lub prawej krawędzi tekstu, · w dość prosty sposób wstawiać odnośniki, · pogrubiać i pochylać tekst, · wklejać kod (opcja w wersji podstawowej, ale jeśli komuś się nudzi, może rozwinąć), · usuwać puste akapity, · w razie potrzeby konwertować tekst z kodowania windows-1250 do iso-8859-2, · usuwać niepotrzebne linie (a co za tym idzie, zmniejszać objętość strony wysyłanej do klienta).
Przykład pliku nadającego się do przepuszczenia przez nasz interpreter
| [naglowek]To testowy plik![/naglowek] [obrazek po lewej=”test.png” alternatywa=”Testowy obrazek.” opis=”Testowy obrazek.” /][pogrubienie]Czy[/pogrubienie] [kursywa]wszystko[/kursywa] zostało zinterpretowane tak, jak się spodziewał(a/e)ś? [kod] <?php if($_POST[’answer’]) { echo „Cieszę się.”; } else { echo „No cóż, popróbuj sam(a). Ewentualnie możesz do mnie napisać na adres [odnośnik=mailto:[email protected] opis=”Napisz do Grzegorza Pacana”][email protected][/odnosnik].”; } ?> [/kod] |
Zakończenie
Mam nadzieję, że przedstawiony powyżej skrypt przyda się przynajmniej kilku osobom. Można go wykorzystywać zgodnie z licencją GNU GPL, która musi być dołączona do skryptu, by był on używany legalnie. Spragnionym eksperymentów polecam dodanie np. pola typu <select> pod <textarea> z nazwami i krótkimi opisami plików graficznych, które można wkleić do treści tekstu. Należy bowiem zwrócić uwagę na to, iż w prosty sposób można ograniczyć użytkownikom wczytywanie obrazków do interpretowania tylko danych formatów czy też wklejania tylko tych ze wskazanego folderu. Na rozwinięcie czeka również znacznik [kod]. Przydałoby mu się np. numerowanie linii.
Mam nadzieję, iż Czytelnicy WebInside potraktują wyżej wspomniane „niedociągnięcia” jako pracę domową.
