GeSHI - Beautifier le code source
Publi� le 22 septembre 2006
Cr�� le 27 octobre 2005

GeSHI a été créé à la base pour phpBB. C'est un projet PHP dont l'objectif est de coloriser un code source de programme pour le rendre plus lisible à l'écran. Efficace !

SPIP propose une contrib pour avoir cette fonctionnalité dans un site SPIP.

Le problème de cette contrib est son utilisation de la fonction PHP highlight_string() qui exige l'introduction des balises <?php ... ?> . De plus le code était inséré en mode <div> alors je l'ai mis en <span> pour que le code puisse s'afficher dans la ligne courante. Il faut remplacer la portion de code suivante dans le code de mortimer :


<?php
//de mortimer le 7/12/4
//modifié par balluche le 5/11/5
//modifié par balluche le 21/10/6 pour gérer PHP5
//modifié par balluche le 21/3/8
function apres_colorer_code($texte) {
   global 
$code_a_colorer;

   
//on remplace toutes les balises qu'on a insérées par le code coloré.
   
while (ereg('<@@colorercode_([0-9]+)@@>'$texte$regs)) {
      
//on récupère l'indexe du code dans le tableau.
      
$lenum $regs[1];
      if (
strpos($code_a_colorer[$lenum], '<?php') === FALSE)
      {
          
//si la cha&icirc;ne ne contient pas <?php, on l'ajoute pour que highlight_string fonctionne
          
$lecode highlight_string("<?php ".$code_a_colorer[$lenum]." ?>",true);
            
//$s = htmlspecialchars($lecode);
          //on enl&egrave;ve les caract&egrave;res inutiles
          
$lecode preg_replace('@<code><font color="#000000">.+<font color="#0000..">&lt;\?php&nbsp;@si''<font color="#000000">'$lecode);
          
$lecode preg_replace('@<code><font color="#000000">.+<font color="#007700">&lt;\?</font><font color="#0000..">php&nbsp;@si''<font color="#000000">'$lecode);
          
$lecode preg_replace("@<font color=\"#0000..\">\?&gt;</font>\n</font>\n<\/code >@si"""$lecode);
           
$lecode str_replace("&nbsp;?&gt;</font>""</font>"$lecode);
          
//les &nbsp; emp&ecirc;chent le retour &agrave; la ligne. Je laisse ceux en d&eacute;but de ligne pour conserver la tabulation
          
$lecode str_replace('&nbsp;&nbsp;''@nbsp;@nbsp;'$lecode);
          
$lecode str_replace('&nbsp;'' '$lecode);
          
$lecode str_replace('@nbsp;@nbsp;''&nbsp;&nbsp;'$lecode);

       }
       else
       {
          
//on enlève les balises que highlight a ajouté
          
$lecode highlight_string($code_a_colorer[$lenum],true);
          
$lecode preg_replace("/(<code>|<\/code>)/","",$lecode);
       }

      
$pos strpos($texte$regs[0]);

      
//on insère une nouvelle balise avec un style css.
      
$texte substr($texte0$pos).
                    
"<tt><span class='spip_ccode' dir='ltr'>"
                    
$lecode .
                    
"</span></tt>"
                   
substr($texte$pos strlen($regs[0]));
   }
   
//on corrige les balises d'échappement de spip qui ont été transformée par highlight.
   
$find "/&lt;@@SPIP_(SOURCEPROPRE|SOURCETYPO)([0-9]+)@@&gt;/";
   
$replace "<@@SPIP_\\1\\2@@>";
   
$texte preg_replace($find,$replace,$texte);

   return 
$texte;
}
?>



La suite sur le site de qbnz.com

Forum de l'article

# 69 GeSHI - Beautifier le code source 5 novembre 2005, par Mortimer

Je n'ai pas compris ce que tu as changé dans ce code ? à part le span, tu appelles toujours highlight_string, alors que la contrib originale utilise beautifier pour faire la coloration des sources de tout type.

Mais geshi a l'air plutôt sympa, il y a un peu moins de langages supporté que beautifier, mais il a l'air meiux fait.

# 70 GeSHI - Beautifier le code source 5 novembre 2005, par Frédéric
L'inconvénient de highlight_string est qu'il ne fonctionne que sur du code PHP, càd, avec un <?php ... ?> obligatoirement présent comme il se doit. Je souhaitais pouvoir l'utiliser sur n'importe quel langage [1]. Alors tout ce que je fais, c'est de virer le <?php ... ?> . Ainsi je peux l'appliquer à n'importe quoi.
# 94 GeSHI - Beautifier le code source 22 février 2006, par Frédéric
En fait mon objectif est de pouvoir utiliser la coloration pour autre chose que du PHP. La fonction highlight_string de PHP exige d'introduire les balises <?php ?>. Tout ce que je fais, c'est de les enlever.
Poster un message

[1] C'est toujours utile de coloriser du code HTML par exemple