Thread CMS Tags parsen (29 answers)
Opened by cbxk1xg at 2010-11-26 16:27

cbxk1xg
 2011-05-23 21:59
#149062 #149062
User since
2003-10-20
496 Artikel
BenutzerIn
[default_avatar]
Hallo!

Ich krame diesen alten Thread mal aus, da ich mich noch mal mit dem Thema auseinandersetzen muss. Ich bin zurück ans Reissbrett gegangen und habe meine krüppelige Tag-Syntax überabeitet. Ich habe mit dazu ein Testskipt geschrieben und bis auf eine einzige sache funktioniert alles. Das Problem ist die Rekursion. Tags innerhalb von Tags werden einfach nicht erkannt. Ich komme da einfach nicht weiter.

Perl-Code
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#!/usr/bin/perl -T

use strict;
use warnings;
use CGI::Carp qw(fatalsToBrowser);

print "Content-type: text; charset=utf-8\n\n";

my $teststring = qq|[pic w=100px h=50px style=test] some text
[infobox headline=Hello world! content=[pic w=50 h=50 style=left]
hier ist mein text.] [gallery path=[host]myfolder/ style=cool navi=standard] [host]|;

print "<h2>input</h2>\n$teststring";
print "<h2>output</h2>\n";
print &GetTags ($teststring);

sub GetKeyValue {
my ($tag, $attr) = @_;
my %KeyVal = $attr =~ m[(\S+)\s*=\s*(\S+)]g;
my $testkeyval = "";
my $totalkey = keys %KeyVal;
my $count= 0;
my $whitespace = " ";

for my $key (sort keys %KeyVal) {
if ($totalkey == $count) {$whitespace = ""};
$testkeyval .= "$key=\"$KeyVal{$key}\"$whitespace";
$count++;
}

if ($tag eq "pic") { return "{pic $testkeyval /}"; }
if ($tag eq "gallery") { return "{gallery $testkeyval /}"; }
if ($tag eq "infobox") { return "{infbox $testkeyval /}"; }
if ($tag eq "host") { return "http://www.example.com/"; }

}


sub GetTags {
    my ($text) = @_;
    my $output = "";
    my $stack = [];
    while (length $text) {
        if (($text =~ s/^\[(pic|gallery|infobox)\s//si) # tag mit attr
                || ($text =~ s/^\[(host)//si)) # tag ohne attr
                {
            my $name = $1;
            # tag
            my $attr = "";
            if ($text =~ s/^([^\[\]]+)//) {
                $attr = $1;
            }
            push @$stack, [$name, $attr];
        }

        else {
            my $out;
            if ($text =~ s/^\[//) {
                $out = "[";
            }
            if ($text =~ s/^\]//) {
                # closing tag
                                if (@$stack) {
                my $last = pop @$stack;
                my ($name, $attr) = @$last;
                $out = &GetKeyValue($name, $attr);
                                }
            }
            else {
                # text
                if ($text =~ s/^([^\[\]]+)//) {
                    $out = $1;
                }
            }
            if (@$stack > 0) {
                $stack->[-1]->[2] .= $out;
            }
            else {
                $output .= $out;
            }
        }
    }
    return $output;

}



Output im Browser
Code: (dl )
1
2
3
4
5
6
<h2>input</h2>
[pic w=100px h=50px style=test] some text
[infobox headline=Hello world! content=[pic w=50 h=50 style=left]
hier ist mein text.] [gallery path=[host]myfolder/ style=cool navi=standard] [host]<h2>output</h2>
{pic h="50px" style="test" w="100px" /} some text
{infbox headline="Hello" /} {gallery /} http://www.example.com/

View full thread CMS Tags parsen