BBCode-Bremse

Probleme bei der regulären Arbeiten mit phpBB, Fragen zu Vorgehensweisen oder Funktionsweise sowie sonstige Fragen zu phpBB im Allgemeinen.
Forumsregeln
phpBB 2.0 hat das Ende seiner Lebenszeit überschritten
phpBB 2.0 wird nicht mehr aktiv unterstützt. Insbesondere werden - auch bei Sicherheitslücken - keine Patches mehr bereitgestellt. Der Einsatz von phpBB 2.0 erfolgt daher auf eigene Gefahr. Wir empfehlen einen Umstieg auf phpBB 3.1, welches aktiv weiterentwickelt wird und für welches regelmäßig Updates zur Verfügung gestellt werden.
Antworten
Ghostwalker
Mitglied
Beiträge: 23
Registriert: 06.01.2004 11:41
Kontaktdaten:

BBCode-Bremse

Beitrag 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:)
Benutzeravatar
itst
Ehrenadmin
Beiträge: 7418
Registriert: 21.08.2001 02:00
Wohnort: Büttelborn bei Darmstadt
Kontaktdaten:

Beitrag 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...
Sascha A. Carlin,
phpBB.de Ehrenadministrator
:o
Ghostwalker
Mitglied
Beiträge: 23
Registriert: 06.01.2004 11:41
Kontaktdaten:

Beitrag 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:)
Benutzeravatar
itst
Ehrenadmin
Beiträge: 7418
Registriert: 21.08.2001 02:00
Wohnort: Büttelborn bei Darmstadt
Kontaktdaten:

Beitrag von itst »

Na denn :D
Sascha A. Carlin,
phpBB.de Ehrenadministrator
:o
Antworten

Zurück zu „phpBB 2.0: Administration, Benutzung und Betrieb“