ILIAS  eassessment Revision 61809
 All Data Structures Namespaces Files Functions Variables Groups Pages
Core Class Reference
+ Collaboration diagram for Core:

Public Member Functions

 Core ($file=undef, $outputmodule)
 load_file ($filename)
 set_stats ($statobj)
 highlight_text ($text, $contextstack=undef)
 get_stack ()
 _munge ($munge)
 _starts_with ($text, $array)

Detailed Description

Definition at line 26 of file Core.php.

Member Function Documentation

Core::_munge (   $munge)

Definition at line 535 of file Core.php.

Referenced by highlight_text().

{
$munge = str_replace(">", ">", $munge);
$munge = str_replace("&lt;","<", $munge);
$inword = 0;
$currword = "";
$currchar = "";
$strout = "";
$lngth = strlen($munge);
if ($this->context->inselection || $this->context->lineselect) return $munge;
if (!$this->context->prepro)
{
for($i=0; $i<=$lngth; $i++)
{
$currchar = $munge[$i];
$delim = in_array($currchar, $this->highlightfile->delimiters);
if ($delim || $i==($lngth))
{
if ($inword)
{
$inword = 0;
$oldword = $currword;
$checkword = $oldword;
if ($this->highlightfile->nocase) $checkword = strtolower($checkword);
$currword = str_replace("<", "&lt;", $currword);
$currword = str_replace(">", "&gt;", $currword);
if (isset($this->context->validkeys[$checkword]))
{
if ($this->highlightfile->nocase) $checkword = $this->context->validkeys[$checkword];
$category = $this->highlightfile->keywords[$checkword];
$fontchunk = $this->context->category_parts[$category][0].$currword.$this->context->category_parts[$category][1];
if (
isset($this->highlightfile->linkscripts) &&
(
$code = call_user_method($this->highlightfile->linkscripts{$category}, $this->highlightfile, $oldword, $this->output_module)
) != $oldword
)
{
$fontchunk = $code;
}
$strout .= $fontchunk;
}
else
$strout .= $currword;
}
$currchar = str_replace("<", "&lt;", $currchar);
$currchar = str_replace(">", "&gt;", $currchar);
$strout .= $currchar;
}
else
{
if ($inword)
{
$currword .= $currchar;
}
else
{
$inword = 1;
$currword = $currchar;
}
}
}
}
else
{
$strout = htmlentities($munge);
}
return $strout;
}

+ Here is the caller graph for this function:

Core::_starts_with (   $text,
  $array 
)

Definition at line 616 of file Core.php.

References $l.

Referenced by highlight_text().

{
$ml = 0;
$curr = "";
foreach($array as $i)
{
$l = strlen($i);
if (((!$this->highlightfile->nocase && substr($text, 0, $l)==$i) || ($this->highlightfile->nocase && strtolower(substr($text, 0, $l))==strtolower($i))) && ($text[$l]==" " || $l==1 || $text[$l]=="\n" || $text[$l]=="\t" || $text[$l]=="." || $text[$l]==";" || $l==strlen($text)))
{
if ($l>$ml)
{
$curr = substr($text, 0, $l);
$ml = $l;
}
}
}
return $curr;
}

+ Here is the caller graph for this function:

Core::Core (   $file = undef,
  $outputmodule 
)

Definition at line 29 of file Core.php.

References $file.

{
if (!isset($file)) $file = new HFile();
$this->zbuffer = false;
$this->buffer = false;
$this->highlightfile = $file;
$this->output_module = $outputmodule;
}
Core::get_stack ( )

Definition at line 529 of file Core.php.

{
return $this->contextstack;
}
Core::highlight_text (   $text,
  $contextstack = undef 
)

Definition at line 55 of file Core.php.

References $BEAUT_PATH, $l, $out, _munge(), _starts_with(), and for.

{
global $BEAUT_PATH;
if (isset($contextstack) && is_array($contextstack))
{
$this->contextstack = $contextstack;
$this->context = array_pop($contextstack);
$this->context->inwhitespace = 0;
}
else
{
$this->context = new Context();
$this->context->from_language($this->highlightfile, $this->output_module);
$this->contextstack = array();
}
array_push($this->contextstack, $this->context);
$this->langstack = array();
if (isset($this->highlightfile->zones))
{
// Create the hash mapping from start tag to language, and put together a hash to give
// the possible endings for a start tag.
$this->starttags = array();
$this->endtags = array();
$this->starttaglengths = array();
foreach($this->highlightfile->zones as $zone)
{
$this->startmap[$zone[0]] = $zone[2];
array_push($this->starttags, $zone[0]);
if (!isset($this->endtags[$zone[0]])) $this->endtags[$zone[0]] = array();
array_push($this->endtags[$zone[0]], $zone[1]);
$this->starttaglengths[$zone[0]] = strlen($zone[0]);
}
$this->endtaglist = array();
$this->langcache = array();
}
// Get the lines.
$arr = preg_split("/\n/", $text);
$aln = sizeof($arr);
if (isset($this->context->code_parts[0])) $out.= $this->context->code_parts[0];
for ($i=0; $i<$aln; $i++)
{
$this->context->prepro = 0;
$line = $arr[$i];
if ($this->context->preprolength>0 && substr($line, 0, $this->context->preprolength)==$this->highlightfile->prepro)
{
$out.= $this->context->prepro_parts[0];
$this->context->prepro = 1;
}
$this->context->inwhitespace = 1;
$this->context->incomment = 0;
// Handle selected lines.
if (isset($this->highlightfile->lineselect) && !$this->context->inselection && substr($line, 0, strlen($this->highlightfile->lineselect))==$this->highlightfile->lineselect)
{
$out.= $this->context->select_parts[0];
$line = substr($line, strlen($this->highlightfile->lineselect));
$this->context->lineselect = 1;
}
// Strip leading and trailing spaces
if ($this->highlightfile->notrim==0) $line = trim($line);
$lineout = "";
$lineorig = $line;
// Print out the current indent.
$sw = $this->_starts_with($lineorig, $this->highlightfile->unindent);
if ($lineorig != "")
{
if ($this->context->ind>0 && $sw!="")
{
//$lineout = str_repeat(" ", ($this->context->ind-1));
$lineout = str_repeat("\t", ($this->context->ind-1));
}
else
{
$lineout = str_repeat("\t", $this->context->ind);
}
}
$ln = strlen($lineorig);
for ($j=0; $j<$ln; $j++)
{
$currchar = $lineorig[$j];
//print $currchar;
// Handle opening selection blocks.
if (isset($this->highlightfile->selecton) && !$this->context->inselection &&
!$this->context->inquote && !$this->context->inbcomment &&
substr($line, $j, strlen($this->highlightfile->selecton))==$this->highlightfile->selecton)
{
//print "01";
$lineout = $this->_munge($lineout).$this->context->select_parts[0];
$out.= $lineout;
$lineout = "";
$this->context->inselection = 1;
$j+= strlen($this->highlightfile->selecton)-1;
continue;
}
// Handle closing selection blocks.
if (isset($this->highlightfile->selectoff) && $this->context->inselection &&
substr($line, $j, strlen($this->highlightfile->selectoff))==$this->highlightfile->selectoff)
{
//print "02";
$lineout.=$this->context->select_parts[1];
$out.= $lineout;
$lineout = "";
$this->context->inselection = 0;
$j+= strlen($this->highlightfile->selectoff);
continue;
}
// Handle line comments. This is made slightly faster by going straight to
// the next line - as nothing else can be done.
if (!$this->context->lineselect && !$this->context->inselection && !$this->context->inquote && !$this->context->incomment && !($this->highlightfile->perl && $j>0 && $line[$j-1]=="$"))
{
//print "03";
$currmax = 0;
foreach($this->highlightfile->linecommenton as $l)
{
if ($l[0] != $currchar) continue;
$lln = $this->context->lcolengths[$l];
if (substr($line, $j, $lln)==$l)
{
if ($lln > $currmax)
{
$lnc = $l;
$currmax = $lln;
}
}
}
if ($currmax != 0)
{
//print "04";
$line = substr($line, $j);
$lineout = $this->_munge($lineout);
$line = htmlentities($line);
$out.= $lineout;
if ($this->context->prepro)
{
$out.= $this->context->prepro_parts[1];
$this->context->prepro = 0;
}
$out.= $this->context->linecomment_parts[0].$line;
if (isset($this->statobj) && $this->statobj->harvest_comments) $this->statobj->comment_cache .= " ".substr($line, $lncl);
$lineout = "";
$this->context->incomment = 1;
$j = $ln + 1;
continue;
}
}
// Handle opening block comments. Sadly this can't be done quickly (like with
// line comments) as we may have 'foo /* bar */ foo'.
if (!$this->context->lineselect && !$this->context->inselection && !$this->context->inquote && !$this->context->inbcomment && in_array($currchar, $this->context->startingbkonchars))
{
//print "05";
$currmax = 0;
foreach($this->highlightfile->blockcommenton as $bo)
{
if ($bo[0] != $currchar) continue;
$boln = $this->context->bcolengths[$bo];
if (substr($line, $j, $boln)==$bo)
{
if ($boln > $currmax)
{
//print "06";
$bkc = $bo;
$bkcl = $boln;
$currmax = $boln;
}
}
}
if ($currmax != 0)
{
//print "07";
if ($this->prepro)
{
$out.= $this->context->prepro_parts[1];
$this->prepro = 0;
}
$this->context->closingstrings = $this->context->bcomatches[$bkc];
$lineout = $this->_munge($lineout);
$bkcout = str_replace(">", "&gt;", $bkc);
$bkcout = str_replace("<", "&lt;", $bkcout);
$out.= $lineout;
$out.= $this->context->blockcomment_parts[0].$bkcout;
$lineout = "";
$this->context->inbcomment = 1;
$j += $bkcl-1;
continue;
}
}
// Handle closing comments.
if (!$this->context->lineselect && !$this->context->inselection && !$this->context->inquote && $this->context->inbcomment)
{
//print "08";
$currmax = 0;
foreach($this->context->closingstrings as $bf)
{
if ($bf[0] != $currchar) continue;
$bfln = $this->context->bcflengths[$bf];
if (substr($line, $j, $bfln)==$bf)
{
if ($bfln > $currmax)
{
$bku = $bf;
$bkul = $bfln;
$currmax = $bfln;
}
}
}
if ($currmax != 0)
{
//print "09";
$bkuout = str_replace(">", "&gt;", $bku);
$bkuout = str_replace("<", "&lt;", $bkuout);
$lineout .= $bkuout.$this->context->blockcomment_parts[1];
$out.= $lineout;
$lineout = "";
$this->context->inbcomment = 0;
$j += $bkul-1;
continue;
}
}
if (isset($this->highlightfile->zones) && !$this->context->inbcomment && !$this->context->incomment && !$this->context->inquote)
{
//print "10";
$startcurrmax = 0;
foreach($this->starttags as $starttag)
{
if ($starttag[0] != $currchar) continue; // Avoid doing substr.
$starttagln = $this->starttaglengths[$starttag];
if (substr($line, $j, $starttagln)==$starttag)
{
if ($starttagln > $startcurrmax)
{
$startcurrtag = $starttag;
$startcurrmax = $starttagln;
}
}
}
if ($startcurrmax != 0)
{
//print "11";
$tagout = str_replace(">", "&gt;", $startcurrtag);
$tagout = str_replace("<", "&lt;", $tagout);
$out.= ltrim($lineout); // Sane? --moj
array_push($this->langstack, $this->highlightfile);
array_push($this->contextstack, $this->context);
$out.= "$tagout";
require_once $BEAUT_PATH."/HFile/".$this->startmap[$startcurrtag].".php";
$this->endtaglist = $this->endtags[$startcurrtag];
if (isset($this->langcache[$startcurrtag]))
$this->highlightfile = $this->langcache[$startcurrtag];
else
{
$this->highlightfile = new $this->startmap[$startcurrtag]();
$this->langcache[$startcurrtag] = $this->highlightfile;
}
$this->context = new Context();
$this->context->from_language($this->highlightfile, $this->output_module);
$lineout = "";
$j += $startcurrmax-1;
continue;
}
$endcurrmax = 0;
foreach($this->endtaglist as $endtag)
{
if ($endtag[0] != $currchar) continue; // Avoid doing substr.
$endtagln = strlen($endtag);
if (substr($line, $j, $endtagln)==$endtag)
{
if ($endtagln > $endcurrmax)
{
$endcurrtag = $endtag;
$endcurrmax = $endtagln;
}
}
}
if ($endcurrmax!=0)
{
//print "12";
$tagout = str_replace(">", "&gt;", $endcurrtag);
$tagout = str_replace("<", "&lt;", $tagout);
$lineout .= "$tagout";
$out.= $lineout;
$lineout = "";
$this->highlightfile = array_pop($this->langstack);
$this->context = array_pop($this->contextstack);
$this->endtaglist = array();
$j += $endcurrmax;
continue;
}
}
// If we're in a comment, skip keyword checking, cache the comments, and go
// to the next char.
if ($this->context->incomment || $this->context->inbcomment)
{
if ($this->context->inbcomment)
{
if ($currchar == "<") $currchar = "&lt;";
else if ($currchar == ">") $currchar = "&gt;";
else if ($currchar == "&") $currchar = "&amp;";
}
//print "13";
$lineout .= $currchar;
if ($this->context->newline)
{
if (isset($this->statobj) && $this->statobj->harvest_comments) $this->statobj->comment_cache .= " ";
$this->context->newline = 0;
}
if (isset($this->statobj) && $this->statobj->harvest_comments) $this->statobj->comment_cache .= $currchar;
continue;
}
// Indent has to be either preceded by, or be, a delimiter.
$delim = ($j==0 || in_array($currchar, $this->context->alldelims) || ($j>0 && in_array($lineorig[$j-1], $this->context->alldelims)));
// Handle quotes.
if (!$this->context->lineselect && !$this->context->inselection && !$this->context->escaping &&
((in_array($currchar, (array)$this->highlightfile->stringchars) && $this->context->inquote && $currchar==$this->context->currquotechar) || (in_array($currchar, (array)$this->highlightfile->stringchars) && !$this->context->inquote)))
{
//print "14:$currchar";
// First quote, so go blue.
if (!$this->context->escaping && isset($this->context->inquote) && !$this->context->inquote)
{
//print "15";
$lineout = $this->_munge($lineout);
$out.= $lineout;
$this->context->inquote = 1;
if (isset($this->statobj) && $this->statobj->harvest_strings) $this->string_cache.=" ";
if ($this->context->prepro)
{
$lineout = $this->context->prepro_parts[1].$currchar.$this->context->quote_parts[0];
}
else
{
$out.= $currchar.$this->context->quote_parts[0];
$lineout = "";
}
$this->context->currquotechar = $currchar;
}
// Last quote, so turn off font colour.
else if ($this->context->inquote && !$this->context->escaping && $currchar == $this->context->currquotechar)
{
//print "16";
$this->context->inquote = 0;
if ($this->context->prepro)
{
$lineout .= $this->context->quote_parts[1].$this->context->prepro_parts[0].$lineorig[$j];
}
else
{
$lineout .= $this->context->quote_parts[1].$lineorig[$j];
}
$out.= $lineout;
$lineout = "";
$this->context->currquotechar = "";
}
}
// If we've got an indent character, increase the level, and add an indent.
else if (!$this->context->inselection && $delim && !$this->context->inquote && ($stri=$this->_starts_with(substr($line, $j), $this->highlightfile->indent))!="")
{
//print "17";
if (!$this->context->inwhitespace)
{
//$lineout .= str_repeat(" ", $this->context->ind);
$lineout .= str_repeat("\t", $this->context->ind);
}
$lineout .= $stri;
$this->context->ind++;
$j += strlen($stri)-1;
}
// If we've got an unindent (and we are indented), go back a level.
else if (!$this->context->inselection && $delim && $this->context->ind>0 && !$this->context->inquote && ($stru=$this->_starts_with(substr($line, $j), $this->highlightfile->unindent))!="")
{
//print "18";
$this->context->ind--;
if (!$this->context->inwhitespace)
{
//$lineout .= str_repeat(" ", $this->context->ind);
$lineout .= str_repeat("\t", $this->context->ind);
}
$lineout .= $stru;
$j += strlen($stru)-1;
}
// Add the characters to the output, and cache strings.
else if (!$this->context->inwhitespace || $currchar != " " || $currchar != "\t")
{
//print "19";
if ($this->context->inquote && isset($this->statobj) && $this->statobj->harvest_strings)
$this->statobj->string_cache .=$currchar;
$lineout .= htmlentities($currchar);
}
if ($this->context->inquote && $this->context->escaping)
{
//print "20";
$this->context->escaping = 0;
}
else if ($this->context->inquote && $currchar == $this->highlightfile->escchar && !$this->context->escaping)
{
//print "21";
$this->context->escaping = 1;
}
}
if ($currchar != " " && $currchar != "\t")
{
$this->context->inwhitespace = 0;
}
if (!$this->context->incomment && !$this->context->inbcomment && !$this->context->inquote)
{
$lineout = $this->_munge($lineout);
}
if ($i<($aln-1))
{
if ($this->context->prepro)
{
$lineout .= $this->context->prepro_parts[1];
}
}
// Close any hanging font tags.
if ($this->context->incomment)
{
$out.= $this->context->linecomment_parts[1];
}
if ($i<($aln-1)) $lineout .="\n";
if ($this->context->lineselect) $lineout.= $this->context->select_parts[1];
$out.= $lineout;
$this->context->newline = 1;
$this->context->lineselect = 0;
}
// If we've finished, and are still in a comment, close the font tag.
if ($this->context->incomment)
{
$out.= $this->context->linecomment_parts[1];
}
else if ($this->context->inbcomment)
{
$out.= $this->context->blockcomment_parts[1];
}
else if ($this->context->inselection)
{
$out.= $this->context->select_parts[1];
}
if (isset($this->context->code_parts[1])) $out.= $this->context->code_parts[1];
$pad = str_repeat(" ", $this->highlightfile->indent_depth);
$out = str_replace ("\t",$pad, $out);
return $out;
}

+ Here is the call graph for this function:

Core::load_file (   $filename)

Definition at line 41 of file Core.php.

References $filename.

{
$filehandle = fopen ($filename, "r") or die("Could not open $filename for reading.");
$text = fread($filehandle, filesize($filename));
fclose($filehandle);
return $text;
}
Core::set_stats (   $statobj)

Definition at line 49 of file Core.php.

{
$this->statobj = $statobj;
}

The documentation for this class was generated from the following file: