# * is an unordered list
# # is an ordered list
# #3 a number indicates the value
__DATA__
* list 1 unordered item 1
* list 1 unordered item 2
*# list 1 unordered item 2 ordered item 1
*# list 1 unordered item 2 ordered item 2
*# list 1 unordered item 2 ordered item 3
* list 1 unordered item 3
** list 1 unordered item unordered item 1
** list 1 unordered item unordered item 2
** list 1 unordered item unordered item 3
**# list 1 unordered item unordered item 3 ordered item 1
**# list 1 unordered item unordered item 3 ordered item 2
**# list 1 unordered item unordered item 3 ordered item 3
# list 2 ordered item 1
#3 list 2 ordered item 2
# list 2 ordered item 3
#* list 2 ordered item 3 unordered item 1
#* list 2 ordered item 3 unordered item 2
#* list 2 ordered item 3 unordered item 3
####
sub story {
my ($source, $doc_magic, $line_magic) = @_;
my $inc = 0;
my @sections;
my @toc;
while (my $line = <$source>) {
chomp($line);
next if !$line;
if ($line =~ /^2/) {
my ($number,$text) = split(/ /,$line,2);
push @toc, anchor(textify($text), { href => '#'.idify($text) });
$inc++;
}
push @{$sections[$inc]}, $line;
}
my $tab = 3;
$inc = 0;
for my $section (@sections) {
if ($section) {
section($tab, sub {
$tab++;
for my $line (@{$section}) {
my $line = convert_string($line, $line_magic);
line($tab, $line), next if $line =~ /^;
line($tab, "<$line>"), next if $line =~ /^[bh]r$/;
$doc_magic->{$1}->(), next if $line =~ /^&\s+(.*)/;
blockquote($tab, $1), next if $line =~ /^bq\s(.*)/;
item($tab + 1, $1), next if $line =~ /^\*\s(.*)/;
item($tab + 1, $2, { value => $1 }), next if $line =~ /^\*(\d+)\s(.*)/;
item($tab + 1, "$1 $2"), next if $line =~ /^\*s\s(.+\:)\s(.*)$/;
heading($tab, $1, $2, { id => idify($2) }), next if $line =~ /^([1-6])\s+(.*)/;
paragraph($tab, $line, { class => 'author' }), next if $line =~ /^by /;
paragraph($tab, $line);
}
$tab--;
});
}
if ($inc == 0 && @toc > 3) {
section($tab, sub {
my $class = @toc > 25 ? @toc > 50 ? 'four' : 'three' : 'two';
my $style = @toc > 50 ? 'font-size:smaller' : undef;
list($tab + 1, 'u', \@toc, { class => $class, style => $style });
}, { class => 'contents'} );
}
$inc++;
}
# paragraph($tab,"written by $root_user", { class => 'author' });
}
####
my $list1 = [
'u',
[
'list 1 unordered item 1',
[
'list 1 unordered item 2',
{
'inlist' => [
'o',
[
'list 1 unordered item 2 ordered item 1',
'list 1 unordered item 2 ordered item 2',
'list 1 unordered item 2 ordered item 3'
]
]
}
],
[
'list 1 unordered item 3',
{
'inlist' => [
'u',
[
'list 1 unordered item unordered item 1',
'list 1 unordered item unordered item 2',
[
'list 1 unordered item unordered item 3',
{
'inlist' => [
'o',
[
'list 1 unordered item unordered item 3 ordered item 1',
'list 1 unordered item unordered item 3 ordered item 2',
'list 1 unordered item unordered item 3 ordered item 3'
]
]
},
]
]
]
},
]
]
];
my $list2 = [
'o',
[
'list 2 ordered item 1',
['list 2 ordered item 2', { value => '3' } ],
[
'list 2 ordered item 3',
{
inlist => [
'u',
[
'list 2 ordered item 3 unordered item 1',
'list 2 ordered item 3 unordered item 2',
'list 2 ordered item 3 unordered item 3',
]
]
}
]
]
];
####
sub list {
my ($tab,$type,$list,$opt) = @_;
my $tag = $type.'l';
my $open = open_tag($tag,$opt,[@ics,@java]);
line($tab,"<$open>");
for my $item (@$list) {
if (ref($item) eq 'ARRAY') {
item($tab + 1,$item->[0],$item->[1]);
}
else {
item($tab + 1,$item);
}
}
line($tab,"$tag>");
}
####
sub item {
my ($tab,$value,$opt) = @_;
my $tag = 'li';
my $open = open_tag($tag, $opt, ['value', @ics, @java]);
line($tab, "<$open>");
line($tab + 1, $value);
if ($opt->{inlist}) {
list($tab + 1, @{$opt->{inlist}});
}
line($tab,"$tag>");
}