[PHP] Colorateur/Indentateur de code PHP

Fermé
Ezable Messages postés 3 Date d'inscription mercredi 2 juin 2004 Statut Membre Dernière intervention 9 mars 2007 - 8 mars 2007 à 17:59
 Bernard - 7 juin 2008 à 17:49
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
A voir également:

3 réponses

bbar Messages postés 436 Date d'inscription mercredi 27 septembre 2006 Statut Membre Dernière intervention 31 octobre 2008 140
8 mars 2007 à 20:31
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
Ezable Messages postés 3 Date d'inscription mercredi 2 juin 2004 Statut Membre Dernière intervention 9 mars 2007
8 mars 2007 à 23:00
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 ;)
0
hamzafes Messages postés 243 Date d'inscription lundi 26 juin 2006 Statut Membre Dernière intervention 4 mai 2013 54
9 mars 2007 à 10:01
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
0
Ezable Messages postés 3 Date d'inscription mercredi 2 juin 2004 Statut Membre Dernière intervention 9 mars 2007
9 mars 2007 à 19:46
Ah yes pas bête, je me suis compliqué la vie en fait !

Merci je vais essayer je reposte après. ;)
0
Anonyme > Ezable Messages postés 3 Date d'inscription mercredi 2 juin 2004 Statut Membre Dernière intervention 9 mars 2007
3 juin 2008 à 20:27
C'est dommage, plus d'un ans après tu n'as pas posté ton code...
0
Bernard > Anonyme
7 juin 2008 à 17:49
Oui très dommage, je cherche un code de ce genre aussi!! merci de nous tenir au courant si tu le veux bien ? ;)
0