[ Index ] |
|
Code source de WikiNi 0.4.4 |
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 ?>
titre
Description
Corps
titre
Description
Corps
titre
Description
Corps
titre
Corps
Généré le : Mon Nov 26 12:05:46 2007 | par Balluche grâce à PHPXref 0.7 |
![]() |