[PHP] Colorateur/Indentateur de code PHP

Bonjour à tous,

J'essaie de faire un colorateur/indentateur syntaxique de code PHP performant pour mon site ou pour autre chose.
Je l'ai pratiquement fini, mais j'ai quelques problèmes !

Voici tout d'abord le script qui je pense est assez mal codé, mais qui marche ! :D
Le script colore et indende le code.
(J'ai commenté le texte pour faciliter la lecture)

<style>
.code_php
{
font:8px
}
.cadre_php
{
border:1px dotted #444411;
margin-left:20px;
margin-right:20px;
margin-top:0px;
margin-bottom:20px;
padding:5px;
font-family: "Courier New", Courier, mono; font-size: 8pt;
background:#F0F0F0;
}
.titre_php
{
margin-left:20px;
margin-right:20px;
margin-top:20px;
margin-bottom:0px;
padding:5px;
font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10pt;
}
</style>
<h1>Essai du colorateur<h1>
<?php
if(!empty($_POST['code']))
{
    $code = nl2br($_POST['code']);
    // Fonction pour colorer le code php
    function colorateur_indentateur_php($kli) 
    {
        $kli[1] = str_replace("<br />", "", $kli[1]);
        // Coloration du code
        $kli[1] = highlight_string($kli[1], true);
        $kli[1] = str_replace(array('<font ', '</font>'), array('<span ', '</span>'), $kli[1]);
        $kli[1] = preg_replace('#color="(.*?)"#', 'style="color: \\1"', $kli[1]);
        // Découpage de la chaîne
        $morceaux = explode("<br />", $kli[1]);
        $morceau_num = array();
        // Variable de comptage
        $i = 1;
        // Création du code avec le numéro des lignes
        foreach($morceaux as $morceau)
        {
             if($i < 10) 
             {
                   $i = "0".$i;
              }
              if($i == 1)
              {
                    $morceau = str_replace("<code>", "", $morceau);
                    $morceau_num[] = "<code class=\"code_php\"><span style=\"color:#000000;\">$i|</span>  $morceau <br />";
              }
              else
              {
                    $morceau_num[] = "<span style=\"color:#000000;\">$i|</span>  $morceau <br />";
               }
               $i++;
         }
         // Reconstitution de la chaîne
         $code = implode($morceau_num);
                
         // Fonction pour indenter le code
         function indentateur_php($kli)
         {
                // Découpe la chaîne
               $morceaux = explode("<br />", $kli[1]);
               $morceau_num = array();
               // Variables de comptage
               $nb = count($morceaux);
               $nb = $nb - 1;
               $i = 0;
               // Création du code avec l'indentation
                foreach($morceaux as $morceau)
                {
                       if($nb == $i)
                      {
                             $morceau_num[] = $morceau;
                       }
                       else
                       {
                              $morceau = str_replace("</span> ", "</span>      ", $morceau);
                              $morceau_num[] = $morceau.'<br />';
                        }
                        $i++;
                 }
                 return '{'.implode($morceau_num).'}';
         }
                
          // Indentation du code
         $code = preg_replace_callback('#\{(.+)\}#Uis','indentateur_php',$code);
         $code = preg_replace('#(\[)#Uis','<span style="color: rgb(0, 0, 187);">[</span>',$code);
         $code = preg_replace('#(\])#Uis','<span style="color: rgb(0, 0, 187);">]</span>',$code);
                
         return '<div class="titre_php">[ <b><acronym title="PHP: Hypertext Preprocessor">PHP</acronym></b> Code ]</div><div class="cadre_php">'.$code.'</div>';
}

$code = preg_replace_callback('#\[php\]((.)+)\[/php\]#Uis','colorateur_indentateur_php',$code);
echo '<b>Voici le code :</b><hr /><br />'.$code.'<br /><hr/>';
}
?>
<b>Tapez votre code :</b>
<form action="essai.php" method="post" name="code">
<p><textarea name="code" cols="100" rows="15">
<? if(!empty($_POST['code'])) { echo $_POST['code']; } ?></textarea></p>
<p><input type="submit" name="Submit" value="Colorer le code"></p>
</form>


Voici donc mon script ! :lol:

Je voudrais savoir plusieurs choses si des gens peuvent m'aider :

Question 1 :
Si vous l'essayez, vous verrez que la coloration marche, mais que l'indentation ne marche pas très bien ! :( J'ai trouvé le problème, c'est que dès que PHP arrive sur un } il arrête l'indentation, alors que cette accolade n'était pas la fermeture de la principale. En gros il fait ça :

ouvre une accolade
{
(espace)(espace)il indente, on ouvre encore
(espace)(espace){
(espace)(espace)(espace)(espace)il indente encore, mais si on referme, il redescend complètement
}
}

Mais je n'arrive pas à régler le problème et je ne vois pas comment le regler !

Question 2 :
J'ai essayé aussi de faire en sorte que l'on puisse cliquer sur les fonctions pour qu'elles envoient à la documentation PHP, mais je n'ai pas réussi ! :euh: Si quelqu'un pouvait m'éclairer la dessus, ça m'aiderait beaucoup !

Question 3 :
J'aimerais bien aussi savoir comment aléger mon code, car à mon avis il est très lourd, donc si vous pouviez me donner certaines explications.

--------------------------------------------

Merci beaucoup ! :D
Bonne soirée.

Blaze/Ezable

3 réponses

  1. salut, pour ton point 1, utilise un compteur que tu incrémentes à chaque fois que tu rencontres une accolade ouvrante et que tu décrémentes à chaque accolade fermante. Tu affiches en début de ligne autant d'espaces que la valeur de ton compteur.
    pour les 2 autres points, il faudra que j'ai le temps de me pencher sur le code
    1. Je vais essayé de numéroté les indentations comme tu m'a dit j'ai dejà mon idée de ce que je vais faire ça a l'air pas mal !

      Merci ;)
      1. Salam,

        Utilisez plutôt ça :

        $code = preg_replace('!({)!', '$1<blockquote>', $code);
        $code = preg_replace('!(})!', '</blockquote>$1', $code);

        Ce code insert la balise "<blockquote>" après toute accolade ouvrante, et "</blockquote>" avant toute accolade fermante, et ça marche très bien.

        LLah mo3ine
        1. Ah yes pas bête, je me suis compliqué la vie en fait !

          Merci je vais essayer je reposte après. ;)
        2. @EzableC'est dommage, plus d'un ans après tu n'as pas posté ton code...
        3. @AnonymeOui très dommage, je cherche un code de ce genre aussi!! merci de nous tenir au courant si tu le veux bien ? ;)