BBCode-Bremse
Verfasst: 08.01.2004 13:55
Hi,
also irgendwie bin ich so ein bischen am verzweifeln. Ich versuch grad nen "generellen" Highlighter für Programmiersprachen zu coden (BBCode).
Das Highlighting an und für sich tut. Bau ich jedoch meine Routine ins Board ein, isses aus mit Antwortzeiten (timeout 30 Seconds). Dir routine selbst läuft sauber und schnell.
Hier mal die Routine:
im array $plang werden für jede sprache die reservierten wörter (idx: 1), kommentarzeichen (idx 3 und 4) , die String-Zeichen (idx 2) und die Zeichen für Präprozessor /Compiler-Direktriven (idx 5) angegeben.
für meinen Test enthält das hab ich ca. 75 Wörter für reservierte Wörter drinn.
so...in einem kleinen Test-Script läuft das teil wunderbar und fix.
Hier die funktion für den Einbau:
Der rest ist analog dem code-bbcode. Wo liegt das problem mit der geschwindigkeit ?
Schonmal danke im Voraus:)
also irgendwie bin ich so ein bischen am verzweifeln. Ich versuch grad nen "generellen" Highlighter für Programmiersprachen zu coden (BBCode).
Das Highlighting an und für sich tut. Bau ich jedoch meine Routine ins Board ein, isses aus mit Antwortzeiten (timeout 30 Seconds). Dir routine selbst läuft sauber und schnell.
Hier mal die Routine:
Code: Alles auswählen
function Highlighter($text,$language)
{
global$plang,$conf;
$resword=array();
$words=array();
$commends=array();
$strings=array();
$compiler=array();
$resword=explode(',',$plang[$language][1]);
for ($x=0;$x< count($resword);$x++)
{
$words[]= '#\b(' . str_replace('\*', '\w*?', phpbb_preg_quote($resword[$x], '#')) . ')\b#i';
}
$strings=explode(',',$plang[$language][2]);
$commends=explode(',',$plang[$language][3]);
$commends2=explode(',',$plang[$language][4]);
$compiler=explode(',',$plang[$language][5]);
//Lets color strings
for ($x = 0; $x < count($strings); $x++) {
$text = preg_replace('/('.$strings[$x].')(.*?)('.$strings[$x].')/si', '<font color="' . $conf['string'] . '"> \\1\\2\\3 </font>', $text);
}
//Lets color commends (Single characters one e.g. PHP or C++ "//")
for ($x = 0; $x < count($commends); $x++) {
$text = preg_replace('&(.*?)('.$commends[$x].')(.*)&', '\\1<font color="' . $conf['commend'] . '">\\2\\3</font>', $text);
}
//Lets color commends (Tag-like commends like Delphi "(*" and "*)")
for ($x=0;$x < count($commends2);$x++)
{
$text = preg_replace('&('.$commends2[$x].')(.*?)('.$commends2[$x+1].')&', '\\1<font color="' . $conf['commend'] . '">\\2</font>\\3', $text);
$x++;
}
//Lets color reserved words
for ($x = 0; $x < count($resword); $x++) {
$text = preg_replace($words[$x],'<font color="'.$conf['resword'].'">'.$resword[$x].'</font>',$text);
}
//Lets color compiler-directrivs
for ($x = 0; $x < count($compiler); $x++) {
$text = preg_replace('/('.$compiler[$x].')(.*?)('.$compiler[$x+1].')/si', '<font color="' . $conf['compiler'] . '"> \\1\\2\\3 </font>', $text);
$x++;
}
return $text;
}
für meinen Test enthält das hab ich ca. 75 Wörter für reservierte Wörter drinn.
so...in einem kleinen Test-Script läuft das teil wunderbar und fix.
Hier die funktion für den Einbau:
Code: Alles auswählen
// the global one
function kod_code( $text, $uid, $bbcode_tpl )
{
global $lang,$phpbb_root_path,$phpEx;
$Kod_start_html = $bbcode_tpl['kod_open'];
$Kod_end_html = $bbcode_tpl['kod_close'];
//strip language
$mylang=substr($text,strpos($text,'=')+1,(strpos($text,']')-strpos($text,'='))-1);
// First, do all the 1st-level matches. These need an htmlspecialchars() run,
// so they have to be handled differently.
$match_count = preg_match_all("#\[kod=".$mylang."\](.*?)\[/kod\]#si", $text, $matches);
for ($i = 0; $i < $match_count; $i++)
{
$before_replace = $matches[1][$i];
$after_replace = $matches[1][$i];
// Replace 2 spaces with " " so non-tabbed code indents without making huge long lines.
$after_replace = str_replace(" ", " ", $after_replace);
// now Replace 2 spaces with " " to catch odd #s of spaces.
$after_replace = str_replace(" ", " ", $after_replace);
// Replace tabs with " " so tabbed code indents sorta right without making huge long lines.
$after_replace = str_replace("\t", " ", $after_replace);
// now Replace space occurring at the beginning of a line
$after_replace = preg_replace("/^ {1}/m", ' ', $after_replace);
$str_to_match = "[kod=$mylang]" . $before_replace . "[/kod]";
$replacement = $Kod_start_html;
$replacement .= Highlighter($after_replace,$mylang);
$replacement .= $Kod_end_html;
$text = str_replace($str_to_match, $replacement, $text);
}
// Now, do all the non-first-level matches. These are simple.
$text = str_replace("[kod=".$mylang."]", $Kod_start_html, $text);
$text = str_replace("[/kod]", $Kod_end_html, $text);
$erg=$text;
return "$erg";
}
Schonmal danke im Voraus:)