Seite 1 von 1

BBCode-Bremse

Verfasst: 08.01.2004 13:55
von Ghostwalker
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:

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;
}

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:


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 "&nbsp; " so non-tabbed code indents without making huge long lines.
		$after_replace = str_replace("  ", "&nbsp; ", $after_replace);
		// now Replace 2 spaces with " &nbsp;" to catch odd #s of spaces.
		$after_replace = str_replace("  ", " &nbsp;", $after_replace);

		// Replace tabs with "&nbsp; &nbsp;" so tabbed code indents sorta right without making huge long lines.
		$after_replace = str_replace("\t", "&nbsp; &nbsp;", $after_replace);

		// now Replace space occurring at the beginning of a line
		$after_replace = preg_replace("/^ {1}/m", '&nbsp;', $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";
}

Der rest ist analog dem code-bbcode. Wo liegt das problem mit der geschwindigkeit ?



Schonmal danke im Voraus:)

Verfasst: 08.01.2004 17:58
von itst
Zeig doch mal, wie Du den BBCode in die bbcode.php eingebaut hast bzw. was Du, wenn überhaupt, am Template bzw. der posting.php geändert hast.

Und dann noch ein Schuss ins Blaue: Lass doch mal die Replacements für Spaces und Tabs weg...

Verfasst: 08.01.2004 19:34
von Ghostwalker
Bingo....habs gefunden.

Das Problem schein der editor von smartor zu sein (den hatte ich schon länger eingebaut).

Ich hab das ganze jetzt mal im orginal eingebaut....und funzt.


Trotzdem danke für eure Mühen:)

Verfasst: 08.01.2004 20:54
von itst
Na denn :D