Aby sobie poradzić z '<' w formularzach, nie potrzeba edytora WYSWIG

Poprawianie znaku '<' na '<' pomiędzy znacznikami <code> i </code>, gdzie miałem wklejony kod jakiegoś programu, przy każdej aktualizacji postu stało się już zbyt denerwujące. Postanowiłem się za to jakoś zabrać, jeśli ja to z automatu robię, to i komputer będzie potrafił to zrobić. Musiałem sam napisać odpowiedni kod, bo do takiego banalnego zadania nie zatrudnia się rozbudowanych edytorów WYSIWYG. Bez mojego zmysłu programistycznego pewnie zrobiłbym to w PHP, jednak JavaScript jest lepszym rozwiązaniem (odpowiedź w zakończeniu).
Skryptowanie w JavaScript
Całość mojego kodu znajduje się w pliku forms.js, jednak oprócz utworzenia tego pliku, trzeba w sekcji nagłówkowej dodać linijkę: <script type="text/javascript" src="ściezka_do_pliku/funkcje.js"></script> i do elementu <body> dodać atrybut onload="setForms()". Poniżej omówię działanie wszystkich funkcji umieszczonych w tym pliku.
function setForms() {
var forms = window.document.getElementsByTagName('form');
for(i = 0; i < forms.length; i++) {
forms[i].setAttribute("onSubmit", "validateForm(this)");
}
}
Funkcja setForms dla każdego formularza, jaki znajdzie w ciele dokumentu HTML, ustawia wartość atrybutu onSubmit na validateForms(this). Czyli przy wysyłaniu formularza zostanie wykonana funkcja validateForms, która będzie posiadała referencję do tego formularza.
function validateForm(form) {
var textareas = form.getElementsByTagName('textarea');
for(var i = 0; i < textareas.length; i++) {
modifyTextArea(textareas[i]);
}
return true;
}
Zadaniem powyższej funkcji jest wywołanie funkcji modifyTextArea dla każdej znalezionego elementu textarea w formularzu.
function modifyTextArea(textarea) {
var from = 0;
while (textarea.value.indexOf('<code>', from) >= 0) {
from = textarea.value.indexOf('<code>', from);
var start = from+6; //tekst '<code>' ma 6 znaków
var end = textarea.value.indexOf('</code>', from);
if(end >= 0)from = end;
else {
end = textarea.value.length;
from = end;
}
textarea.value = inCode(textarea.value, start, end);
}
}
Funkcja modifyTextArea jest trochę bardziej skomplikowana. Główna pętla się wykonuje, dopóki znajdywane są znaczniki <code>. Aby odnaleźć coś w stringu trzeba napisać nasz_string.indexOf('coś', 0), gdzie drugi parametr wskazuje, od którego znaku zacząć poszukiwanie.
Później wewnątrz pętli szukany jest znacznik zamykający </code>, jeśli nie zostanie znaleziony (indexOf zwraca wartość mniejszą od zera), wartość from - czyli odkąd zacząć kolejne poszukiwanie znacznika <code> - ustawiana jest na długość stringa (lepiej zakończyć pętlę, gdy kod HTML nie jest poprawny).
Później wywoływana jest funkcja inCode, której przekazywana jest wartość textarea, indeks startowy i indeks końcowy.
function inCode(string, start, end) {
var sub_string = string.substring(start, end);
sub_string = sub_string.replace(/</g, '<');
string = string.substring(0, start) + sub_string + string.substring(end);
return string;
}
Podmiana wszystkich cos1 na cos2 w jakimś stringu w JavaScript: jakis_string.replace(/cos1/g, 'cos2'). W JavaScript używa się wyrażeń regularnych, bez tego 'g' podmieniło by tylko jeden ciąg. Jak dla mnie mogłoby być to bardziej intuicyjne.
Podsumowanie
Nie odpowiedziałem na jedno niezawarte pytanie w rozwinięciu tego postu, dlaczego rozwiązania w PHP byłyby złe. Nie mogę zrobić tego w kontrolerze, bo musiałbym w każdej funkcji obsługującej formularz wykonywać funkcję, która by mi zamieniała '<' na '<'. Czyli z tego wynika, że musiałbym zrobić to gdzieś głębiej, czyli w modelu. Jednak modelu nie powinno obchodzić, czy dane są typu HTML, czy zwykłym tekstem itd. I w widoku tego nie zrobię, bo widok nie zajmuje się przetwarzaniem danych. Jedynie rozsądne rozwiązanie to JavaScript ;) lub utworzenie klasy odpowiedzialnej za przetwarzanie formularzy, która byłaby na stałe powiązana z jakimś widokiem. Zrobiłem to pierwsze zgodnie z zasadą BUZI lub KISS.
Jeśli spodobał ci się wpis, zasubkrybuje kanał RSS
«Włączenie kompresji GZIP nie jest łatwe
Blog Day 2010»
Podobne wpisy
- Włączenie kompresji GZIP nie jest łatwe
- Anacron + Tar = automat do robienia kopii zapasowych
- Jak zmusić użytkowników do wylogowania się, w Linuksie?
- Walka ze spamem
- Linki HTML
1 komentarzy »
Secretisfaith napisał 31 Sierpnia 2010 o 12:02
Hej Godlark ?;> o ile nie pomyliłam ... To ja Adminka waylife.pl ;-) poodpisywałam na twoje komentarze na moim blogu bo już wrociłam z wakacji. Baw sie dobrze. Pozdrawiam.