Hackerboard Wiki HaboBlog
Hackerboard bei Facebook Hackerboard bei Google+ Hackerboard bei Twitter

[HaBo]

 
Code Kitchen Allgemeines Coder-Forum rund um das Programmieren eigenständiger, ausführbarer Programme.

Phpbb Forum: Code tags

Diskussion: Phpbb Forum: Code tags im Forum Code Kitchen, in der Kategorie Software Home; Anzeige Hallo, Ich habe ein phpbb Forum, und würde dort gerne die vorhandenen codetags etwas abändern. Momentan wird, wenn man ...

Antwort
Alt 05.01.08, 18:09   #1 (permalink)
IsNull
Guest
 
Likes:
Standard Phpbb Forum: Code tags

Anzeige

Hallo,

Ich habe ein phpbb Forum, und würde dort gerne die vorhandenen codetags etwas abändern. Momentan wird, wenn man diese tags verwendet, einfach der Code in einen eigenen Rahmen/Kasten genommen. Nun würde ich gerne dem Code Syntaxhighligthning hinzufügen.

Zumindest mal ein erkennen der Kommentare im Code. Ziel wäre es in etwa solche Codeboxen zu erhalten: (Eigentlich _genau_ diese, da es sich ebenfalls um AHK code handelt.)
http://de.autohotkey.com/forum/viewtopic.php?t=2310

Hat da einer Erfahrung damit?
Gruss
IsNull

  Mit Zitat antworten
Alt 05.01.08, 18:24   #2 (permalink)
Administrator
 
Benutzerbild von Mackz
 
Registriert seit: 02.10.01
Mackz Leistung: Pentium IMackz Leistung: Pentium I
Likes: 30
Standard

Hi,

PHP bietet eine Syntax Highlighting Funktion: http://de.php.net/highlight_string
Vielleicht bringt dich das ja weiter. Theoretisch müsstest du nur in der Parserklasse (keine Ahnung wie genau das beim PHPbb läuft) den Code durch diese Funktion jagen.
Ansonsten müsstest du dir vielleicht mit preg_replace und regulären Ausdrücken eine eigene Highlighting-Funktion bauen bzw. einen fertigen Mod verwenden.
__________________
RL sux big time... auch 2012!

Deleting pr0n is like killing your best friend

[HaBo] bei Facebook - Werde Fan
Mackz ist offline   Mit Zitat antworten
   
HaBOT
 
- Anzeige -

Werbung ist gerade online    
Alt 05.01.08, 20:06   #3 (permalink)
Senior Member
 
Registriert seit: 29.07.05
Heinzelotto Leistung: Facit NTK
Heinzelotto eine Nachricht über ICQ schicken
Likes: 0
Standard RE: Phpbb Forum: Code tags

Zitat:
Original von IsNull
Zumindest mal ein erkennen der Kommentare im Code. Ziel wäre es in etwa solche Codeboxen zu erhalten: (Eigentlich _genau_ diese, da es sich ebenfalls um AHK code handelt.)
das müsste recht einfach gehen:
1. mit explode() den String in ein Array zerlegen, in dem jedes Element eine Textzeile enthält (explode() teilt einen string dort, wo eine newline (\n) ist)
2. testen, ob am anfang ein semikolon ist. da aber vor dem semikolon wahrscheinlich beliebig viele leerzeichen stehen dürfen, müsstest du dir eine funktion schreiben, die in einem string alle anführenden leerzeichen entfernt (ich glaube, php stellt eine solche sogar schon zu verfügung). dann schaust du ob in deineFunktion(zuTestenderString) der erste Buchstabe gleich ";" ist.
Falls das so ist, färbst du den string mit <font color=#aabbcc> </font>
Heinzelotto ist offline   Mit Zitat antworten
Alt 05.01.08, 20:55   #4 (permalink)
Member of Honour
 
Benutzerbild von beavisbee
 
Registriert seit: 22.02.07
beavisbee Leistung: Pentium IIIbeavisbee Leistung: Pentium IIIbeavisbee Leistung: Pentium IIIbeavisbee Leistung: Pentium III
beavisbee eine Nachricht über ICQ schicken
Likes: 77
Standard

ähhhm... ja.

1.) das Parsen:

warum einfach, wenn's auch kompliziert geht?!

Wie Mackz schon geschrieben hat: Reguläre Ausdrücke - Einarbeitung in die Syntax + erste kleine Übungen zum Begreifen der Problematik: 30 Minuten; danach hat man für immer ein sehr mächtiges Werkzeug zum Parsen - da kommt kein Script mit sonstwieviel Befehlen mit (besonders nicht in Sachen Bearbeitungszeit)

2.) die Kommentare

man sollte auch die mehrzeiligen Kommentare beachten: /* kommentar, der über mehrere Zeilen gehen kann */

und da wird's schon wieder lustig, das mit Schleifen und so zu machen --> Lösung = RegExp...

3.) einfärben
Zitat:
Falls das so ist, färbst du den string mit <font color=#aabbcc> </font>
okay, so hat man das vor 5 Jahren mal gemacht... ;-)
Seit einiger Zeit versucht man Design möglichst gut vom Content zu trennen und zieht CSS zur farblichen Gestaltung vor.
beavisbee ist offline   Mit Zitat antworten
Alt 05.01.08, 21:25   #5 (permalink)
Senior Member
 
Registriert seit: 29.07.05
Heinzelotto Leistung: Facit NTK
Heinzelotto eine Nachricht über ICQ schicken
Likes: 0
Standard

@Beavisbee: stimmt, ich muss dir in allen Punkten Recht geben
Heinzelotto ist offline   Mit Zitat antworten
Alt 05.01.08, 22:07   #6 (permalink)
IsNull
Guest
 
Likes:
Standard

Hallo,

Ich kenne mich (glücklicherweise) mit Regex etwas aus. Bevor ich das Rad neu erfinde, möchte ich jedoch versuchen die bestehende Funktion zu verwenden.
Hier nochmal ein beliebiger Thread:
http://www.autohotkey.com/forum/viewtopic.php?t=27252

Im Quelltext findet man folgendes Javascript, welches für die färbung verantwortlich ist:
http://www.autohotkey.com/forum/code.js

Das sollte ich doch irgendwie bei mir einbauen können?
  Mit Zitat antworten
Alt 05.01.08, 22:13   #7 (permalink)
Member of Honour
 
Benutzerbild von beavisbee
 
Registriert seit: 22.02.07
beavisbee Leistung: Pentium IIIbeavisbee Leistung: Pentium IIIbeavisbee Leistung: Pentium IIIbeavisbee Leistung: Pentium III
beavisbee eine Nachricht über ICQ schicken
Likes: 77
Standard

okay, ich persönlich finde solche clientseitigen Sachen nicht sooo doll (setzt halt voraus, dass JS beim User aktiviert ist), aber es wird wohl die schnellste Variante sein...
beavisbee ist offline   Mit Zitat antworten
Alt 06.01.08, 14:04   #8 (permalink)
IsNull
Guest
 
Likes:
Standard

Also, überredet Ich werde mal eine highlight_ahk_code() funktion schreiben - aber das problem ist die implementation in das phpbb System. Mackz hat da was angesprochen:
Zitat:
Theoretisch müsstest du nur in der Parserklasse (keine Ahnung wie genau das beim PHPbb läuft) den Code durch diese Funktion jagen.
Ich glaube, ich muss bei der bbcode.php ansetzten, die sieht so aus:
PHP-Code:
<?php
/***************************************************************************
 *                              bbcode.php
 *                            -------------------
 *   begin                : Saturday, Feb 13, 2001
 *   copyright            : (C) 2001 The phpBB Group
 *   email                : support@phpbb.com
 *
 *   $Id: bbcode.php,v 1.36.2.41 2006/02/26 17:34:50 grahamje Exp $
 *
 ***************************************************************************/

/***************************************************************************
 *
 *   This program is free software; you can redistribute it and/or modify
 *   it under the terms of the GNU General Public License as published by
 *   the Free Software Foundation; either version 2 of the License, or
 *   (at your option) any later version.
 *
 ***************************************************************************/

if ( !defined('IN_PHPBB') )
{
    die(
"Hacking attempt");
}

define("BBCODE_UID_LEN"10);

// global that holds loaded-and-prepared bbcode templates, so we only have to do
// that stuff once.

$bbcode_tpl null;

/**
 * Loads bbcode templates from the bbcode.tpl file of the current template set.
 * Creates an array, keys are bbcode names like "b_open" or "url", values
 * are the associated template.
 * Probably pukes all over the place if there's something really screwed
 * with the bbcode.tpl file.
 *
 * Nathan Codding, Sept 26 2001.
 */
function load_bbcode_template()
{
    global 
$template;
    
$tpl_filename $template->make_filename('bbcode.tpl');
    
$tpl fread(fopen($tpl_filename'r'), filesize($tpl_filename));

    
// replace \ with \\ and then ' with \'.
    
$tpl str_replace('\\''\\\\'$tpl);
    
$tpl  str_replace('\'''\\\''$tpl);

    
// strip newlines.
    
$tpl  str_replace("\n"''$tpl);

    
// Turn template blocks into PHP assignment statements for the values of $bbcode_tpls..
    
$tpl preg_replace('#<!-- BEGIN (.*?) -->(.*?)<!-- END (.*?) -->#'"\n" '$bbcode_tpls[\'\\1\'] = \'\\2\';'$tpl);

    
$bbcode_tpls = array();

    eval(
$tpl);

    return 
$bbcode_tpls;
}


/**
 * Prepares the loaded bbcode templates for insertion into preg_replace()
 * or str_replace() calls in the bbencode_second_pass functions. This
 * means replacing template placeholders with the appropriate preg backrefs
 * or with language vars. NOTE: If you change how the regexps work in
 * bbencode_second_pass(), you MUST change this function.
 *
 * Nathan Codding, Sept 26 2001
 *
 */
function prepare_bbcode_template($bbcode_tpl)
{
    global 
$lang;

    
$bbcode_tpl['olist_open'] = str_replace('{LIST_TYPE}''\\1'$bbcode_tpl['olist_open']);

    
$bbcode_tpl['color_open'] = str_replace('{COLOR}''\\1'$bbcode_tpl['color_open']);

    
$bbcode_tpl['size_open'] = str_replace('{SIZE}''\\1'$bbcode_tpl['size_open']);

    
$bbcode_tpl['quote_open'] = str_replace('{L_QUOTE}'$lang['Quote'], $bbcode_tpl['quote_open']);

    
$bbcode_tpl['quote_username_open'] = str_replace('{L_QUOTE}'$lang['Quote'], $bbcode_tpl['quote_username_open']);
    
$bbcode_tpl['quote_username_open'] = str_replace('{L_WROTE}'$lang['wrote'], $bbcode_tpl['quote_username_open']);
    
$bbcode_tpl['quote_username_open'] = str_replace('{USERNAME}''\\1'$bbcode_tpl['quote_username_open']);

    
$bbcode_tpl['code_open'] = str_replace('{L_CODE}'$lang['Code'], $bbcode_tpl['code_open']);

    
$bbcode_tpl['img'] = str_replace('{URL}''\\1'$bbcode_tpl['img']);

    
// We do URLs in several different ways..
    
$bbcode_tpl['url1'] = str_replace('{URL}''\\1'$bbcode_tpl['url']);
    
$bbcode_tpl['url1'] = str_replace('{DESCRIPTION}''\\1'$bbcode_tpl['url1']);

    
$bbcode_tpl['url2'] = str_replace('{URL}''http://\\1'$bbcode_tpl['url']);
    
$bbcode_tpl['url2'] = str_replace('{DESCRIPTION}''\\1'$bbcode_tpl['url2']);

    
$bbcode_tpl['url3'] = str_replace('{URL}''\\1'$bbcode_tpl['url']);
    
$bbcode_tpl['url3'] = str_replace('{DESCRIPTION}''\\2'$bbcode_tpl['url3']);

    
$bbcode_tpl['url4'] = str_replace('{URL}''http://\\1'$bbcode_tpl['url']);
    
$bbcode_tpl['url4'] = str_replace('{DESCRIPTION}''\\3'$bbcode_tpl['url4']);

    
$bbcode_tpl['email'] = str_replace('{EMAIL}''\\1'$bbcode_tpl['email']);

    
define("BBCODE_TPL_READY"true);

    return 
$bbcode_tpl;
}


/**
 * Does second-pass bbencoding. This should be used before displaying the message in
 * a thread. Assumes the message is already first-pass encoded, and we are given the
 * correct UID as used in first-pass encoding.
 */
function bbencode_second_pass($text$uid)
{
    global 
$lang$bbcode_tpl;

    
$text preg_replace('#(script|about|applet|activex|chrome):#is'"\\1:"$text);

    
// pad it with a space so we can distinguish between FALSE and matching the 1st char (index 0).
    // This is important; bbencode_quote(), bbencode_list(), and bbencode_code() all depend on it.
    
$text " " $text;

    
// First: If there isn't a "[" and a "]" in the message, don't bother.
    
if (! (strpos($text"[") && strpos($text"]")) )
    {
        
// Remove padding, return.
        
$text substr($text1);
        return 
$text;
    }

    
// Only load the templates ONCE..
    
if (!defined("BBCODE_TPL_READY"))
    {
        
// load templates from file into array.
        
$bbcode_tpl load_bbcode_template();

        
// prepare array for use in regexps.
        
$bbcode_tpl prepare_bbcode_template($bbcode_tpl);
    }

    
// [CODE] and [/CODE] for posting code (HTML, PHP, C etc etc) in your posts.
    
$text bbencode_second_pass_code($text$uid$bbcode_tpl);
    

   
    
// [QUOTE] and [/QUOTE] for posting replies with quote, or just for quoting stuff.
    
$text str_replace("[quote:$uid]"$bbcode_tpl['quote_open'], $text);
    
$text str_replace("[/quote:$uid]"$bbcode_tpl['quote_close'], $text);

    
// New one liner to deal with opening quotes with usernames...
    // replaces the two line version that I had here before..
    
$text preg_replace("/\[quote:$uid=\"(.*?)\"\]/si"$bbcode_tpl['quote_username_open'], $text);

    
//[list] and[list=x] for (un)ordered lists.
    // unordered lists
    
$text str_replace("[list:$uid]"$bbcode_tpl['ulist_open'], $text);
    
// li tags
    
$text str_replace("[*:$uid]"$bbcode_tpl['listitem'], $text);
    
// ending tags
    
$text str_replace("[/list:u:$uid]"$bbcode_tpl['ulist_close'], $text);
    
$text str_replace("[/list:o:$uid]"$bbcode_tpl['olist_close'], $text);
    
// Ordered lists
    
$text preg_replace("/\[list=([a1]):$uid\]/si"$bbcode_tpl['olist_open'], $text);

    
// colours
    
$text preg_replace("/\[color=(\#[0-9A-F]{6}|[a-z]+):$uid\]/si"$bbcode_tpl['color_open'], $text);
    
$text str_replace("[/color:$uid]"$bbcode_tpl['color_close'], $text);

    
// size
    
$text preg_replace("/\[size=([1-2]?[0-9]):$uid\]/si"$bbcode_tpl['size_open'], $text);
    
$text str_replace("[/size:$uid]"$bbcode_tpl['size_close'], $text);

    
// [b] and [/b] for bolding text.
    
$text str_replace("[b:$uid]"$bbcode_tpl['b_open'], $text);
    
$text str_replace("[/b:$uid]"$bbcode_tpl['b_close'], $text);

    
// [u] and [/u] for underlining text.
    
$text str_replace("[u:$uid]"$bbcode_tpl['u_open'], $text);
    
$text str_replace("[/u:$uid]"$bbcode_tpl['u_close'], $text);

    
// [i] and [/i] for italicizing text.
    
$text str_replace("[i:$uid]"$bbcode_tpl['i_open'], $text);
    
$text str_replace("[/i:$uid]"$bbcode_tpl['i_close'], $text);

    
// Patterns and replacements for URL and email tags..
    
$patterns = array();
    
$replacements = array();

    
// [img]image_url_here[/img] code..
    // This one gets first-passed..
    
$patterns[] = "#\[img:$uid\]([^?](?:[^\[]+|\[(?!url))*?)\[/img:$uid\]#i";
    
$replacements[] = $bbcode_tpl['img'];

    
// matches a [url]xxxx://www.phpbb.com[/url] code..
    
$patterns[] = "#\[url\]([\w]+?://([\w\#$%&~/.\-;:=,?@\]+]+|\[(?!url=))*?)\[/url\]#is";
    
$replacements[] = $bbcode_tpl['url1'];

    
// [url]www.phpbb.com[/url] code.. (no xxxx:// prefix).
    
$patterns[] = "#\[url\]((www|ftp)\.([\w\#$%&~/.\-;:=,?@\]+]+|\[(?!url=))*?)\[/url\]#is";
    
$replacements[] = $bbcode_tpl['url2'];

    
// [url=xxxx://www.phpbb.com]phpBB[/url] code..
    
$patterns[] = "#\[url=([\w]+?://[\w\#$%&~/.\-;:=,?@\[\]+]*?)\]([^?\n\r\t].*?)\[/url\]#is";
    
$replacements[] = $bbcode_tpl['url3'];

    
// [url=www.phpbb.com]phpBB[/url] code.. (no xxxx:// prefix).
    
$patterns[] = "#\[url=((www|ftp)\.[\w\#$%&~/.\-;:=,?@\[\]+]*?)\]([^?\n\r\t].*?)\[/url\]#is";
    
$replacements[] = $bbcode_tpl['url4'];

    
// [email]user@domain.tld[/email] code..
    
$patterns[] = "#\[email\]([a-z0-9&\-_.]+?@[\w\-]+\.([\w\-\.]+\.)?[\w]+)\[/email\]#si";
    
$replacements[] = $bbcode_tpl['email'];

    
$text preg_replace($patterns$replacements$text);

    
// Remove our padding from the string..
    
$text substr($text1);

    return 
$text;

// bbencode_second_pass()

// Need to initialize the random numbers only ONCE
mt_srand( (double) microtime() * 1000000);

function 
make_bbcode_uid()
{
    
// Unique ID for this message..

    
$uid dss_rand();
    
$uid substr($uid0BBCODE_UID_LEN);

    return 
$uid;
}

function 
bbencode_first_pass($text$uid)
{
    
// pad it with a space so we can distinguish between FALSE and matching the 1st char (index 0).
    // This is important; bbencode_quote(), bbencode_list(), and bbencode_code() all depend on it.
    
$text " " $text;

    
// [CODE] and [/CODE] for posting code (HTML, PHP, C etc etc) in your posts.
    
$text bbencode_first_pass_pda($text$uid'[code]''[/code]'''true'');


    
// [QUOTE] and [/QUOTE] for posting replies with quote, or just for quoting stuff.
    
$text bbencode_first_pass_pda($text$uid'[quote]''[/quote]'''false'');
    
$text bbencode_first_pass_pda($text$uid'/\[quote=\\\\&quot;(.*?)\\\\&quot;\]/is''[/quote]'''false''"[quote:$uid=\\\"\\1\\\"]");

    
//[list] and[list=x] for (un)ordered lists.
    
$open_tag = array();
    
$open_tag[0] = "[list]";

    
// unordered..
    
$text bbencode_first_pass_pda($text$uid$open_tag"[/list]""[/list:u]"false'replace_listitems');

    
$open_tag[0] = "[list=1]";
    
$open_tag[1] = "[list=a]";

    
// ordered.
    
$text bbencode_first_pass_pda($text$uid$open_tag"[/list]""[/list:o]",  false'replace_listitems');

    
// [color] and [/color] for setting text color
    
$text preg_replace("#\[color=(\#[0-9A-F]{6}|[a-z\-]+)\](.*?)\[/color\]#si""[color=\\1:$uid]\\2[/color:$uid]"$text);

    
// [size] and [/size] for setting text size
    
$text preg_replace("#\[size=([1-2]?[0-9])\](.*?)\[/size\]#si""[size=\\1:$uid]\\2[/size:$uid]"$text);

    
// [b] and [/b] for bolding text.
    
$text preg_replace("#\[b\](.*?)\[/b\]#si""[b:$uid]\\1[/b:$uid]"$text);

    
// [u] and [/u] for underlining text.
    
$text preg_replace("#\[u\](.*?)\[/u\]#si""[u:$uid]\\1[/u:$uid]"$text);

    
// [i] and [/i] for italicizing text.
    
$text preg_replace("#\[i\](.*?)\[/i\]#si""[i:$uid]\\1[/i:$uid]"$text);

    
// [img]image_url_here[/img] code..
    
$text preg_replace("#\[img\]((http|ftp|https|ftps)://)([^ \?&=\#\"\n\r\t<]*?(\.(jpg|jpeg|gif|png)))\[/img\]#sie""'[img:$uid]\\1' . str_replace(' ', '%20', '\\3') . '[/img:$uid]'"$text);

    
// Remove our padding from the string..
    
return substr($text1);;

// bbencode_first_pass()

/**
 * $text - The text to operate on.
 * $uid - The UID to add to matching tags.
 * $open_tag - The opening tag to match. Can be an array of opening tags.
 * $close_tag - The closing tag to match.
 * $close_tag_new - The closing tag to replace with.
 * $mark_lowest_level - boolean - should we specially mark the tags that occur
 *                     at the lowest level of nesting? (useful for [code], because
 *                        we need to match these tags first and transform HTML tags
 *                        in their contents..
 * $func - This variable should contain a string that is the name of a function.
 *                That function will be called when a match is found, and passed 2
 *                parameters: ($text, $uid). The function should return a string.
 *                This is used when some transformation needs to be applied to the
 *                text INSIDE a pair of matching tags. If this variable is FALSE or the
 *                empty string, it will not be executed.
 * If open_tag is an array, then the pda will try to match pairs consisting of
 * any element of open_tag followed by close_tag. This allows us to match things
 * like[list=A]...[/list]and[list=1]...[/list]in one pass of the PDA.
 *
 * NOTES:    - this function assumes the first character of $text is a space.
 *                - every opening tag and closing tag must be of the [...] format.
 */
function bbencode_first_pass_pda($text$uid$open_tag$close_tag$close_tag_new$mark_lowest_level$func$open_regexp_replace false)
{
    
$open_tag_count 0;

    if (!
$close_tag_new || ($close_tag_new == ''))
    {
        
$close_tag_new $close_tag;
    }

    
$close_tag_length strlen($close_tag);
    
$close_tag_new_length strlen($close_tag_new);
    
$uid_length strlen($uid);

    
$use_function_pointer = ($func && ($func != ''));

    
$stack = array();

    if (
is_array($open_tag))
    {
        if (
== count($open_tag))
        {
            
// No opening tags to match, so return.
            
return $text;
        }
        
$open_tag_count count($open_tag);
    }
    else
    {
        
// only one opening tag. make it into a 1-element array.
        
$open_tag_temp $open_tag;
        
$open_tag = array();
        
$open_tag[0] = $open_tag_temp;
        
$open_tag_count 1;
    }

    
$open_is_regexp false;

    if (
$open_regexp_replace)
    {
        
$open_is_regexp true;
        if (!
is_array($open_regexp_replace))
        {
            
$open_regexp_temp $open_regexp_replace;
            
$open_regexp_replace = array();
            
$open_regexp_replace[0] = $open_regexp_temp;
        }
    }

    if (
$mark_lowest_level && $open_is_regexp)
    {
        
message_die(GENERAL_ERROR"Unsupported operation for bbcode_first_pass_pda().");
    }

    
// Start at the 2nd char of the string, looking for opening tags.
    
$curr_pos 1;
    while (
$curr_pos && ($curr_pos strlen($text)))
    {
        
$curr_pos strpos($text"["$curr_pos);

        
// If not found, $curr_pos will be 0, and the loop will end.
        
if ($curr_pos)
        {
            
// We found a [. It starts at $curr_pos.
            // check if it's a starting or ending tag.
            
$found_start false;
            
$which_start_tag "";
            
$start_tag_index = -1;

            for (
$i 0$i $open_tag_count$i++)
            {
                
// Grab everything until the first "]"...
                
$possible_start substr($text$curr_posstrpos($text']'$curr_pos 1) - $curr_pos 1);

                
//
                // We're going to try and catch usernames with "[' characters.
                //
                
if( preg_match('#\[quote=\\\&quot;#si'$possible_start$match) && !preg_match('#\[quote=\\\&quot;(.*?)\\\&quot;\]#si'$possible_start) )
                {
                    
// OK we are in a quote tag that probably contains a ] bracket.
                    // Grab a bit more of the string to hopefully get all of it..
                    
if ($close_pos strpos($text'&quot;]'$curr_pos 14))
                    {
                        if (
strpos(substr($text$curr_pos 14$close_pos - ($curr_pos 14)), '[quote') === false)
                        {
                            
$possible_start substr($text$curr_pos$close_pos $curr_pos 7);
                        }
                    }
                }

                
// Now compare, either using regexp or not.
                
if ($open_is_regexp)
                {
                    
$match_result = array();
                    if (
preg_match($open_tag[$i], $possible_start$match_result))
                    {
                        
$found_start true;
                        
$which_start_tag $match_result[0];
                        
$start_tag_index $i;
                        break;
                    }
                }
                else
                {
                    
// straightforward string comparison.
                    
if (== strcasecmp($open_tag[$i], $possible_start))
                    {
                        
$found_start true;
                        
$which_start_tag $open_tag[$i];
                        
$start_tag_index $i;
                        break;
                    }
                }
            }

            if (
$found_start)
            {
                
// We have an opening tag.
                // Push its position, the text we matched, and its index in the open_tag array on to the stack, and then keep going to the right.
                
$match = array("pos" => $curr_pos"tag" => $which_start_tag"index" => $start_tag_index);
                
array_push($stack$match);
                
//
                // Rather than just increment $curr_pos
                // Set it to the ending of the tag we just found
                // Keeps error in nested tag from breaking out
                // of table structure..
                //
                
$curr_pos += strlen($possible_start);
            }
            else
            {
                
// check for a closing tag..
                
$possible_end substr($text$curr_pos$close_tag_length);
                if (
== strcasecmp($close_tag$possible_end))
                {
                    
// We have an ending tag.
                    // Check if we've already found a matching starting tag.
                    
if (sizeof($stack) > 0)
                    {
                        
// There exists a starting tag.
                        
$curr_nesting_depth sizeof($stack);
                        
// We need to do 2 replacements now.
                        
$match array_pop($stack);
                        
$start_index $match['pos'];
                        
$start_tag $match['tag'];
                        
$start_length strlen($start_tag);
                        
$start_tag_index $match['index'];

                        if (
$open_is_regexp)
                        {
                            
$start_tag preg_replace($open_tag[$start_tag_index], $open_regexp_replace[$start_tag_index], $start_tag);
                        }

                        
// everything before the opening tag.
                        
$before_start_tag substr($text0$start_index);

                        
// everything after the opening tag, but before the closing tag.
                        
$between_tags substr($text$start_index $start_length$curr_pos $start_index $start_length);

                        
// Run the given function on the text between the tags..
                        
if ($use_function_pointer)
                        {
                            
$between_tags $func($between_tags$uid);
                        }

                        
// everything after the closing tag.
                        
$after_end_tag substr($text$curr_pos $close_tag_length);

                        
// Mark the lowest nesting level if needed.
                        
if ($mark_lowest_level && ($curr_nesting_depth == 1))
                        {
                            if (
$open_tag[0] == '[code]')
                            {
                                
$code_entities_match = array('#<#''#>#''#"#''#:#''#\[#''#\]#''#\(#''#\)#''#\{#''#\}#');
                                
$code_entities_replace = array('&lt;''&gt;''&quot;'':''['']''('')''{''}');
                                
$between_tags preg_replace($code_entities_match$code_entities_replace$between_tags);
                            }
                            
$text $before_start_tag substr($start_tag0$start_length 1) . ":$curr_nesting_depth:$uid]";
                            
$text .= $between_tags substr($close_tag_new0$close_tag_new_length 1) . ":$curr_nesting_depth:$uid]";
                        }
                        else
                        {
                            if (
$open_tag[0] == '[code]')
                            {
                                
$text $before_start_tag '[code]';
                                
$text .= $between_tags '[/code]';
                            }
                            else
                            {
                                if (
$open_is_regexp)
                                {
                                    
$text $before_start_tag $start_tag;
                                }
                                else
                                {
                                    
$text $before_start_tag substr($start_tag0$start_length 1) . ":$uid]";
                                }
                                
$text .= $between_tags substr($close_tag_new0$close_tag_new_length 1) . ":$uid]";
                            }
                        }

                        
$text .= $after_end_tag;

                        
// Now.. we've screwed up the indices by changing the length of the string.
                        // So, if there's anything in the stack, we want to resume searching just after it.
                        // otherwise, we go back to the start.
                        
if (sizeof($stack) > 0)
                        {
                            
$match array_pop($stack);
                            
$curr_pos $match['pos'];
//                            bbcode_array_push($stack, $match);
//                            ++$curr_pos;
                        
}
                        else
                        {
                            
$curr_pos 1;
                        }
                    }
                    else
                    {
                        
// No matching start tag found. Increment pos, keep going.
                        
++$curr_pos;
                    }
                }
                else
                {
                    
// No starting tag or ending tag.. Increment pos, keep looping.,
                    
++$curr_pos;
                }
            }
        }
    } 
// while

    
return $text;

// bbencode_first_pass_pda()

/**
 * Does second-pass bbencoding of the [code] tags. This includes
 * running htmlspecialchars() over the text contained between
 * any pair of [code] tags that are at the first level of
 * nesting. Tags at the first level of nesting are indicated
 * by this format: [code:1:$uid] ... [/code:1:$uid]
 * Other tags are in this format: [code:$uid] ... [/code:$uid]
 */
function bbencode_second_pass_code($text$uid$bbcode_tpl)
{
    global 
$lang;

    
$code_start_html $bbcode_tpl['code_open'];
    
$code_end_html =  $bbcode_tpl['code_close'];

    
// First, do all the 1st-level matches. These need an htmlspecialchars() run,
    // so they have to be handled differently.
    
$match_count preg_match_all("#\[code:1:$uid\](.*?)\[/code:1:$uid\]#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 "[code:1:$uid]" $before_replace "[/code:1:$uid]";

        
$replacement $code_start_html;
        
$replacement .= $after_replace;
        
$replacement .= $code_end_html;

        
$text str_replace($str_to_match$replacement$text);
    }

    
// Now, do all the non-first-level matches. These are simple.
    
$text str_replace("[code:$uid]"$code_start_html$text);
    
$text str_replace("[/code:$uid]"$code_end_html$text);

    return 
$text;

// bbencode_second_pass_code()

/**
 * Rewritten by Nathan Codding - Feb 6, 2001.
 * - Goes through the given string, and replaces xxxx://yyyy with an HTML <a> tag linking
 *     to that URL
 * - Goes through the given string, and replaces www.xxxx.yyyy[zzzz] with an HTML <a> tag linking
 *     to http://www.xxxx.yyyy[/zzzz]
 * - Goes through the given string, and replaces xxxx@yyyy with an HTML mailto: tag linking
 *        to that email address
 * - Only matches these 2 patterns either after a space, or at the beginning of a line
 *
 * Notes: the email one might get annoying - it's easy to make it more restrictive, though.. maybe
 * have it require something like xxxx@yyyy.zzzz or such. We'll see.
 */
function make_clickable($text)
{
    
$text preg_replace('#(script|about|applet|activex|chrome):#is'"\\1:"$text);

    
// pad it with a space so we can match things at the start of the 1st line.
    
$ret ' ' $text;

    
// matches an "xxxx://yyyy" URL at the start of a line, or after a space.
    // xxxx can only be alpha characters.
    // yyyy is anything up to the first space, newline, comma, double quote or <
    
$ret preg_replace("#(^|[\n ])([\w]+?://[\w\#$%&~/.\-;:=,?@\[\]+]*)#is""\\1<a href=\"\\2\" target=\"_blank\">\\2</a>"$ret);

    
// matches a "www|ftp.xxxx.yyyy[/zzzz]" kinda lazy URL thing
    // Must contain at least 2 dots. xxxx contains either alphanum, or "-"
    // zzzz is optional.. will contain everything up to the first space, newline, 
    // comma, double quote or <.
    
$ret preg_replace("#(^|[\n ])((www|ftp)\.[\w\#$%&~/.\-;:=,?@\[\]+]*)#is""\\1<a href=\"http://\\2\" target=\"_blank\">\\2</a>"$ret);

    
// matches an email@domain type address at the start of a line, or after a space.
    // Note: Only the followed chars are valid; alphanums, "-", "_" and or ".".
    
$ret preg_replace("#(^|[\n ])([a-z0-9&\-_.]+?)@([\w\-]+\.([\w\-\.]+\.)*[\w]+)#i""\\1<a href=\"mailto:\\2@\\3\">\\2@\\3</a>"$ret);

    
// Remove our padding..
    
$ret substr($ret1);

    return(
$ret);
}

/**
 * Nathan Codding - Feb 6, 2001
 * Reverses the effects of make_clickable(), for use in editpost.
 * - Does not distinguish between "www.xxxx.yyyy" and "http://aaaa.bbbb" type URLs.
 *
 */
function undo_make_clickable($text)
{
    
$text preg_replace("#<!-- BBCode auto-link start --><a href=\"(.*?)\" target=\"_blank\">.*?</a><!-- BBCode auto-link end -->#i""\\1"$text);
    
$text preg_replace("#<!-- BBcode auto-mailto start --><a href=\"mailto:(.*?)\">.*?</a><!-- BBCode auto-mailto end -->#i""\\1"$text);

    return 
$text;

}

/**
 * Nathan Codding - August 24, 2000.
 * Takes a string, and does the reverse of the PHP standard function
 * htmlspecialchars().
 */
function undo_htmlspecialchars($input)
{
    
$input preg_replace("/&gt;/i"">"$input);
    
$input preg_replace("/&lt;/i""<"$input);
    
$input preg_replace("/&quot;/i""\""$input);
    
$input preg_replace("/&amp;/i""&"$input);

    return 
$input;
}

/**
 * This is used to change a[*] tag into a [*:$uid] tag as part
 * of the first-pass bbencoding of[list] tags. It fits the
 * standard required in order to be passed as a variable
 * function into bbencode_first_pass_pda().
 */
function replace_listitems($text$uid)
{
    
$text str_replace("[*]""[*:$uid]"$text);

    return 
$text;
}

/**
 * Escapes the "/" character with "\/". This is useful when you need
 * to stick a runtime string into a PREG regexp that is being delimited
 * with slashes.
 */
function escape_slashes($input)
{
    
$output str_replace('/''\/'$input);
    return 
$output;
}

/**
 * This function does exactly what the PHP4 function array_push() does
 * however, to keep phpBB compatable with PHP 3 we had to come up with our own
 * method of doing it.
 * This function was deprecated in phpBB 2.0.18
 */
function bbcode_array_push(&$stack$value)
{
   
$stack[] = $value;
   return(
sizeof($stack));
}

/**
 * This function does exactly what the PHP4 function array_pop() does
 * however, to keep phpBB compatable with PHP 3 we had to come up with our own
 * method of doing it.
 * This function was deprecated in phpBB 2.0.18
 */
function bbcode_array_pop(&$stack)
{
   
$arrSize count($stack);
   
$x 1;

   while(list(
$key$val) = each($stack))
   {
      if(
$x count($stack))
      {
             
$tmpArr[] = $val;
      }
      else
      {
             
$return_val $val;
      }
      
$x++;
   }
   
$stack $tmpArr;

   return(
$return_val);
}

//
// Smilies code ... would this be better tagged on to the end of bbcode.php?
// Probably so and I'll move it before B2
//
function smilies_pass($message)
{
    static 
$orig$repl;

    if (!isset(
$orig))
    {
        global 
$db$board_config;
        
$orig $repl = array();

        
$sql 'SELECT * FROM ' SMILIES_TABLE;
        if( !
$result $db->sql_query($sql) )
        {
            
message_die(GENERAL_ERROR"Couldn't obtain smilies data"""__LINE____FILE__$sql);
        }
        
$smilies $db->sql_fetchrowset($result);

        if (
count($smilies))
        {
            
usort($smilies'smiley_sort');
        }

        for (
$i 0$i count($smilies); $i++)
        {
            
$orig[] = "/(?<=.\W|\W.|^\W)" preg_quote($smilies[$i]['code'], "/") . "(?=.\W|\W.|\W$)/";
            
$repl[] = '<img src="'$board_config['smilies_path'] . '/' $smilies[$i]['smile_url'] . '" alt="' $smilies[$i]['emoticon'] . '" border="0" />';
        }
    }

    if (
count($orig))
    {
        
$message preg_replace($orig$repl' ' $message ' ');
        
$message substr($message1, -1);
    }
    
    return 
$message;
}

function 
smiley_sort($a$b)
{
    if ( 
strlen($a['code']) == strlen($b['code']) )
    {
        return 
0;
    }

    return ( 
strlen($a['code']) > strlen($b['code']) ) ? -1;
}

?>
... die interessante Funktion scheint diese hier zu sein:
PHP-Code:
function bbencode_second_pass_code($text$uid$bbcode_tpl)
{
    global 
$lang;

    
$code_start_html $bbcode_tpl['code_open'];
    
$code_end_html =  $bbcode_tpl['code_close'];

    
// First, do all the 1st-level matches. These need an htmlspecialchars() run,
    // so they have to be handled differently.
    
$match_count preg_match_all("#\[code:1:$uid\](.*?)\[/code:1:$uid\]#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 "[code:1:$uid]" $before_replace "[/code:1:$uid]";

        
$replacement $code_start_html;
        
$replacement .= $after_replace;
        
$replacement .= $code_end_html;

        
$text str_replace($str_to_match$replacement$text);
    }

    
// Now, do all the non-first-level matches. These are simple.
    
$text str_replace("[code:$uid]"$code_start_html$text);
    
$text str_replace("[/code:$uid]"$code_end_html$text);

    return 
$text;


Da ich php nicht wirklich gut kann, und auch das ganze phpbb Forensystem (wie der Source aufgebaut ist, wie es funktioniert usw) nicht gerade gut kenne, wäre ich um Hilfe dankbar. Wenn ich beim return $text; ansetzte, und in etwa return hilight_ahk($text); dafür verwende, könnte das in die richtige Richtung gehen? (Ich kann das nicht allzueinfach testen...)

Ein weiteres Problem ist dann noch das einfärben, besonders, wenn das ganze vom restlichen code getrennt sein muss/sollte... (css auslagern?) Auch sollte das ganze auf verschiedenen Themes laufen, also evt. auf Einstellungen der Themes rücksicht nehmen :/
  Mit Zitat antworten
Alt 08.01.08, 14:07   #9 (permalink)
 
Registriert seit: 17.02.06
Harry Boeck Leistung: Facit NTK
Likes: 0
Standard

Optimierung des Aufwand-Nutzen-Verhältnisses:

Wenn Du WIRKLICH NUR Kommentare hervorgehoben haben willst und das auch nur so wie im Forum von Autohotkey (wobei ich mich der Empfehlung anschließen kann, auf client-seitiges Javascript zu verzichten: Ich konnte zuerst gar nicht erfassen, worum es Dir ging, weil bei mir kein Syntaxhighlighting zu sehen war...), bist Du mit einem einfachen reg_replace aus dem Stand heraus korrekt bedient (weil die das dort genau so machen).

Wenn Du "richtiges" Syntax-Highlighting machen willst, wirst Du um die extra Behandlung aller einzufärbenden Fälle nicht umhinkommen, wobei Du das in weiter Skalierung auslegen kannst (von einfachen Schlüsselzeichen-getriggerten Einfärbungen bis zur kompletten Compilierung mir Einfärbung von Fehlern - nur mal als Anregung).

(Die Behandlung von dem "BBCode" würde ich nicht als relevant für dieses Thema ansehen: Dort geht es um den Ersatz von BBCode-Tags durch HTML-Tags. Das ist was ganz anderes als planen Programmtext zu analysieren und umzusetzen.)
Edit: Das war Quatsch: Ich hatte vergessen, daß es ja eben um eine PHPBB-Änderung geht...

----

Nebenfrage (etwas Off-Topic):

Hat jemand eine Ahnung, ob und wie man die Standard-Einfärbung von PHP-"highlight_file" anständig ersetzen kann?

Was man AUCH (aber nicht sehr systematisch) machen kann, ist im nachhinein nochmal die dort gesetzten Attribute gegen eigenes css austauschen. Das funktioniert aber nicht mit unterschiedlichen Elementen, die standardmäßig gleich eingefärbt werden...
Harry Boeck ist offline   Mit Zitat antworten
Alt 08.01.08, 14:25   #10 (permalink)
Administrator
 
Benutzerbild von Mackz
 
Registriert seit: 02.10.01
Mackz Leistung: Pentium IMackz Leistung: Pentium I
Likes: 30
Standard

Zitat:
Original von IsNull
Wenn ich beim return $text; ansetzte, und in etwa return hilight_ahk($text); dafür verwende, könnte das in die richtige Richtung gehen?
So wie ich das sehe, solltest du das vor
Code:
 $text = str_replace("[code:$uid]", $code_start_html, $text);
    $text = str_replace("[/code:$uid]", $code_end_html, $text);
machen, da dort der $code_start_html und $code_end_html auch eingefärbt werden würde, und die Codebox dadurch fehlerhaft dargestellt werden würde.

Zitat:
(Ich kann das nicht allzueinfach testen...)
Installiert dir doch einfach XAMPP zum Testen.

Zitat:
Ein weiteres Problem ist dann noch das einfärben, besonders, wenn das ganze vom restlichen code getrennt sein muss/sollte... (css auslagern?) Auch sollte das ganze auf verschiedenen Themes laufen, also evt. auf Einstellungen der Themes rücksicht nehmen :/
Wenn du das für verschiedene Themes anpassen willst, würde ich den CSS Code auslagern. Zum Beispiel <span class="code-blau">$code</span> könntest du so das blau für dunkle und helle Themes variieren.
__________________
RL sux big time... auch 2012!

Deleting pr0n is like killing your best friend

[HaBo] bei Facebook - Werde Fan
Mackz ist offline   Mit Zitat antworten
Alt 08.01.08, 22:47   #11 (permalink)
IsNull
Guest
 
Likes:
Standard

Danke, ich glaube ich brings jetzt hin

Ich häkle das thema aber noch nicht ab, da ich bei etwaigen Problemen hier noch weiter nerven werde
EDIT:
Zu früh gefreut

Ich habe folgende Funktion geschrieben... In meinem künstlichen test-script funzts, aber im Forum nicht wirklich... Es wirbelt den html ziemlich durcheinander :/ (Plötzlich mehr Abstände usw. usf)

Und ja, der Code ist nicht gerade elegant - ich musste fast jeden Befehl im Wiki nachlagen gehen, von daher...^^ Ich habe Null erfahrung mit PHP -also henkt mich nicht gleich.
PHP-Code:
  function highlight_ahk($codeIN) {
      
//erstellt einen Array mit je einer Zeile code:
      
$lines explode("\n"$codeIN);

   
      
//parst sämtliche Linien einzeln durch:-------------------------------------------------------
      
foreach ($lines as $a_line) {
        
$needle ";";
        
$needle_esc1 "\\";
        
$needle_esc2 "`";

        
$pos strpos($a_line$needle);
        
        if (
$pos === false) {
              
//Der String ';' wurde NICHT gefunden!
            
$hiliCODE .= "\n $a_line";
        } else {
            
//Der String wurde gefunden!
            
            
if ($pos == 0) {
            
// wenn das ';' Zeichen ganz am anfang steht, alles "kommentieren"
                  
$hiliCODE .= "<div class=\"code-comment\">$a_line</div>";
            }else{
            
//sonst testen, ob unmitelbar vor ';' ein escapezeichen ist:           
                  
$escapepos_probly $pos 1;
                  
$escapepos strpos(substr($a_line,$escapepos_probly,),$needle_esc2);
                  
$escapepos2 strpos(substr($a_line,$escapepos_probly,),$needle_esc1);
                  
                  if (
$escapepos === false && $escapepos2 === false) {
                       
//Ein escape wurde NICHT gefunden -> alles "kommentieren"
                       
                       //vordererteil alles bis zum ';' Zeichen
                       
$vorderer_code substr($a_line0$pos);
                       
                       
//Rest
                       
$fulllengt strlen($a_line);
                       
$rest_code substr($a_line$pos$fulllengt);
    
                       
//Kommentar basteln
                       
$hiliCODE .= "$vorderer_code<span class=\"code-comment\">$rest_code</span>";
    
                  } else {
                        
//ein escape wurde gefunden, somit ist das ; Zeichen ungültig -> nix machen...
                        
$hiliCODE .= "\n $a_line";
                  }
            }         
        }
      }
      
//--------------------------------------------------------------------------------------------

      
return $hiliCODE;
    } 
Das ganze überfordert mich an allen Ecken und Enden... jetzt scheint nähmlich Html selber noch recht wichtig zu werden, da ich anscheinend damit Konflickte verursache. Und das testen ist auch recht mühsam. (Ich habe hier einen Server, auf dem ein alter Stand des Forums ist, mit dem übe ich zur Zeit Trotzdem ist es sehr mühsam - man kann vorallem keine variabeln mal einfach so ausgeben/anzeigen laseen -> sonst landet es im quelltext)
  Mit Zitat antworten
Antwort
   
- Anzeige -

Werbung ist gerade online    

[HaBo] » Software Home » Code Kitchen » Phpbb Forum: Code tags
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind aus
Pingbacks sind aus
Refbacks sind aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Forum phpBB ein weiteres Problem Landra (Web-) Design und webbasierte Sprachen 8 17.11.09 22:17
Forum phpBB Landra (Web-) Design und webbasierte Sprachen 8 04.07.09 12:42
Wiki-Tags 2Bios Hackerboard.de-Feedback 13 10.07.07 15:13
Editieren + Code-Tags unter erweitertem Editor Gottzilla Hackerboard.de-Feedback 3 27.10.05 15:56


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61