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->keywords, FALSE)))) ||
      ((!
$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->i + $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->i + 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->i + strlen($delimiter2)), $color, $style);
         
// On replace l'indice au bon endroit
         
$this->i = $delimiterend + strlen($delimiter2);
         
// Enfin on recupere le caractere en cours
         
if ($this->i > $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->i = 0; $this->i < $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.012 s
������������ ������: 1.612 Mb