Projekt jest już na githubie pod adresem
https://github.com/wookieb/bbcode
Proszę o dodawanie informacji o bugach właśnie tam.
UPDATE Wersja 1.2
[php bbcode, parser bbcode, advanced bbcode parser]
Chciałbym dziś zaprezentować swój mechanizm parsujący kod bbcode oraz ułatwiający nam kontrolę nad tym czy tagi są prawidłowo używane.
Klasa do pobrania:
https://github.com/wookieb/bbcode/zipball/master
Przykład działania:
http://wookieb.pl/bbcode/test.php
Readme.html w paczce oraz pod adresem http://wookieb.pl/bbcode/readme.html
Licencja
Skrypt wydany na licencji BSD. Dla własnego jak i komercyjnego użytku.
Ustawienia parsera
Ustawienia dla parsera znajdują się teraz w klasie BbCodeSettings. Ciekawsze z ustawień to
Zaufany kod
$settings->trustText = false; // kod niezaufany $settings->trustText = true; // kod zaufany
$code = $bbcode->getBbcode();
No nie wiem, czy zapis do bazy jest szybszy od sprawdzenia poprawności tagów. Wydaje mi się, że lepszym (szybszym) rozwiązaniem byłoby cache'owanie na dysku.
@down: a no fakt, nie zrozumiałem przeznaczenia. Mógłbyś dopisać do tej klasy cache'owanie - gdy implementowałem bbcode u siebie i robiłem benchmark, to przykładowy bbcode parsował się średnio 4ms, a przy włączonym cache'owaniu wczytywanie trwało średnio koło 0.2ms. jest różnica
<?php http://www.php.net/echo $bb->getParseText(); ?>
Klasa działa fajnie. Jefnak z danego tutka nie jestem w stanie stworzyć dodatkowego znacznika. Chodzi mi o kolor.
Czyli
CZERWONY
<?php .... 'color'=>array( 'open'=>'span', 'close'=>'span', 'attributes'=>array('color'=>array('attr'=>'style', 'type'=>'string', 'name'=>'color:' ) ) ) ... ?>
I to był właśnie mój błąd którego nie ująłem we wstępnej dokumentacji
Wstępnie zakładałem następujące możliwości podania parametru:
"parametr ze spacja itd"
'parametr ze spacja'
[0-9][a-z] - tutaj nie łapało koloru.
Oczywiście był to mój błąd w założeniu.
Poprawka polega na zamianie liniii 391 na następującą
<?php http://www.php.net/preg_match_all('/s*([a-z0-9-_]+)=('.+?'|".+?"|S*)s*/i', $text, $matches, PREG_SET_ORDER); ?>
Dięki ~wookieb.
Z kolorem od razu pomogło.
Ja jednak (bardzo prawdopodone!) upośledzony. Nie czaje dokumentacji o dodawaniu dodatkowych znaczników. Od 2h próbuje utworzyć
<http://december.com/html/4/element/span.html style="text-decoration: underline" ></http://december.com/html/4/element/span.html>
aż z ciekawości jak wrócę ze studiów po weekendzie to sobie zerknę w kod... swoją drogą jak tak na szybko na przewijaniu zerknąłem to nie powinno być trudne w stosowaniu, składnią przypomina ale tak pobieżnie patrząc DOM z php
Bardzo ciekawa klasa, gratulacje. Wiem co mówię bo swego czasu wytestowałem takich z 10 i z każdą były większe lub mniejsze problemy Trzeba tą odpicować i będzie gites
Na szybko to co wpadło mi w oczy:
- brak automatycznej zamiany URLa na link (czyli http://jakisurl.pl/cos)
- tym samym brak skracania zbyt długich URLi (skracania samego opisu linka aby nie rozjechał treści serwisu)
- brak obsługi
Ok sprawdziłem i dwie uwagi
1. jeśli umieścimy coś między [ul] a [li] to nie zostanie to usunięte co powoduje wygenerowanie nievalidującego się kodu html
2. Wyrzuca błędy
Warning: Call-time pass-by-reference has been deprecated; If you would like to pass it by reference, modify the declaration of [runtime function name](). If you would like to enable call-time pass-by-reference, you can set allow_call_time_pass_reference to true in your INI file in /home/hellson/public_html/bbcode/bbcode/bbcode.class.php on line 234
Klasa została poprawiona i usprawniona. Dodałem wszystkie standardowe tagi bbcode.
Można ściągać i sprawdzić teraz.
a ja pobrałem klasę ,wypakowałem ją do katalogu na serwer oraz uruchomiłem plik test.php i moim oczom ukazał się błąd :
Zapewne masz php4 zamiast php5
na jednym mam PHP Version 5.0.4 a na tym gdzie paser działa : PHP Version 5.2.6 .
testuje paser od jakiegoś czasu i przyzna,m że jest świetny . Mam tylko jedno pytanie : np. w bazie mam tresc a w tresci jest url z filmem do youtube i chcial bym go odrazu podmienic na odtwarzacz jak to zrobic ?
Przykładowy filtr
youtube.php
<?php class bbcode_filter_youtube { public $tags = http://www.php.net/array( 'youtube'=>array( 'open' => 'youtube', // tak naprawde moze byc tutaj cokolwiek bo i tak potem to wywalimy 'close' => 'youtube', 'notallowed_childs'=> 'all', // zadnych innych tagow w srodku nie potrzebujemy 'parseBody' => 'checkMovie' ); ); //$tag - wszystkie informacje o tagu. W naszym przypadku to co powyzej // $openNode - tag otwierajacy // $body - lista elementow zawartych pomiedzy tagami // $closeNode - tag zamykajacy public function checkMovie($tag, &$openNode, &$body, &$closeNode) { // wyciagamy caly tekst $bodyStr=''; foreach($body as $el) $bodyStr.=$el['text']; // sprawdzamy czy ciag jest urlem $str=data_validator::checkUrl($bodyStr); if($str==false) { return false; } // tag zamykajacy nie jest nam potrzebny wiec usuwamy z niego sam tekst $closeNode['text']=''; $openNode['text']=' tutaj wpisujemy kod odpowiadajacy za wyswietlenie filmiku youtube '; } } ?>
<?php private $defaultFilters=http://www.php.net/array('basic', 'code', 'url', 'list', 'image', 'youtube'); ?>
<?php $bbcode->loadFilter('youtube'); ?>
dzięki , już łapie o co chodzi .
Będę się musiał trochę pomęczyć z tym bo przykładowy filmik ma taki oto god
Wiec ten kod wstawiasz w miejsce
Tak zrobiłem wcześniej ,ale nie było widać odtwarzacza , po kliknieciu prawym klawiszem myszy na miejsce gdzie powinnien być wyskakuje opis " film niewczytany..." a źródło wygląda tak
Zacznijmy od tego, że raczej coś źle zrobiłeś bo mi nic nie ucinało.
Podsyłam cały filtr. Przyda się dla potomnych.
<?php class bbcode_filter_youtube { public $tags = http://www.php.net/array( 'youtube'=>array( 'open' => 'youtube', // tak naprawde moze byc tutaj cokolwiek bo i tak potem to wywalimy 'close' => 'youtube', 'notallowed_childs'=> 'all', // zadnych innych tagow w srodku nie potrzebujemy 'parseBody' => 'checkMovie' ) ); //$tag - wszystkie informacje o tagu. W naszym przypadku to co powyzej // $openNode - tag otwierajacy // $body - lista elementow zawartych pomiedzy tagami // $closeNode - tag zamykajacy public function checkMovie($tag, &$openNode, &$body, &$closeNode) { // wyciagamy caly tekst $bodyStr=''; foreach($body as &$el) { $bodyStr.=$el['text']; // wersja do wyswietlenia $el['text']=''; } // sprawdzamy czy ciag jest urlem $str=data_validator::checkUrl($bodyStr); if($str==false) { $openNode=bb_code::removeNode($openNode); $closeNode=bb_code::removeNode($closeNode); return false; } // szukanie id filmu if(http://www.php.net/preg_match('/watch?v=([a-zA-Z0-9_]+)/i', $str, $matches)) { $idMovie=$matches[1]; } else { $openNode=bb_code::removeNode($openNode); $closeNode=bb_code::removeNode($closeNode); return false; } // zamkniecie nie jest nam potrzebne $closeNode['text']=''; // Ustawiamy content $openNode['text']='<object width="425" height="344"> <param name="movie" value="http://www.youtube.com/v/'.$idMovie.'"></param> <param name="allowFullScreen" value="true"></param> <param name="allowscriptaccess" value="always"></param> <embed src="http://www.youtube.com/v/'.$idMovie.'" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed> </object>'; //ustawiamy link dla zaufanego bbcode http://www.php.net/reset($body); $body[http://www.php.net/key($body)]['tagText']=$str; } } ?>
może się przyda:) http://hobix.com/textile/quick.html
Witam!
http://wookieb.pl/bbcode/cut_test.php - ten przykład nie działa poprawnie.
Chciałbym się dowiedzieć gdzie można wyłączyć automatyczne zamienianie & na & ponieważ używam klasy convert charset i tam polskie litery są zapisywane do bazy w takim stylu: & #380 ; (bez spacji) i przy tej klasie bbcode zamiast litery pokazują się te znaki.
pozdrawiam
Oczywiście masz rację.
Poprawiłem cut_test.php wraz z małym bugiem który znalazłem.
Jeżeli chodzi o twój problem to używam funkcji htmlspecialchars to zabezpieczenia przez wstrzykaniem htmla, możesz ją zamienić na następującą funkcje
<?php $text=http://www.php.net/str_replace(http://www.php.net/array('<', '>'), http://www.php.net/array('<', '>'), $text); ?>
<?php else $str=http://www.php.net/htmlspecialchars($str); ?>
<?php $it=http://www.php.net/htmlspecialchars($node['text']); ?>
Dzięki za odpowiedź, czy żeby u mnie działało wycinanie tekstu muszę pobrać paczkę od nowa? (czy aktualizowałeś coś?).
Używam encji żeby nie było problemów z kodowaniem np. przy przenoszeniu bazy danych
Tak aktualizowałem, pobierz nową paczkę
No niestety nadal coś nie działa...
wyświetla się:
Sprawdź czy aby napewno poprawnie ściągnąłeś nowe pliki.
Poprawiłem jeszcze błąd z call_time_pass_reference.
Jak widzisz na serwerze działa wszystko ok, poza tym jest całkiem nowy cut_test.php
http://wookieb.pl/bbcode/cut_test.php
No niestety, ściągałem kilka razy i nic. Ciągle te same błędy.
EDIT: już działa chodziło o cache przeglądarki - pobierało mi poprzedni plik.
pozdrawiam
a ja mam mały problem bo nie wiem jak stosować znacznik <img> zdjęcia ? mam np. taki oto kod
Nawet nie wiesz co to bbcode :/
http://bbcode.org/reference.php
Kurczę, nie mogę ogarnąć jednej rzeczy - chciałbym dodać znacznik [flash={szerokosc},{wysokość}]{url_obiektu_flash}[/flash] i nie mam pojęcia jak się za to zabrać ;/
Ja mam pytanko z całkiem innej sceny. Jaka jest licencja na używanie tej klasy?
Do własnego jak i komercyjnego użytku.
Nie znam się specjalnie na licencjach więc niech będzie BSD
U mnie śmiga, że hej!
Narazie poprawiłem jeden błąd:
błędnie: (bbcode/filter/youtube.php)
$openNode['text']='<object width="425" height="344"> <param name="movie" value="http://www.youtube.com/v/'.$idMovie.'"></param> <param name="allowFullScreen" value="true"></param> <param name="allowscriptaccess" value="always"></param> <embed src="http://www.youtube.com/v/'.$idMovie.'" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed> </object>';
$openNode['text']='<object type="application/x-shockwave-flash" style="width:425px; height:350px;" data="http://www.youtube.com/v/'.$idMovie.'"><param name="movie" value="http://www.youtube.com/v/'.$idMovie.'" /></object>';
Tak
no i na przykład do img nie dodajesz alt i nie zamykasz znacznika /> to się też nie waliduje w strict
tak myślę, że przydała by się możliwość wyłączenia niektóych znaczników (bo teraz to nie wiem gdzie to zedytować?) i zamieniania nieznanych znaczników na '' (puste). np jak ktoś wpisze [ble]cos[/ble] -> cos (bez [])
if($tagInfo === null) { // to nie jest tag bbcode (prawdopodobnie zwykly tekst) $node['text']=$text; $node['type']=self::NODE_TYPE_TEXT; return $node; }
if($tagInfo === null) { $node['text'] = ''; $node['type'] = self::NODE_TYPE_TEXT; return $node; }
UPDATE PARSERA.
Wszystkie nowinki w pierwszym poście. http://forum.php.pl/index.php?showtopic=115269
Wszystko fajnie wygląda. Brakuje tylko integracji z Kohaną ;-)
A co za problem zintegrować to samemu? A dlaczego phpmailer nie jest zintegrowany z kohana, albo z ZF? Integrujcie sobie gdzie chcecie.
Swift jest zintegrowany w kohana.
Z tą integracją żartowałem. Fajnie napisana biblioteka
Implementował ktoś Geshi dla [code] ? Coś u mnie nie interpretuje tego jak powinien. Wychodzi kod potraktowany jakby htmlspecialchars. htmlspecialchars_decode nic nie pomaga ...
hmm.. Jeśli formatuje kod np. java jest ok. Jeśli zaś formatuje kod jako php oraz posiada znaczniki <?php ... ?> nie interpretuje tego dobrze, nie wyświetla nawet textarea geshi. Natomiast kod php bez znaczników <?php, ?> wyświetla okno textarea geshi, z tym że nie interpretuje kodu.
Pokaż jak zaimplementowałeś geshi.
Mam dwa pytania.
1. Jest jakaś opcja dostarczenia do tego parsera listy dozwolonych tagów?
2. Jeśli istnieje taka lista to jak do pozostałych tagów dodawać spację np. użytkownik poda <nowy_tag>, chcę uzyskać < nowy_tag.
Chodzi o to, aby nie traktował błędnego tagu jako kod html.
1) A readme.html czytał?
2) Opcje leave_* opisane w manualu, dokumentacja BbCodeSettings również się kłania.
przyda się
użyję w swoim skrypcie
Jeszcze jedno pytanie. Da się zrobić odwrotną konwersję, czyli html->bbcode ?
Tak da się tworząc filtry odwrotne. Aczkolwiek takiej możliwości jeszcze nie udostępniłem.
nie wiem czy to tylko u mnie, czy znalazłem buga
jeśli w parsowanym kodzie jest link powiedzmy http://www.wp.pl/cos to przestaje działać dodawanie <br/> w znakach nowej linii
więc pytanie, co jest nie tak, bądź jak zdebugować to.
PS: Mam klasę zintegrowaną z Kohaną, sam do końca nie wiem czy poprawnie
@Zdunek Poprawiłem błąd, Dzięki za info
Linia 1233
Wielkie dzięki
Przyznam, że wyrażenie skądś kopiowałem i przyznam, że nie ma to jednak jak zrobić coś samemu
Poprawki:
Url.php (98)
DataValidator.class.php (141)
Oczywiście + za doraźną pomoc
Przetestowałem link i jest ok. Proszę upewnij się czy na pewno masz poprawną wersję. Chodzi tylko o wyrażenia regularne więc mogło ci sie coś pomotać, albo coś nadpisałeś
Pomysł ciekawy. Dlatego dodałem do tagów opcję hide_body_in_cut_text (domyślnie w img i youtube). Oznacza ona, że zawartość danego taga nie będzie pokazywana, ani nie będzie wpływała na długość zajawki w skracanym tekście.
Wcześniej była opcja w ustawieniach parsera (BbCodeSettings) o nazwie availableTags. Jest ona tablicą w której podajemy nazwy tagów, które są dostępne w parserze. Rozszerzyłem opcje o "removeNotAvailableTags" (domyślnie true). Oznacza ona czy usuwać tagi, które nie są dostępne. Wygląda to w ten sposób
mam pytanko, w jaki sposób podczepić GeSHi ?
znalazłem gdzie
// tutaj mozemy dodać geshi czy to tez sie podoba
ale nie mam bladego pojęcia w jaki sposób to uczynić
Edit:
Próbowałem tak łopatologicznie wstawić
ale tak jak ktoś wcześniej pisał, wywala jakby ktoś przeleciał htmlspecialchars...
funkcja:
public function parseCode($tag, $openNode, $body, $closeNode) { $source = $body[0]['text']; $language = 'php'; $path = 'geshi/'; $geshi = new GeSHi($source, $language, $path); $body[0]['text'] = htmlspecialchars_decode($geshi->parseCode()); // tutaj mozemy dodać geshi czy to tez sie podoba $openNode['text'].='<div class="code_title">Kod</div><pre class="prettyprint">'; $closeNode['text']='</pre>'.$closeNode['text']; }
Jest to zabezpieczenie przed tym aby czasem autor filtra, nie zapomniał o zabezpieczeniu przed xss. Dlatego dodajemy flage "nohtmlspecialchars" aby przy budowanie tekstu końcowego, nie traktował danego NODE'a htmlspecialchars.
$body[0]['text'] =$geshi->parseCode(); $body[0]['nohtmlspecialchars'] = 1;
$body[0]['text'] =$geshi->parseCode(); $body[0]['nohtmlspecialchars'] = 1;
Faktycznie był mały błąd. Poprawiony + podany wzór używania geshi
Zmiana plików:
Filters/Url.php
Filters/Code.php (funkcja obsługująca geshi zakomentowana )
mam jeszcze jedno pytanko,
w jaki sposób zrobić obsługę na zasadzie
będzie
[code lang='php']jakiś skrypt php[/code] [code lang='java'] jakiś skrypt java[/code]
Oczywiście.
Możesz zrobić to za pomocą atrybutu, albo zlecić to oddzielnym tagom.
1) Atrybut
a) Należy stworzyć ustawienia twojego atrybutu (szczegóły w readme)
public $tags=http://www.php.net/array( 'code'=>array( 'open'=>'div class="code_wrapper"', 'close'=>'div', 'notallowed_child'=>'all', 'leave_notallowed_child'=>1, 'leave_notallowed_parent'=>1, 'parse_body'=>'parseCode', 'attributes'=>array( 'lang'=>array( 'type'=>'string', 'values'=>array('php', 'js') ) ) ) );
public function parseCode($tag, &$openNode, &$body, &$closeNode) { $language = 'default'; if(http://www.php.net/isset($openNode['attributes']['tag_attributes']['lang'])) { $language = $openNode['attributes']['tag_attributes']['lang']; } // dalszy kod }
public $tags=http://www.php.net/array( 'php'=>array( 'open'=>'div class="code_wrapper"', 'close'=>'div', 'notallowed_child'=>'all', 'leave_notallowed_child'=>1, 'leave_notallowed_parent'=>1, 'parse_body'=>'parsePHP' ), 'code'=>array( 'open'=>'div class="code_wrapper"', 'close'=>'div', 'notallowed_child'=>'all', 'leave_notallowed_child'=>1, 'leave_notallowed_parent'=>1, 'parse_body'=>'parseCode' ) ); public function parserPhp($tag, &$openNode, &$body, &$closeNode) { $language = 'php'; $this->parseCode($tag, $openNode, $body, $closeNode, 'php'); } public function parseCode($tag, &$openNode, &$body, &$closeNode, $language = 'default') { // laczymy tresc w całość $content = ''; foreach($body as $key => &$node) { $content.= $node['text']; $node['text'] = ''; // usuwamy zbedne elementy if($key!=0) http://www.php.net/unset($body[$key]); } require_once 'class.geshi.php'; $geshi = new GeSHi($content, $language); $body[0]['tagText'] = $content; $body[0]['text'] = $geshi->parseCode(); $body[0]['nohtmlspecialchars'] = 1; $openNode['text'].='<div class="code_title">Kod</div><div class="code_area">'; $closeNode['text']='</div>'.$closeNode['text']; }
'c'=>array( 'open'=>'div class="code_wrapper"', 'close'=>'div', 'notallowed_child'=>'all', 'leave_notallowed_child'=>1, 'leave_notallowed_parent'=>1, 'parse_body'=>'parseC' ),
Możesz. Przejrzyj zmienna $tag jaka dostajesz do funkcji i kombinuj
dzięki, udało się podczepić
chyba znalazłem następny błąd
f(x) \xrightarrow{T_{[1,5]}}g(x)
zmienia się w
f(x) \xrightarrow{T_{}}g(x)
Nie jest to błąd tylko ustawienie.
BbCodeSettings->removeNotAvailableTags
ustaw na false
Acha, dzięki
a jeszcze jedna rzecz którą zauważyłem
przy ustawianiu wielkości czcionek, jeśli czcionka jest za duża, bądź za mała to wywala błąd, mi w kohanaphp pokazuje
'Out of range (maximal)' myślę że lepszą opcją byłoby po prostu ustawienie tej wielkości to maksymalnej bądź minimalnej, a nie wywalenie błędu
Widocznie miałem wyłączone pokazywanie błędów.
Poprawka oczywiście na serwerze
Dodano @ przed wywołaniami metod DataValidatora w metodzie _parseAttributes
Poprawiłem również metodę _getTagInfo oraz _createNode
Witaj,
Bardzo przyjemna klasa, kawałek dobrej roboty.
Mam jednak z nią pewien zgryz - czy da się ją przekonać do parsowania składni list znanej z phpBB?
Chodzi mi o formatowanie typu jak w tym forum:
[ list]
[*]a
[*]b
[*]c
[/list]
oraz
[ list=1]
[*]a
[*]b
[*]c
[/list]
Takie tagi to koszmar każdego parsera tworzonego pod składnię znaną z html (a ten na taki wygląda). Moje próby spełzły na niczym - zrobiłem to dookoła modyfikując javascriptowy edytor pod składnię parsera. Da się to jakoś rozwiązać?
Da się przekonać.
Jak pisałem na początku tagi są dostosowane do "standardu" z http://bbcode.org/reference.php
Oczywiście da się zrobić tak jak chcesz. Niestety nie jestem w stanie tego zrobić za ciebie w najbliższym czasie dlatego dam małe podpowiedzi.
I zamieniasz włąściwość $tags
public $tags=http://www.php.net/array( 'list'=>array( 'open'=>'ul', 'close'=>'ul', 'wrap_white_space'=>true, 'allowed_child'=>array('li'), 'notallowed_parent'=>array('list'), 'parse_body'=>'parseList' ), '*'=>array( 'open'=>'li', 'close'=>false, 'allowed_parent'=>array('list') ) );
mi sie podoba, sprobuje poczytac Twoj kod i sie czegos nauczyc... co by nie byc lama^^
plus ode mnie ;-)
E: nie moge dac plusa w nie swoim temacie
nie wazne...
Witam, znalazłem następny błąd
tekst z tego artykułu
http://osnews.pl/zapowiedz-swiata-post-nielegalnej-kopii/
i zdaje mi się że przez => ucina 1/3 tekstu po przerzuceniu tekstu przez parser
PS: Kod kopiowałem jako mirror bo strona padła jak ktoś wrzucił na wykop
Hmm nie zauważyłem takiej przypadłości. Mógłbyś wrzucić dokładny tekst jaki podałeś parserowi? (wklej.org badz wystawić gdzieś na serwerze )
http://wklejasz.pl/t.txt (plik kodowany w utf-8)
i jak wrzuciłem zamiast > odpowiednik w kodzie, to nie ucięło tekstu
Niestety u mnie sytuacja nadal nie występuje.
O ile pamiętam, modyfikowałeś parser, więc polecałbym pobrać parser jeszcze raz i porównać różnice pomiędzy plikami (np total commanderem -> Porównaj według zawartości), może umknęło Ci parę ważnych elementów. Jeżeli pomimo tego problem nadal wystąpi wyrzuć proszę swój parser gdzieś publicznie lub zagadaj na pw w celu wysłania swojego parsera.
czekaj... czekaj
nie wiem czemu myslalem, ze parser jest zgodny z xhtml i uzywa np. <span style="weight: bold;"></span> zamiast <b></b>
w kazdym razie tak nie jest... co prawda uzywam htmla a nie xhtmla, ale jeszcze jakis czas temu szukalem parsera do xhtmla, w sumie to bez tego caly parser jest neiwiele warty, bo mozna sobie na szybko napisac niewiele gorszy, a plikow ma tyle co polowa cmsa
1) Element B istnieje w XHTMLu
2) Dalece bardziej poprawnym jest użycie
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <http://december.com/html/4/element/html.html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pl" lang="pl"> <http://december.com/html/4/element/head.html> <http://december.com/html/4/element/meta.html http-equiv="Content-type" content="application/xhtml+xml; charset=iso-8859-2" /> <http://december.com/html/4/element/title.html>Tytuł</http://december.com/html/4/element/title.html> <http://december.com/html/4/element/link.html rel="stylesheet" href=" [nazwa_arkusza_stylow.css] " type="text/css" /> </http://december.com/html/4/element/head.html> <http://december.com/html/4/element/body.html> <http://december.com/html/4/element/p.html> <http://december.com/html/4/element/span.html style="font-weight: bold">pogrubiony tekst</http://december.com/html/4/element/span.html> </http://december.com/html/4/element/p.html> </http://december.com/html/4/element/body.html> </http://december.com/html/4/element/html.html>
jestem za bardzo pro zeby pisac byle BB
szukalem np. takiego parsera ktory jest w wbb3, gdzie calosc jest formatowana css i sie nie gryzie
ale chyba nie ma co
z reszta, zaczalem dzisiaj czytac joomle, to co tam zobaczylem przeroslo moje wyobrazenia o duzych aplikacjach
to jest jakis kombajn, moze troche przesadzam z tym ograniczaniem aplikacji
Czy istnieje możliwość do pisania w wartości title, a w obrazkach alt??
Zależało by mi na tym, jest to możliwe?
Oczywiście, że jest i oczywiście, że wszystko jest opisane w readme
No fakt, za readme wziąłem inny plik i stąd moja niewiedza.
Już sobie z tym poradziłem.
Dzięki.
A ja mam taki problem
mam aktualnie taki układ plików:
Main:
-class:
--Bbcode:
---pliki tej klasy
--klasa1.php
--klasa2.php
-index.php
i mój problem wygląda w ten sposób, że po skopiowaniu zawartości pliku test.php (z paczki bbcode) do index.php i zaincludowaniu klasy bbcode w ten sposób: include_once ('class/Bbcode/BbCode.class.php');
Dostaję kupę błędów:
Warning: include_once(Bbcode/Filters/Basic.php) [function.include-once]: failed to open stream: No such http://www.php.net/file or directory in C:\xampp\htdocs\smarty\class\Bbcode\BbCode.class.php on line 264 Warning: include_once() [function.include]: Failed opening 'Bbcode/Filters/Basic.php' for inclusion (include_path='.;C:\xampp\php\PEAR') in C:\xampp\htdocs\smarty\class\Bbcode\BbCode.class.php on line 264 Notice: filter not exists in C:\xampp\htdocs\smarty\class\Bbcode\BbCode.class.php on line 268 Warning: include_once(Bbcode/Filters/Code.php) [function.include-once]: failed to open stream: No such http://www.php.net/file or directory in C:\xampp\htdocs\smarty\class\Bbcode\BbCode.class.php on line 264 Warning: include_once() [function.include]: Failed opening 'Bbcode/Filters/Code.php' for inclusion (include_path='.;C:\xampp\php\PEAR') in C:\xampp\htdocs\smarty\class\Bbcode\BbCode.class.php on line 264 Notice: filter not exists in C:\xampp\htdocs\smarty\class\Bbcode\BbCode.class.php on line 268 Warning: include_once(Bbcode/Filters/Url.php) [function.include-once]: failed to open stream: No such http://www.php.net/file or directory in C:\xampp\htdocs\smarty\class\Bbcode\BbCode.class.php on line 264 Warning: include_once() [function.include]: Failed opening 'Bbcode/Filters/Url.php' for inclusion (include_path='.;C:\xampp\php\PEAR') in C:\xampp\htdocs\smarty\class\Bbcode\BbCode.class.php on line 264 Notice: filter not exists in C:\xampp\htdocs\smarty\class\Bbcode\BbCode.class.php on line 268 Warning: include_once(Bbcode/Filters/List.php) [function.include-once]: failed to open stream: No such http://www.php.net/file or directory in C:\xampp\htdocs\smarty\class\Bbcode\BbCode.class.php on line 264 Warning: include_once() [function.include]: Failed opening 'Bbcode/Filters/List.php' for inclusion (include_path='.;C:\xampp\php\PEAR') in C:\xampp\htdocs\smarty\class\Bbcode\BbCode.class.php on line 264 Notice: filter not exists in C:\xampp\htdocs\smarty\class\Bbcode\BbCode.class.php on line 268 Warning: include_once(Bbcode/Filters/Image.php) [function.include-once]: failed to open stream: No such http://www.php.net/file or directory in C:\xampp\htdocs\smarty\class\Bbcode\BbCode.class.php on line 264 Warning: include_once() [function.include]: Failed opening 'Bbcode/Filters/Image.php' for inclusion (include_path='.;C:\xampp\php\PEAR') in C:\xampp\htdocs\smarty\class\Bbcode\BbCode.class.php on line 264 Notice: filter not exists in C:\xampp\htdocs\smarty\class\Bbcode\BbCode.class.php on line 268 Warning: include_once(Bbcode/Filters/Youtube.php) [function.include-once]: failed to open stream: No such http://www.php.net/file or directory in C:\xampp\htdocs\smarty\class\Bbcode\BbCode.class.php on line 264 Warning: include_once() [function.include]: Failed opening 'Bbcode/Filters/Youtube.php' for inclusion (include_path='.;C:\xampp\php\PEAR') in C:\xampp\htdocs\smarty\class\Bbcode\BbCode.class.php on line 264
masz 2 wyjścia
1) dodać do include path katalog "class",
2) poprawić wszędzie ścieżkę dołączanych plików na poprzedzając ją 'class/'
Wielkie dzięki już wszystko dobrze działa.
Zauważyłem drobny błąd chyba.
W linijce 51 w pliku youtube.php jest:
$idMovie = http://www.php.net/htmlspecialchars($str);
$idMovie = http://www.php.net/htmlspecialchars($bodyStr);
Czy jest mozliwość usprawnienia biblioteki/filtru w taki sposób, żeby wyłapywał niedomknięte tagi? Chodzi mi o napisanie filtra do obsługi innego typu listy, takiej jak na przykład na tym forum.
$idMovie = http://www.php.net/htmlspecialchars($str);
$idMovie = http://www.php.net/htmlspecialchars($bodyStr);
A w jaki sposób mogę użyć asterixa w nazwie taga? Skrypt nie parsuje tagu [ * ], natomiast bez problemu działa na innych [tagbb] ze znakami alfanumerycznymi. Dodatkowo gdzie w ustawieniach mogę zmienić, aby tab zamykający [/*] nie był wymagany? Próbowałem obejść to i przy parsowaniu całej listy (to udało mi się szybko zrobić) wywołać:
'notallowed_parent'=>array('code'), // uniemozliwia osadzenie code 'leave_notallowed_parent'=>true // ale samo istnienie tegoż taga pozostawia w tekście
public $tags=http://www.php.net/array( 'list'=>array( 'open'=>'ul', 'close'=>'ul', 'wrap_white_space'=>true, 'allowed_child'=>array('*'), 'notallowed_parent'=>array('list'), 'parse_body'=>'parseList' ), '*'=>array( 'open'=>'li', 'close'=>false ) );
<?php /** * Obsługa list (popularna na forach) * @package Parser * @subpackage Filters * @author LapKom * @version 0.1 */ class BbCodeFilterList { public $tags=http://www.php.net/array( 'list'=>array( 'open'=>'ul', 'close'=>'ul', 'wrap_white_space'=>true, 'allowed_child'=>array('*','l'), 'notallowed_parent'=>array('list'), 'parse_body'=>'parseList', 'attributes'=>array( 'list'=>array( 'attr'=>'style', 'type'=>'string', 'values'=>array( '1', '01', 'a', 'A', 'i', 'I', ), ), ), ), '*'=>array( 'open'=>'li', 'close'=>false, 'allowed_parent'=>array('list'), ), ); /** * Parsuje LISTY * @param array $tag * @param array $openNode * @param array $body * @param array $closeNode * @param BbCodeSettings $settings */ public function parseList($tag, &$openNode, &$body, &$closeNode, $settings) { if(http://www.php.net/isset($openNode['attributes']['tag_attributes']['list'])) { $listStyleType = $openNode['attributes']['tag_attributes']['list']; switch ($listStyleType) { case '1' : $type = 'decimal'; break; case '01' : $type = 'decimal-leading-zero'; break; case 'a' : $type = 'lower-alpha'; break; case 'A' : $type = 'upper-alpha'; break; case 'i' : $type = 'lower-roman'; break; case 'I' : $type = 'upper-roman'; break; } $listStyleType = $openNode['attributes']['tag_attributes']['list'] = 'list-style-type:'.$type; $openNode=BbCode::rebuildNode($tag, $openNode, $settings); $openNode['text'] = http://www.php.net/str_replace('ul','ol',$openNode['text']); $closeNode['text'] = http://www.php.net/str_replace('ul','ol',$closeNode['text']); } } } ?>
'l'=>array( 'open'=>'li', 'close'=>false, 'allowed_parent'=>array('list'), )
foreach($body as &$el) { http://www.php.net/var_dump($el); }
http://www.php.net/array 'type' => int 0 'text' => string ' ' (length=4) 'nobr' => int 1 http://www.php.net/array 'type' => int 3 'original_text' => string '[l]' (length=3) 'tagname' => string 'l' (length=1) 'tagText' => string '[l]' (length=3) 'text' => string '<li/>' (length=5) http://www.php.net/array 'type' => int 0 'text' => string ' Element listy ' (length=18) 'nobr' => int 1 http://www.php.net/array 'type' => int 3 'original_text' => string '[l]' (length=3) 'tagname' => string 'l' (length=1) 'tagText' => string '[l]' (length=3) 'text' => string '<li/>' (length=5) http://www.php.net/array 'type' => int 0 'text' => string ' Element listy 2 ' (length=19) 'nobr' => int 1
Ściągnij parser i skopiuj plik BbCode.class.php . Wczoraj to zrobiłem, poniewaz faktycznie parser blokował tego typu tagi.
Mam problem z funkcją do skracania.
Przy skracaniu [ul][li][/li][ul] powinno brać cały [li][/li], domknąć [ul] a dopiero wtedy dopisać "...".
BBcode:
<http://december.com/html/4/element/p.html> tresc <http://december.com/html/4/element/ul.html> <http://december.com/html/4/element/li.html>Internet Explorer,</http://december.com/html/4/element/li.html> <http://december.com/html/4/element/li.html>Firefox 3.0,</http://december.com/html/4/element/li.html>...</http://december.com/html/4/element/li.html> </http://december.com/html/4/element/ul.html> </http://december.com/html/4/element/p.html>
Problem poprawiony i nowa paczka jest na serwerze. Plik BbCode.class.php do zmiany
Witam,
Ostatnio kolega @wookieb podał mi kod do swojej klasy bbcode.
Wszystko działa prawie super Chodzi o wprowadzenie kolorowania w geshi
Zrobiłem to tak
a tu go zamykam*/
<?php include_once('Bbcode/BbCode.class.php'); $bb=new BbCode(); $text='POGROBIONE /*oczywiście tu wpisuję znacznki [php] tylko na forum się to rozwal*/ if ($ddd == "aaa") { echo "bbb"; } /*
Było
http://forum.php.pl/index.php?act=findpost&hl=geshi&pid=684713Następnym razem poruszaj takie sprawy w temacie dotyczącym tego skryptu bo robi się bałagan na forum
// EDIT: Dziękuję za połączenie tematów
oki tego nie widziałem
Ale jak zrobiłem zmiany z code.php
<?php /** * Tag CODE * @package Parser * @subpackage Filters * @author wookieb * @version 1.1 */ class BbCodeFilterCode { public $tags=http://www.php.net/array( 'code'=>array( 'open'=>'div class="code_wrapper"', 'close'=>'div', 'notallowed_child'=>'all', 'leave_notallowed_child'=>1, 'leave_notallowed_parent'=>1, 'parse_body'=>'parseCode' ) ); /** * Parsuje tag CODE * @param array $tag * @param array $openNode * @param array $body * @param array $closeNode */ /*public function parseCode($tag, &$openNode, &$body, &$closeNode) { // tutaj mozemy dodać geshi czy to tez sie podoba $openNode['text'].='<div class="code_title">Kod</div><div class="code_area">'; $closeNode['text']='</div>'.$closeNode['text']; } */ /** * Parsuje tag CODE używając GESHI * @param array $tag * @param array $openNode * @param array $body * @param array $closeNode */ public $tag=http://www.php.net/array( 'php'=>array( 'open'=>'div class="code_wrapper"', 'close'=>'div', 'notallowed_child'=>'all', 'leave_notallowed_child'=>1, 'leave_notallowed_parent'=>1, 'parse_body'=>'parsePHP' ), 'code'=>array( 'open'=>'div class="code_wrapper"', 'close'=>'div', 'notallowed_child'=>'all', 'leave_notallowed_child'=>1, 'leave_notallowed_parent'=>1, 'parse_body'=>'parseCode' ) ); public function parsePhp($tag, &$openNode, &$body, &$closeNode) { $language = 'php'; $this->parseCode($tag, $openNode, $body, $closeNode, 'php'); } public function parseCode($tag, &$openNode, &$body, &$closeNode, $language = 'default') { // laczymy tresc w całość $content = ''; foreach($body as $key => &$node) { $content.= $node['text']; $node['text'] = ''; // usuwamy zbedne elementy if($key!=0) http://www.php.net/unset($body[$key]); } require_once 'class.geshi.php'; $geshi = new GeSHi($content, $language); $body[0]['tagText'] = $content; $body[0]['text'] = $geshi->parseCode(); $body[0]['nohtmlspecialchars'] = 1; $openNode['text'].='<div class="code_title">Kod</div><div class="code_area">'; $closeNode['text']='</div>'.$closeNode['text']; } }
A no tak bo zmienił się parser
public function parseCode($tag, &$openNode, &$body, &$closeNode, $settings, $language = 'default')
public function parsePhp($tag, &$openNode, &$body, &$closeNode, $settings) { $language = 'php'; $this->parseCode($tag, $openNode, $body, $closeNode, $settings, 'php'); }
http://www.php.net/print_r($openNode);
Poprawiłem i teraz mi wyświetla
Fatal error: Call to undefined method GeSHi::parseCode() in D:\www\TESTY-MODULOW\geshi_testy\Bbcode\Filters\Code.php on line 94
a ta linijka to
$body[0]['text'] = $geshi->parseCode();
To w takim razie sprawdź jaka funkcja przeparsuje code w geshi, bo juz nie pamietam, może miałem inna wersje. Ale generalnie wiesz o co chodzi.
Witam,
Już doszedłem prawie gdzie był problem. W Geshi zostało zmienione parseCode() na parse_code() i już działa to znaczy nie wyświetla błędu.
Niestety kod nie jest pokolorowany jest wyświetlony jako default
Code.php
<?php /** * Tag CODE * @package Parser * @subpackage Filters * @author wookieb * @version 1.1 */ class BbCodeFilterCode { public $tags=http://www.php.net/array( 'code'=>array( 'open'=>'div class="code_wrapper"', 'close'=>'div', 'notallowed_child'=>'all', 'leave_notallowed_child'=>1, 'leave_notallowed_parent'=>1, 'parse_body'=>'parseCode' ) ); /** * Parsuje tag CODE * @param array $tag * @param array $openNode * @param array $body * @param array $closeNode */ /*public function parseCode($tag, &$openNode, &$body, &$closeNode) { // tutaj mozemy dodać geshi czy to tez sie podoba $openNode['text'].='<div class="code_title">Kod</div><div class="code_area">'; $closeNode['text']='</div>'.$closeNode['text']; } */ /** * Parsuje tag CODE używając GESHI * @param array $tag * @param array $openNode * @param array $body * @param array $closeNode */ public $tag=http://www.php.net/array( 'php'=>array( 'open'=>'div class="code_wrapper"', 'close'=>'div', 'notallowed_child'=>'all', 'leave_notallowed_child'=>1, 'leave_notallowed_parent'=>1, 'parse_body'=>'parsePHP' ), 'code'=>array( 'open'=>'div class="code_wrapper"', 'close'=>'div', 'notallowed_child'=>'all', 'leave_notallowed_child'=>1, 'leave_notallowed_parent'=>1, 'parse_body'=>'parseCode' ) ); public function parsePhp($tag, &$openNode, &$body, &$closeNode, $settings) { $language = 'php'; $this->parseCode($tag, $openNode, $body, $closeNode, $settings, 'php'); } public function parseCode($tag, &$openNode, &$body, &$closeNode, $settings, $language = 'default') { // laczymy tresc w całość http://www.php.net/print_r($openNode); $content = ''; foreach($body as $key => &$node) { $content.= $node['text']; $node['text'] = ''; // usuwamy zbedne elementy if($key!=0) http://www.php.net/unset($body[$key]); } require_once 'geshi/geshi.php'; $geshi = new GeSHi($content, $language); $body[0]['tagText'] = $content; $body[0]['text'] = $geshi->parse_code(); $body[0]['nohtmlspecialchars'] = 1; $openNode['text'].='<div class="code_title">Kod</div><div class="code_area">'; $closeNode['text']='</div>'.$closeNode['text']; } }
<?php include_once('Bbcode/BbCode.class.php'); $bb=new BbCode(); $text="POGROBIONE <!--c1--><div class='codetop'>Kod</div><div class='codemain'><!--ec1--> if ( $ddd == 'aaa') { echo 'pupa'; }<!--c2--></div><!--ec2-->"; http://www.php.net/echo '<fieldset class="pre"><legend>Oryginalny tekst</legend>'.$text.'</fieldset>'; $bb->parse($text, false); http://www.php.net/echo '<fieldset><legend>Po BBC</legend'.$bb->getHtml().'</fieldset>'; ?>
A gdzie ty masz tag "code" uzyty?
Poza tym pisałem, przeczytaj readme.html jak się dodaje parametry do tagów
to forum wycieło znaczniki code.
Kurcze no mam te tagi dopisane
public $tag=http://www.php.net/array( 'php'=>array( 'open'=>'div class="code_wrapper"', 'close'=>'div', 'notallowed_child'=>'all', 'leave_notallowed_child'=>1, 'leave_notallowed_parent'=>1, 'parse_body'=>'parsePhp' ), 'code'=>array( 'open'=>'div class="code_wrapper"', 'close'=>'div', 'notallowed_child'=>'all', 'leave_notallowed_child'=>1, 'leave_notallowed_parent'=>1, 'parse_body'=>'parseCode' ) );
Przecież cały czas mówię o dodaniu atrybutu LANG do tagu CODE.
Dodałem atrybut
public $tag=http://www.php.net/array( 'php'=>array( 'open'=>'div class="code_wrapper"', 'close'=>'div', 'notallowed_child'=>'all', 'leave_notallowed_child'=>1, 'leave_notallowed_parent'=>1, 'parse_body'=>'parsePhp' ), 'code'=>array( 'open'=>'div class="code_wrapper"', 'close'=>'div', 'notallowed_child'=>'all', 'leave_notallowed_child'=>1, 'leave_notallowed_parent'=>1, 'attributes'=>array('lang'=>array('attr'=>'lang')), 'parse_body'=>'parseCode' ) );
Przeczytaj jeszcze raz moje posty.
napisałem:
DODAJ ATRYBUT
+
SPRAWDŹ W KODZIE JAK TEN ATRYBUT PRZEKAZAĆ DO GESHI
A może mi Pan pomóc,
Kurcze nie jestem taki mocy w PHP i ślęczę nad tym od dwóch dni i nic ciekawego wymodzić nie mogę.
Tak kiepski jestem wiem. Amatorsko się tym zajmuję na potrzeby zabawy i wolnego czasu.
Proszę o wyrozumiałość, potrzebne mi jest to do moich skryptów z języka bash
Mam jeszcze tylko 1 pytanie, w którym miejscu mogę zrobić parsowanie emotów? tzn ": )" na ?
---------------------------------------------------------------------------------------------------------------
Ok, udało mi się podłączyć Geshi do Tego parsera, nie miałem żadnych większych problemów ;]
Ale mam pewien problem z wyświetlaniem tego, mianowicie na chrome wszystko działa:
http://gynio.pl/artykul/8-geshi-dodatek-do-parsera-BBcode/
A na Mozilli wywala błąd XML
Błąd parsowania XML: niezdefiniowana jednostka Obszar: <http://december.com/html/4/element/a.html href="http://gynio.pl/artykul/8-geshi-dodatek-do-parsera-BBcode/" target="_blank">http://gynio.pl/artykul/8-geshi-dodatek-do-parsera-BBcode/</http://december.com/html/4/element/a.html> Numer linii: 77, kolumna 131:<http://december.com/html/4/element/div.html class="code_wrapper"><http://december.com/html/4/element/div.html class="code_title">Kod</http://december.com/html/4/element/div.html><http://december.com/html/4/element/div.html class="code_area"><http://december.com/html/4/element/pre.html class="php" style="font-family:monospace;">
Masz, pokalało Cię za używanie twardych spacji do czegoś do czego nie zostały stworzone.
Ale żeby nie było: http://changelog.ca/log/2006/06/12/making_nbsp_work_with_xml_rss_and_atom
Ok działa
Parser
zamienia \t na 4x nbsp w pliku bbcode.class.php
Właśnie szukałem czegoś do parsowania bbcodu z możliwością dodania kilku niestandardowych znaczników i natrafiłem na Twoją fajną klasę. Na prawdę niezła robota. Z moich uwag to:
- nie wiem, czy dobrze widzę, ale czy niestandardowe tagi trzeba dopisać "na stałe" do klasy? Jeśli tak to fajnie byłoby dodać jakąś metodę pozwalającą na zmianę w locie - raz mogę potrzebować innego zestawu tagów a drugi raz innego. Fajnie aby takie rzeczy można było zmieniać w kodzie.
- zadeklarowałbym metody jak protected a nie private tak, aby w razie czego można było dziedziczyć po Twojej klasie - znów powód jak powyżej - czasami mogę potrzebować jakiś niestandardowych rozwiązań i zamiast przerabiać całą klasę mógłbym tylko dodać/zmienić pewne części
Najbardziej podoba mi się automatyczne "domykanie" tagów - wiele rozwiązań nie ma tego zaimplementowanego a jest to przydatna funkcja.
Ogólnie dobra robota - gratuluje.
Potrzebuję wymienić parser BBCode i cieszę się że znalazłem coś porządnego
Niestety pierwsza próba odpalenia sprawiła kilka kłopotów, otóż postanowiłem wrzucić klasę do odpowiedniego podkatalogu mojego systemu. Wtedy okazało się, że robiąc "require_once 'include/tools/parsers/BbCode.php" wszystko się sypie, ze względu na relatywność ścieżek.
Poprawiłem to prostym znanym trickiem z dirname i __FILE__. Dzielę się swoim patchem, fajnie gdybyś go włączy do swojego "mainline"
http://files.zajec.net/bbcode.0001.patch.txt
Wystarczy dodać katalog z BbCode do include_path
witam, sciagnalem sobie to, ale nie bardzo wiem jak sie teraz do tego zabrac...
mam sobie strony index.php oraz dodaj.php, na tym samym poziomie folder bbcode.
no i co teraz musze zrobic, zebym w formularzu dodaj.php mogl sobie wpisac tekst i ubrac go w bbcode?
dodaje do plikow
include_once('Bbcode/BbCode.class.php'); $bb=new BbCode();
a jak zrobić zwykłe prasowanie
Musisz wcześniej zamienić "<br />" na znak nowej linii.
A czy jest możliwość parsowania youtube po samym ID?
@gorzat, użyj patcha Zajeca
Tak. W tagu podajesz po prostu tylko jego ID
No ale jak podaje samo id to mi sie wyswietla ramka z youtubem i tekstem, ze not found.
Fakt, uzylem patcha zejeca i zmienilem player na nowy.
Mozesz pomoc?
Moj kod:
github.com/marcinlawnik/BBcode-parser
Jestem kretynem. Mój błąd
W pliku Filter/Youtube.php
zamień linijke
$idMovie = http://www.php.net/htmlspecialchars($str);
$idMovie = http://www.php.net/htmlspecialchars($bodyStr);
Poprawione.
Zaraz dorzuce twoje przyklady i zrobie diff na twoim oryginale i mojej modyfikacji.
Ew. po prostu zrobisz forka z mojej wersji.
Raczej nie forka. I tak będę wydawał nową wersję.
Czekam z nieciepliwością.
EDIT: Dla potomnych:
Zawartosc paczki z pierwszego postu:
https://github.com/marcinlawnik/BBcode-orig
Paczka z pierwszego postu z modyfikacjami:
- patch zajeca
- poprawka w youtube.php taka sama jak w patchu bo zajec ja pominal
- poprawka 2 posty wyzej z $str i $bodyStr
https://github.com/marcinlawnik/BBcode-modified
Jedna rzecz , czy parser blokuję html'a i XSS czy to już należy do nas?
Sam blokuje.
Dzięki , zaoszczędzi mi to trochę włosów na głowie ogólnie świetna sprawa.Myślałeś może o dodaniu tagu "spoiler"?
Nie planuje, bo jest to zbyt zależne od widoku.
W sumie dzięki takiemu łatwemu do zrozumienia rozpisaniu klasy bardzo łatwo dopisywać tagi. Jakby ktoś chciał tag spoiler z jQuery to ja zrobiłem to tak :
Zaraz po tag'u Quote w pliku Basic.php
CSS :
, 'spoiler'=>array( 'open'=>'div class="spoiler"><input type="button" value="Spoiler"/><div class="spoiled"', 'close'=>'div></div' )
i w JS
.spoiler , .spoiler input { margin:5px; border: 1px white dashed; } div.spoiler div.spoiled{ display:none; margin:5px; }
A tak ogólnie mówiąc to ja taki parser bym sprzedawał a nie publikował ..
$('.spoiler').children('input').click(function(){ $(this).siblings('.spoiled').toggle(); });
Cześć,
Na początek napisze, że świetny parser stworzyłeś.
Ale mam dwie kwestie.
1. Zagnieżdzanie tagów, np:
[b]123[/b]
<http://december.com/html/4/element/b.html><http://december.com/html/4/element/b.html>123</http://december.com/html/4/element/b.html></http://december.com/html/4/element/b.html>
<http://december.com/html/4/element/b.html>123</http://december.com/html/4/element/b.html>
'notallowed_child'=>array('b')
@mlawnik popraw tag youtube'a dokładnie mam na myśli linijkę 77 , usuń "allowfullscreen" bo w3c validator krzyczy a nic to allowfullscreen niezmienia bo to nie jest embed tylko iframe.
1) Tak zajmę się tym
2) Niestety raczej nie ma takiej opcji ale racja muszę o tym pomyśleć.
@nekomata, poprawione.
Jak korzystać z tej zajawki? Mam w pętli wyświetlanie newsów. W miejscu na treść dodałem:
$bbcode = new BbCode(); $bbcode->getSettings()->trustText = true; $bbcode->parse($news['content']); http://www.php.net/echo $bbcode->cutText(150);
A na jakiej podstawie mogę stwierdzić co jest źle skoro tych tekstów nie otrzymałem?
Pamiętaj o białych znakach bo skrypt ich nie rozróżnia od "rzeczywistych" znaków.
No spróbuj sobie do tego $news['content'] wpisać np.:
Zbadaj tekst za pomocą var_dump i sprawdź czy nie maasz białych znaków na początku.
1. Wychodzi string(397) podczas gdy tekst wklejony w Wordzie pokazuje liczbę znaków(ze spacjami): 369. Gdy zmienię liczbę ze 150 do 100 tekst skraca do takiej postaci:
Łap paczkę z przykładem. Coś z kodowaniem nawet jest nie tak... Wszystko zapisywane w UTF-8, nie wiem czemu więc tak jest.
http://akademiawesola.pl/test_skracania.rar
U mnie efekt tego skryptu to:
Ok poprawione.
Dzięki za znalezienie błędu
Można prosić o numery linijek i typy zmian? Staram się na bieżąco updateować to w http://forum.php.pl/Quiz_a_moze_test_t175859.html
Jasne.
Linia 1357 bbcode.class.php
$node['text'] = mb_substr( $node['text'], 0, $length, $this->settings->charset);
Poprawiłem i przypominam, że repo z kilkoma nowymi małymi ficzerami i aktualnymi poprawkami @wookieb leży tu:
https://github.com/marcinlawnik/BBcode-modified
Poprawki są od strony 6, nie wiem, ale chyba wookieb je uploaduje.
Oprócz tego na nowy podmieniony jest odtwarzacz youtube i coś tam jeszcze.
Tak wrzuciłem Twoje poprawki mlawnik
Projekt jest już na githubie pod adresem
https://github.com/wookieb/bbcode
Proszę o dodawanie informacji o bugach właśnie tam.
Jeżeli ktoś nie ma konta może również pisać tutaj.
Katalogi z SVN-a ci się skopiowały.
Przydałby się .gitignore
Znowu coś ze skracaniem wyrazów:
Zrzut bazy:
-- -- Table structure for table `Levels` -- CREATE TABLE IF NOT EXISTS `Levels` ( `ID_lvl` smallint(6) NOT NULL, `Question` text COLLATE utf8_unicode_ci NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; -- -- Dumping data for table `Levels` -- INSERT INTO `Levels` (`ID_lvl`, `Question`) VALUES (1, 'Najpierw sprawdzimy czy nie jesteś idiotą. \nPytanie brzmi: 2+2*2 jest?'), (2, 'Jak nazywa się konstruktor tego karabinu?\r\n [.img]http://ttg.webuda.com/lvl2/aks.PNG[./img]'), (3, 'Najbardziej dochodowy film w historii?\r\n'), (4, 'Od jakiego słowa pochodzi nazwa "Google"?\r\n'), (5, '01010011011000010110110101101111011000110110100001101111011001000111101001101001
01101011\r\n'), (6, 'Ile grodzi wodoszczelnych miał RMS Titanic?\r\n[.img]http://ttg.webuda.com/lvl6/tytanik.PNG[./img]\r\n'), (7, 'Jaką tablicę mają Tworzanice?(Chodzi o pierwsze trzy litery)\r\n[.img]http://ttg.webuda.com/lvl7/tab.png[./img]\n'), (8, 'Jak [.b]naprawdę[./b] nazywa się autor Sztuki Wojennej?\r\n\r\n[youtube]http://www.youtube.com/watch?v=wtaja8lkEdk[/youtube]\r\n'), (9, 'Jaka litera jest na szczysie tzw."Tablicy Snellena"?\r\n\r\n[.img]http://www.ttg.webuda.com/lvl10/snellen.PNG[./img]');
//connection if (!($conn = http://www.php.net/mysql_connect($db_hostname, $db_username, $db_password))) { http://www.php.net/print("$LANG[db_connect_error]"); http://www.php.net/error_log("$LANG[db_connect_error]\r\n", 3, '../log/db.log'); http://www.php.net/exit; } //encoding mysql_set_charset('utf8', $conn); //db selection if (!($db = http://www.php.net/mysql_select_db($db_name, $conn))) { http://www.php.net/print $LANG['db_select_error']; http://www.php.net/error_log("$LANG[db_select_error]\r\n", 3, '../log/db.log'); http://www.php.net/exit; } //display db table $result = http://www.php.net/mysql_query("SELECT * FROM Levels"); if (!$result) { http://www.php.net/die("$LANG[db_query_error]"); } $table_display = '<table border=\'1\'><tr>'; $table_display .= "<td>$LANG[level]</td><td>$LANG[question]</td><td>$LANG[edit]</td>"; $table_display .= "</tr>\n"; // printing table rows while($row = http://www.php.net/mysql_fetch_row($result)) { $table_display .= '<tr>'; // $row is array... foreach( .. ) puts every element // of $row to $cell variable foreach($row as $cell) if(mb_strlen($cell) >= 3){ $bb = new BbCode(); $bb->parse($cell, false); $cut_cell = $bb->cutText(30); $table_display .= "<td>$cut_cell</td>"; } else{ $table_display .= "<td>$cell</td>"; } $table_display .= "<td><img src=\"../templates/$CONF[template]/img/page_edit.png\"> </td>"; $table_display .= "</tr>\n"; }
Hmm u mnie wszystko śmiga elegancko bez żadnych problemów.
Sprawdź czy na pewno wszystko z twoim kodowaniem OK ale najpierw popraw wszystkie błedy E_NOTICE.
U autora zawsze śmiga
live demo:
yopqsdev.orchestra.io/admin
admin
samplepassword
https://github.com/marcinlawnik/Yopqs/blob/dev/admin/edit.php
---------------------
EDIT
A gdzie te E_NOTICE?
Miałeś starą wersję parsera.
Zassaj nową.
Wrzuciłem jedną poprawkę, ale nie dotyczyła ona twojego błędu.
Faktycznie, trochę lepiej. Zobaczę kodowanie, i dam znać.
Czy jest możliwość utworzenia osobnej "czystej" gałęzi z samym kodem, bez przykładów?
Chciałbym dodać sobie twój parser jako submoduł, i nie bawić się w ciągłe poprawki.
Narazie nie za bardzo. To repo całego projektu (czyli również przykładów) a wydzielanie gałęzi tylko na kod i ciągłe jej uaktualnienia (co każdy commit) jest bezsensowne.
A gałąź z kodem (praca na niej) i merge z masterem?
A merge usunąłby pliki usunięte w branchu z kodem.
Szukałem, szukałem i... znalazłem:
http://stackoverflow.com/questions/1407638/git-merge-removing-files-i-want-to-keep?answertab=active#tab-top
Ale racja, to dużo roboty.
Zgłosiłem błąd na githubie
Witam, takie pytanie:
Czy jest w miarę prosta możliwość dodania tagu w formie:
np.
Aby został przeparsowany na
Co muszę zrobić, aby nie zamykało automatycznie niedomkniętych tagów?
Mam ustawione:
/** * Czy poprawiać poprawność użycia kolejności tagów. Np. [.b]tekst[.i] kursywą[./b] zostanie zamienione na [.b]tekst[.i] kursywą[./i][./b] * @var bool */ public $validHtml = false;
Niedomykanie a poprawa kolejności to 2 różne rzeczy.
Nie ma możliwości wyłączenia domykania tagów.
@master_25 Musisz utworzyć nowy tag i przypisać do niego funkcję parsującą (przykłądy masz w katalogu Filters).
Wersja na której możesz się wzortować jest tutaj https://github.com/wookieb/bbcode/blob/master/Bbcode/Filters/Youtube.php
W razie pytań pisz.
Mam kolejny problem - wstawiłem BBCode'a od kodu i do niego inne BBCode'y no i je sparsowało :| Wgrałem więc od nowa cały parser -> dalej parsuje w [.code][/.code]
Z góry dzięki za pomoc
A dokłądniej?
Przykład?
Sory, nie sprecyzowałem..
Poprawka:
Parsuje tag kodu tylko np.:
Witam,
ogólnie klasa super, mam jednak mały mankament. Mianowicie używając tagu bbcode size i podając w nim bardzo mały parametr np 2 czcionka jest bardzo mała, a nie taka jak ustawiona dla tego tagu minimalna np 10px
Przykład:
Masz rację - to mów wielki błąd.
Przepraszam barzdo, fix już jest w repozytorium na githubie
A ja się chciałem zapytać bo już się bawię kilka msc tym ( raz zaczynam i się podaje), no więc pisze sobie bloga mam system podstron i newsów, tam wyświetlam chciałbym wyświetlić kod dla użytkowników sformatowany w htmlspecialchars i ładnie koloruje SyntaxHighlighter w JS. W bazie danych kod wygląda tak:
Wszystko co nie jest sparsowane bezpośrednio przez tag bbcode jest traktowane htmlspecialchars + nl2br. Musisz dodać nowy tag php i w funkcji parsującej wyłączyć wstawianie BR.
Przykładowe rozszerzenie plugin Code o Twój tag "PHP".
class BbCodeFilterCode { public $tags = http://www.php.net/array( 'code' => http://www.php.net/array( 'open' => 'div class="code_wrapper"', 'close' => 'div', 'notallowed_child' => 'all', 'leave_notallowed_child' => 1, 'leave_notallowed_parent' => 1, 'parse_body' => 'parseCode' ), 'php' => http://www.php.net/array( 'open' => 'div', 'close' => 'div', 'notallowed_child' => 'all', 'leave_notallowed_child' => 1, 'parse_body' => 'parsePHP' ) ); /** * Parsuje tag CODE * @param array $tag * @param array $openNode * @param array $body * @param array $closeNode */ public function parseCode($tag, &$openNode, &$body, &$closeNode) { // tutaj mozemy dodać geshi czy to tez sie podoba $openNode['text'].='<div class="code_title">Kod</div><div class="code_area">'; $closeNode['text'] = '</div>'.$closeNode['text']; } public function parsePHP($tag, &$openNode, &$body, &$closeNode) { foreach ($body as &$node) { if ($node['type'] === BbCode::NODE_TYPE_TEXT) { $node['nobr'] = true; } } } }
Ok, teraz mi się podoba, jak wyłączyć htmlspecialchars?
$node['nobr'] = true; $node['nohtmlspecialchars'] = true'
Super dziękuje, teraz mam taki problem nie wiem czy mój czy klasy ale wydaje mi się ze klasy , że za tagiem code, lub quote zmniejszają mi się same litery:
Tekst z code/quote:
http://xxdrago.pl/tmp/1.gif
http://xxdrago.pl/tmp/txt_code.txt - to co wrzucam do prasowania bb-code.
http://xxdrago.pl/tmp/txt_code_html.txt - to co zostało wygenerowane przez klasę(HTML).
Tekst bez code/quote:
http://xxdrago.pl/tmp/2.gif
http://xxdrago.pl/tmp/txt_nocode.txt - czysty tekst prasowany przez bb-code
http://xxdrago.pl/tmp/txt_nocode_html.txt - tekst wygenerowany przez klasę(HTML).
W CSS nic nie mogę znaleźć...
Bardzo fajny skrypt, ale znalazłem jednego niewielkiego buga (zgłosiłem już na githubie).
Przy okazji mam jedno pytanie: coś szczególnego powinienem uwzględnić, jeśli chcę dodać odpornego na XSS taga
Więcej komplikacji z ustawieniem czegoś jakiegoś inteligentnego kodu niż to wszystko warte... :/
W jaki sposób mogę zmodyfikować tag size, aby dla poszczególnego atrybutu ustawiało ustawiony rozmiar?
Np.
odpowiadać będzie
[size=1]text[/span]
<http://december.com/html/4/element/span.html style="font-size: 12px;">teskt</http://december.com/html/4/element/span.html>
odpowiadać będzie
[size=2]text[/span]
<http://december.com/html/4/element/span.html style="font-size: 14px;">teskt</http://december.com/html/4/element/span.html>
odpowiadać będzie
[size=4]text[/span]
<http://december.com/html/4/element/span.html style="font-size: 20px;">teskt</http://december.com/html/4/element/span.html>
'size' => http://www.php.net/array( 'open' => 'span', 'close' => 'span', 'attributes' => http://www.php.net/array( 'size' => http://www.php.net/array( 'attr' => 'style', 'type' => 'string', 'name' => 'font-size:', 'values' => http://www.php.net/array( '1' => '14px', '2' => '16px', '3' => '18px', '4' => '20px' ), 'replace' => true ) ) ),
Dzięki wielkie, ułożyłem coś podobnego według manuala, z tym, że u mnie nie działało to nadałem type jako number.
Dzięki. Kawał dobrej roboty.
Witaj,
Mam z tym jeszcze mały problem, nie wiem czy to bug, jednak gdy w treści jest HTML, a następnie użyję:
$bbcode->parse($n->content, true );
,
<http://december.com/html/4/element/strong.html>tekst</http://december.com/html/4/element/strong.html>
i wszystkie inne HTML'owe nie działają, czyli w zasadzie tak ma być.
<http://december.com/html/4/element/u.html>tekst</http://december.com/html/4/element/u.html>
, wtedy zamiast tego, widzę:
<http://december.com/html/4/element/a.html href="http://google.pl/">Tekst</http://december.com/html/4/element/a.html>
<http://december.com/html/4/element/a.html href="http://google.pl/...;>Tekst</http://december.com/html/4/element/a.html>
jest parsowana na link, czyli można to kliknąć, jednak odnośnik jest wtedy następujący:
http://google.pl/...;>Tekst</http://december.com/html/4/element/a.html>
.
http://google.pl/%22%3ETekst%3C/a%3E
$bbcode->parse($n->content, false ); $code = $bbcode->getBbcode(); $bbcode->getSettings()->trustText = true; http://www.php.net/echo $bbcode->parse($code);
nie jest parsowany i jest widoczny tak jak napisałem.
<http://december.com/html/4/element/a.html href="http://google.pl/">Tekst</http://december.com/html/4/element/a.html>
Odkopię trochę temat bo mam mały problem.
Jak zrobić aby używając taga img w wyniku końcowym wyświetlany obrazek był również odnośnikiem do tego obrazka?
Wiem, że można by zastosować url i w nim img ale dla wygody użytkowników wolałbym aby to działo się tylko przy wykorzystaniu img
Aktualnie jest tak jeżeli zrobisz coś takiego
Witam, miałem okazję wykorzystać klasę i muszę powiedzieć, że na prawdę jest świetna! Tylko przy edycji filtra Youtube napotkałem mały problem. Minowicie zamiast wstawiania całego iframe poprzez dopisanie kodu w tym miejscu:
$openNode['text'] = '<iframe title="YouTube video player" width="560" height="349" src="http://www.youtube.com/embed/'.$idMovie.'?rel=0" frameborder="0"> </iframe> ';
public $tags = http://www.php.net/array( 'youtube' => http://www.php.net/array( 'open' => 'iframe', 'close' => 'iframe', 'notallowed_child' => 'all', 'parse_body' => 'checkMovie', 'hide_body_in_cut_text' => true, 'attributes' => http://www.php.net/array( 'width' => http://www.php.net/array( 'attr' => 'width', 'type' => 'number', 'default_value' => '457' ), 'height' => http://www.php.net/array( 'attr' => 'height', 'type' => 'number', 'default_value' => '329' ), ) ) );
$openNode['text'] = http://www.php.net/substr($openNode['text'],0,-1); $openNode['text'] .= ' src="http://www.youtube.com/embed/'.$idMovie.'" frameborder="0">';
Rozwiązanie jest OK. Wartość parametru jest generowana więc musi to być zrobione własnie w podany sposób.
Chcę otrzymać zajawkę tekstu i używam takiego kodu:
$bbcode->parse($forumr[2], false)->trustText = true;; $forum[$i][2] = $bbcode->cutText(120,false);//tresc postu
Nie ma takiej możliwości.
Pobierz wersję HTML i usuń z niej tagi za pomocą na strip_tags
Zapomniałeś ampersanta przy $openNode. Z kolei $body niby nie edytujesz w tej funkcji, ale też przydałoby się dla spokoju dać & . Chwilę się głowiłem, czemu nie dostaję odpowiednich tagów
public function parseQuote($tag, $openNode, $body, &$closeNode, $settings) {
require_once 'include/BbCode/BbCode.class.php'; $bbcode = new BbCode(); $text='http://google.pl/test?foo=a&bar=b'; http://www.php.net/echo $bbcode->parse($text, true);
@Zajec - bardzo dziękuję za wykrycie buga - błąd został naprawiony
Dzięki serdeczne! Widzę też, że przesiadłeś się na filter_var w checkUrl. Jestem za, loklanie używałem podobnej modyfikacji.
Troszkę przeszkadzało mi, że filter_var nie akceptuje relatywnych linków, moja funckja wygląda więc następująco:
(Tak podaję, gdyby ktoś potrzebował konstrukcji typu
public http://www.php.net/static function checkUrl($text) { $valid = filter_var($text, FILTER_VALIDATE_URL); if (!$valid) $valid = filter_var('http://php.net/' . $text, FILTER_VALIDATE_URL); if (!$valid) return false; return http://www.php.net/preg_replace('/(java script:)/is', '', $text); }
Sztywne użycie php.net w checkUrl jest trochę... jednostronne, więc nie wprowadzam tego do kodu.
Co do $inImg - szczerze mówiąc zostawie tak jak jest dopóki działa. Bbcode 2.0 już niedługo więc nie będzie takich kwiatków
Zastosowałem tą klasę na swoim małym forum żeby, działała funkcja cytuj i napisałem taki kod:
$tresc = http://www.php.net/htmlspecialchars(http://www.php.net/mysql_real_escape_string($_POST['tresc'])); $bbcode->getSettings()->trustText = false; $bbcode->parse($tresc,false); $tresc=$bbcode->getBbcode();
'quote' => http://www.php.net/array( 'open' => 'div class="quote"', 'close' => 'div', 'parse_body' => 'parseQuote', 'attributes' => http://www.php.net/array( 'quote' => http://www.php.net/array( 'type' => 'string' ), 'date' => http://www.php.net/array( 'type' => 'string' ) ) )
Podaj proszę dokładną zawartość zmiennej $_POST['tresc'];
U mnie zwykły quote działa.
[qote]trolololo[/qote] tutaj jest zwykly post
\[qote] trolololo tutaj jest zwykly post \[/qote] \[/qote]
Tag zamykający quote był (jak domniemam) nieprawidłowy "[/qoute]" co powoduje, że bbcode sam zamknął tag po koniec tekstu gdyż nie było żadnego innego prawidłowego zamknięcia cytatu.
Mam problem z klasą, jak dodaje rekord do bazy to znaki specjalne takie jak ",&,< i > (możliwe też że inne) zamienia mi na " & itd. Da się ten problem rozwiązać za zmianą ustawień w klasie? Bo że używajac str_replace da się to zrobić to wiem
To domyślne zachowanie które zabezpiecza przed tym aby nie wyświetlać HTML-a. Nie da się tego wyłączyć.
Cześć,
bardzo fajna klasa, niestety jednak dzisiaj ujrzałem jej błąd.
Nie mogę tu tego wkleić, ale jest coś takiego:
[url=
[b
[color = "Red"]
i zamknięcie tych tagów
Notice: Undefined index: URL in Bbcode/BbCode.php on line 841
Notice: Undefined index: COLOR in Bbcode/BbCode.php on line 841
Co jest nie tak?
Ściągasz wersję bezpośrednio z githuba?
Po uruchomieniu skrawków przykładu bbcode, który dostarczyłeś nie otrzymuję żadnego błędu
Jeżeli masz problem ze wstawieniem tegoż bbcode, użyj proszę gist.github.com
Witam!
Od jakiegoś czasu używam Twojego parsera i jestem z niego bardzo zadowolony, ale mam jeden problem.
Podczas kopiowania tekstu zachowuje się jego formatowanie np. tekst:
Faktycznie był mały błąd w parserze. Poprawione - wersja na githubie
Teraz działa idealnie dziękuję
Witam, chciałbym aby jeżeli tekst odnośnika do strony jest dłuższy niż 100 znaków to pojawiały się tylko 20 pierwszych znaków, następnie ... i końcowe 20 znaków.
Jak to zmienić w parserze?
https://github.com/wookieb/bbcode/blob/master/Bbcode/Filters/Url.php
Metoda shortUrl
Witam,
Jak mogę to umieścić na swojej stronie? Chciałbym tak zrobić, żeby można było bbcode używać przy dodawaniu newsa, już cały skrypt gotowy, tylko jak to tam wsadzić?
Musisz zastosować parser bbcode przy zapisie aby zastąpić oryginalną treść newsa treścią z parsera. Przykład jak wykorzystać parser jest podany na 1 stronie tematu oraz w repozytorium.
<form action="" method="post"> <select name="id_profesji"> <?php include("polacz.php"); $results = http://www.php.net/mysql_query("SELECT id, profesja FROM profesje"); while($id_profesji = http://www.php.net/mysql_fetch_array($results)) { ?> <option value="<?php http://www.php.net/echo $id_profesji[0]; ?>"> <?php http://www.php.net/echo $id_profesji[1]; ?> </option> <?php } ?> </select><br /> Tytuł<br /> <input type="text" name="tytul" /><br /> Level:<br /> <input type="text" name="level" /><br /> Wersja:<br /> <input type="text" name="version" /><br /> Ostatnia aktualizacja: <br /> <input type="text" name="last_update" /><br /> Video: <br /> <input type="text" name="video" /><br /> Treść: <br /> <textarea name="tresc"></textarea> <input type="submit" value="Dodaj" /> </form> <?php $tytul = $_POST['tytul']; $level = $_POST['level']; $version = $_POST['version']; $last_update = $_POST['last_update']; $video = $_POST['video']; $id_profesji = (int)$_POST['id_profesji']; $tresc = $_POST['tresc']; if($_SERVER['REQUEST_METHOD'] == 'POST') { $query = http://www.php.net/mysql_query("INSERT INTO skrypty SET tytul='$tytul', level='$level', version='$version', last_update='$last_update', video='$video', id_profesji='$id_profesji', tresc='$tresc'"); if($query) http://www.php.net/echo "Poradnik został dodany poprawnie"; else http://www.php.net/echo "Błąd, nie udało się dodać nowego poradnika"; } ?>
Najpierw naucz się programować. Koniec dyskusji.
Witam, poradziłem sobie z tym już jakiś czas temu, lecz teraz tak naprawdę zacząłem używać tabeli. Firebug w ogóle nic nie wykazuje, usunąłem cały styl pliku i nadal występuje błąd: nad tabelą pozostaje jakies 500-600px wolnego miejsca. Próbowałem to zmienić margin-top:-500px, ale jest to rozwiązanie niestabilne, bo czasami tabela rozszerza się na większą odległość.
Dodałem to do basic.php
'table' => http://www.php.net/array( 'open' => 'table', 'close' => 'table', 'notallowed_child' => http://www.php.net/array('table') ), 'tr' => http://www.php.net/array( 'open' => 'tr', 'close' => 'tr', 'notallowed_child' => http://www.php.net/array('tr') ), 'td' => http://www.php.net/array( 'open' => 'td', 'close' => 'td', 'notallowed_child' => http://www.php.net/array('td') ),
[table] [tr] [td]asdasdas[/td] [td]adadasdas[/td] [td]asdasteretrr34[/td] [/tr] [tr] [td]3333[/td] [td]sawe[/td] [td]asaa[/td] [/tr] [/table]
pokaż to na przykładzie, bo wrzuciłeś jakieś fragmenty które niczego nie obrazują.. najlepiej link albo jsfiddle
blablablablabla 1231231313123123123 test <?php require_once 'Bbcode/BbCode.php'; $tresc = '[table] [tr] [td]asdasdas[/td] [td]adadasdas[/td] [td]asdasteretrr34[/td] [/tr] [tr] [td]3333[/td] [td]sawe[/td] [td]asaa[/td] [/tr] [/table]'; $parser = new BbCode(); http://www.php.net/echo $parser->parse($tresc); ?> blablablablabla 1231231313123123123 test
Źródło prawdę Ci powie, nwm co to za parser ale coś w nim jest nie tak
blablablablabla 1231231313123123123 test <http://december.com/html/4/element/table.html><http://december.com/html/4/element/br.html /> <http://december.com/html/4/element/tr.html><http://december.com/html/4/element/br.html /> <http://december.com/html/4/element/td.html>asdasdas</http://december.com/html/4/element/td.html><http://december.com/html/4/element/br.html /> <http://december.com/html/4/element/td.html>adadasdas</http://december.com/html/4/element/td.html><http://december.com/html/4/element/br.html /> <http://december.com/html/4/element/td.html>asdasteretrr34</http://december.com/html/4/element/td.html><http://december.com/html/4/element/br.html /> </http://december.com/html/4/element/tr.html><http://december.com/html/4/element/br.html /> <http://december.com/html/4/element/tr.html><http://december.com/html/4/element/br.html /> <http://december.com/html/4/element/td.html>3333</http://december.com/html/4/element/td.html><http://december.com/html/4/element/br.html /> <http://december.com/html/4/element/td.html>sawe</http://december.com/html/4/element/td.html><http://december.com/html/4/element/br.html /> <http://december.com/html/4/element/td.html>asaa</http://december.com/html/4/element/td.html><http://december.com/html/4/element/br.html /> </http://december.com/html/4/element/tr.html><http://december.com/html/4/element/br.html /> </http://december.com/html/4/element/table.html>blablablablabla 1231231313123123123 test
Wiem co jest nie tak - po prostu każde przeniesienie do nowej linijki to <br />. Zatem będę musiał tabelki pisać bez przeniesień do nowych linijek.
tak ale wgl poco Ci to br tu? przecież jego to się rzadko w obecnych czasach używa do łamana tekstu, akapity wyznaczasz znacznikiem <p>, a br to ostateczność..
Właśnie go nie chcę, a to jest w parserze ustawione, że po złamaniu linii w bbcode dodaje <br>. Ja dodałem bbcode tabeli ręcznie. Chciałbym się tego pozbyć.
no to warunkiem sprawdzaj czy jesteś w tabeli jeśli tak no to nie dodajesz br jeśli nie no to tak jak było
albo stwórz oddzielna metodę do generowana tabelek najlepiej
Dzięki, po prostu zastosuję preg_replace do tych 6 znaków i po problemie.
@edit
Niestety, po zastosowaniu preg_replace dalej występuje ten błąd. Wgrywałem inne parsery, ale część nie ma tabelek, a w innych to same błędy wyskakują.
I ja podepnę się do tematu..
ckeditor z wtyczką bbcode tworzy list na takiej zasadzie:
[_list=1]
[_*]Aaaaaaaa
[_*]Bbbbbbbb
[_*]Ccccccccc
[_/list]
(jeśli ma być numerowane)
lub wypunktowanie
[_list]
[_*]Aaaaaaaa
[_*]Bbbbbbbb
[_*]Ccccccccc
[_/list]
jak to dostosować do dodatku List.php?
Dodałem _ bo tutaj działa takie parsowanie...
kiedyś przerabiałem ten problem z listami
może komuś się przyda https://www.dropbox.com/s/n9ti8d57mgr0ly3/plugin.js?dl=1 teraz ck będzie zamykał tagi w listach, nie pamiętam co tam zmieniałem żeby działało więc musicie szukać sami
wydaje mi się chodzi o to
Przepuszcza 2 razy </b> co może troszkę zepsuć stronę, niestety.
Nie sprawdzałem innych tagów
$text='[ul] [li]Internet Explorer, [li][li][li][li][li][li]Firefox,[/li] [li]Google Chrome 4.0,[/li][/b][/b] [li]Safari 3.0.[/li] [/ul]';
<ul> <li>Internet Explorer,<br /> <b>Firefox,</b></li></b> <li>Google Chrome 4.0,</li> <li>Google Chrome 4.0,</li> <li>Safari 3.0.</li> </ul>
Hej,
przejrzałem dokumentację i parę tagów dostosował pod swoje potrzeby, ale mam problem z emotikonami.
Czy jest możliwość żeby parser wyłapywał z tekstu i zamieniał na obrazki "uśmieszki"
Są dodawane do bazy danych bez znaków "[" i "]" dlatego mam lekki problem w ustawieniu tak parsera żeby brał pod uwagę sam tekst bez tych otwierających i zamykających nawiasów. Jest taka możliwość?
Z góry dziękuję za pomoc jak i za samą klasę
Ze względu na beznadzieje parserów BBcode dla symfony (jeden nie działa na wyższych v niż 2.4, drugi jakieś bugi mi z lokalizacją - nie istotne), pozwoliłem sobie na modyfikację biblioteki. Dodałem namespace i utworzyłem sobie twig extension.
wystarczy dodać namespace do:
bbcode
BbCodeSettings
DataValidator
oraz wszelkie required w tych 3 klasach zamienić na po prostu use.
W katalogu filters jest troche inaczej - dodajemy use lecz nie dodajemy namespace. Jest to mało oryginalne rozwiązanie, lecz działające.
Zrobiłem twig extension w taki sposób:
<?php namespace acme\DemoBundle\Twig; use acme\DemoBundle\Lib\Bbcode\BbCode; class BbcodeExtension extends \Twig_Extension { public function getFilters() { return http://www.php.net/array( new \Twig_SimpleFilter('bbcode', http://www.php.net/array($this, 'bbCodeParser')), ); } public function bbCodeParser($rawText) { $text = http://www.php.net/htmlspecialchars($rawText); $bbcode = new BbCode(); $bbcode->parse($text, false); return $bbcode->getHtml(); } public function getName() { return 'acme_bbcode_extension'; } }
services: acme.bbcode_extension: class: acme\DemoBundle\Twig\BbcodeExtension tags: - { name: twig.extension }
{{ comment.text|bbcode|raw }} // |raw musi być, inaczej twig robi dodatkowe swoje htmlspecialchars, który my zrobiliśmy przed parsowaniem.
Z przyjemnością Jak dodasz to umieszczę potem link do Twojego bundle
RAW nie będzie potrzebny jeśli ... http://twig.sensiolabs.org/doc/advanced.html#automatic-escaping
Wookie pilnuj mnie
Całość mam już gotowe - troche refactoringu i jeszcze testy muszę napisać, chociaż i tak aby dodać do "oficjalnego" repo musi być pokryte nimi 80% kodu ;d
https://github.com/Fortidude/bbcode/
Na pewno zrobisz to lepiej
Pisałem to tak dawno temu iż wiem, że teraz zrobiłbym to zupełnie inaczej. Swoją drogą polecam ten oto kurs https://www.coursera.org/course/compilers zanim zaczniesz pracę nad parserem
Hej,
po aktualizacji PHP do 5.4.38 parser nie działa.
Wiecie czemu tak się dzieje?
Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)