#!/usr/local/bin/perl -s

# Generate a single-file NROFF source for text representation of the PNG spec
# in Internet Draft (RFC) format
# Usage: makerfc <master >output

# Write nroff header
print ".de PF\n";     # PF macro changes page length to 63 lines
print ".pl 63v\n"; 
print ".wh 8\n";      # clear the trap
print "..\n"; 
print ".de PG\n";     # PG macro sets a trap to change page length
print ".wh 8 PF\n";   # after we have written the header for page 2.
print ".nr FM 5v\n";  # footer margin (last text line to page bottom)
print ".wh 9\n";      # clear the trap
print "..\n"; 
print ".wh 9 PG\n"; 
print ".pl 60v\n";    # page 1 has only 60 lines to footer
print ".po 0\n";      # page offset (left margin) is zero
print ".ll 7.2i\n";   # line length
print ".lt 7.2i\n";   # line length of headers and footers
print ".nr LL 7.2i\n";   # line length register for MS macros
print ".nr LT 7.2i\n";   # line length register of headers and footers
print ".ds RF FORMFEED[Page %]\n"; 
print ".ds CF\n"; 
print ".hy 0\n";        # do not hyphenate anything
print ".ad l\n";        # adjust left, leave ragged right margin
print ".in 0\n";        # indent

$Chapter = '-1';
$Section = '0';
$Paragraph = '0';
$skip_blank = 1;
$dt_level = '1';

while (<STDIN>) {
	&process_line($_);
}

exit;

sub process_line {
	local($line) = @_;

        # Remove any leading blanks ahead of "<"
        $line =~ s|^[ ]+<|<|;

        # Double up backslashes
        $line =~ s|\\|\\\\|g;

	# handle H2 tag
	if ($line =~ /<H2>/i) {
        print ".in 3\n";
        print ".ti -3\n";
	$dt_level = '3';
	if ($line =~ /<.+NAME="([^>]+)">/i) {
        $Chapter++;
        $Section = '0';
        $Paragraph = '0';
        if ($PN) {$line = "<h2>s\|!$1!\|!\\n(PN!\|i; #</h2>\n";}
	else { $line =~ s|(<H2>[^>]+>)|$1$Chapter. |; }
        }
	}

	# handle H3 tag
	if ($line =~ /<H3>/i) {
        print ".in 6\n";
        print ".ti -3\n";
	$dt_level = '4';
	if ($line =~ /<.+NAME="([^>]+)">/i) {
        $Section++;
        $Paragraph = '0';
        if ($PN) {$line = "<h3>s\|!$1!\|!\\n(PN!\|i; #</h3>\n";}
	else { $line =~ s|(<H3>[^>]+>)|$1$Chapter.$Section. |;}
	}
	}

	# handle H4 tag
	if ($line =~ /<H4>/i) {
        print ".in 9\n";
        print ".ti -3\n";
	if ($line =~ /<.+NAME="([^>]+)">/i) {
        $Paragraph++;
        if ($PN) {$line = "<h4>s\|!$1!\|!\\n(PN!\|i; #</h4>\n";}
	else { $line =~ s|(<H4>[^>]+>)|$1$Chapter.$Section.$Paragraph |;}
	}
	}

	# handle DL, DT, DD tags
        if ($line =~ /<DL>/i) { print ".in +3\n"; }
	if ($line =~ /<DT>/i) {
	    print ".ti -3\n";
            if ($skip_blank =~ /0/) {print STDOUT "\n" ; }
            $skip_blank = 1;
	if ($dt_level =~ /3/) {
	if ($line =~ /<.+NAME="([^>]+)">/i) {
        $Section++;
        if ($PN) {$line = "<DT>s\|!$1!\|!\\n(PN!\|i; #\n\n";}
	else { $line =~ s|(<DT>[^>]+>)|$1$Chapter.$Section. |;}
        }
        }
	if ($dt_level =~ /4/) {
	if ($line =~ /<.+NAME="([^>]+)">/i) {
        $Paragraph++;
        if ($PN) {$line = "<DT>s\|!$1!\|!\\n(PN!\|i; #\n\n";}
	else {$line =~ s|(<DT>[^>]+>)|$1$Chapter.$Section.$Paragraph |;}
        }
	}
        }
	# handle DD tag
        if ($line =~ /<DD>/i) {
            if ($skip_blank =~ /0/) {print STDOUT "\n" ; }
            $skip_blank = 1;
        }
	$line =~ s|<D[DLT]>[ ]+||i;
        if ($line =~ /<.DL>/i)  {
	    print ".in -3\n";
            if ($skip_blank =~ /0/) {print STDOUT "\n" ; }
            $skip_blank = 1;
        }

	# handle PRE tag
        if ($line =~ /<PRE>/i){
        print ".in +3\n";
        print ".nf\n";
        if ($skip_blank =~ /0/) {print STDOUT "\n" ; }
        $skip_blank = 1;
	$line =~ s|<PRE>||i;
	}
   
	# handle /PRE tag
        if ($line =~ /<.PRE>/i){
	$line =~ s|</PRE>||i;
        print ".in -3\n";
        print ".fi\n";
        if ($skip_blank =~ /0/) {print STDOUT "\n" ; }
        $skip_blank = 1;
	}
   
	# handle UL tag
        if ($line =~ /<UL>/i){
	$line =~ s|<UL>|.in +6|i;
        if ($skip_blank =~ /0/) {print STDOUT "\n" ; }
        $skip_blank = 1;
	}

	# handle /UL tag
        if ($line =~ /<.UL>/i){
	$line =~ s|</UL>||i;
        print ".in -6\n";
        if ($skip_blank =~ /0/) {print STDOUT "\n" ; }
        $skip_blank = 1;
	}

	# handle OL tag
        if ($line =~ /<OL>/i){
	$line =~ s|<OL>|.in +6|i;
        if ($skip_blank =~ /0/) {print STDOUT "\n" ; }
        $skip_blank = 1;
	}

	# handle /OL tag
        if ($line =~ /<.OL>/i){
	$line =~ s|</OL>||i;
        print ".in -6\n";
        if ($skip_blank =~ /0/) {print STDOUT "\n" ; }
        $skip_blank = 1;
	}

	# handle LI tag
        if ($line =~ /<LI>/i){
	$line =~ s|<LI>[ ]+| o |i;
	$line =~ s|^<LI>$| o |i;
	$line =~ s|<LI>| o |i;
        print ".ti -3\n";
        }

	# handle P tag
	$line =~ s|<P>||i;

	# handle inclusion
	if ($line =~ /<!-- INCLUDE (\S+) -->/i) {
	  if (open(INPUT, $1)) {
		while (<INPUT>) {
			&process_line($_);
		}
		close INPUT;
	  } else {
		warn "Couldn't open $1: $!\n";
	  }
	  return;
	}

        # remove any remaining HTML tags

        $line =~ s|^<TITLE.+>||i;
        $line =~ s|^<DT>||i;

        $line =~ s|^[ ]+$|==BLANK==|;
        $line =~ s|^$|==BLANK==|;

        $line =~ s|^[ ]+<[^>]+>||i;
        $line =~ s|^[ ]+<[^>]+>||i;
        $line =~ s|^[ ]+<[^>]+>||i;
        $line =~ s|[ ]+<[^>]+>[ ]+| |i;
        $line =~ s|<[^>]+>||gi;

        $line =~ s|<[^<]+$||i;
        $line =~ s|^[^>]+>||i;

        $line =~ s|&amp;|&|g;
        $line =~ s|&gt;|>|g;
        $line =~ s|&lt;|<|g;
        $line =~ s|&copy;|(c)|g;

        $line =~ s|^[ ]+$||;

        if ($line =~ /^$/) {return;}

        $line =~ s|^==BLANK==$||;

        if (($line =~ /./) || ($skip_blank =~ /0/)) {print STDOUT $line; }
        if ($line =~ /^$/) {$skip_blank = 1;}
        if ($line =~ /./) {$skip_blank = 0;}

}
