Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [klasa] Zaawansowany parser bbcode (php5)
Forum PHP.pl > Forum > Gotowe rozwiązania > Algorytmy, klasy, funkcje
Stron: 1, 2, 3, 4, 5
c3zi
Jeszcze jedno pytanie. Da się zrobić odwrotną konwersję, czyli html->bbcode ?
wookieb
Tak da się tworząc filtry odwrotne. Aczkolwiek takiej możliwości jeszcze nie udostępniłem.
Zdunek
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 biggrin.gif
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
wookieb
@Zdunek Poprawiłem błąd, Dzięki za info smile.gif
Zdunek
Cytat(wookieb @ 27.10.2009, 22:53:43 ) *
@Zdunek Poprawiłem błąd, Dzięki za info smile.gif

no i znowu będę musiał integrować z Kohaną tongue.gif
Jeśli możesz powiedzieć jakie linijki są do zmiany, będę bardzo wdzięczny
wookieb
Linia 1233
Zdunek
Cytat(wookieb @ 29.10.2009, 23:17:35 ) *
Linia 1233

dzięki

znalazłem już następny błąd
link na przykładzie
http://www.1980-games.com/us/old-games/nin...3;/big-game.php
po !/ przestaje być linkiem

Edit:
przy autolinkowaniu nie działają także linki typu
http://www.radareklamy.org/uchwala,163.html
ucina przy przecinku
wookieb
Wielkie dzięki smile.gif
Przyznam, że wyrażenie skądś kopiowałem i przyznam, że nie ma to jednak jak zrobić coś samemu smile.gif

Poprawki:
Url.php (98)
DataValidator.class.php (141)

Oczywiście + za doraźną pomoc smile.gif
Zdunek
Cytat(wookieb @ 5.11.2009, 23:21:38 ) *
Wielkie dzięki smile.gif
Przyznam, że wyrażenie skądś kopiowałem i przyznam, że nie ma to jednak jak zrobić coś samemu smile.gif
Oczywiście + za doraźną pomoc smile.gif

To ja dziękuję za parser winksmiley.jpg

mam jeszcze pytanko, jak zrobić by zajawka była bez znaczników bb ale by ten kod nie miał także htmla, tz. był tylko bez bbcode ?

Edit:
chyba jednak ciągle jest błąd
http://www.radareklamy.org/uchwala,163.html + tekst
wywala takie coś
";/null"

biggrin.gif
wookieb
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ś smile.gif

Cytat
mam jeszcze pytanko, jak zrobić by zajawka była bez znaczników bb ale by ten kod nie miał także htmla, tz. był tylko bez bbcode ?

Chodzi ci o sam czysty tekst? Jeżeli tak to aktualnie nie brałem takiej opcje pod uwagę (a może faktycznie się przydać). Aczkolwiek możesz to uczynić trochę okrężną drogą. Pobrać zajawkę i wywalić z niej html, pomyślę nad tym.
Zdunek
Cytat(wookieb @ 7.11.2009, 15:05:56 ) *
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ś smile.gif

Jednak moja wina biggrin.gif patrzałem na zły wpis ;]

Cytat
Chodzi ci o sam czysty tekst? Jeżeli tak to aktualnie nie brałem takiej opcje pod uwagę (a może faktycznie się przydać). Aczkolwiek możesz to uczynić trochę okrężną drogą. Pobrać zajawkę i wywalić z niej html, pomyślę nad tym.

tak czysty tekst
daję na przykładzie
http://wklejasz.pl/user/zobacz/Zdunek
o wiele lepiej by było gdyby znaczniki poznikały, ew by b i u zmieniły się w html a cała reszta by zniknęła(głównie obrazki, filmiki YT itp.) z wiadomych powodów smile.gif
wookieb
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

Kod
$bbcode = new BbCode();
$text = '[i]Tekst[/i] [b]do skrócenia[/b] [img]Adres obrazka[/img] Dodatkowy tekst[/i]';
$bbcode->getSettings()->availableTags = array('i', 'img'); //img jest konieczny aby parser wiedział, żeby go NIE pokazywać przy cutText
$bbcode->parse($text);
echo $bbcode->cutText(20);
// mniej więcej coś takiego [i]Tekst[/i] do skrócenia ...


Zmiany w plikach
Image.php (dodana opcja)
Youtube.php (dodana opcja)
BbCode.class.php (Zmiany w metodach _createNode, _filtersParseBody, cutText)
BbCodeSettings.class.php (poprawiono komentarze, dodano opcję removeNotAvailableTags)
Zdunek
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ć biggrin.gif

Edit:
Próbowałem tak łopatologicznie wstawić

ale tak jak ktoś wcześniej pisał, wywala jakby ktoś przeleciał htmlspecialchars...
funkcja:
  1. public function parseCode($tag, $openNode, $body, $closeNode)
  2. {
  3. $source = $body[0]['text'];
  4. $language = 'php';
  5. $path = 'geshi/';
  6.  
  7. $geshi = new GeSHi($source, $language, $path);
  8. $body[0]['text'] = htmlspecialchars_decode($geshi->parseCode());
  9.  
  10. // tutaj mozemy dodać geshi czy to tez sie podoba
  11. $openNode['text'].='<div class="code_title">Kod</div><pre class="prettyprint">';
  12. $closeNode['text']='</pre>'.$closeNode['text'];
  13.  
  14. }
wookieb
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.
  1. $body[0]['text'] =$geshi->parseCode();
  2. $body[0]['nohtmlspecialchars'] = 1;

Zdunek
Cytat(wookieb @ 24.11.2009, 21:05:29 ) *
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.
  1. $body[0]['text'] =$geshi->parseCode();
  2. $body[0]['nohtmlspecialchars'] = 1;

wrzuciłem to, niestety nie zadziałało
wookieb
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 )
Zdunek
mam jeszcze jedno pytanko,
w jaki sposób zrobić obsługę na zasadzie
będzie
  1. [code lang='php']jakiś skrypt php[/code]
  2. [code lang='java'] jakiś skrypt java[/code]

i by do geshi podawało ten atrybut lang ? próbowałem się wzorować na Url ale niestety nic mi z tego nie wyszło
wookieb
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)
  1. public $tags=array(
  2. 'code'=>array(
  3. 'open'=>'div class="code_wrapper"',
  4. 'close'=>'div',
  5. 'notallowed_child'=>'all',
  6. 'leave_notallowed_child'=>1,
  7. 'leave_notallowed_parent'=>1,
  8. 'parse_body'=>'parseCode',
  9. 'attributes'=>array(
  10. 'lang'=>array(
  11. 'type'=>'string',
  12. 'values'=>array('php', 'js')
  13. )
  14. )
  15. )
  16. );


Atrybut jaki posiada tag jest w tagu otwierającym
  1. public function parseCode($tag, &$openNode, &$body, &$closeNode)
  2. {
  3. $language = 'default';
  4. if(isset($openNode['attributes']['tag_attributes']['lang']))
  5. {
  6. $language = $openNode['attributes']['tag_attributes']['lang'];
  7. }
  8.  
  9. // dalszy kod
  10. }


Druga lepsza opcja to utworzenie taga dla każdego języka
  1.  
  2. public $tags=array(
  3. 'php'=>array(
  4. 'open'=>'div class="code_wrapper"',
  5. 'close'=>'div',
  6. 'notallowed_child'=>'all',
  7. 'leave_notallowed_child'=>1,
  8. 'leave_notallowed_parent'=>1,
  9. 'parse_body'=>'parsePHP'
  10. ),
  11. 'code'=>array(
  12. 'open'=>'div class="code_wrapper"',
  13. 'close'=>'div',
  14. 'notallowed_child'=>'all',
  15. 'leave_notallowed_child'=>1,
  16. 'leave_notallowed_parent'=>1,
  17. 'parse_body'=>'parseCode'
  18. )
  19. );
  20.  
  21. public function parserPhp($tag, &$openNode, &$body, &$closeNode)
  22. {
  23. $language = 'php';
  24. $this->parseCode($tag, $openNode, $body, $closeNode, 'php');
  25. }
  26.  
  27.  
  28. public function parseCode($tag, &$openNode, &$body, &$closeNode, $language = 'default')
  29. {
  30. // laczymy tresc w całość
  31.  
  32. $content = '';
  33. foreach($body as $key => &$node)
  34. {
  35. $content.= $node['text'];
  36. $node['text'] = '';
  37.  
  38. // usuwamy zbedne elementy
  39. if($key!=0) unset($body[$key]);
  40. }
  41.  
  42. require_once 'class.geshi.php';
  43.  
  44.  
  45. $geshi = new GeSHi($content, $language);
  46. $body[0]['tagText'] = $content;
  47. $body[0]['text'] = $geshi->parseCode();
  48. $body[0]['nohtmlspecialchars'] = 1;
  49.  
  50. $openNode['text'].='<div class="code_title">Kod</div><div class="code_area">';
  51. $closeNode['text']='</div>'.$closeNode['text'];
  52. }

Wybór należy do Ciebie.
Zdunek
Cytat
public function parsePhp($tag, &$openNode, &$body, &$closeNode)
{
$language = 'php';
$this->parseCode($tag, $openNode, $body, $closeNode, 'php');
}


jakby ktoś kiedyś przeglądał, powyżej była literówka smile.gif

a idzie zrobić tak aby dodawać tylko
  1. 'c'=>array(
  2. 'open'=>'div class="code_wrapper"',
  3. 'close'=>'div',
  4. 'notallowed_child'=>'all',
  5. 'leave_notallowed_child'=>1,
  6. 'leave_notallowed_parent'=>1,
  7. 'parse_body'=>'parseC'
  8. ),

a była jedna funkcja parsująca to? zaoszczędziło by to sporo czasu i ułatwiło całość
wookieb
Możesz. Przejrzyj zmienna $tag jaka dostajesz do funkcji i kombinuj smile.gif
Zdunek
dzięki, udało się podczepić

chyba znalazłem następny błąd biggrin.gif

f(x) \xrightarrow{T_{[1,5]}}g(x)
zmienia się w
f(x) \xrightarrow{T_{}}g(x)
wookieb
Nie jest to błąd tylko ustawienie.
BbCodeSettings->removeNotAvailableTags
ustaw na false
Zdunek
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
wookieb
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
Borys_
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ć?
wookieb
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

  1. public $tags=array(
  2. 'list'=>array(
  3. 'open'=>'ul',
  4. 'close'=>'ul',
  5. 'wrap_white_space'=>true,
  6. 'allowed_child'=>array('li'),
  7. 'notallowed_parent'=>array('list'),
  8. 'parse_body'=>'parseList'
  9. ),
  10. '*'=>array(
  11. 'open'=>'li',
  12. 'close'=>false,
  13. 'allowed_parent'=>array('list')
  14. )
  15. );


Co dalej?
Piszesz kod obsługi listy parseList do której dostajesz następujące argumenty
$tag - tablica informacji o tagu ( w naszym przypadku o tagu list)
&$openNode - tag otwierajacy
&$body - zawartosc pomiedzy tagami list
&$closeNode - tag zamykajacy
$settings - ustawienia parsera

Na podstawie tablicy body wiesz co wpisał użytkownik. Przejrzyj ją a będziesz już wiedział co dalej z tym zrobić smile.gif
tog
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 biggrin.gif
nie wazne...
Zdunek
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
wookieb
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 )
Zdunek
http://wklejasz.pl/t.txt (plik kodowany w utf-8)
i jak wrzuciłem zamiast > odpowiednik w kodzie, to nie ucięło tekstu
wookieb
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.
Kamil Pietrzak
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
Crozin
1) Element B istnieje w XHTMLu
2) Dalece bardziej poprawnym jest użycie
Kod
<b>test</b>
, niż
Kod
<span style="font-wieght: bold">test</span>
.
3) Co ma ilość plików do samego parsera?

(Samego parsera nie oceniam, bo nigdy go nawet na oczy nie widziałem).
wookieb
Cytat(Kamil Pietrzak @ 30.01.2010, 13:49:36 ) *
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

To napisz. Ocenimy. Stwórz konkurencję to będziemy gadać.
A sprawdź czy
Kod
<span style="weight: bold"></span>

jest NIE poprawne a dopiero potem gadaj.

Jeżeli piszesz cmsa na 10 plikach to dobrze, ciesz się ale jeżeli nie znasz się na wydajnym organizowaniu struktury plików, obiektów i celu dla jakiego to zorganizowałem (a z tego co widzę to nie znasz się) to się nie wypowiadaj, albo jak już zapytaj. Rozumiem opinie negatywne ale ta jest zupełnie bezpodstawna. Dodatkowo zadziwię cię. Możesz zmienić męczący cię kod na B, I, U, LI. BA! Nawet możesz sobie zamienić na "MOJ_TAG_POGRUBIENIA_KTOREGO_UZYWAM_W_XML_A_NASTEPNIE_TRANSFORMUJE_ZA_POMOCA
_XSLT".

Cytat(Crozin @ 30.01.2010, 14:45:42 ) *
1) Element B istnieje w XHTMLu
2) Dalece bardziej poprawnym jest użycie
Kod
<b>test</b>
, niż
Kod
<span style="font-weight: bold">test</span>


http://webdesign.about.com/od/htmltags/p/bltags_b.htm

Cytat
If you can't use the <strong> element, then you should consider using the CSS font-weight property.


Sprawdźcie czy jest poprawne
  1. <!DOCTYPE html
  2. PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  3. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  4. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pl" lang="pl">
  5. <meta http-equiv="Content-type" content="application/xhtml+xml; charset=iso-8859-2" />
  6. <title>Tytuł</title>
  7. <link rel="stylesheet" href=" [nazwa_arkusza_stylow.css] " type="text/css" />
  8. </head>
  9. <p>
  10. <span style="font-weight: bold">pogrubiony tekst</span>
  11. </p>
  12.  
  13. </body>
  14. </html>
  15.  

Semantycznie nie jest, aczkolwiek validator kod przepuszcza.
Kamil Pietrzak
jestem za bardzo pro zeby pisac byle BB biggrin.gif
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
GyniO
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?
wookieb
Oczywiście, że jest i oczywiście, że wszystko jest opisane w readme
kallosz
Cytat(GyniO @ 14.02.2010, 09:39:29 ) *
Czy istnieje możliwość do pisania w
Kod
<a href="http://" target="_blank"></a>
wartości title, a w obrazkach alt??

Zależało by mi na tym, jest to możliwe?

wystarczy przeczytać readme <- sama nazwa pliku mówi żeby przeczytać ;]

Poza tym jak przejrzysz kod klasy to również możesz twierdzić czy idzie dopisać
GyniO
No fakt, za readme wziąłem inny plik i stąd moja niewiedza.

Już sobie z tym poradziłem.
Dzięki.
lobopol
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:
  1. Warning: include_once(Bbcode/Filters/Basic.php) [function.include-once]: failed to open stream: No such file or directory in C:\xampp\htdocs\smarty\class\Bbcode\BbCode.class.php on line 264
  2.  
  3. 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
  4.  
  5. Notice: filter not exists in C:\xampp\htdocs\smarty\class\Bbcode\BbCode.class.php on line 268
  6.  
  7. Warning: include_once(Bbcode/Filters/Code.php) [function.include-once]: failed to open stream: No such file or directory in C:\xampp\htdocs\smarty\class\Bbcode\BbCode.class.php on line 264
  8.  
  9. 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
  10.  
  11. Notice: filter not exists in C:\xampp\htdocs\smarty\class\Bbcode\BbCode.class.php on line 268
  12.  
  13. Warning: include_once(Bbcode/Filters/Url.php) [function.include-once]: failed to open stream: No such file or directory in C:\xampp\htdocs\smarty\class\Bbcode\BbCode.class.php on line 264
  14.  
  15. 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
  16.  
  17. Notice: filter not exists in C:\xampp\htdocs\smarty\class\Bbcode\BbCode.class.php on line 268
  18.  
  19. Warning: include_once(Bbcode/Filters/List.php) [function.include-once]: failed to open stream: No such file or directory in C:\xampp\htdocs\smarty\class\Bbcode\BbCode.class.php on line 264
  20.  
  21. 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
  22.  
  23. Notice: filter not exists in C:\xampp\htdocs\smarty\class\Bbcode\BbCode.class.php on line 268
  24.  
  25. Warning: include_once(Bbcode/Filters/Image.php) [function.include-once]: failed to open stream: No such file or directory in C:\xampp\htdocs\smarty\class\Bbcode\BbCode.class.php on line 264
  26.  
  27. 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
  28.  
  29. Notice: filter not exists in C:\xampp\htdocs\smarty\class\Bbcode\BbCode.class.php on line 268
  30.  
  31. Warning: include_once(Bbcode/Filters/Youtube.php) [function.include-once]: failed to open stream: No such file or directory in C:\xampp\htdocs\smarty\class\Bbcode\BbCode.class.php on line 264
  32.  
  33. 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

Ale gdy wrzucę index.php do katalogu class wszystko działa, co robię źle?

Ps. dołączenie innego pliku z katalogu bbcode np. include_once 'class/Bbcode/asd.php'; działa dobrze, chmody są ustawione na 777 i nie ma żadnych dodatkowych zabezpieczeń
wookieb
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/'
lobopol
Wielkie dzięki już wszystko dobrze działa.
kenobi13
Zauważyłem drobny błąd chyba.
W linijce 51 w pliku youtube.php jest:
  1. $idMovie = htmlspecialchars($str);

a powinno być:
  1. $idMovie = htmlspecialchars($bodyStr);


Czemu jak mam tag CODE to cdy dam do środka kolejny taki tak pokauje mi się okienko na kod i w nim drugie?
LapKom
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.
Kod
[list=1]
[*] pozycja 1
[*] pozycja 2
[*] pozycja 3
[/list]

Listę otwiera tag list, domyślnie jest to ul, ale jeśli podamy parametr w postaci liczby, to zamienia sie w ol i rozpoczyna odliczanie od podanej liczby. Każda pozycja w liście to tag *. Bardzo często spotyka się listy własnie w takim formacie BBCode.
wookieb
Cytat(kenobi13 @ 17.03.2010, 18:24:53 ) *
Zauważyłem drobny błąd chyba.
W linijce 51 w pliku youtube.php jest:
  1. $idMovie = htmlspecialchars($str);

a powinno być:
  1. $idMovie = htmlspecialchars($bodyStr);

Faktycznie zgadza się. Niedługo to poprawię.
Cytat(kenobi13 @ 17.03.2010, 18:24:53 ) *
Czemu jak mam tag CODE to cdy dam do środka kolejny taki tak pokauje mi się okienko na kod i w nim drugie?

Takie było założenie. Narazie je zostawiam w takiej formie, dopóki dokładniej tego nie przemyślę.


Cytat
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.

Posługiwałem się "standardem" z http://bbcode.org/reference.php
Aczkolwiek, nie ma problemu by sobie napisać tak działającą listę. Odpowiednie zaprogramowanie funkcji parsującej listę i jest.
LapKom
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ć:
Kod
$body[0]['text'] = preg_replace('/\[\*\](.*)/i','<li>$1</li>',$body[0]['text']);

Niestety po utworzeniu wynikowego html, po var_dump() dostaję wynik przepuszczony przez htmlspecialchars(). Nie mogłem namierzyć, gdzie się to filtrowanie odbywa. Można to w przypadku takiego taga wyłączyć? Może istnieje jakiś natywny sposób na parsowanie elementów listy w takim formacie?


Dodatkowo do basic filtra proponuję dołączyć tagi [ left], [ center] i [ right] do wyrównania tekstu. Sam sobie dopisałem i są przydatne. smile.gif
wookieb
Cytat(kenobi13 @ 17.03.2010, 18:24:53 ) *
Czemu jak mam tag CODE to cdy dam do środka kolejny taki tak pokauje mi się okienko na kod i w nim drugie?

A jednak duża ilość opcji się przydaje smile.gif
Wystarczy, że do taga code dodasz podane ustawienia:
  1. 'notallowed_parent'=>array('code'), // uniemozliwia osadzenie code
  2. 'leave_notallowed_parent'=>true // ale samo istnienie tegoż taga pozostawia w tekście



Co do "gwiazdkowej" listy smile.gif
Mała pomoc:
  1.  
  2. public $tags=array(
  3. 'list'=>array(
  4. 'open'=>'ul',
  5. 'close'=>'ul',
  6. 'wrap_white_space'=>true,
  7. 'allowed_child'=>array('*'),
  8. 'notallowed_parent'=>array('list'),
  9. 'parse_body'=>'parseList'
  10. ),
  11. '*'=>array(
  12. 'open'=>'li',
  13. 'close'=>false
  14. )
  15. );

Odprogramuj tylko metodę parseList.
Przejrzyj zawartość tagu otwierającego i możesz przykładowo spojrzeć na filtr Image, która pokazuje co można zrobić z tagiem/mi.
LapKom
  1. <?php
  2.  
  3. /**
  4.  * Obsługa list (popularna na forach)
  5.  * @package Parser
  6.  * @subpackage Filters
  7.  * @author LapKom
  8.  * @version 0.1
  9.  */
  10. class BbCodeFilterList
  11. {
  12. public $tags=array(
  13. 'list'=>array(
  14. 'open'=>'ul',
  15. 'close'=>'ul',
  16. 'wrap_white_space'=>true,
  17. 'allowed_child'=>array('*','l'),
  18. 'notallowed_parent'=>array('list'),
  19. 'parse_body'=>'parseList',
  20. 'attributes'=>array(
  21. 'list'=>array(
  22. 'attr'=>'style',
  23. 'type'=>'string',
  24. 'values'=>array(
  25. '1',
  26. '01',
  27. 'a',
  28. 'A',
  29. 'i',
  30. 'I',
  31. ),
  32. ),
  33. ),
  34. ),
  35. '*'=>array(
  36. 'open'=>'li',
  37. 'close'=>false,
  38. 'allowed_parent'=>array('list'),
  39. ),
  40. );
  41.  
  42. /**
  43. * Parsuje LISTY
  44. * @param array $tag
  45. * @param array $openNode
  46. * @param array $body
  47. * @param array $closeNode
  48. * @param BbCodeSettings $settings
  49. */
  50. public function parseList($tag, &$openNode, &$body, &$closeNode, $settings)
  51. {
  52. if(isset($openNode['attributes']['tag_attributes']['list'])) {
  53. $listStyleType = $openNode['attributes']['tag_attributes']['list'];
  54. switch ($listStyleType) {
  55. case '1' : $type = 'decimal'; break;
  56. case '01' : $type = 'decimal-leading-zero'; break;
  57. case 'a' : $type = 'lower-alpha'; break;
  58. case 'A' : $type = 'upper-alpha'; break;
  59. case 'i' : $type = 'lower-roman'; break;
  60. case 'I' : $type = 'upper-roman'; break;
  61. }
  62. $listStyleType = $openNode['attributes']['tag_attributes']['list'] = 'list-style-type:'.$type;
  63. $openNode=BbCode::rebuildNode($tag, $openNode, $settings);
  64. $openNode['text'] = str_replace('ul','ol',$openNode['text']);
  65. $closeNode['text'] = str_replace('ul','ol',$closeNode['text']);
  66. }
  67. }
  68. }
  69.  
  70. ?>

Na szybko napisałem taki filtr, ale gwiazdki z nic nie mogę zmusić do współpracy. sad.gif Gdy zamiast * podam cokolwiek innego w nazwie taga, parser działa bez problemów np.:
  1. 'l'=>array(
  2. 'open'=>'li',
  3. 'close'=>false,
  4. 'allowed_parent'=>array('list'),
  5. )

W przypadku gwiazdki tag nie jest w ogóle parsowany i dostaje go surowej postaci. Czy ja coś źle ustawiam, że dla 'l' dziala, a dla '*' nie, czy to może jakiś bug parsera? Jeszcze muszę dopisać samo przetwarzanie takich tagów, bo według tego co napisałeś generowany html jest w postaci '<li/> Jakiś tekst', a parser traktuje samodomknięty tag i tekst jako 2 osobne pola w tablicy elementów. Dla kodu:
  1. foreach($body as &$el) {
  2. var_dump($el);
  3. }

Dostaję wynik w postaci:
  1. 'type' => int 0
  2. 'text' => string '
  3.  
  4. ' (length=4)
  5. 'nobr' => int 1
  6.  
  7. 'type' => int 3
  8. 'original_text' => string '[l]' (length=3)
  9. 'tagname' => string 'l' (length=1)
  10. 'tagText' => string '[l]' (length=3)
  11. 'text' => string '<li/>' (length=5)
  12.  
  13. 'type' => int 0
  14. 'text' => string ' Element listy
  15.  
  16. ' (length=18)
  17. 'nobr' => int 1
  18.  
  19. 'type' => int 3
  20. 'original_text' => string '[l]' (length=3)
  21. 'tagname' => string 'l' (length=1)
  22. 'tagText' => string '[l]' (length=3)
  23. 'text' => string '<li/>' (length=5)
  24.  
  25. 'type' => int 0
  26. 'text' => string ' Element listy 2
  27.  
  28. ' (length=19)
  29. 'nobr' => int 1

Jakaś wskazówka na skutecznego fixa? smile.gif
wookieb
Ściągnij parser i skopiuj plik BbCode.class.php . Wczoraj to zrobiłem, poniewaz faktycznie parser blokował tego typu tagi.
GyniO
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:
Cytat
[ul]
[li]Internet Explorer,[/li]
[li]Firefox,[/li]
[li]Google Chrome 4.0,[/li]
[li]Safari 3.0.[/li]
[/ul]


W chwili obecnej OPT się wysypuje:
  1. <p>
  2. tresc
  3. <ul>
  4. <li>Internet Explorer,</li>
  5. <li>Firefox 3.0,</li>...</li>
  6. </ul>
  7. </p>
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.