Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]11637[/thread]

Tags finden (Seite 2)

Leser: 1


<< |< 1 2 3 >| >> 22 Einträge, 3 Seiten
Froschpopo
 2008-04-15 23:29
#108429 #108429
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
so, hier mal eine Testversion für meinen BBCode-Parser.

Code (perl): (dl )
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
62
63
64
65
66
67
68
69
70
package HTML::BBCode;

use strict;
use warnings;

sub new {
        my $class = shift;
        my $self = {};
        bless($self, $class);
        $self->_init(@_);
        return $self;
}

sub _init {
        my $self = shift;
        my %attr = @_;
        my %tags = (
                b               => '<strong>%s</strong>',
                i               => '<span style="font-style:italic">%s</span>',
                u               => '<span style="text-decoration:underline">%s</span>',
                center  => '<div style="text-align:center">%s</div>',
                img             => '<img src="%s" alt="Bild" />',
                color           => '<span style="color:%s">%s</span>',
                size            => '<span style="font-size:%sem">%s</span>'
        );
        
        my %allowedTags = ();
        if (ref($attr{allowedTags}) eq 'ARRAY') {
                $allowedTags{$_} = $tags{$_} for @{$attr{allowedTags}};
        } else {
                %allowedTags = %tags;
        }
        $self->{escape_html} = 1 if $attr{escape_html};
        $self->{allowedTags} = \%allowedTags;
}

sub parse {
        my ($self, $text) = @_;
        $text = escape_html($text) if $self->{escape_html};
        $text =~ s/(?<![\n\r])\n(?![\r\n])/<br \/>/g;
        $text =~ s/[\n\r]+(.*)[\n\r]+/\n<p>$1<\/p>\n/g;
        for (keys %{$self->{allowedTags}}) {
                $text =~ s{
                        \[$_\](.+?)\[/$_\]
                } {
                        _replace($self,$_,$1)
                }egsx;
                $text =~ s{
                        \[($_)=([a-zA-Z_0-9\#]+)\](.+?)\[/$_\]
                } {
                        _replace($self,$1,$2,$3)
                }egsx;
        }
        return $text;
}

sub _replace {
        my $self = shift;
        return sprintf($self->{allowedTags}->{shift(@_)}, @_);
}

sub escape_html {
        my $text = shift;
        $text =~ s/&/&amp;/gso;
        $text =~ s/</&lt;/gso;
        $text =~ s/>/&gt;/gso;
        return $text;
}

1;


Hier die Applikation:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/perl

use strict;
use warnings;
use HTML::BBCode;

my $bbcode = HTML::BBCode->new(allowedTags => [qw(i size)], escape_html =>1);

my $string = "[size=3]Ha<test>llo[/size],\n[i]dies[/i]\n\nist ein\n\n[b]fetter Text[/b].[dd]test[/dd]\n";

print $bbcode->parse($string);


Und, was meint ihr? Was fehlt noch oder was würdet ihr besser machen?

Meine Todo-Liste:
- optionale umwandlung von Urls zu Links
- Syntax-Validator in einem externen package
- [quote] und [code] (dafür fehlt mir noch ne zündende Idee)
- einen Switch für XHTML/HTML
- Möglichkeit, einem Tag auch eine id (für javascript, css usw.) mitzugeben.
moritz
 2008-04-16 12:38
#108444 #108444
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
Du könntest die Möglichkeit anbieten, callbacks mitzugeben, die genau das (also URLs frobben) erledigen können.

Außerdem wären Callbacks toll, um eigene code-Tags zu bauen, die Syntax-Hilighting machen.
Froschpopo
 2008-04-16 12:29
#108445 #108445
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
was mir heute nacht noch innovatives eingefallen ist:
Wenn $text die url einer konkurrenzseite enthält, wird die url automatisch um meine ref-id ergänzt und als link umgewandelt.
he he he he här
Froschpopo
 2008-04-16 12:43
#108446 #108446
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
Wo willst du denn das Callback hinschicken? Soll man dort auch einen regex definieren können oder nur tags hinzufügen?
letzteres könnte man ja auch einfacher machen:
Code: (dl )
$bbcode->add_tags(font => '<span style="font-family:%s">%s</span>');


wäre dann nichts weiter als wie:
Code (perl): (dl )
1
2
3
4
sub add_tags {
   my $self = shift;
   $self->{allowedTags}->{$_[0]} = {$_[1]};
}


irgendwie so.
moritz
 2008-04-16 13:08
#108448 #108448
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
Ich will sowas:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
sub syntax_hilight {
    my $text = shift;
    # mache hier das syntaxhilighting
    return $html_with_markup;
}
$bbcode->add_tag('perl', \&syntax_hilight);

sub frob_uri {
    my $url = shift;
    if ($url =~ m/evil_competitor/){
        return $url . '?ref_id=1234';
     }
     return $url;
}

$bbcode->add_callback_for('url', \&frob_uri);
Froschpopo
 2008-04-16 13:22
#108449 #108449
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
kannst du mir eine zeile von diesem syntaxhighlight zeigen damit ich in etwa weiss was man entgegennehmen muss.

Wenn ich hier im forum in den Quelltext sehe, dann sieht es ganz so aus, als würden nur bestimmte Wörter gefiltert und mit einem <span> umgeben werden.

Also für use, my... wird dann <span class="keyword">%s</span> gesetzt und bei $var <span class="type">%s</span> usw.
Wenn es so funktioniert, dann lässt sich das schnell ergänzen.
Aber könntest du mir das bitte noch kurz bestätigen, sonst machen ich es jetzt so wie ich es denke, und dann erweist es sich hinterher doch als falsch.
Handelt es sich dabei nur um einen Hash?

Das mit dem callback scheint mir nicht so schwer zu sein.
moritz
 2008-04-16 13:31
#108452 #108452
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
Ich würde die Callbacks einfach HMTL zurückgeben lassen, als String. Und dieses HTML soll dann in der Ausgabe auftauchen.

Wie das HTML aussieht muss dich eigentlich gar nicht interessieren, was ja das schöne an der Sache ist: Die Funktion kümmert sich drum, nicht du.
Strat
 2008-04-16 18:58
#108482 #108482
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
@Froschpopo: wenn dir mal langweilig ist, kannst du dir ja mal den BBCode-Scanner vom Poard anschauen... du führst ihn ja eh fast jeden tag aus *grins*
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
GwenDragon
 2008-04-16 21:44
#108487 #108487
User since
2005-01-17
14837 Artikel
Admin1
[Homepage]
user image
Froschpopo
 2008-08-03 02:49
#113034 #113034
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
soo da bin ich wieder :-)
Ich dachte mir, ich mache hier mal weiter, und schon ist die Kacke wieder am dampfen!

Dieser Parser funktioniert nicht mit folgendem Sting:
Code: (dl )
$str = "Zeile 1\r\nZeile 2\r\nZeile3";

aber super klappts mit dem hier:
Code: (dl )
$str = "Zeile 1\nZeile 2\nZeile 3\n";

Das ist mir vorher garnicht aufgefallen, weil ich meistens unter Linux bastle !

Ursprünglich sollte das mal so werden wie bei Text::Textile: Dort kommen Absätze in <p>(...)</p> und ein einzelnes Newline wird durch <br /> ersetzt.

Vorläufig habe ich das jetzt so gelöst:
Code (perl): (dl )
1
2
3
39:         $text =~ s/\r//g;
40:         $text =~ s/(?<![\n\r])\n(?![\r\n])/<br \/>/g;
41:         $text =~ s/[\n\r]+(.*)[\n\r]+/\n<p>$1<\/p>\n/g;

Fühle mich dabei aber irgendwie dreckig weil ich den \r einfach nur lösche (Zeile 39)
<< |< 1 2 3 >| >> 22 Einträge, 3 Seiten



View all threads created 2008-04-13 18:34.