1package Text::Trac::Ul; 2 3use strict; 4use warnings; 5use base qw(Text::Trac::BlockNode); 6 7our $VERSION = '0.24'; 8 9sub init { 10 my $self = shift; 11 $self->pattern(qr/(\s+) \* \s+ (.*)$/xms); 12} 13 14sub parse { 15 my ( $self, $l ) = @_; 16 my $c = $self->{context}; 17 my $pattern = $self->pattern; 18 $l =~ $pattern or return $l; 19 20 my $space = length($1); 21 my $level = $c->ul->{level} || 0; 22 $c->ul->{space} ||= 0; 23 24 if ( $space > $c->ul->{space} ) { 25 for ( 1 .. ( $space + 1 ) / 2 - $level ) { 26 $l = '<ul>' . $l; 27 $level++; 28 } 29 } 30 elsif ( $space < $c->ul->{space} ) { 31 for ( 1 .. ( $c->ul->{space} - $space ) / 2 ) { 32 $l = '</li></ul>' . $l; 33 $level--; 34 } 35 $l =~ s!(?<=</(?:ul|li)>)(?= )!</li>!; 36 } 37 else { 38 $l = "</li>$l"; 39 } 40 41 $c->ul( { level => $level, space => $space } ); 42 43 # parse inline nodes 44 $l =~ s{ $pattern }{"<li>" . $self->replace($2)}xmsge; 45 46 if ( $c->hasnext and $c->nextline =~ /$pattern/ ) { 47 $self->parse($l); 48 } 49 else { 50 for ( 1 .. $c->ul->{level} ) { 51 $l .= '</li></ul>'; 52 } 53 $c->ul->{level} = 0; 54 $c->ul->{space} = 0; 55 } 56 57 # parse inline nodes 58 $c->htmllines($l); 59 60 return; 61} 62 631; 64