TD : Intégrer GeSHi dans un BBCode

Bonjour à tous !

A travers ce petit exercice, je vous propose d’intégrer le célèbre colorateur syntaxique GeSHi dans votre BBCode (ou autre, Zcode par exemple).

Le fonctionnement de GeSHi :

Tout d’abord, si ce n’est pas déjà fait, téléchargez GeSHi et uploadez-le sur votre FTP, dans un dossier à part, pour plus de clarté :D
Pour l’utiliser, voici comment procéder :

include_once('geshi/geshi.php'); // Remplacez geshi par votre dossier.
$code = ""; // Code à colorer
$langage = 'php'; // Langage à utiliser pour colorer le code
$geshi = new GeSHi($code, $langage); // Création de l'objet GeSHi
echo $geshi->parse_code(); // Affichage du code coloré via la méthode parse_code de l'objet GeSHi
?>

Consignes et contraintes :

- Pour insérer du code dans notre BBCode, nous taperons

Code

- A l’enregistrement de notre textarea dans la BDD, nous utiliserons mysql_escape_string pour nous protéger des inclusions MySql
- A l’affichage, nous récupérons le contenu de la table et nous sécuriserons son affichage

$contenu = stripslashes($contenu);
$contenu = htmlspecialchars($contenu);
echo bbcode($contenu); // Fonction comprenant nos diverses regex chargées de transformer notre BBCode en html

- Note : Avec GeSHi, pour colorer en html, le langage à saisir est html4strict, mais dans notre BBCode, nous taperons [ code=html]Code[/ code]. A vous de vous arranger  :)
- On affichera le nom du langage au-dessus du code coloré.

Correction :

Note : La correction ci-dessous n’est pas forcément la seule manière de procéder.

include_once('geshi/geshi.php');  // On inclus la bibliothèque GeSHi

function colore($matches) // Fonction faisant appel à GeSHi, prenant en paramétre les options souhaitées dans le preg_replace_callback
 {
 $languages_autorises = array("php", "html", "css", "javascript", "apache", "mysql"); // Tableau listant les langages autorisés

 if (in_array($matches[1], $languages_autorises)) { // Si le langage se trouve dans le tableau ci-dessus
 if ($matches[1] == "html") // Si le langage est html, nous le convertirons en html4strict et le langage affiché sera : html
 { $matches[1] = "html4strict"; $language = "html"; }
 else
 { $language = $matches[1]; } // Sinon le langage à afficher sera le nom du langage utilisé pour la coloration (il n'y a que html qui change)

 $geshi = new GeSHi(html_entity_decode(trim($matches[2])), $matches[1]); // Création de l'objet GeShi, on décode les caractéres que htmlspecialchars à fait et on supprime les espaces au début et fin de chaîne

 return 'Code '.strtoupper($language).'
'.$geshi->parse_code(); // On retourne le code coloré
 }

 else {// Si le langage de coloration souhaité ne se trouve pas dans le tableau
 return 'Code AUTRE
<pre>'.html_entity_decode(trim($matches[2])).'</pre>
'; // On n'affiche le code sans lui faire de traitement

 }
 }

function bbcode($cont) { // Fonction BBCode comprenant les regex pour parser notre texte
$cont = preg_replace_callback('`\\[code=(.*)\\](.*)\\[/code\\]`isU', 'colore', $cont); // Remplace en utilisant la fonction colore
//  Vos remplacements ici : par exemple [gras] [/gras] ...
$cont = trim($cont); // Suppresion des espaces en début et fin de chaîne
return $cont;
}

// Utilisation :
$contenu = stripslashes($contenu);
$contenu = htmlspecialchars($contenu);
echo bbcode($contenu);
?>

Et voilà :)

Bravo à ceux qui ont réussit à faire marcher GeSHi dans leur système de BBCode !

Note : La fonction bbcode ci-dessus reste entièrement sécurisée. Néanmoins, faites attention à vos remplacements et vos regex !
Note 2 : Suite au commentaire de Blogiwi, il est évident que vous pouvez tester directement si le langage fournis dans

[/code]

est un langage attendu en incluant directement la condition dans la regex.

 

Laissez une réponse