WackoWiki: JavaHighlighter ...

Home Page | Изменения | Новые Комменты | Пользователи | Каталог | Регистрация | Вход:  Пароль:  

Java code Highlighter

Оглавление документа

Introduction

Files

Put the following files in the respective classes

java.php (in formatters/highlight)

<?php

$this
->UseClass("JavaHighlighter""formatters/classes/");

$DH = &new JavaHightighter();
echo 
"<pre>".$DH->analysecode($text)."</pre>";
unset(
$DH);

?>

JavaHighLighter.php (in formatters/classes)


<?php

/**
* Java Syntax Highlighting 
******************************
* D'apres le code originale de FEREY Damien et Dark Skull Software
* publie sur http://www.phpcs.com/article.aspx?Val=649
* Modifie par Eric Feldstein (mise sous forme de classe et adapte a WikiNi)
******************************
* Peut facilement etre adapte pour d'autres langages (vb, c, c++...)
* Il suffit de modifier le contenu des variables
*
* @version 1.0
* @copyright FEREY Damien 23/06/2003 
* @copyright Dark Skull Software
*          http://www.darkskull.net
*

**/


class JavaHighlighter{

 var 
$code ''//the code to be hightlighed
 
var $newcode ''//the generated code
 
var $tok;            // Le mot en train d'etre decoupe
 
var $char;        // Le caractere en cours
 
var $i;          // La position en cours dans le code
 
var $codelength;  // La longueur de la chaine de code
 /****************************************************************/
 /* Les variables qui definissent le comportement de l'analyseur */
 /****************************************************************/
 
var $case_sensitive true;                   // Langage sensible a la case ou pas
 
var $tokdelimiters " []()=+-/*:;,.\n\t\r  "// Les delimiteurs de mots

 /***************************************************/
 /* Les couleurs associees a chaque type de donnees */
 /***************************************************/
 
var $colorkeyword "#0000CC";
 var 
$colortext "";
 var 
$colorstring   "#000000";
 var 
$colorcomment "#006600";
 var 
$colorsymbol   "";
 var 
$colornumber   "#000080";
 var 
$colorpreproc "#008000";

 
/*************************************************/
 /* Les styles donnes pour chaque type de donnees */
 /*************************************************/
 
var $stylekeyword = array("<b>""</b>");
 var 
$styletext = array("""");
 
//var $stylestring   = array("<span style=\"background-color:yellow\">", "</span>");
 
var $stylestring   = array("","");
 var 
$stylecomment = array("<i>""</i>");
 var 
$stylesymbol   = array("""");
 var 
$stylenumber   = array("""");
 var 
$stylepreproc = array("<i>""</i>");

 
/*****************/
 /* Keywords */
 /*****************/
 
var $keywords = array(
    
'abstract','double','double','strictfp','boolean','else',
    
'interface','super','break','extends','long','switch','byte','final','native',
    
'synchronized','case','finally','new','this','catch','float','package','throw','char','for',
    
'protected','public','published','record','packed','case','of','const','array',
    
'private','throws','class','goto','protected','transient','const','if','public','try',
    
'constructor','destructor','library','set','inherited','object','overload',
    
'continue','implements','return','void','default','import','short','volatile',
    
'do','instanceof','static','while');
 
/***********************************/
 /* Delimiters for comment */
 /***********************************/
 
var $commentdelimiters = array(
   array(
"//""\n"),
   array(
"/*""*/"),
   array(
"/**""*/")
 );

 
/********************************************/
 /* Delimiters for Strings */
 /********************************************/
 
var $stringdelimiters = array(
   array(
"\"""\"")
 );

 
/********************************************************/
 /* Delimiters for pre-processor-instructions */
 /********************************************************/
 
var $preprocdelimiters = array(
   array(
"(*\$""*)"),
   array(
"{\$""}")
 );

/////////////////////////////////////////////////////////////////////////////////////////
// Le code en lui-meme
/////////////////////////////////////////////////////////////////////////////////////////

 /************************************************************************/
 /* Renvoie vrai si un caractere est visible et peut etre mis en couleur */
 /************************************************************************/
 
function visiblechar($char) {
   
$inviblechars " \t\n\r  ";
   return (!
is_integer(strpos($inviblechars$char)));
 }

 
/************************************************************/
 /* Formatte un mot d'une maniere speciale (couleur + style) */
 /************************************************************/
 
function formatspecialtok($tok$color$style)
 {
   if (empty(
$color)) return sprintf("%s$tok%s"$style[0], $style[1]);
   return 
sprintf("%s<font color=\"%s\">$tok</font>%s"$style[0], $color$style[1]);
 }


 
/*******************************************************************/
 /* Recherche un element dans un tableau sans se soucier de la case */
 /*******************************************************************/
 
function array_search_case($needle$array)
 {
   if (!
is_array($array)) return FALSE;
   if (empty(
$array)) return FALSE;
   foreach(
$array as $index=>$string)
     if (
strcasecmp($needle$string) == 0) return intval($index);
   return 
FALSE;
 }


 
/*****************************************************/
 /* Analyse un mot et le renvoie de maniere formattee */
 /*****************************************************/
 
function analyseword($tok)
 {
   
// Si c'est un nombre
   
if (($tok[0] == '$') || ($tok[0] == '#') || ($tok == (string)intval($tok)))
     return 
$this->formatspecialtok($tok$this->colornumber$this->stylenumber);
   
// Si c'est vide, on renvoie une chaine vide
   
if (empty($tok)) return $tok;
   
// Si c'est un mot cle
   
if ((($this->case_sensitive) && (is_integer(array_search($tok$this->keywordsFALSE)))) ||
      ((!
$this->case_sensitive) && (is_integer($this->array_search_case($tok$this->keywords)))))
      return 
$this->formatspecialtok($tok$this->colorkeyword$this->stylekeyword);
   
// Sinon, on renvoie le mot sans formattage
   
return $this->formatspecialtok($tok$this->colortext$this->styletext);
 }


 
/***************************************************/
 /* On regarde si on ne tombe pas sur un delimiteur */
 /***************************************************/
 
function parsearray($array$color "#000080"$style = array("<i>""</i>"))
 {
   
// On effectue quelques verifications
   
if (!is_array($array))   return FALSE;
   if (!
strlen($this->code))     return FALSE;
   if (!
sizeof($array))     return FALSE;

   
// On va essayer de comparer le caractere courrant avec le 1°
   // caractere de chaque premier delimiteur
   
foreach($array as $delimiterarray) {
     
$delimiter1 $delimiterarray[0];
     
// Si le 1° char correspond
     
if ($this->char == $delimiter1[0]) {
       
$match TRUE;
       
// On va tenter de comparer tous les autres caracteres
       // Pour verifier qu'on a bien le delimiteur complet
       
for ($j 1; ($j strlen($delimiter1)) && $match$j++) {
         
$match = ($this->code[$this->$j] == $delimiter1[$j]);
       } 
// for
       // Si on l'a en entier
       
if ($match) {
         
$delimiter2 $delimiterarray[1];
         
// Alors on recherche le delimiteur de fin
         
$delimiterend strpos($this->code$delimiter2$this->strlen($delimiter1));
         
// Si on ne trouve pas le delimiteur de fin, on prend tout le fichier
         
if (!is_integer($delimiterend)) $delimiterend strlen($this->code);
         
// Maintenant qu'on a tout, on analyse le mot avant le delimiteur, s'il existe
         
if (!empty($this->tok)) {
           
$this->newcode .= $this->analyseword($this->tok);
           
$this->tok "";
         }
         
// Ensuite, on place le texte contenu entre les delimiteurs
         
$this->newcode .= $this->formatspecialtok(substr($this->code$this->i$delimiterend $this->strlen($delimiter2)), $color$style);
         
// On replace l'indice au bon endroit
         
$this->$delimiterend strlen($delimiter2);
         
// Enfin on recupere le caractere en cours
         
if ($this->$this->codelength$this->char NULL;
         else 
$this->char $this->code[$this->i];
         
// On precise qu'on a trouve
         
return TRUE;
       } 
//if
     
// if
   
// foreach
   
return FALSE;
 }


 
/******************************/
 /* On traite les cas speciaux */
 /******************************/
 
function parsearrays()
 {
   
$haschanged TRUE;
   
// A chaque changement, on redemarre la boucle entiere
   
while($haschanged){
     
// On regarde si on ne tombe pas sur un delimiteur de commentaire
     
$haschanged $this->parsearray($this->preprocdelimiters$this->colorpreproc$this->stylepreproc);
     if (!
$haschanged) {
       
// On regarde si on ne tombe pas sur un delimiteur de commentaire
       
$haschanged $this->parsearray($this->commentdelimiters$this->colorcomment$this->stylecomment);
       if (!
$haschanged) {
         
// Ou de chaine de caractere
         
$haschanged $this->parsearray($this->stringdelimiters$this->colorstring$this->stylestring);
       } 
// if
     
// if
   
// while
 
// parsearrays


 
function dump($var,$name){
//  echo "<pre>$name = \n";
//  print_r($var);
//  echo "</pre><br>";
 
}
 function 
trace($msg){
  
error_log("$msg");
 }
 
/***************************/
 /*Analyse the complete code */
 /***************************/
 
function analysecode($text)
 {
  
// Initialize variables
  
$this->newcode "";
  
$this->tok "";
  
$this->char NULL;
  
$this->code $text;
  
$this->codelength strlen($this->code);

  
$this->trace("debut analysecode");
  
$this->dump($this->codelength,"codelength");
  
$this->dump($this->code,"code");
  for (
$this->0$this->$this->codelength$this->i++ ) {
   
$this->dump($this->i,"i");
   
$this->char $this->code[$this->i];
   
$this->dump($this->char,"char");
   
// On regarde si on tombe sur un cas special
   
$this->parsearrays();
   
// On regarde si on est arrive au bout de la chaine
   
if ($this->char == NULL) return $this->newcode;
   
// On a fini d'analyser les commentaires, on regarde si on a un mot complet
   
if (is_integer(strpos($this->tokdelimiters$this->char))) {
    
// On tombe sur un delimiteur, on coupe le mot
    
$this->newcode .= $this->analyseword($this->tok);
    
// On formatte le delimiteur
    
if ($this->visiblechar($this->char)) $this->newcode .= $this->formatspecialtok($this->char$this->colorsymbol$this->stylesymbol);
    else 
$this->newcode .= $this->char;
    
// On remet a 0 le mot en cours
    
$this->tok "";
   }
   else {
// On n'a pas de mot complet, on complete le mot
    
$this->tok .= $this->char;
   }
  } 
// for
  // On regarde si on arrive au bout du code
  
if (!empty($this->tok)) $this->newcode .= $this->analyseword($this->tok);
  return 
$this->newcode;
 }
}

?>

Credits

Of course, this code has been borrowed from the Delphi Highlighter...



CategoryHighlighter?


 
Файлов нет. [Показать файлы/форму]
Комментариев нет. [Показать комментарии/форму]
Donate
Время работы: 1.785 s
Использовано памяти: 2.912 Mb