]> git.pond.sub.org Git - empserver/blobdiff - info/emp2html.pl
Update copyright notice
[empserver] / info / emp2html.pl
index 86802900feaaae7710f12c523fbd57feefc61720..abad5dea2933d1c4013a91321da80d6fe5559c35 100644 (file)
@@ -1,28 +1,95 @@
-#!/usr/local/bin/perl
+#!/usr/bin/perl
+#
+#   Empire - A multi-player, client/server Internet based war game.
+#   Copyright (C) 1986-2018, Dave Pare, Jeff Bailey, Thomas Ruschak,
+#                 Ken Stevens, Steve McClure, Markus Armbruster
+#
+#   Empire is free software: you can redistribute it and/or modify
+#   it under the terms of the GNU General Public License as published by
+#   the Free Software Foundation, either version 3 of the License, or
+#   (at your option) any later version.
+#
+#   This program is distributed in the hope that it will be useful,
+#   but WITHOUT ANY WARRANTY; without even the implied warranty of
+#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#   GNU General Public License for more details.
+#
+#   You should have received a copy of the GNU General Public License
+#   along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+#   ---
+#
+#   See files README, COPYING and CREDITS in the root of the source
+#   tree for related information and legal notices.  It is expected
+#   that future projects/authors will amend these files as needed.
+#
+#   ---
+#
+#   emp2html.pl: Convert info source to HTML
+#
+#   Known contributors to this file:
+#      Drake Diedrich, 1996
+#      Markus Armbruster, 2004-2013
+#
+# Usage: emp2html.pl INFO...
+#
+# Convert info source on standard input to HTML on standard output.
+# INFO... are the info page names.
 
 use strict;
 use warnings;
 
-my $esc="\\";
+my $in_nf = 0;
+my $esc = "\\";
+my $ignore = 0;
+my $is_subj;
 my @a;
+my %topic;
 
-line: while (<>) {
+for (@ARGV) {
+    $topic{$_} = 1;
+}
+
+print "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\"\n";
+print "   \"http://www.w3.org/TR/html4/strict.dtd\">\n";
+print "<html>\n";
+print "<head>\n";
+
+line: while (<STDIN>) {
     chomp;                     # strip record separator
-    s/([^\\](\\\\)*)\\\".*/$1/g; # strip comments
+    s/((^|[^\\])(\\\\)*)\\\".*/$1/g; # strip comments
 
     @a = req($_);
 
     if (!@a) {
-       print htmlify($_), "\n";
+       if ($is_subj && $in_nf) {
+           while ($_ =~ /[A-Za-z0-9\-\.]+/g) {
+               print htmlify("$`");
+               print anchor("$&");
+               $_="$'";
+           }
+       }
+       print htmlify($_), "\n" unless $ignore;
        next line;
     }
 
     # requests
 
+    if ($a[1] eq "ig") { $ignore = 1; next line; }
+    if ($ignore) {
+       $ignore = 0 if $a[1] eq "..";
+       next line;
+    }
+
     if ($a[1] eq "TH") {
        @a = checkarg(2, @a);
+       $is_subj = $a[2] eq 'Subject' || $a[2] eq 'Info';
        $a[3] = htmlify($a[3]);
-       print "<title>$a[2] : $a[3]</title><h1>$a[2] : $a[3]</h1>\n";
+       print "<title>$a[2] : $a[3]</title>\n";
+       print "</head>\n";
+       print "<body>\n";
+       print "<h1>$a[2] : $a[3]</h1>\n";
+       print "<p>\n";
        next line;
     }
 
@@ -39,21 +106,27 @@ line: while (<>) {
        next line;
     }
 
+    if ($a[1] eq "L" && $is_subj) {
+       $a[2] =~ / /;
+       print "<br>" . anchor("$`") . " $'\n";
+       next line;
+    }
+
     if ($a[1] =~ /^LV?$/) {
        @a = checkarg(1, @a);
        $a[2] = htmlify($a[2]);
        print "<h2>$a[2]</h2>\n";
+       print "<p>\n";
        next line;
     }
 
-    if ($a[1] =~ "eo") { $esc = 0; next line; }
-    if ($a[1] =~ "ec") { $esc = $#a == 1 ? "\\" : $a[2]; next line; }
+    if ($a[1] eq "eo") { $esc = 0; next line; }
+    if ($a[1] eq "ec") { $esc = $#a == 1 ? "\\" : $a[2]; next line; }
 
-    if (/^\.(NF|nf)/) { printf (("<p><pre>\n")); next line; }
-    if (/^\.(FI|fi)/) { printf (("</pre><p>\n")); next line; }
-    if (/^\.s3/) { printf (("<p>\n")); next line; }
-    if (/^\.s1/) { printf (("<hr> \n")); next line; }
-    if (/^\.br/) { printf "<br>\n"; next line; }
+    if ($a[1] =~ /NF|nf/i) { $in_nf = 1; printf (("<p><pre>\n")); next line; }
+    if ($a[1] =~ /FI|fi/i) { $in_nf = 0; printf (("</pre><p>\n")); next line; }
+    if ($a[1] eq "s1") { printf (("<hr><p>\n")); next line; }
+    if ($a[1] eq "br") { printf "<br>\n"; next line; }
 
     if ($a[1] eq "SA") {
        @a = checkarg(1, @a);
@@ -67,12 +140,15 @@ line: while (<>) {
     # ignore unknown request
 }
 
+print "</body>\n";
+print "</html>\n";
+
 sub req {
     local ($_) = @_;
-    if (/^([\.\'])[ \t]*([^ ]+) *(.*)/) {
+    if (/^([\.\'])[ \t]*([^ ]*) *(.*)/) {
        my @a = ($1, $2);
        $_ = $3;
-       while (/(\"((\\.|[^\\\"])*)(\"|\Z))|(([^ ]|\\.)+) */g) {
+       while (/\G(\"((\\.|[^\\\"])*)(\"|\Z))|\G(([^ ]|\\.)+) */g) {
            push(@a, $2 || $5);
        }
        return @a;
@@ -92,8 +168,7 @@ sub checkarg {
 
 sub anchor {
     local ($_) = @_;
-    # FIXME don't create dangling links here
-    return "<a href=\"$_.html\">$_</a>";
+    return $topic{$_} ? "<a href=\"$_.html\">$_</a>" : $_;
 }
 
 # Translate HTML special characters into escape sequences
@@ -112,12 +187,18 @@ sub htmlify {
     s/\\e/&\#92;/g;            # escape character
     # turn quoted strings that look like info names into links
     # tacky...
-    while (/(\\\*Q)([A-Za-z0-9\-\.]+)(\\\*U)/) {
-       $_ = $` . anchor($2) . "$'";
-    }
-    while (/(\"info )([A-Za-z0-9\-\.]+)/) {
-       $_ = "$`\"info " . anchor($2) . "$'";
+    my $pfx = "";
+    while (/\\\*Q([A-Za-z0-9\-\.]+)\\\*U|\"info ([A-Za-z0-9\-\.]+)\"/) {
+       if (defined $1 && $topic{$1}) {
+           $pfx = $` . anchor($1);
+       } elsif (defined $2 && $topic{$2}) {
+           $pfx = "$`\"info " . anchor($2) . "\"";
+       } else {
+           $pfx .= $` . $&;
+       }
+       $_ = "$'";
     }
+    $_ = "$pfx$_";
     # tranlate more troff escapes and strings
     s/\\\*Q/<em>/g;
     s/\\\*U/<\/em>/g;