/http.pl
#!/usr/bin/env perl
use v5.10;
use strict;
use warnings;

my $PORT = 8080;
my $ROOT = '/';

{
    package Dreamlands::WebServer;
    use HTTP::Server::Simple::CGI;
    use base qw(HTTP::Server::Simple::CGI);

    use FindBin qw/$Bin/;
    use Template;
    use Dreamlands::Dreamer qw/generate_paragraph/;

    my $tt = Template->new({
        INCLUDE_PATH => "$Bin/templates",
    });

    sub linkify {
        my $links = int(rand(3));
        my $n;
        my @ranges;
        for (1..$links) {
            my $start = int(rand(@_));
            my $end = $start + int(rand(3));
            if ($end > @_ - 1) {
                $end = @_ - 1;
            }
            for my $r (@ranges) {
                if (($start >= $r->[0] && $start <= $r->[1]) || ($end >= $r->[0] && $end <= $r->[1])) {
                    # Range overlap; try again
                    next;
                }
            }
            push @ranges, [$start, $end];
        }
        for my $r (@ranges) {
            my $slug = join('-', map {
                s/[^\w]//g; lc $_
            } @_[$r->[0]..$r->[1]]);
            $_[$r->[0]] = qq{<a href="$ROOT$slug">} . $_[$r->[0]];
            $_[$r->[1]] .= '</a>';
        }
        @_
    }

    sub handle_request {
        my ($self, $cgi) = @_;

        my $path = $cgi->path_info();
        
        print "HTTP/1.0 200 OK\r\n";
        print $cgi->header(-charset => 'utf-8');

        $path = substr($path, length($ROOT) - 1);
        Dreamlands::Dreamer::seed($path);
        my $para_count = int(rand(3)) + 2;
        my $content = '';
        for (1..$para_count) {
            $content .= join(' ', linkify(generate_paragraph));
            $content .= "\n\n" unless $_ == $para_count;
        }

        $tt->process('page.tt', {
            content => $content,
            path => $path,
        });
    }
}

my $server = Dreamlands::WebServer->new($PORT)->run;