Dziś jest sobota, 11 października 2008 roku (z kalendarza...)

Prace nad OPT2

Icon

23.11.2007, 19:40

Projekty

Komentarze (8)

Powrót

Przez ostatnich kilka dni zabrałem się już na poważnie za OPT 2.0 i prace nad tym przedsięwzięciem wreszcie nabrały jakiegoś tempa. Pierwsze rezultaty będą być może już niedługo nadawać się do pokazania publicznie, aczkolwiek możliwości biblioteki będą bardzo ograniczone.

Dosłownie kilkanaście minut temu kompilator przetworzył na drzewko węzłów prosty plik XML oraz angielską dokumentację do pierwszej wersji biblioteki. Najważniejsze, że wszystkie znaczniki są otwierane i zamykane tak, jak powinny, a ich atrybuty rozpoznawane. Jedynie w niektórych miejscach dodatkowo znacznik dorzucany jest do węzła character data, ale to prawdopodobnie kwestia kilku regulacji. W załączniku zamieściłem screenshot przedstawiający fragment wczytanego drzewa.

Kompilator liczy w tej chwili około 12,5 kilobajtów kodu. Prawidłowo rozpoznaje znaczniki, przestrzenie nazw, komentarze i sekcje CDATA. Obsługa nagłówka dokumentu XML oraz DTD powinna dojść później. W ostatecznej wersji obsługa XML-a będzie prezentować się następująco:

  • Nazwy znaczników i argumentów - standard XML dopuszcza stosowanie w nich sporej liczby znaków Unicode. OPT także będzie zezwalać na ich używanie w nazwach, ale po włączeniu stosownej dyrektywy. Powód to wydajność wyrażeń regularnych - według autorów przetwarzanie klas znaków UTF jest dużo wolniejsze, ponieważ PCRE musi skanować ogromne tablice z ich opisami. Tak więc jeśli mamy pewność, że z takich nie będziemy korzystać, będzie nam to niepotrzebnie spowalniać i tak niezbyt szybką kompilację.
  • Sekcje CDATA - OPT traktuje je dokładnie tak, jak zaleca specyfikacja. Są one przepisywane bezpośrednio do drzewka tak, aby w wynikowym dokumencie także pozostały sekcjami CDATA.
  • Nagłówek dokumentu i DTD - OPT będzie umiał sprawdzać ich składnię, natomiast na pewno nie będzie zawartych tam danych w żaden sposób przetwarzać. OPT domyślnie będzie wymagać dodawania takowych do szablonów, ale będzie to do wyłączenia w konfiguracji. W przypadku szablonu głównego zawierającego szkielet dokumentu, zostaną one przepisane na wyjście. W obrębie tych elementów możliwe będzie stosowanie bloków OPT, dzięki czemu można np. umieścić informację o kodowaniu czy języku.
  • Komentarze - domyślnie zjadane w trakcie kompilacji, ale będzie możliwość przekierowania ich na wyjście.
  • Domyślnie OPT także będzie wymagać obecności jednego elementu głównego, ale będzie to do wyłączenia. Istnieć będzie specjalny pusty znacznik, dzięki czemu szablony zawierające fragment treści strony nie będą musiały martwić się tym ograniczeniem.
  • OPT będzie przetwarzać jedynie znaczniki, których przestrzenie nazw są zarejestrowane w bibliotece. Pozostałe będą przepisywane na wejście, aczkolwiek wykonywany będzie skan w poszukiwaniu atrybutów specjalnych.
  • Składnia atrybutów będzie trzymać się ściśle XML-a, aczkolwiek będzie możliwe włączenie respektowania także atrybutów bez wartości znanych z HTML-a.
  • Encje - będą.

Jak widać, istnieje kilka opcji, dzięki którym można włączyć pewne odstępstwa od standardu. Ich istnienie podyktowane jest albo wydajnością, albo zwyczajną wygodą. Przykładowo dla mnie nagłówki XML i ograniczenie jednego głównego elementu to zbędne utrudnienie, bo i tak tych szablonów nie będę w przeglądarce odpalać, ani przepuszczać przez sprawdzarki składni inne, niż OPT :). Jest też inny powód, mianowicie zarzucenie prac nad XHTML 2.0 na rzecz HTML-a 5. Aż się prosi o zacytowanie artykułu "Bez tytułu o CSS" napisanego przed półtora rokiem: Standardów nie publikuje się dla samego siebie, ale dla ludzi. Cieszę się, że ktoś tam na górze doszedł do tego samego wniosku i puknął się w czoło, choć wiem, że oznacza to dla mnie więcej pracy nad kompilatorem. Oczywiście szerokie ustępstwa wobec tolerancji HTML-a nie będą dopuszczalne. W trybie XML, nawet lekko uproszczonym, OPT będzie się bronić przed śmietnikiem w kodzie.

Wciąż do napisania jest tzw. quirks mode, czyli sposób pracy na wzór OPT 1, gdzie poza znacznikami jednoznacznie przeznaczonymi dla OPT cała reszta jest bezwzględnie traktowana jako statyczny tekst, nawet jeśli jest to XML. W związku z tym niektóre dodatkowe możliwości manipulacji nie będą dostępne, ale za to parser w dalszym ciągu będzie w stanie przetwarzać dokumenty niebędące XML-em. Implementacja będzie łatwiejsza, niż się początkowo wydawało. Wystarczy po wczytaniu znacznika sprawdzić, czy jest zarejestrowany i jak nie, przepisać na wyjście, zamiast przerobić na węzeł.

OPT2 w dalszym ciągu będzie kompilowany do postaci kodu PHP i zasada przetwarzania instrukcji oraz znaczników pozostanie mniej więcej taka sama, jak w starej wersji. Piszemy procesor instrukcji, rejestrujemy go, procesor informuje kompilator, jakie znaczniki potrafi przetwarzać i od tej pory OPT przekierowuje takowe do niego. Wielu zmianom uległo jednak API. Już teraz możliwa jest manipulacja drzewem węzłów na wzór DOM. Starałem się zachować z nim zgodność nazw i kolejności parametrów tam, gdzie to było możliwe, jednak istnieją pewne odstępstwa. Schemat klas jest uproszczony, inna jest także ogranizacja węzłów tekstowych i dostęp do atrybutów. Wynikają one ze specyficznych potrzeb kompilatora, które były głównym powodem, dla którego piszę go od zera, zamiast skorzystać z gotowych rozwiązań.

API biblioteki najbardziej interesujące programistę jest w powijakach, aczkolwiek da się nim już nieco podstawowych operacji wykonać. OPT2 posiada zupełnie zmieniony system wyjścia, który teraz jest obiektowy i konfigurowalny. Aby móc obsłużyć dane wygenerowane przez parser, piszemy klasę implementującą stosowny interfejs i w niej decydujemy, co z nimi robić. Domyślnie biblioteka udostępnia dwie takie klasy optNetOutput wypluwająca wynik na ekran z kompresją gZip i buforowaniem oraz optReturnOutput, czyli zwracanie wyniku przez metodę. Sprawa buforowania została ujednolicona i już nie powinno być z nim takich problemów i niejasności, jak w OPT 1.x.x. Zmiana ta implikuje również kasację filtrów, które są teraz po prostu niepotrzebne.

Dyrektywy konfiguracyjne zostały ujednolicone i podzielone na grupy, dzięki którym powinny być łatwiejsze w użyciu:

// Directory configuration
public $sourceDir = NULL;
public $compileDir = NULL;
public $pluginDir = NULL;
public $cacheDir = NULL;
 
// Front-end configuration
public $compileStatus = OPT_CS_DEFAULT;
public $charset = 'utf-8';
public $contentType = 0;
public $gzipCompression = true;
public $debugConsole = false;
 
// Compiler configuration
public $mode = OPT_XML_MODE;
public $unicodeNames = false;
public $htmlAttributes = false;
public $printComments = false;
public $prologRequired = true;

Wprowadziłem też jedną dodatkową rzecz - musimy ręcznie odpalić metodę setup(), która dokona wstępnej konfiguracji - inaczej nic nie wygenerujemy. We wczesnych wersjach pierwszego OPT też coś takiego istniało, lecz zostało wywalone na wzór Smarty'ego. Jednak znajdujący się tam kod nie mógł być tak po prostu wywalony, gdzieś go trzeba było upchnąć i teraz wegetuje sobie w metodzie fetch(), gdzie parę tricków sprawuje nad nim pieczę tak, aby był uruchomiony tylko podczas przetwarzania pierwszego szablonu. Z pozostałych zmian - nie wiem, czy przypisywanie danych do bloków zrealizować poprzez assign(), czy metodami magicznymi. Myślę, że zadecyduje o tym jakiś pomiar wydajności każdego z rozwiązań.

PS. W nowym OPT nie będzie już dopisków, że jest to część większego projektu. Nie oszukujmy się, przy takim zaangażowaniu nie da się zrobić dobrego forum, tak więc niniejszym pro forma tylko ogłaszam to, co wiadomo od dawna - OpenPB jest zamknięty i rozwijane będą jedynie biblioteki. Jakoś nie uznaję tego za moją porażkę. Zgłosiłem się głównie, aby napisać do niego system szablonów i jako jedyny się z tego wywiązałem, zaś liderem całości zostałem zrządzeniem losu. Dodam, że Slump dalej będzie sprawować pieczę nad tym, co zostało. Strony internetowe zostaną zmienione, gdy OPT2 będzie się nadawać do normalnego użycia. Pracuję obecnie nad kilkoma innymi projektami. Kto wie, może jeśli będą wystarczająco dobre, to też je wypuszczę jako open-source?

Powrót

Komentarze

Napisał Ktos w sobotę, 24 listopada 2007 o 10:06

Jest też inny powód, mianowicie zarzucenie prac nad XHTML 2.0 na rzecz HTML-a 5

Akurat ja mam wrażenie, że po prostu XHTML 2.0 oraz HTML 5.0 będą rozwijać się równolegle, XHTML2 nie został zarzucony - on ma inne koncepcje rozwoju niż HTML5 po prostu.

Napisał Bob w niedzielę, 25 listopada 2007 o 06:36

Dokładnie. XHTML2 będzie rozwijany równolegle, HTML 5 ma być poprawioną wersją HTMLa z możliwościami wcześniej uwzględnionymi i przyjętymi przez wszystkich wydawców przeglądarek tak, aby po opublikowaniu można było ze wszystkich zawartych w nim technologii od razu korzystać. A tak na marginesie to jak dla mnie głupota bo powinno się zwiększać możliwości stosowania xmla a nie wracać do starych rozwiązań, gdy nowe zaczynają się całkiem nieźle przyjmować. Powinni się raczej zająć np. dodaniem akcji do CSS żeby można było wskazać że element <dupa> jest klikalny bez mieszania NS z htmla.

A odnośnie porzucenia forum to nawet dobrze. Forów jest na pęczki a dobrych systemów szablonów tylko kilka.

Napisał Komentator newsa w niedzielę, 25 listopada 2007 o 09:55

HTML 5 wnosi ciekawe rozwiązania. Być może przejdę na niego z xHTML 1.0. Niektóre nowości w XHTML 2 również są użyteczne, np. wszechobecny atrybut HREF, jednak usunięcie znaczników <b>, <i> już niekoniecznie.

Co do forum to dobra decyzja, ponieważ jest już wiele dobrych darmowych systemów, np. MyBB, PunBB, PhpBB3... Co ze stroną OPB? Pozostanie w obecnej formie, czy przekształci się na witrynę projektów OPT, OPD i OPF?

Napisał Zyx w niedzielę, 25 listopada 2007 o 14:14

Będzie przekształcana, tyle że jeszcze nie teraz. Inna sprawa to domena :).

Napisał Komentator Newsa w poniedziałek, 26 listopada 2007 o 17:22

Jak pogodziłeś szkołę z rozwijaniem projektów?

Napisał Zyx w poniedziałek, 26 listopada 2007 o 21:14

Pogodziłem? Po prostu poczekałem, aż się trochę luźniej zrobi :).

Napisał Komentator newsa w środę, 5 grudnia 2007 o 16:22

Skoro piszemy o standardach - warto przestawić się z ISO-8859-2 (Latin2) na UTF-8? Z jednej strony może zwiększyć się rozmiar plików i danych wysyłanych do przeglądarki. Są jednak zalety, m. in. obecność wielu znaków. W przypadku ISO gdyby ktoś chciał pisać po rusku lub po hiszpańsku, musiałby zmodyfikować co najmniej kilka plików w skrypcie.

Napisał Zyx w środę, 5 grudnia 2007 o 19:38

OPT nigdy nie był i nie będzie zależny od jakiegoś jedynego słusznego kodowania. W teorii, jeśli masz ochotę, to statyczny tekst możesz sobie nawet w EBCDIC pisać, byleby znaki funkcyjne znaczników były w ASCII. Jedynie w nazwach znaczników pojawi się możliwość używania unikodu zgodnie ze standardem XML.

Natomiast co do ogólnego uźywania (co się lekko nijak ma do samego wpisu, ale trudno) - popieram w całej rozciągłości, tym bardziej że sam używam UTF-8 od ładnych paru lat i sprawdza się świetnie.

Strona 1 z 1 :: 1

Skomentuj

NickInformacja
E-mailTylko do użytku wewnętrznego.
WWWNie zapomnij o http://
LayoutNapisz tu, czy widzisz dzienny czy nocny layout.
WpisFormatowanie wiki
Internauto, pamiętaj! Wolność to nie samowola - dbaj o kulturę wypowiedzi oraz dyskusji w sieci.

Na Zyxist.com panuje swoboda wyrażania opinii oraz krytyki pod dowolnym adresem. Jedyny warunek: musi być ona kulturalna i rzeczowa. Na chamstwo, prostactwo lub jawne obrażanie kogokolwiek nie ma tu miejsca i takie komentarze są bardzo szybko usuwane. Jeśli zamierzasz polemizować z treścią wpisu, wpierw uważnie ją przeczytaj.

© Tomasz "Zyx" Jędrzejewski 2005 - 2008 | Wykonanych zapytań: 2 | Serwer wirtualny zapewnia