Browse Source

+ Text::Dokuwiki->_parse_list

master
Zubrikhin Alexey 10 years ago
parent
commit
c5a0a068d1
  1. 38
      lib/Text/Dokuwiki.pm

38
lib/Text/Dokuwiki.pm

@ -14,6 +14,44 @@ sub new {
return bless($self, $class); return bless($self, $class);
} }
sub _parse_list {
my ($self, $lines) = @_;
my @lists = ();
my @stack = ( \@lists );
my $types = {curr => '', last => ''};
my $level = {curr => 0, last => 0};
foreach my $line (@{ $lines }) {
$line =~ m/^(\s+)/o;
my ($ident, $dot, $rest) = ($line =~ m/^((?:\s{2})+)([\*-])\s*(.+)/);
$level->{last} = $level->{curr};
$level->{curr} = $ident =~ tr/ / /;
$types->{last} = $types->{curr};
$types->{curr} = ($dot eq '-') ? 'ol' : 'ul';
if ($level->{curr} == $level->{last} and
$types->{curr} ne $types->{last}) {
pop @stack;
my $list = [$types->{curr} => {}];
push @{ $stack[-1] }, (@stack > 1) ? [li => {}, $list] : $list;
push @stack, $list;
}
if ($level->{curr} > $level->{last}) {
my $list = [$types->{curr} => {}];
push @{ $stack[-1] }, (@stack > 1) ? [li => {}, $list] : $list;
push @stack, $list;
}
if ($level->{curr} < $level->{last}) {
pop @stack;
}
push @{ $stack[-1] }, [li => {}, $rest];
}
pop @stack while @stack;
return @lists;
}
sub parse { sub parse {
my ($self, $text) = @_; my ($self, $text) = @_;
my ($tree, $mode, $attrs, $buf) = ([], 'text', '', ''); my ($tree, $mode, $attrs, $buf) = ([], 'text', '', '');

Loading…
Cancel
Save