use strict;
use HTML::TreeBuilder;
use Template;
use Syntax::Highlight::Perl;
use HTML::Entities;

# Rechtstreeks uit http://tnx.nl/scribble.plp
sub tidy {
    require Syntax::Highlight::Perl;
    my ($data) = @_;
    $data = decode_entities($data);
    my $hl = Syntax::Highlight::Perl->new;
    $hl->define_substitution(
        '<' => '&lt;',
        '>' => '&gt;',
        '&' => '&amp;',
        "\t" => '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;',
        ' ' => '&nbsp;',
    );
    $hl->set_format( $_ => [ "<span class=$_>", "</span>" ] )
        for qw/Comment Directive Label Quote String Subroutine Variable
               Keyword Builtin Operator Package Number CodeTerm Symbol
               DATA/;
    return $hl->format_string($data);
}

my $tree = HTML::TreeBuilder->new;
$tree->parse_file('slides.html');

my $i = 0;
my $sf = 'slide%d.html';

my $tt = Template->new({INCLUDE_PATH => '.'});

my @slides = $tree->look_down(_tag => 'div');

my $index = '<div><ul class=index>';

for (@slides) {
    my $j = $i + 1;
    printf $sf." - ", $j;
    my $h = $_->look_down(_tag => qr/^h\d$/);
    my $title = $h->content->[0];
    print "$title\n";
    $h->delete;

    my $slide = $_->as_HTML;

    # Waarom werkt $pre_element->delete of $pre_element->replace_with of
    # $pre_element->replace_content niet gewoon? grom. Nou ja. Ik zit in de
    # trein en over een paar uurtjes moet dit werken. Dan maar zo:
    $slide =~ s/<pre>\n?(.*?)\n?<\/pre>/"<pre>" . tidy($1) . "<\/pre>"/ges;
    $slide =~ s/\[\[\[/&lt;/g;  # vies.
    
    $tt->process(
        'slide.html',
        {
            title => $title,
            slide => $slide,
            index => $j,
            total => scalar @slides,

            indexlink => sprintf($sf, 0),

            ($i != 0       ? (first => sprintf($sf, 1)) : ()),
            ($i > 0        ? (prev => sprintf($sf, $j - 1)) : ()),
            ($i < $#slides ? (next => sprintf($sf, $j + 1),
                              spoiler => $slides[$i + 1]->look_down(_tag => qr/^h\d$/)->content->[0]) : ())
        },
        sprintf($sf, $j)
    ) or die $tt->error;

    $index .= sprintf qq[<li> %d. <a href="$sf">%s</a>], $j, $j, $title;

    $i++;
}

$index .= '</ul></div>';
$tt->process(
    'slide.html',
    {
        title => 'Index',
        slide => $index,
        index => 0,
        total => scalar @slides,
        first => sprintf($sf, 1),
    },
    sprintf($sf, 0)
) or die $tt->error;
