Thread CMS Tags parsen
(29 answers)
Opened by cbxk1xg at 2010-11-26 16:27
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 <h2>input</h2> |