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