no save
Assistance
Achat
News

Forum | programmation
[PHP] Colorateur/Indentateur de code PHP
Ezable, le jeu. 08 mars 2007 à 17:59:57
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


bbar
mars 07
Suivant
REPONSES
bbar
mars 07
Ezable
mars 07
hamzafes
mars 07
Ezable
mars 07
Anonyme
juin 08
Bernard
juin 08
Version Web
Réalisé par RedShift
no save