#! /usr/bin/env perl

$srcdir = $ARGV[0];
$dstdir = $ARGV[1];
$imgdir = $ARGV[2];

for my $d (glob ("$srcdir/*.html")) {
    $d =~ s%^$srcdir/%% or die;
    push (@srcfiles, $d);
}

open (INDEX, "$srcdir/index.html") || die;
while (<INDEX>) {
    chomp;
    $toc = 1, $level = 0, undef $nextnode, next if m%^<h2>Table of Contents</h2>$%;
    $level++, next if $toc && /^<ul>$/;
    if ($toc && m%^</ul>$%) {
	$level--;
	$toc = 0 if $level == 0;
	next;
    }
    next if !$toc;

    if (my ($file, $frag, $title)
	= m%<a href=\042([^\042\043]*)(\#[^\042]*)?\042>(.*)</a>%) {
	if (!defined ($fntoindex{$file})) {
	    push (@nodes, "$level\0$file\0$title");
	    $fntoindex{$file} = $#nodes;
	    if (defined ($nextfrag)) {
		$filetocfrag{$file} = $nextfrag;
		undef $nextfrag;
	    }
	}
    } elsif (my ($name) = m%<a name=\042([^\042]*)\042>%) {
	$nextfrag = $name;
    }
}
close (INDEX);

for my $d (@srcfiles) {
    open (SRC, "<$srcdir/$d") || die;
    while (<SRC>) {
	$headnode{$d} = $1, last
	    if /^Node:<a name=\042([^\042]*)\042>([^<]*)</;
	$refresh{$d} = $1, last
	    if /^<meta http-equiv=\042refresh\042 content=\0420; url=([^\042]*)\042>/;
    }
    close (SRC);
}

sub fixnode {
    my ($file, $frag) = @_;

    ($file, $frag) = ($refresh{$file} =~ /(.*)\#(.*)/)
	if defined ($refresh{$file});

    if ($headnode{$file} eq $frag) {
	$href = $file;
    } else {
	$href = "$file#$frag";
    }
    return "href=\"$href\"";
}

sub getnodeindex {
    my ($index) = @_;
    return split(/\0/, $nodes[$index]);
}

sub getskipback {
    my ($index) = @_;
    my ($level) = (getnodeindex($index))[0];
    while ($index-- > 0) {
	my ($plevel, $pfile, $ptitle) = getnodeindex($index);
	return ($pfile, $ptitle) if $plevel == $level;
	return undef if $plevel < $level;
    }
    return undef;
}

sub getskipfwd {
    my ($index) = @_;
    my ($level) = (getnodeindex($index))[0];
    while ($index++ < $#nodes) {
	my ($nlevel, $nfile, $ntitle) = getnodeindex($index);
	return ($nfile, $ntitle) if $nlevel == $level;
	return undef if $nlevel < $level;
    }
    return undef;
}

sub getprev {
    my ($index) = @_;
    if ($index > 0) {
	my ($plevel, $pfile, $ptitle) = getnodeindex($index - 1);
	return ($pfile, $ptitle);
    } else {
	return undef;
    }
}

sub getnext {
    my ($index) = @_;
    if ($index < $#nodes) {
	my ($nlevel, $nfile, $ntitle) = getnodeindex($index + 1);
	return ($nfile, $ntitle);
    } else {
	return undef;
    }
}

sub getup {
    my ($index) = @_;
    my ($level, $file, $title) = getnodeindex($index);
    my ($i) = $index - 1;
    for (;;) {
	last if $i < 0;

	my ($ulevel, $ufile, $utitle) = getnodeindex($i);
	if ($ulevel == $level - 1) {
	    return ($ufile, $utitle);
	    last;
	}

	$i--;
    }

    $frag = $filetocfrag{$file};
    if (defined ($frag)) {
	$frag = "#$frag";
    } else {
	$frag = "";
    }
    return ("index.html$frag", "Table of Contents") if ($i < 0);
}

sub linkimg {
    my ($full, $tag, $png) = @_;
    my ($txt) = $png;
    $txt =~ s/\.png$/.txt/;

    (-e "$dstdir/$png") or link ("$imgdir/$png", "$dstdir/$png") or die;
    return $full if ! -e "$imgdir/$txt";

    (-e "$dstdir/$txt") or link ("$imgdir/$txt", "$dstdir/$txt") or die;

    #print "$full, $tag, $png, $txt\n";
    #print "<a href=\"$txt\"><img border=0 src=\"$png\" alt=\"[Click here for plain-text rendering]\"></a>";
    return "<a href=\"$txt\"><img border=0 src=\"$png\" alt=\"[Click here for plain-text rendering]\"></a>";
}

for my $d (@srcfiles) {
    next if defined ($refresh{$d});

    $headers = 0;
    $body = 0;
    $sawtitle = 0;
    $sawmeta = 0;
    $toc = 0;

    open (SRC, "<$srcdir/$d") || die;
    @srclines = <SRC>;
    close (SRC);

    open (DST, ">$dstdir/$d") || die;
    undef $index;
    $index = $fntoindex{$d};
    die "$d" if !defined ($index);

    for ($srcln = 0; $srcln <= $#srclines; $srcln++) {
	$_ = $srclines[$srcln];
	
	chomp;

	s%<br><pre>%<pre>%g;
	s%<pre>%<pre style="margin-left: 1em;">%g;
	s%(<img (src=\042([^\042]*)\042[^>]*)>)%linkimg($1,$2,$3)%eg;

	if (/^<small>(This code|See also)/) {
	    $_ = "<div style=\"margin-left: 1em;\">$_</div>";
	}

	if (/^<ul>$/ && $srclines[$srcln + 1] =~ /^<li>.*:\s*$/) {
	    my ($hadleader) = 0;
	    my ($level) = (getnodeindex($index))[0];
	    my ($listlevel) = $level;
	    my ($nindex) = $index;
	    while (my ($nlevel, $nfile, $ntitle) = getnodeindex (++$nindex)) {
		last if ($nlevel <= $level);
		if (!$hadleader++) {
		    if ($level == 0) { $parts = "Chapters"; }
		    elsif ($level == 1) { $parts = "Sections"; }
		    elsif ($level == 2) { $parts = "Subsections"; }
		    else { $parts = "Subsubsections"; }
		    print DST "<p><b>$parts:</b></p>\n";
		}
		(print DST "<ul>\n"), $listlevel++ while ($listlevel < $nlevel);
		(print DST "</ul>\n"), $listlevel-- while ($listlevel > $nlevel);
		print DST "<li><a href=\"$nfile\">$ntitle</a>\n";
	    }
	    while (!($srclines[++$srcln] =~ m%</ul>%)) {
		# Nothing.
	    }
	    (print DST "</ul>\n"), $listlevel-- while ($listlevel > $level);
	    
	    next;
	}

	if (/^<meta name/) {
	    if (!$sawmeta) {
		print DST "<meta name=author content=\"Ben Pfaff\">\n";
		print DST "<meta name=generator content=\"makeinfo --html augmented by htmlpp\">\n";
		print DST "<link rel=Start href=\"index.html\" title=\"Table of Contents\">\n";
		print DST "<link rel=Contents href=\"index.html\" title=\"Table of Contents\">\n";
		print DST "<link rel=Index href=\"Index.html\" title=\"Index\">\n";
		print DST "<link rel=Glossary href=\"Glossary.html\" title=\"Glossary\">\n";
		print DST "<link rel=Copyright href=\"http://www.gnu.org/copyleft/gpl.html\" title=\"License\">\n";

		for ($i = 0; $i <= $#nodes; $i++) {
		    my ($level, $file, $title) = getnodeindex ($i);
		    $title =~ s/<[^>]*>//g;
		    if ($level == 1) {
			if ($title =~ s/^Appendix //) {
			    $type = 'Appendix';
			} else {
			    $type = 'Chapter';
			}
			print DST "<link rel=$type href=\"$file\" title=\"$title\">\n";
		    }
		}

		my ($phref, $ptitle) = getprev($index) if defined ($index);
		print DST "<link rel=Prev href=\"$phref\" title=\"$ptitle\">\n"
		    if defined ($phref);

		my ($nhref, $ntitle) = getnext($index) if defined ($index);
		print DST "<link rel=Next href=\"$nhref\" title=\"$ntitle\">\n"
		    if defined ($nhref);

		my ($uhref, $utitle) = getup($index) if defined ($index);
		print DST "<link rel=Parent href=\"$uhref\" title=\"$utitle\">\n"
		    if defined ($uhref);
	    }
	    $sawmeta = 1;
	    next;
	}
	/^<link/ && next;

	s/href=\042([^\042\#]*)\#([^\042\#]*)\042/fixnode($1,$2)/ge;

	$toc = 1 if $d eq 'index.html' && m%^<h2>Table of Contents</h2>$%;
	if ($toc && m%<a href=\042([^\042]*)\042>%) {
	    $_ = "$`<a name=\"$1\" href=\"$1\">$'";
	}

	if (/^<body>$/) {
	    print DST "<body bgcolor=\"#ffffff\" text=\"#000000\" link=\"#1f00ff\" alink=\"#ff0000\" vlink=\"#9900dd\">\n";

	    $body = 1;
	    next;
	} elsif ($body) {
	    $body = 0;
	    /^<p>$/ && next;
	}

	if ((my ($title) = m%^<h\d>([^<]*)</h\d>%)
	    && !$sawtitle && defined ($index)) {
	    $sawtitle = 1;
	    print DST "<table bgcolor=\"#d0d0d0\" cellpadding=0 width=\"100%\"><tr>\n";
	    print DST "<td align=left><big><b>$title</b></big></td>\n";
	    print DST "<td align=right>\n";

	    $tochref = "index.html#$d";
	    print DST "<a href=\"$tochref\" title=\"Table of Contents\"><img src=\"toc.png\" border=0 alt=\"[ToC]\"></a>\n";
	    print DST "<a href=\"Index.html\" title=\"Index\"><img src=\"index.png\" border=0 alt=\"[Index]\"></a>\n";
	    print DST "&nbsp;&nbsp;&nbsp;\n";

	    my ($sbhref, $sbtitle) = getskipback($index);
	    my ($phref, $ptitle) = getprev($index);
	    my ($uhref, $utitle) = getup($index);
	    my ($nhref, $ntitle) = getnext($index);
	    my ($sfhref, $sftitle) = getskipfwd($index);

	    my ($skip) = 0;
	    if (defined ($sbhref)) { # && $sbhref ne $phref) {
		print DST "<a href=\"$sbhref\" title=\"Skip Back: $sbtitle\"><img src=\"skipback.png\" border=0 alt=\"[Skip Back]\"></a>\n";
		$skip++;
	    } else {
		print DST "<img src=\"padding.png\">\n";
	    }
		
	    if (defined ($sfhref)) { # && $sfhref ne $nhref) {
		print DST "<a href=\"$sfhref\" title=\"Skip Forward: $sftitle\"><img src=\"skipfwd.png\" border=0 alt=\"[Skip Fwd]\"></a>\n";
		$skip++;
	    } else {
		print DST "<img src=\"padding.png\">\n";
	    }
		
	    print DST "&nbsp;&nbsp;&nbsp;\n";

	    if (defined ($phref)) {
		print DST "<a href=\"$phref\" title=\"Prev: $ptitle\"><img src=\"prev.png\" border=0 alt=\"[Prev]\"></a>\n";
	    } else {
		print DST "<img src=\"padding.png\">\n";
	    }

	    if (defined ($uhref)) {
		print DST "<a href=\"$uhref\" title=\"Up: $utitle\"><img src=\"up.png\" border=0 alt=\"[Up]\"></a>\n"
	    } else {
		print DST "<img src=\"padding.png\">\n";
	    }
		
	    if (defined ($nhref)) {
		print DST "<a href=\"$nhref\" title=\"Next: $ntitle\"><img src=\"next.png\" border=0 alt=\"[Next]\"></a>\n"
	    } else {
		print DST "<img src=\"padding.png\">\n";
	    }

	    print DST "</td></tr></table>\n";
	    next;
	}

	if (m%^</body>% && defined ($index)) {
	    print DST "</p>\n";
	    print DST "<table bgcolor=\"#d0d0d0\" cellpadding=0 width=\"100%\"><tr valign=middle>\n";
	    my ($phref, $ptitle) = getprev($index);
	    print DST "<td align=left width=\"33%\">\n";
	    if (defined $phref) {
		print DST "<a href=\"$phref\"><img src=\"prev.png\" border=0 alt=\"Prev:\" align=middle></a>\n";
		print DST "$ptitle\n";
	    }
	    print DST "</td>\n";

	    my ($uhref, $utitle) = getup($index);
	    print DST "<td align=center width=\"33%\">\n";
	    if (defined $uhref) {
		print DST "<a href=\"$uhref\"><img src=\"up.png\" border=0 alt=\"Up:\" align=middle></a>\n";
		print DST "$utitle\n";
	    }
	    print DST "</td>\n";

	    my ($nhref, $ntitle) = getnext($index);
	    print DST "<td align=right width=\"33%\">\n";
	    if (defined $nhref) {
		print DST "$ntitle\n";
		print DST "<a href=\"$nhref\"><img src=\"next.png\" border=0 alt=\"Next\" align=middle></a>\n";
	    }
	    print DST "</td>\n";
	    print DST "</tr></table>\n";
	}

	if ((my ($title) = /<p>(.*):$/)
	    && (my ($href, $frag, $entry) = $srclines[$srcln + 1] =~ m%<a href=\042([^\042\#]*)\#([^\042]*)\042>(catalogue-entry-.*)</a>$%)) {
	    my ($realhref) = fixnode ($href, $frag);
	    print DST "<a $realhref>$title</a><br>\n";
	    $srcln += 2;
	    next;
	}

	if (/^Node:<a name=\042([^\042]*)\042>([^<]*)</) {
	    print DST "<a name=\"$1\">\n";
	    $headers = 1;
	    next;
	} elsif ($headers) {
	    $headers = 0 if /<br>$/;
	    next;
	}

	print DST "$_\n";
    }
    close (DST);
    close (SRC);
}

for $d ("toc", "index", "padding", "skipback", "skipfwd", "prev", "up", "next") {
    link ("$imgdir/$d.png", "$dstdir/$d.png") || die;
}
