Parser wiadomości

Witajcie!

Dziś ponownie o uniBoard. Tym razem napiszę o parserze wiadomości, którego używam w uniBoard. Ale na początek…

Czym jest parser wiadomości w skrypcie forum?

Jestem pewien że każdy z was używa w swoich postach bbtagów. Są to tagi, które przy wyświetleniu wiadomości zostają zamienione (przeparsowane) na kod html, np:

[b]The quick brown fox jumps over the lazy dog[/b]

Zostanie wyświetlone jako:

<b>The quick brown fox jumps over the lazy dog</b>

Tym właśnie zajmują się parsery. Obrabiają surowy tekst, zamieniając określone ciągi znaków na określony html.

Typy parserów

Parsery można podzielić na dwie główne grupy: te które zastąpują określonymi formułkami inne, oraz te, które analizują strukturę tekstu. Te pierwsze są proste w konstrukcji i działaniu. Podstawowy parser tego typu można upchać w jednej funkcji:

function parse( $text){

	//break lines
	$text = nl2br( $text);

	//parse
	$text = preg_replace("#\[b\](.*?)\[/b\]#si",'\\1', $text);
	$text = preg_replace("#\[i\](.*?)\[/i\]#si",'\\1', $text);
	$text = preg_replace("#\[u\](.*?)\[/u\]#si",'\\1', $text);
	$text = preg_replace("#\[url\](.*?)\[/url\]#si",'\\1', $text);

	//return ready text
	return $text;

}

Rozwiązanie to jest proste, ale ma parę wad. Pierwszą jest brak świadomości lokalizacji tekstu, co znaczy że parser nie ma pojęcia, gdzie aktualnie w tekstcie się znajduje. Drugą jest zerowy wpływ na samą zawartość tegoż. Parser nie analizuje tagów, tylko odrazu zamienia je na ich HTML. W przypadku prostych narzędzi formatowania tekstu, nie jest to problemem, jednak gdy trzeba np. przeparsować link, który zawiera inne tagi, parser ten uczyni go niedziałającym (co dzieje się swoją drogą w Callisto):

[url]http://link.pl/][/url]

Zostanie wielokrotnie przeparsowane:

<a href="http<img src="HTML EMOTKI" />/link.pl/">...

Tutaj swą siłę pokazuje inny typ parserów, który zamiast bezmózgiego przelecenia przez tekst, będzie analizował jego strukturę. Taki parser napisałem specjalnie dla uniBoard. Jego kod jest zbyt rozbudowany, aby tutaj go umieścić, dlatego ograniczę się do zasady działania, dla przykładowego postu:

[b]The quick brown fox jumps over the lazy dog[/b]

Oto, jak tekstem zajmie się uniBoard:

1. Rozpoznanie pierwszego tagu („[b]„)
2. Dodanie „<br/>” od poprzedniej pozycji kursora do pozycji tagu.
3. Przesunięcie kursora do tagu.
4. Rozpoznanie tagu (czy jest to tag samodzielny, czy wymagający zamknięcia).
5. Dodanie tagu do stosu.
6. Przesunięcie kursora za tag.
7. Rozpoznanie tagu „[/b]„.
8. Kontrola poprzedniego tagu.
9. Kontrola blokady parsowania.
10. Odczytanie tekstu między tagami.
11. Umieszczenie tekstu w html tagu („<b>{content}</b>”).
12. Zastąpienie znaków od początku pierwszego tagu do końca drugiego gotowym html.
13. Przesunięcie wskaznika do następnego tagu.
14. „Złamanie linii” od ostatniego tagu, do końca tekstu.

Ten parser sprawdza każdy tag indywidualnie. Dzięki temu można uniknąć wieloktrotnego parsowania tego samego tekstu, oraz dokładniej budować sam kod. Przykładem tego mogą być tagi img, które analizują rozmiar obrazka, i w razie potrzeby doklejają js, obsługujący powiększenie grafiki po kliknięciu na nią.

Leave a comment

2 Comments.

  1. a gdy parser natrafi na tag [code] to ignoruje wszystkie napotkane miedzy tym tagiem, i czy jak się połączy kilka tagów w dziwnej konfiguracji to nie zwariuje, np.: [b][img][code]kod kod[/code][/b][/img] ??

  2. Tak, jeśli natrafi na tag [code], przestanie parsować jego zawartość, aż do zamknięcia.

    Jeśli kolejność tagów będzie nie prawidłowa, zostaną one uznane za błędne, i zignorowane.

Leave a Reply


[ Ctrl + Enter ]