Jump to content
InvisionCommunity.de - Der Deutsche Invision Community Support
Sign in to follow this  
TomCrow

Mehr/eigene BBCodes erstellen

Recommended Posts

Hi @ll!

Ich suche eine Möglichkeit, eigene BBCodes in die post_parser.php einzutragen.

Ich weiß, dass es dafür einen Mod gibt - der Grund, warum ich das selber machen will, ist:

1.) ich möchte die 'normale' Textformatierung erhalten und nicht mit buttons "überladen" (wer die codes verwenden will, muss sie selber eintippen ;) )

2.) ich möchte die Möglichkeit haben, die codes einzeln einzubauen bzw. abzuschalten (je nachdem, was ankommt, und was nicht ;) )

Ich hab bei ibplanet ein Tutorial gefunden, dass die grundlegende Vorgangsweise erklärt:

es funktioniert immer nach dem Schema

      $txt = 

      preg_replace("#\[something\](.+?)\[/something\]#is","<somehtml>\\1</somehtml>", 

      $txt);
bzw.
$txt = 

preg_replace("#<somehtml>(.+?)</somehtml>#is","\[something\]\\1\[/something\]", 

$txt);
für die Rückkonvertierung.. So kann man z.B. erreichen, dass aus [c][/c] der HTML Befehl <center></center> wird. Nun zu meinem eigentlichen Problem: wie kann ich vorgehen, damit ich bei meinem BBCode auch noch (einen oder mehrere) Parameter angeben kann, also z.B. [glow=red] [/glow] sollte dann in etwa
<font style="FILTER: Glow(Color=red, Strength=3); width=100%;"> </font>
werden.. (sodaß ich dann z.B. 4 ,5 verschiedene Glowfarben angeben kann, die dann übernommen werden) Bei den schon vorhandenen Codes Schriftart, -größe und -farbe funktioniert dies ja bereits standardmäßig. Ich denke mal, dass diese Teile
            // font size, colour and font style

            // [font=courier]Text here[/font]  [size=6]Text here[/size]  [color=red]Text here[/color]


            while ( preg_match( "#\[size=([^\]]+)\](.+?)\[/size\]#ies", $txt ) )

            {

                $txt = preg_replace( "#\[size=([^\]]+)\](.+?)\[/size\]#ies"    , "\$this->regex_font_attr(array('s'=>'size','1'=>'\\1','2'=>'\\2'))", $txt );

            }


            while ( preg_match( "#\[font=([^\]]+)\](.*?)\[/font\]#ies", $txt ) )

            {

                $txt = preg_replace( "#\[font=([^\]]+)\](.*?)\[/font\]#ies"    , "\$this->regex_font_attr(array('s'=>'font','1'=>'\\1','2'=>'\\2'))", $txt );

            }


            while( preg_match( "#\[color=([^\]]+)\](.+?)\[/color\]#ies", $txt ) )

            {

                $txt = preg_replace( "#\[color=([^\]]+)\](.+?)\[/color\]#ies"  , "\$this->regex_font_attr(array('s'=>'col' ,'1'=>'\\1','2'=>'\\2'))", $txt );

            }



        }
und
           $txt = preg_replace( "#<span style=['\"]font-size:(.+?)pt;line-height:100%['\"]>(.+?)</span>#se" , "\$this->unconvert_size('\\1', '\\2')", $txt );


            while ( preg_match( "#<span style=['\"]color:(.+?)['\"]>(.+?)</span>#is", $txt ) )

            {

                $txt = preg_replace( "#<span style=['\"]color:(.+?)['\"]>(.+?)</span>#is"    , "\[color=\\1\]\\2\[/color\]", $txt );

            }


            $txt = preg_replace( "#<span style=['\"]font-family:(.+?)['\"]>(.+?)</span>#is", "\[font=\\1\]\\2\[/font\]", $txt );

der post_parser.php dafür verantwortlich sind..

Kann mich jemand "in die richtige Richtung" schubsen und ev. eine Beispielzeile posten?

Vielen Dank im voraus..

Tom

Share this post


Link to post

Da ich gerade nicht wirklich Zeit habe und meine Mitterpause in Kürze vorbei ist, nur mal kurz die Codefetzen erklärt, die du da gepostet hast.

Im Endeffekt ist das ein regulärer Ausdruck, der verschiedene Stellen rausfiltert.

            while ( preg_match( "#\]+)\](.+?)\[/size\]#ies", $txt ) )

          {

              $txt = preg_replace( "#\([^\]]+)\](.+?)\[/size\]#ies"    , "\$this->regex_font_attr(array('s'=>'size','1'=>'\\1','2'=>'\\2'))", $txt );

          }

In runden Klammern wird immer eine gesuchte Gruppe gekenntzeichnet. Diese werden dann mittels \\X weitergegeben und in dem Beispiel an eine Methode regex_font_attr. Das X steht jeweils für die x. Klammer, somit ist \\1 das Ergebnis, was in der blau markierten Klammer gefunden wird und \\2 für das Resultat aus der rot markierte Klammer.

Ich weiß nicht wie fit du in regulären Ausdrücken bist, die erste Klammer bedeutet folgendes:

[] => Menge von Zeichen, die vorkommen dürfen. Da direkt am Anfang ein ^ steht, ist es eine Invertierung, sprich die Zeichen, die in dieser Menge angegeben sind, dürfen nicht vorkommen. Hier wäre es das Zeichen ], was durch den Backslah den Sonderzeichenstatus enzogen bekommen hat.

+ => Bedeutet, das mindestens ein Zeichen aus der Menge (bzw. hier alle andere außer die in der Menge vorhandenen Zeichen) vorkommen muß.

Hoffe, das hat dir schon mal ein wenig geholfen. :)

Share this post


Link to post

Erstmal :thumb_up: dafür, dass Du Dich in Deiner Mittagspause durch meine codeschnipsel ackerst.. :)

Ein bisschen was dämmert schon - ich versteh' jetzt den Aufbau schon eher.. ;)

Werd' ein bisschen damit experimentieren und meine "Ergebnisse" dann posten - ev. kann's ja noch jemand dann verwenden..

mfg,

Tom

Share this post


Link to post

Die Funktion regex_font_attr sieht original so aus..

    /**************************************************/

    // regex_font_attr:

    // Returns a string for an /e regexp based on the input

    /**************************************************/


    function regex_font_attr($IN) {

        if (!is_array($IN)) return "";


        // Trim out stoopid 1337 stuff

        // [color=black;font-size:500pt;border:orange 50in solid;]hehe[/color]


        if ( preg_match( "/;/", $IN['1'] ) )

        {

            $attr = explode( ";", $IN['1'] );


            $IN['1'] = $attr[0];

        }


        $IN['1'] = preg_replace( "/[&\(\)\.\%]/", "", $IN['1'] );


        if ($IN['s'] == 'size')

        {

            $IN['1'] = $IN['1'] + 7;


            if ($IN['1'] > 30)

            {

                $IN['1'] = 30;

            }


            return "<span style='font-size:".$IN['1']."pt;line-height:100%'>".$IN['2']."</span>";

        }

        else if ($IN['s'] == 'col')

        {

            return "<span style='color:".$IN['1']."'>".$IN['2']."</span>";

        }

        else if ($IN['s'] == 'font')

        {

            return "<span style='font-family:".$IN['1']."'>".$IN['2']."</span>";

        }

    }

Ziemlich kompliziert.. :blush:

Ich denke, es ist nicht gut, da noch meine zusätzlichen Codes mitreinzunehmen.. :unsure:

Sauberer wäre es wohl, eine eigene Funktion zu schreiben - ich glaube, mit arrays wäre es auch möglich, mehrere Parameter zu übernehmen (z.B. bei FILTER: Shadow Werte für Color und Direction)..

Spare ich damit codezeilen, wenn ich solche Funktionen einsetze (denn einfacher - für mich jedenfalls ;) - wäre es wohl, z.B. für 5 Glow-Farben 5 Codes zu belegen, z.B. glowred, glowyellow, usw..) - ich les' noch ein bissl bei selfphp.. ;)

Tom

Edited by TomCrow

Share this post


Link to post

Meine Experimente sind im Moment hier:

$text = preg_replace( "#\[glow=([red|blue|yellow]+)\](.+?)\[/glow\]#is", "<span style=\"filter: Glow(Color=\\1, Strength=3); Width=100%;\">\\2</span>", $text );

(bitte nicht zu lange lachen ;) )

scheint zu funktionieren..

Aus

[glow=red]Test[/glow]

wird

<span style="filter: Glow(Color=red, Strength=3); Width=100%;">Test</span>

erlaubt sind glow=red, blue oder yellow..

Wie könnt ich es jetzt schaffen, dass er noch einen weiteren Parameter einliest?

Also z.B. \\1 für Color, \\2 für Strength und \\3 für den eigentlichen Text.

Ich denke da in etwas wie [glow=red,3]blabla[/glow] - wie kann ich es anstellen, dass das , (oder ein anderes Zeichen) im preg_replace als Trenner erkannt wird?

Wenn ich das hätte, könnte ich wohl alle übrigen Möglichkeiten abdecken.. ;)

Tom

Share this post


Link to post

ok, das mit den komplexen codes habe ich aufgegeben..ich hab' es nicht geschafft, diese dann zurück zu konvertieren (braucht man ja, wenn ein z.B. posting editiert wird..) :rolleyes:

Hab' aber noch ein paar Fragen zur preg_replace in der post_parser.php:

mir ist aufgefallen, dass z.B. das

(C)
zu dem © umgewandelt wird. Nun dachte ich mir, diese Möglichkeit könnte man doch auch nützen, wenn man einfache "codes" einbauen will, wo kein Text zwischen zwei tags steht.. z.B. ein <hr> Für das Copyright-Zeichen sieht der code in der post_parser so aus:
$txt = preg_replace( "#\(c\)#i"     , "&copy;" , $txt );
Dieses wird anscheinend auch nicht zurückkonvertiert.. Hab' jetzt mal probehalber
$txt = preg_replace( "#\[hr\]#i"     , "<hr>"  , $txt );
eingebaut, damit aus dem tag
eine Trennlinie wird. Das muss natürlich schon zurückverwandelt werden, sonst hat man nach dem Editieren eines Beitrages ja wieder <hr> statt der Linie ;) also weiter unten in der post_parser (wo auf das TM bezug genommen wird):
$txt = preg_replace( "#<hr>#i", "\[hr\]", $txt );
1.) Ist das so in Ordnung, oder laufe ich da Gefahr, dass irgendwann irgendwo etwas falsch "geparst" wird?? 2.) Kann ich das noch erweitern, indem ich z.B. einen tag [punkt] einbaue, der dann diesen Punkt ·, also & #183; anzeigt?
$txt = preg_replace( "#\[punkt\]#i"     , "& #183;"  , $txt );
und
$txt = preg_replace( "#&\#183;#i", "[punkt]", $txt );

(funktionieren tut es, aber - wie oben - ist das auch ok so..?)

3.) Kann man in dem Teil auch gleich Umlaute & Sonderzeichen in die &uuml; usw. umwandeln lassen?

4.) Hab' leider auch noch nichts über die switches i, is, usw. in der preg_replace gefunden - wofür stehen die..?

Viele Fragen :rolleyes: , aber ich denke, von jemandem, der sich damit auskennt, rel. schnell zu beantworten.. :blush:

mfg,

Tom

Edited by TomCrow

Share this post


Link to post

Zu deinem BB Codes Problem: Wieso nutzt du nicht einfacherkeitshalber Peters Mod dazu? Damit kannst du einfach im AdminCP diese "BB Codes" anlegen, auch wenn gewünscht Buttons dazu anlegen etc. PP. Denn die "Buttons" die musst du bei dem Mod nicht miterstellen, das kannst du auch weglassen. Somit wärst du dann damit besser bediehnt.

Share this post


Link to post

Ja, ich hab' mich schon überzeugen lassen und den mod genommen - wenn man's erstmal durchschaut, ist es damit wirklich einfacher..

Nur - soweit ich das bisher gesehen hab' - gibt es bei den SimpleBBCodes keine Möglichkeit, nur den tag, aber keinen Button zu erstellen..

Und die DefaultBBCodes sind eigentlich ja immer in der Art [tag]<param1>[/tag] - wahrscheinlich könnt' ich es nur mit [tag] lösen und das <param1>[/tag] weglassen (bei <hr> gibt's ja eigentlich kein <param1> ;) )..

Tom

Share this post


Link to post

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this  

×