Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

12 Stron V  « < 2 3 4 5 6 > »   
Reply to this topicStart new topic
> [klasa] Zaawansowany parser bbcode (php5), advanced bbcode parser
Zdunek
post 7.11.2009, 15:13:36
Post #61





Grupa: Zarejestrowani
Postów: 57
Pomógł: 2
Dołączył: 29.08.2008

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
wookieb
post 8.11.2009, 15:44:10
Post #62





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




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)


--------------------
Go to the top of the page
+Quote Post
Zdunek
post 24.11.2009, 17:42:05
Post #63





Grupa: Zarejestrowani
Postów: 57
Pomógł: 2
Dołączył: 29.08.2008

Ostrzeżenie: (0%)
-----


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


Ten post edytował Zdunek 24.11.2009, 17:42:34
Go to the top of the page
+Quote Post
wookieb
post 24.11.2009, 21:05:29
Post #64





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




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;



--------------------
Go to the top of the page
+Quote Post
Zdunek
post 24.11.2009, 21:24:48
Post #65





Grupa: Zarejestrowani
Postów: 57
Pomógł: 2
Dołączył: 29.08.2008

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
wookieb
post 24.11.2009, 23:25:45
Post #66





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




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 )


--------------------
Go to the top of the page
+Quote Post
Zdunek
post 25.11.2009, 20:06:57
Post #67





Grupa: Zarejestrowani
Postów: 57
Pomógł: 2
Dołączył: 29.08.2008

Ostrzeżenie: (0%)
-----


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

Ten post edytował Zdunek 25.11.2009, 20:07:36
Go to the top of the page
+Quote Post
wookieb
post 25.11.2009, 21:06:06
Post #68





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




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.


--------------------
Go to the top of the page
+Quote Post
Zdunek
post 25.11.2009, 22:54:30
Post #69





Grupa: Zarejestrowani
Postów: 57
Pomógł: 2
Dołączył: 29.08.2008

Ostrzeżenie: (0%)
-----


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ść

Ten post edytował Zdunek 25.11.2009, 23:16:45
Go to the top of the page
+Quote Post
wookieb
post 26.11.2009, 00:35:53
Post #70





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Możesz. Przejrzyj zmienna $tag jaka dostajesz do funkcji i kombinuj smile.gif


--------------------
Go to the top of the page
+Quote Post
Zdunek
post 26.11.2009, 16:09:44
Post #71





Grupa: Zarejestrowani
Postów: 57
Pomógł: 2
Dołączył: 29.08.2008

Ostrzeżenie: (0%)
-----


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)
Go to the top of the page
+Quote Post
wookieb
post 26.11.2009, 16:42:18
Post #72





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Nie jest to błąd tylko ustawienie.
BbCodeSettings->removeNotAvailableTags
ustaw na false


--------------------
Go to the top of the page
+Quote Post
Zdunek
post 26.11.2009, 18:46:03
Post #73





Grupa: Zarejestrowani
Postów: 57
Pomógł: 2
Dołączył: 29.08.2008

Ostrzeżenie: (0%)
-----


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

Ten post edytował Zdunek 26.11.2009, 21:06:33
Go to the top of the page
+Quote Post
wookieb
post 28.11.2009, 19:56:24
Post #74





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




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


--------------------
Go to the top of the page
+Quote Post
Borys_
post 1.12.2009, 02:48:47
Post #75





Grupa: Zarejestrowani
Postów: 1
Pomógł: 0
Dołączył: 1.12.2009

Ostrzeżenie: (0%)
-----


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ć?
Go to the top of the page
+Quote Post
wookieb
post 2.12.2009, 11:14:08
Post #76





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




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


--------------------
Go to the top of the page
+Quote Post
tog
post 4.01.2010, 20:18:43
Post #77





Grupa: Zarejestrowani
Postów: 93
Pomógł: 4
Dołączył: 1.12.2009
Skąd: lublin

Ostrzeżenie: (0%)
-----


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

Ten post edytował tog 4.01.2010, 20:20:06
Go to the top of the page
+Quote Post
Zdunek
post 11.01.2010, 14:04:44
Post #78





Grupa: Zarejestrowani
Postów: 57
Pomógł: 2
Dołączył: 29.08.2008

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
wookieb
post 12.01.2010, 10:26:09
Post #79





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




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 )


--------------------
Go to the top of the page
+Quote Post
Zdunek
post 12.01.2010, 20:31:33
Post #80





Grupa: Zarejestrowani
Postów: 57
Pomógł: 2
Dołączył: 29.08.2008

Ostrzeżenie: (0%)
-----


http://wklejasz.pl/t.txt (plik kodowany w utf-8)
i jak wrzuciłem zamiast > odpowiednik w kodzie, to nie ucięło tekstu
Go to the top of the page
+Quote Post

12 Stron V  « < 2 3 4 5 6 > » 
Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 10.06.2024 - 07:35