AccueilAccueil  FAQFAQ  RechercherRechercher  S'enregistrerS'enregistrer  MembresMembres  Connexion  

Partagez | 
 

 [PHP]Coloration syntaxique

Aller en bas 
AuteurMessage
Térence
Utilisateur confirmé: Rang *****
avatar

Messages : 2213
Localisation : Oui

MessageSujet: [PHP]Coloration syntaxique   Mer 7 Nov 2012 - 12:33

Bonjour à tous,
J'ai fait une classe pour pouvoir coloriser du code :
Code:
<?php
class langage
   {
   protected $code;
   
   /*
   1=>contrôles(if, else,etc...)
   2=>valeurs(true,false,etc...)
   3=>fonctions
   4=>string
   5=>nombres
   6=>commentaires
   7=>opérateurs(==,<,(,))
   */
   protected $groupes_code=array(
      array("if","then","else","return"),
      array("true","false","null","this"),
      array(".+\(.*\)"),
      array("[\"\'].*[\"\']"),
      array("[\d\.]+"),
      array("//.*","/\*.*\*/"),
      array("==","!=","<",">","<=",">=","|","&","<<",">>"),
      );
   protected $groupes_couleur=array("blue","orange","red","gold","grey","green","orange");
   
   public function __construct($code)
      {
      $this->code=$code;
      }
   
   protected function parser_code()
      {
      $code=$this->code;
      
      for($i=0;$i<count($this->groupes_code);$i++)
         {
         foreach($this->groupes_code[$i] as $expression)
            {
            $code=preg_replace("#".$expression."#Usi","<span style='color:".$this->groupes_couleur[$i]."'>$0</span>",$code);
            }
         }
      
      return $code;
      }
      
   public function get_code()
      {
      return $this->parser_code();
      }
   }
?>

Voilà, ca marcherait à merveille dans n'importe quel langage, mais là à chaque étape le code recoit des balises <span style="color:x">, et donc ca commence a buger dès qu'il y a des mots-clés comme les chevrons, les guillemets et le signe =, puisqu'il colorise les balises span... Je me retrouve donc pour un code de départ de 3 lignes à une cinquantaine de lignes avec des chevrons partout...
J'ai pensé à utiliser une fonction récursive : preg_replace_callback ; mais je n'arrive pas à adapter l'exemple qu'ils donnent :
Code:

<?php
$input = "plain [indent] deep [indent] deeper [/indent] deep [/indent] plain";

function parseTagsRecursive($input)
{

    $regex = '#\[indent]((?:[^[]|\[(?!/?indent])|(?R))+)\[/indent]#';

    if (is_array($input)) {
        $input = '<div style="margin-left: 10px">'.$input[1].'</div>';
    }

    return preg_replace_callback($regex, 'parseTagsRecursive', $input);
}

$output = parseTagsRecursive($input);

echo $output;
?>
De plus, le deuxième argument doit être une fonction à rappeler, mais vu que mon code est un objet, et qu'on appelle les fonctions d'objets comme ca : $this->function(), je met quoi comme argument ? $this->function ou function ?

Voilà, je suis un peu perdu, donc si quelqu'un a déjà utilisé cette fonction, de la récursivité, ou réussi à obtenir le même résultat d'une autre façon, je suis preneur ! happy1
Merci d'avance !
Revenir en haut Aller en bas
Térence
Utilisateur confirmé: Rang *****
avatar

Messages : 2213
Localisation : Oui

MessageSujet: Re: [PHP]Coloration syntaxique   Jeu 8 Nov 2012 - 22:09

Personne n'a le moindre début d'idée ? triste
Revenir en haut Aller en bas
onilink_
Modérateur
avatar

Messages : 8995
Localisation : Montpellier
Projet Actuel : Planet Centauri
OniDev

MessageSujet: Re: [PHP]Coloration syntaxique   Sam 10 Nov 2012 - 13:57

Je fait pas de php, donc si tu veux de l'aide explique au moins l'algorithme que tu utilise x)

_________________
                 
Revenir en haut Aller en bas
Térence
Utilisateur confirmé: Rang *****
avatar

Messages : 2213
Localisation : Oui

MessageSujet: Re: [PHP]Coloration syntaxique   Sam 10 Nov 2012 - 14:27

Ouais, merci Oni
Donc, voilà le code complet :
Code:
<?php
class langage
  {
  protected $code;
 
  /*
  1=>contrôles(if, else,etc...)
  2=>valeurs(true,false,etc...)
  3=>fonctions
  4=>string
  5=>nombres
  6=>commentaires
  7=>opérateurs(==,<,(,))
  */
  protected $groupes_code=array(
      array("if","then","else","return"),
      array("true","false","null","this"),
      array(".+\(.*\)"),
      array("[\"\'].*[\"\']"),
      array("[\d\.]+"),
      array("//.*","/\*.*\*/"),
      array("==","!=","<",">","<=",">=","|","&","<<",">>"),
      );
  protected $groupes_couleur=array("blue","orange","red","gold","grey","green","orange");
 
  public function __construct($code)
      {
      $this->code=$code;
      }
 
  protected function parser_code()
      {
      $code=$this->code;
     
      for($i=0;$i<count($this->groupes_code);$i++)
        {
        foreach($this->groupes_code[$i] as $expression)
            {
            $code=preg_replace("#".$expression."#Usi","<span style='color:".$this->groupes_couleur[$i]."'>$0</span>",$code);
            }
        }
     
      return $code;
      }
     
  public function get_code()
      {
      return $this->parser_code();
      }
  }
?>

Maintenant on le décortique :
Code:

protected $groupes_code=array(
      array("if","then","else","return"),
      array("true","false","null","this"),
      array(".+\(.*\)"),
      array("[\"\'].*[\"\']"),
      array("[\d\.]+"),
      array("//.*","/\*.*\*/"),
      array("==","!=","<",">","<=",">=","|","&","<<",">>"),
      );
  protected $groupes_couleur=array("blue","orange","red","gold","grey","green","orange");
La variable $groupes_code est un tableau 2D, le premier index est l'id du groupe ( le premier groupe c'est les contrôles, le deuxième les valeurs,etc.. c'est dans les commentaires), et dans le deuxième index c'est les mots-clés du groupe.
Par exemple, :
$groupes_code[0][0]="if",
$groupes_code[6][3]=">"
Le deuxième index est une regex sans les caractères séparateurs de départ (# en général), ils sont rajoutés plus tard ; ainsi on peut utiliser un mot normal ou une regex, ca marche dans les deux cas.

Code:

public function __construct($code)
      {
      $this->code=$code;
      }
Bon ben ca c'est le constructeur, on lui passe en argument le code à coloriser et il le met dans la variable de classe code.

Code:

protected function parser_code()
      {
      $code=$this->code;
     
      for($i=0;$i<count($this->groupes_code);$i++)
        {
        foreach($this->groupes_code[$i] as $expression)
            {
            $code=preg_replace("#".$expression."#Usi","<span style='color:".$this->groupes_couleur[$i]."'>$0</span>",$code);
            }
        }

Ok là il parse le code (et c'est la que ca *****...) :
Dans une boucle for il étudie tous les groupes, et à l'intérieur il parcourt toutes les cases du groupe $i avec foreach (je sais pas si ca existe en c++, mais en gros ca parcourt toutes les cases d'un tableau et ca met la valeur de la case dans la variable donnée après les as, ici dans $expression).
Donc, par exemple, pour le premier groupe, la variable $expression aura les valeurs "if", puis "then", puis "else", puis "return".

Code:

$code=preg_replace("#".$expression."#Usi","<span style='color:".$this->groupes_couleur[$i]."'>$0</span>",$code);
preg_replace(regex,remplacement,texte)
preg_replace remplace tous ce qui satisfait le masque regex par remplacement dans texte.
Code:
"#".$expression."#Usi"
Le point (.) sert à concaténer, comme ca on a une regex fait à partir d'une case du tableau de mots-clés.
[code]"<span style='color:".$this->groupes_couleur[$i]."'>$0</span>"[*code]
Donc là ca met le texte qui satisfait le filtre ($0) dans une balise span avec une couleur (elle est dans le tableau $groupes_couleur).

Donc par exemple si le code passé dans le constructeur est
[code]if(a=="boujour")[/code]
, le if va être colorisé (en bleu) et la variable $code vaudra maintenant "<span style='color:blue'>if</span>(a=="boujour")" à la première itération du foreach dans la première itération du for.
Jusque là, tout marche trüs bien, j'ai déjà testé.
Le problème c'est que à la deuxième itération du foreach, $code vaudra "<span style='color:blue'>if</span>(a=="boujour")".
là ca pose pas de problème, mais quand il faudra coloriser les guillemets ('), et ben il va aussi coloriser ceux de la balise span, $code vaudra donc "<span style=<span class='gold'>'</span>color:blue<span class='gold'>'</span>>if</span>(a==<span class='gold'>"</span>boujour<span class='gold'>"</span>)"....
Il a aussi colorisé les guillemets de la balise,et ca faut surtout pas, en plus il tourne en boucle parce qu'à chaque fois il colorise les guillemets qu'il a rajouté avant...
Donc à la fin je me retrouve avec 500 lignes qui veulent rien dire, puisque le bug marche aussi avec les chevrons et le signe =...
Donc il faudrait faire en sorte que la fonction preg_replace prennent en 3ème argument le code sans balise, et qu'ensuite seulement, tous les codes colorisés soient mis en communs, mais ca je sais pas comment faire... mrgreen2
Revenir en haut Aller en bas
Contenu sponsorisé




MessageSujet: Re: [PHP]Coloration syntaxique   

Revenir en haut Aller en bas
 
[PHP]Coloration syntaxique
Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» Soins et coloration des cheveux au henné
» Coloration cheveux fins et fragiles
» Coloration temporaire ou semi-permanente autrement dit.
» Test de compréhension syntaxique TCS
» la coloration des cheveux pendant la grossesse...

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
Forum Le CBNA :: Développement :: Programmation-
Sauter vers: