[ GDRCD 5.4 ] Aggiungere comandi/filtri BBCODE (functions.inc.php)
[ GDRCD 5.4 ] Aggiungere comandi/filtri BBCODE (functions.inc.php) postato il 29/04/2018 20:00:57 nel forum programmazione, open source e hosting
Buonasera a tutti, ultimamente mi sto scontrando con l'implementazione di un editor di testo (http://wysibb.com/) un po' grazioso per il progetto.
Funziona piuttosto bene ma ho notato che fra il codici BBCODE messi a disposizione da GDRCD mancano alcuni dei comandi che ho deciso di mantenere nell'editor, come la lista ordinata e la lista numerata.
Ora dal basso delle mie raffazzonate competenze, questo credo sia il codice in cui GDRCD 'traduce' il BBCODE in HTML (file: functions.inc.php):
/**
* BBcode nativo di GDRCD
* Secondo me, questo bbcode presenta non poche vulnerabilità.
* TODO Andrebbe aggiornata per essere più sicura
* @param string $str: la stringa con i bbcode da tradurre, dovrebbe già essere stata filtrata per l'output su pagina web
* @return $str con i tag bbcode tradotti in html
* @author Blancks
*/
function gdrcd_bbcoder($str){
global $MESSAGE;
$str=gdrcd_close_tags('quote',$str);
$search = array(
'#\n#',
'#\[BR\]#is',
'#\[B\](.+?)\[\/B\]#is',
'#\[i\](.+?)\[\/i\]#is',
'#\[U\](.+?)\[\/U\]#is',
'#\[center\](.+?)\[\/center\]#is',
'#\[img\](.+?)\[\/img\]#is',
'#\[redirect\](.+?)\[\/redirect\]#is',
'#\[url=(.+?)\](.+?)\[\/url\]#is',
'#\[color=(.+?)\](.+?)\[\/color\]#is',
'#\[quote(?::\w+)?\]#i',
'#\[quote=(?:"|"|\')?(.*?)["\']?(?:"|"|\')?\]#i',
'#\[/quote(?::\w+)?\]#si'
);
$replace = array(
'<br />',
'<br />',
'<span style="font-weight: bold;">$1</span>',
'<span style="font-style: italic;">$1</span>',
'<span style="border-bottom: 1px solid;">$1</span>',
'<div style="width:100%; text-align: center;">$1</div>',
'<img src="$1">',
'<meta http-equiv="Refresh" content="5;url=$1">',
'<a href="$1">$2</a>',
'<span style="color: $1;">$2</span>',
'<div class="bb-quote">'.$MESSAGE['interface']['forums']['link']['quote'].':<blockquote class="bb-quote-body">',
'<div class="bb-quote"><div class="bb-quote-name">$1 ha scritto:</div><blockquote class="bb-quote-body">',
'</blockquote></div>'
);
return preg_replace($search, $replace, $str);
}
Non avendo idea di cosa rappresenti la sintassi stregonesca della prima parte mi sono limitata a fare un infimo copia-incolla di questo genere, modificando i tag che mi interessano.
Nella prima parte:
'#\[list=(.+?)\](.+?)\[\/list\]#is',
'#\[*=(.+?)\](.+?)\[\/*\]#is',
Nella seconda parte:
'<ul>$1</ul>',
'<li>$1</li>',
Non ho avuto molto successo - purtroppo non mi è neanche chiarissimo cosa siano esattamente questi $1 e $2, ma sorvoliamo:


Se qualcuno ha mezza idea .. Sob.
Pagine → 1
29/04/2018 20:49:03
Quello in funcionts.inc.php è il bbcode nativo.
In config hai abilitato quello o il plugin bbdecoder? Nel secondo caso, devi andare nella cartella plugins > bbdecoder per trovare il file con la gestione dei vari tag.
Usando il bbdecoder io ho risolto saltando <ul> e trasformando direttamente [li] in <li>
Non so quanto sia corretto, ma mi funziona.
Per il nativo dovrebbe essere
'#\[li\](.+?)#is',
'<li>$1',
29/04/2018 21:17:44 e modificato da sadly-noob il 29/04/2018 21:28:35
[ COME NON DETTO .. ]
Evito di postare di nuovo - okéy, sono riuscita ad aggiungere l'elemento lista <li> in questo modo:
$bbtag = array(
array(
"\n",
'[hr]',
'[*b]~[/*b]',
'[*i]~[/*i]',
'[*u]~[/*u]',
'[*s]~[/*s]',
'[*center]~[/*center]',
'[right]~[/right]',
'[left]~[/left]',
'[*quote]~[/*quote]'
'[li]~[/li]'
),
array(
'<br />',
'<hr />',
'<strong>~</strong>',
'<em>~</em>',
'<ins>~</ins>',
'<del>~</del>',
'<p align="center">~</p>',
'<p align="right">~</p>',
'<p align="left">~</p>',
'<span class="quote">~</span>',
'<li>~</li>'
)
);
Ora purtroppo il mio editor utilizza invece il formato [*] per creare l'elemento <li>, forse è il fatto che * è un simbolo a creare qualche problema ..
Continuo comunque a provare, grazie mille!
________________________________
(prima parte ..)
Grazie Seralia! Ho il BBDECODER abilitato, quindi mi concentrerò su quello - ho individuato:
$bbcode = array(
"#\[color=($regexpColor)\](.*?(?!\[color).*?)\[/color\]#is"
=> "<span style=\"color:\\1\">\\4</span>",
"#\[bg=($regexpColor)\](.*?(?!\[bg).*?)\[/bg\]#is"
=> "<span style=\"background-color:\\1\">\\4</span>",
"#\[font=([a-z A-Z,]+)\](.*?(?!\[font).*?)\[/font\]#is"
=> "<span style=\"font-family:\\1\">\\2</span>",
"#\[size=([0-9]{1,2})\](.*?(?!\[size).*?)\[/size\]#is"
=> "<span style=\"font-size:\\1px\">\\2</span>",
"#\[url\]($regexpUrl)+\[/url\]#is"
=> "<a href=\"\\1\" target=\"_blank\" title=\"\\1\">\\1</a>",
"#\[mail\]($regexpMail)+\[/mail\]#is"
=> "<a href=\"mailto:\\1\" title=\"\\1\">\\2</a>"
);
E questa seconda parte:
function baseformat($str)
{
$bbtag = array(
array(
"\n",
'[hr]',
'[*b]~[/*b]',
'[*i]~[/*i]',
'[*u]~[/*u]',
'[*s]~[/*s]',
'[*center]~[/*center]',
'[right]~[/right]',
'[left]~[/left]',
'[*quote]~[/*quote]'
),
array(
'<br />',
'<hr />',
'<strong>~</strong>',
'<em>~</em>',
'<ins>~</ins>',
'<del>~</del>',
'<p align="center">~</p>',
'<p align="right">~</p>',
'<p align="left">~</p>',
'<span class="quote">~</span>'
)
);
(..)
Ora sulla seconda me la sono giocata con queste due aggiunte:
'[*]~[/*]'
),
(...)
'<li>~</li>'
)
Sulla prima invece mi trovo molto più al buio, sigh .. Ho provato a buttare giù un mezzo tentativo:
"#\[*\][/*\]#is" => "<li>\\1</li>",
Ma in output o non viene letto o addirittura invalida il resto del codice (viene perso anche il resto della formattazione). Con un po' di fortuna si tratta solo di un problema di sintassi?
29/04/2018 22:41:11
Non ti serve la prima parte, quella formatta colori, url ed altro di più complesso, con più attributi.
Ti dovrebbe bastare la seconda (che hai fatto per prima)
30/04/2018 08:48:44 e modificato da dyrr il 30/04/2018 08:49:34
Puoi usare entrambi i metodi, per quello che non ti riesce l'espressione regolare da usare è questa:
"#\[\*\](.+?)\[/\*\]#si" => "<li>\\1</li>"
Test: https://regex101.com/r/8ppbTU/2/ ↗
Su quel sito puoi testare le espressioni regolari quando le scrivi in maniera da poterle verificare facilmente.
Se mastichi l'inglese qui https://www.regular-expressions.info/reference.html ↗ trovi tutto quello che devi sapere sulla sintassi e altro delle regex.
Io uso quella come guida quando ho dei dubbi, mi spiace non sapertene indicare una fatta bene in italiano, ma se cerchi con espressioni regolari sicuramente con google trovi quella che fa più al caso tuo facilmente.
Il * è un carattere speciale per le regex per cui va messo l'escape prima \ per quello non ti andava.
Se ti dovesse capitare invece il problema opposto che hai dei bbcode presenti lato server ma non sull'editor puoi aggiungerli sull'editor come spiegato qui http://wysibb.com/docs/p1.html ↗
30/04/2018 09:54:18
dyrr ha scritto:
Il * è un carattere speciale per le regex per cui va messo l'escape prima \ per quello non ti andava.
Grazie Dyrr, non lo sapevo! 👍
30/04/2018 15:47:48
Grazie mille per le dritte Dyrr!
.. Non so se avrò il coraggio di avvicinarmi troppo alle espressioni regolari, sembrano abbastanza diaboliche.
Per il resto .. Dunque, non mi riesce di fargli gestire sia le liste ordinate che quelle numerate. Se ho una non viene letta l'altra, sigh.
Nell'editor (quasi) tutto viene visualizzato correttamente:
.. Poi però:
Il BBCODE di quel post è il seguente:
[list][*]Lista pallino
[/*][*]Lista pallino
[/*][*]Lista pallino
[/*][*]Lista pallino
[/*][*]Lista pallino [/*][/list]
[list=1][*]Lista Numerica
[/*][*]Lista Numerica
[/*][*]Lista Numerica
[/*][*]Lista Numerica
[/*][*]Lista Numerica[/*][/list]
Ed in bbdecoder.php dovrebbe esserci tutto (alla fine non ho aggiunto l'espressione regolare, già che le cose sembravano funzionare anche senza ..):

L'unica cosa che mi viene in mente è che adesso essendo le voci di lista ordinata che lista numerata utilizzate entrambe con il tag '[*]~[/*]' si venga a creare qualche tipo di conflitto.
Ho preso il file dell'editor jquery.wysibb.js per dare un'occhiata, per quanto terrificante - ho individuato questa parte:
bullist : {
title: CURLANG.bullist,
buttonHTML: '<span class="fonticon ve-tlb-list1">\uE009</span>',
excmd: 'insertUnorderedList',
transform : {
'<ul>{SELTEXT}</ul>':"[list]{SELTEXT}[/list]",
'<li>{SELTEXT}</li>':"[*]{SELTEXT}[/*]"
}
},
numlist : {
title: CURLANG.numlist,
buttonHTML: '<span class="fonticon ve-tlb-numlist1">\uE00a</span>',
excmd: 'insertOrderedList',
transform : {
'<ol>{SELTEXT}</ol>':"[list=1]{SELTEXT}[/list]",
'<li>{SELTEXT}</li>':"[*]{SELTEXT}[/*]"
}
},
Che dal basso delle mie inesistenti competenze in jquery, mi sembra sia la cosa più vicina ad un filtro. Ho provato con:
bullist : {
title: CURLANG.bullist,
buttonHTML: '<span class="fonticon ve-tlb-list1">\uE009</span>',
excmd: 'insertUnorderedList',
transform : {
'<ul>{SELTEXT}</ul>':"[list]{SELTEXT}[/list]",
'<li>{SELTEXT}</li>':"[**]{SELTEXT}[/**]"
}
},
E sul decoder ho inserito queste due cose:
'[**]~[/**]'
(...)
'<li>~</li>'
Ma nessun risultato - il problema è già presente sull'editor, che comunque inserisce [*] invece di [**] per la lista ordinata:

.. Alla brutta si vive anche solo con una delle due, mi faceva solo un po' innervosire come fatto. E ci sono un altro paio di questioni simili .. Magari potrei aprire un thread dedicato proprio a questo editor, che il titolo di questo ormai è un po' fuorviante.
Grazie comunque ragazzi per il supporto!
Discussione seguita da
Pagine → 1
Rispondi alla Discussione Segui Discussione Inoltra Discussione Forum Programmazione, Open Source e Hosting Elenco Forum
Articoli, Interviste e altre Risorse!
World of Warship ↗
Exclusive Villa GdR ↗
Project Entropy ↗
Storie di Agarthi ↗
World of the Sea Battle ↗
The Coven ↗
World of Tanks ↗