[ Index ]
 

Code source de WikiNi 0.4.4

Accédez au Source d'autres logiciels libres

Classes | Fonctions | Variables | Constantes | Tables

title

Body

[fermer]

/formatters/ -> hightlighter.class.inc (source)

   1  <?php
   2  /*

   3  * $Id: hightlighter.class.inc,v 1.3 2004/04/20 23:47:31 garfieldfr Exp $

   4  *

   5  * Souligneur générique pour colorier la syntaxe de langage de programmation

   6  *

   7  * copyrigth Eric Feldstein 2004 mailto:garfield_fr@tiscali.fr

   8  *

   9  * Licence : la meme que wikini(voir le fichier LICENCE).

  10  * Vous êtes libre d'utiliser et de modifier ce code à condition de laisser le copyright 

  11  * d'origine. Vous pouvez  bien sur vous ajouter à la liste des auteurs.

  12  *

  13  * INSTALLATION : copier le fichier dans le repertoire "formatters" de WikiNi

  14  * UTILISATION : importer la classe dans le script de coloration

  15  * ATTRIBUTS DE LA CLASSE :

  16  *   - isCaseSensitiv : booleen - indique si la syntaxe est sensible a la casse

  17  *   - comment : array - tableau d'expressions regulieres definissant les commentaires multiligne

  18  *                ex : array('({[^$][^}]*})',    //commentaires: { ... }

  19  *                        '(\(\*[^$](.*)\*\))'        //commentaires: (* ... *)

  20  *                    );

  21  *    - commentLine : array tableau d'expressions regulieres definissant les commentaires monoligne

  22  *                ex : array('(//.*\n)');         //commentaire //

  23  *    - commentStyle : string - style CSS inline a utiliser pour la coloration(utilisé dans une

  24  *            balise <SPAN style="..."></SPAN>)

  25  *    - directive : array - tableau d'expression reguliere pour definir les directive de

  26  *            compilation

  27  *    - directiveStyle : string - style CSS inline a utiliser pour la coloration

  28  *    - string : array - tableau d'expression reguliere pour definir les chaine de caracteres

  29  *    - stringStyle : string - style CSS inline a utiliser pour la coloration

  30  *    - number : array - tableau d'expression reguliere pour definir les nombres

  31  *    - numberStyle : string - style CSS inline a utiliser pour la coloration

  32  *    - keywords : array - tableau asociatif contenant des tableaux de liste de mots avec leur style. Ex :

  33  *          $oHightlighter->keywords['Liste1']['words'] = array('liste1mot1','liste1mot2','liste1mot3');

  34  *          $oHightlighter->keywords['Liste1']['style'] = 'color: red';

  35  *          $oHightlighter->keywords['Liste2']['words'] = array('liste2mot1','liste2mot2');

  36  *          $oHightlighter->keywords['Liste2']['style'] = 'color: yellow';

  37  *    chaque tableau keywords['...'] DOIT posseder les 2 clé 'words' et 'style'.

  38  *    - symboles : array - tableau conteant la liste des symboles

  39  *    - symbolesStyle : string - style CSS inline a utiliser pour la coloration

  40  *    - identifier : array - tableau d'expression reguliere pour definir les identifiants

  41  *    - identStyle : string - style CSS inline a utiliser pour la coloration

  42  * METHODE PUBLIQUE DE LA CLASSE :

  43  *    - Analyse($text) : $text string Chaine a analyser

  44  *        renvoie le texte colorié.

  45  *

  46  * NOTES IMPORTANTES

  47  *  - Les expressions reguliere doivent être entre parenthèse capturante pour etre utilisé

  48  * dans une fonction de remplacement. Voir le fichier coloration_delphi.php pour un exemple

  49  *  - Lorsque un style est defini à vide, l'expression reguliere n'est pas prise en compte dans

  50  * l'analyse.

  51  *  - L'option de recherche est msU : multiligne, le . peut être un \n et la recherche

  52  * est 'not greedy' qui inverse la tendance à la gourmandise des expressions régulières.

  53  */
  54  
  55  class Hightlighter{
  56      //sensibilite majuscule/minuscule

  57      var $isCaseSensitiv = false;
  58      //commentaires

  59      var $comment = array();    //commentaire multiligne

  60      var $commentLine = array();    //commentaire monoligne

  61      var $commentStyle = '';//'color: red';

  62      //directives de compilation

  63      var $directive = array();
  64      var $directiveStyle = '';//'color: green';

  65      //chaine de caracteres

  66      var $string = array();
  67      var $stringStyle = '';
  68      //nombre

  69      var $number = array();
  70      var $numberStyle = '';
  71      //mots clé

  72      var $keywords = array();
  73      //séparateurs

  74      var $symboles = array();
  75      var $symbolesStyle = '';
  76      //identifiant

  77      var $identifier = array();
  78      var $identStyle = '';
  79      //*******************************************************

  80      // Variable privées

  81      //*******************************************************

  82      var $_patOpt = 'msU';        //option de recherche

  83      var $_pattern = '';            //modele complet

  84      var $_commentPattern = '';    //modele des commentaires

  85      var $_directivePattern = '';//modele des directives

  86      var $_numberPattern = '';    //modele des nombres

  87      var $_stringPattern = '';    //modele des chaine de caracteres

  88      var $_keywordPattern = '';    //modele pour le mots cle

  89      var $_symbolesPattern = '';    //modele pour les symbole

  90      var $_separatorPattern = '';//modele pour les sparateurs

  91      var $_identPattern = '';    //modele pour les identifiants

  92      /********************************************************

  93      Methodes de la classe

  94      *********************************************************/
  95      /**

  96      * Renvoie le pattern pour les commentaires

  97      */
  98  	function _getCommentPattern(){
  99          $a = array_merge($this->commentLine,$this->comment);
 100          return implode('|',$a);
 101      }
 102      /**

 103      * Renvoie le pattern pour les directives de compilation

 104      */
 105  	function _getDirectivePattern(){
 106          return implode('|',$this->directive);
 107      }
 108      /**

 109      * Renvoie le pattern pour les chaine de caracteres

 110      */
 111  	function _getStringPattern(){
 112          return implode('|',$this->string);
 113      }
 114      /**

 115      * Renvoie le pattern pour les nombre

 116      */
 117  	function _getNumberPattern(){
 118          return implode('|',$this->number);
 119      }
 120      /**

 121      * Renvoie le pattern pour les mots clé

 122      */
 123  	function _getKeywordPattern(){
 124        $aResult = array();
 125        foreach($this->keywords as $key=>$keyword){
 126           $aResult = array_merge($aResult, $keyword['words']);
 127           $this->keywords[$key]['pattern'] = '\b'.implode('\b|\b',$keyword['words']).'\b';
 128        }
 129          return '\b'.implode('\b|\b',$aResult).'\b';
 130      }
 131      /**

 132      * Renvoie le pattern pour les symboles

 133      */
 134  	function _getSymbolesPattern(){
 135          $a = array();
 136          foreach($this->symboles as $s){
 137              $a[] = preg_quote($s,'`');
 138          }
 139          return implode('|',$a);
 140      }
 141      /**

 142      * Renvoie le pattern pour les identifiants

 143      */
 144  	function _getIdentifierPattern(){
 145          return implode('|',$this->identifier);
 146      }
 147      /**

 148      * Liste des separateur d'apres la liste des symboles

 149      */
 150  	function _getSeparatorPattern(){
 151          $a = array_unique(preg_split('//', implode('',$this->symboles), -1, PREG_SPLIT_NO_EMPTY));
 152          $pattern = '['.preg_quote(implode('',$a),'`').'\s]+';
 153          return $pattern;
 154      }
 155      /**

 156      * Renvoie le modele a utiliser dans l'expression regulière

 157      *

 158      * @return string Modele de l'expression régulière

 159      */
 160  	function _getPattern(){
 161          $this->_separatorPattern = $this->_getSeparatorPattern();
 162          $this->_symbolesPattern = $this->_getSymbolesPattern();
 163          $this->_commentPattern = $this->_getCommentPattern();
 164          $this->_directivePattern = $this->_getDirectivePattern();
 165          $this->_stringPattern = $this->_getStringPattern();
 166          $this->_numberPattern = $this->_getNumberPattern();
 167          $this->_keywordPattern = $this->_getKeywordPattern();
 168          $this->_identPattern = $this->_getIdentifierPattern();
 169          //construction du modele globale en fonction de l'existance d'un style(optimisation)

 170          if($this->commentStyle){ $a[] = $this->_commentPattern; }
 171          if($this->directiveStyle){ $a[] = $this->_directivePattern; }
 172          if($this->stringStyle){ $a[] = $this->_stringPattern; }
 173          if($this->numberStyle){ $a[] = $this->_numberPattern; }
 174        if(count($this->keywords)>0){ $a[] = $this->_keywordPattern; }
 175          if($this->symbolesStyle){ $a[] = $this->_symbolesPattern; }
 176          if($this->identStyle){ $a[] = $this->_identPattern; }
 177          $this->_pattern = implode('|',$a);
 178          return $this->_pattern;
 179      }
 180      /**

 181      * Fonction de remplacement de chaque élement avec leur style.

 182      */
 183  	function replacecallback($match){
 184          $text = $match[0];
 185          $pcreOpt = $this->_patOpt;
 186          $pcreOpt .= ($this->isCaseSensitiv)?'':'i';
 187          //commentaires

 188        if($this->commentStyle){
 189           if (preg_match('`'.$this->_commentPattern."`$pcreOpt",$text,$m)){
 190              return "<span style=\"$this->commentStyle\">".$match[0].'</span>';
 191           }
 192        }
 193          //directive de compilation

 194        if ($this->directiveStyle){
 195           if (preg_match('`'.$this->_directivePattern."`$pcreOpt",$text,$m)){
 196              return "<span style=\"$this->directiveStyle\">".$match[0].'</span>';
 197           }
 198        }
 199          //chaine de caracteres

 200        if ($this->stringStyle){
 201             if (preg_match('`'.$this->_stringPattern."`$pcreOpt",$text,$m)){
 202                 return "<span style=\"$this->stringStyle\">".$match[0].'</span>';
 203             }
 204        }
 205          //nombres

 206        if ($this->numberStyle){
 207             if (preg_match('`'.$this->_numberPattern."`$pcreOpt",$text,$m)){
 208                 return "<span style=\"$this->numberStyle\">".$match[0].'</span>';
 209             }
 210        }
 211          //mot clé

 212        if (count($this->keywords)>0){
 213           foreach($this->keywords as $key=>$keywords){
 214              if ($keywords['style']){
 215                 if(preg_match('`'.$keywords['pattern']."`$pcreOpt",$text,$m)){
 216                    return "<span style=\"".$keywords['style']."\">".$match[0].'</span>';
 217                 }
 218              }
 219           }
 220        }
 221          //symboles

 222        if ($this->symbolesStyle){
 223             if (preg_match('`'.$this->_symbolesPattern."`$pcreOpt",$text,$m)){
 224                 return "<span style=\"$this->symbolesStyle\">".$match[0].'</span>';
 225             }
 226        }
 227          //identifiants

 228        if ($this->identStyle){
 229             if (preg_match('`'.$this->_identPattern."`$pcreOpt",$text,$m)){
 230                 return "<span style=\"$this->identStyle\">".$match[0].'</span>';
 231             }
 232        }
 233          return $match[0];
 234      }
 235      /**

 236      * renvois le code colorié

 237      *

 238      * @param $text string Texte a analyser

 239      * @return string texte colorié

 240      */
 241  	function Analyse($text){
 242          $pattern = '`'.$this->_getPattern()."`$this->_patOpt";
 243          if (!$this->isCaseSensitiv){
 244              $pattern .= 'i';
 245          }
 246          $text = preg_replace_callback($pattern,array($this,'replacecallback'),$text);
 247          return $text;
 248      }
 249  }    //class Hightlighter

 250  ?>


Généré le : Mon Nov 26 12:05:46 2007 par Balluche grâce à PHPXref 0.7
  Clicky Web Analytics