Edytor BBCode w JavaScript

Autor: Andrew Kitchin
Data publikacji: 19.08.2005, 09:36 | Ostatnia modyfikacja: 19.11.2006, 17:46

Pierwsza część serii opisującej tworzenie kompletnego mechanizmu BBCode. W tym odcinku poruszane jest pisanie formularza HTML z edytorem BBCode z JavaScript.



Z pewnoÅ›ciÄ… wielu ludzi zastanawiaÅ‚o siÄ™, jak należy wykonać edytor BBCode umożliwiajÄ…cy użytkownikom wstawianie do swych tekstów na stronie specjalnych znaczników. Jak każdy dobry programista wie, nie można po prostu zezwolić czÅ‚owiekowi na użycie HTML'a, gdyż zagrażaÅ‚oby to poważnie bezpieczeÅ„stwu serwisu. Tak wiÄ™c musimy stworzyć zestaw znaczników wstawianych za poÅ›rednictwem przycisku, które bÄ™dÄ… konwertowane na HTML dopiero po wciÅ›niÄ™ciu przycisku "PodglÄ…d", bÄ…dź "WyÅ›lij".

Ten artykuÅ‚ przedstawi tylko tÄ™ część przedsiÄ™wziÄ™cia, która wykonywana jest po stronie klienta - formularz do edycji z przyciskami korzystajÄ…cymi z JavaScriptu, by umieÅ›cić w polu tekstowym odpowiednie znaczniki. Część uruchamiana po stronie serwera, czyli zestaw wyrażeÅ„ regularnych, mechanizm podglÄ…du, oraz zapisu zostanÄ… przedstawione w nastÄ™pnej części artykuÅ‚u.

Przedstawiony tutaj kod nie bÄ™dzie posiadać wielu cech systemu z phpBB. Najbardziej zauważalne różnice to brak zamykania otwartych tagów, oraz blokady przeciwko nieprawidÅ‚owemu zagnieżdżaniu znaczników. StworzyÅ‚em go dla potrzeb edytora danych na stronÄ™ WWW - pierwotnie stosowaÅ‚em go do tworzenia nowych newsów, ale można go używać w wielu innych kontekstach.

Ta część artykuÅ‚u wymaga wÅ‚aÅ›ciwie tylko przeglÄ…darki obsÅ‚ugujÄ…cej JavaScript. Jednak abyÅ› mógÅ‚ skorzystać z zawartych dalej porad, bÄ™dziesz potrzebować serwera WWW obsÅ‚ugujÄ…cego PHP. Dodatkowo, jeżeli chciaÅ‚byÅ› zapisywać gdzieÅ› stworzone wiadomoÅ›ci, bÄ™dziesz musiaÅ‚ mieć także serwer baz danych MySQL. To wszystko, co miaÅ‚em do powiedzenia na poczÄ…tku, wiÄ™c zabierzmy siÄ™ do roboty!

Formularz

Aby zacząć nasze prace, bÄ™dziemy potrzebowali formularza HTML, którego użytkownik bÄ™dzie mógÅ‚ użyć do napisania wiadomoÅ›ci. Jak już wczeÅ›niej wspomniaÅ‚em, edytor ten byÅ‚ pierwotnie zaprojektowany do dodawania newsów, tak wiÄ™c zaprezentujÄ™ tu klasycznÄ… formÄ™ tytuÅ‚-autor-treść. Oto odpowiedni kod, wyjaÅ›nienie znajduje siÄ™ poniżej:

<html><head>
<title>Edytor</title>
<script src="editor.js"></script>
</head><body>
<form action="jakas_akcja" method="dowolna" name="editform"><p><input type="button" value="bold" name="bold" onclick="javascript:tag('b', '', 'bold*', '', 'bold', 'bold');" /></p>
<p>Tytuł: <input type="text" name="title" size="50" /><br />
Autor: <input type="text" name="author" size="35" /><br />
Wiadomość:<br />
<textarea rows="5" cols="75" name="post"></textarea></p>
<input type="submit" name="preview" value="PodglÄ…d" />
<input type="submit" name="submit" value="Dodaj" /></form>
</body></html>

Jak widzicie, formularz jest bardzo prosty. Ponadto możecie dostrzec, że w jego definicji nie wpisałem żadnych konkretnych danych. Zrobiłem tak, gdyż część przetwarzającą dane zostawimy sobie do drugiej części artykułu. Przyjrzyjmy się pierwszej części kodu:

<html><head>
<title>Editor</title>
<script src="editor.js"></script>
</head><body>
<form action="something" method="whatever" name="editform"><p>

Jest to standardowy nagÅ‚ówek. JedynÄ… różnicÄ… miÄ™dzy nim, a innymi takimi nagÅ‚ówkami jest dołączanie zewnÄ™trznego pliku JavaScript. Wrócimy do niego dalej, na razie trzeba nam wiedzieć, że jest on niezbÄ™dny. Wreszcie otwieramy znacznik formularza, po czym tworzymy paragraf. Dla potrzeb JS, nadaliÅ›my formularzowi nazwÄ™ "editform".

<input type="button" value="bold" name="bold" onclick="javascript:tag('b', '', 'bold*', '', 'bold', 'bold');" /></p>
<p>Tytuł: <input type="text" name="title" size="50" /><br />
Autor: <input type="text" name="author" size="35" /><br />
Wiadomość:<br />
<textarea rows="5" cols="75" name="post"></textarea></p>

Oto serce formularza. Pierwszy przycisk znacznika jest na razie także ostatnim takim przyciskiem. Możesz dostrzec, że odwoÅ‚uje siÄ™ on do funkcji JS zwanej tag(), wprowadzajÄ…c do niej kilka parametrów. Wrócimy do nich później. Wreszcie, dodajemy pola tekstowe dla tytuÅ‚u, autora i treÅ›ci. JedynÄ… rzeczÄ…, na którÄ… pragnÄ™ zwrócić uwagÄ™, jest nadanie nazw polu tekstowemu i przyciskom znaczników.

<input type="submit" name="preview" value="PodglÄ…d" />
<input type="submit" name="submit" value="Dodaj" /></form>
</body></html>

Na końcu dodajemy przyciski pozwalające nam wykonać podgląd wiadomości, lub zapisanie jej. Na tym kończymy omawianie kodu HTML, przejdziemy więc do JavaScript'u.

Do góry

JavaScript

Tak, wiem, niezbyt oryginalny tytuł. Jednakże, oto potrzebny kod JavaScript:

var b = 2;
function tag(v, tagadd, newbut, tagclose, oldbut, name) {
   if(eval(v)%2 == 0){
      eval("window.document.editform."+name+".value = newbut;");
      var post = window.document.editform.post.value;
      window.document.editform.post.value = post + tagadd;
      window.document.editform.post.focus();
   }else{
      eval("window.document.editform."+name+".value = oldbut;");
      var post = window.document.editform.post.value;
      window.document.editform.post.value = post + tagclose;
      window.document.editform.post.focus();
   }
   eval(v+"++;");
}

Ponownie mamy do czynienia z prostym skryptem. Dla tych, którzy nie rozumiejÄ… niektórych części kodu, rozbijÄ™ go na części i opiszÄ™.

var b = 2;
function tag(v, tagadd, newbut, tagclose, oldbut, name) {
   if (eval(v)%2 == 0) {

Na samym poczÄ…tku nadajemy zmiennej b wartość 2. Jest to ważna część, gdyż każdy przycisk bÄ™dzie naprzemiennie peÅ‚niÅ‚ różne funkcje. Brzmi znajomo? Przypomina to przeplatanie kolorów wierszy przy pobieraniu danych z bazy danych. BÄ™dziemy zwiÄ™kszali tÄ™ wartość za każdym razem, gdy wstawimy nowy tag, a po nastÄ™pnym klikniÄ™ciu w przycisk zostanie on zamkniÄ™ty (obliczymy to dzieleniem modulo, tj. resztÄ… z dzielenia). Każdy przycisk musi mieć oddzielnÄ… zmiennÄ… tego typu.

Definiujemy także listÄ™ parametrów w nawiasach. v jest nazwÄ… zmiennej użytej do sprawdzenia, czy tag jest otwarty, czy nie (w przypadku naszego formularza przekazujemy tutaj tylko wartość "b"). tagadd okreÅ›la otwartÄ… formÄ™ znacznika, jaki chcemy dodać. newbut to opis widniejÄ…cy na przycisku po klikniÄ™ciu na niego (np. "bold*"). tagclose przekazuje formÄ™ znacznika dodawanÄ…, gdy tag jest zamykany. oldbut opisuje oryginalnÄ… nazwÄ™ przycisku (gdy nie jest klikniÄ™ty), a name to po prostu nazwa przycisku, którego używamy.

Wróćmy do wÅ‚aÅ›ciwego kodu - sprawdzamy wynik dzielenia modulo w instrukcji if(). Jeżeli reszta z dzielenia wynosi 0, oznacza to, iż tag jest zamkniÄ™ty i w tym klikniÄ™ciu przycisku zostanie on otwarty. Wykona siÄ™ wiÄ™c ten kod:

      eval("window.document.editform."+name+".value = newbut;");
      var post = window.document.editform.post.value;
      window.document.editform.post.value = post + tagadd;
      window.document.editform.post.focus();

Najpierw sprawiamy, że przycisk przyjmie nazwÄ™ okreÅ›lonÄ… w newbut (np. "bold*"). W kolejnej linii nadajemy zmiennej post aktualnÄ… zawartość pola textarea. Trzecia linia - dodajemy znacznik otwierajÄ…cy. Na koÅ„cu przesuwamy kursor na koniec tekstu tak, by użytkownik od razu mógÅ‚ pisać odpowiednio sformatowany tekst bez koniecznoÅ›ci rÄ™cznego bawienia siÄ™ strzaÅ‚kami.

   }else{
      eval("window.document.editform."+name+".value = oldbut;");
      var post = window.document.editform.post.value;
      window.document.editform.post.value = post + tagclose;
      window.document.editform.post.focus();
   }

Ten kod wykonuje siÄ™, gdy reszta z dzielenia nie jest równa zeru (czyli tag zostaÅ‚ kiedyÅ› otwarty i trzeba go zamknąć). Wykonujemy tutaj te same czynnoÅ›ci, co w poprzednim fragmencie, tyle że dane czerpiemy z innych parametrów.

   eval(v+"++;");
}

Tutaj bez wzglÄ™du na to, czy otwieramy, czy zamykamy nasz znacznik, musimy zwiÄ™kszyć wartość w zmiennej okreÅ›lajÄ…cej stan przycisku. W przeciwnym wypadku dostawalibyÅ›my w kóÅ‚ko same znaczniki otwierajÄ…ce, bÄ…dź zamykajÄ…ce.

Do góry

Koniec części pierwszej

Tak wiÄ™c nauczyliÅ›my siÄ™ trochÄ™ o dziaÅ‚aniu mechanizmów BBcode zakodowanych w HTML'u i JavaScripcie. WiÄ™kszość z nich jest póki co niezbyt rozbudowana. Możesz jednak, ku wÅ‚asnej satysfakcji i doÅ›wiadczeniu, zmodyfikować zawarty tu kod. Dodaj przyciski, dodaj możliwoÅ›ci, wprowadź elementy designu. W tej chwili pracujÄ™ nad drugÄ… częściÄ… tego tekstu, odczuwalnie dÅ‚uższÄ….

Jeszcze raz usilnie namawiam do eksperymentowania z tym kodem. Mam nadzieję, że będzie do pomocne w przyswojeniu tego, co tu opisałem.

Andrew Kitchin (http://www.calgarytritons.com/~fluid/)

Przetłumaczył Zyx (http://www.zyxist.com/)

Do góry

Waszym zdaniem:

Nikt jeszcze nie dodał swojego komentarza. Możesz być pierwszy!


Twoim zdaniem:

Reklama

banner

Partnerzy

CityDesign.pl
phpSolutions