1#! @PATH_PERL@ -w 2# 3# html2man: Converts the NTP HTML documentation to man page format 4# 5# This file require the Perl HTML::TokeParser module: 6# http://search.cpan.org/search?module=HTML::TokeParser 7# 8# Depending on where this is run from, you might need to modify $MANDIR below. 9# 10# Hacked together by Peter Boettcher <boettcher@ll.mit.edu> 11# Last modified: <Mon Jan 28 17:24:38 2002 by pwb> 12 13require HTML::TokeParser; 14 15# use strict; # I can dream... 16 17$MANDIR = "./man"; 18 19# HTML files to convert. Also include per-file info here: 20# name of man page, man section, 'see also' section 21%manfiles = ( 22 'ntpd' => ['ntpd', @NTPD_MS@, 'ntp.conf(5), ntpq(@NTPQ_MS@), ntpdc(@NTPDC_MS@)'], 23 'ntpq' => ['ntpq', @NTPQ_MS@, 'ntp_decode(5), ntpd(@NTPD_MS@), ntpdc(@NTPDC_MS@)'], 24 'ntpdate' => ['ntpdate', @NTPDATE_MS@, 'ntpd(@NTPD_MS@)'], 25 'ntpdc' => ['ntpdc', @NTPDC_MS@, 'ntpd(@NTPD_MS@)'], 26 'ntptime' => ['ntptime', @NTPTIME_MS@, 'ntpd(@NTPD_MS@), ntpdate(@NTPDATE_MS@)'], 27 'ntptrace' => ['ntptrace', @NTPTRACE_MS@, 'ntpd(@NTPD_MS@)'], 28 'ntp-wait' => ['ntp-wait', @NTP_WAIT_MS@, 'ntpd(@NTPD_MS@)'], 29 'keygen' => ['ntp-keygen', @NTP_KEYGEN_MS@, 'ntpd(@NTPD_MS@), ntp_auth(5)'], 30 'tickadj' => ['tickadj', @TICKADJ_MS@, 'ntpd(@NTPD_MS@)'], 31 'confopt' => ['ntp.conf', 5, 'ntpd(@NTPD_MS@), ntp_auth(5), ntp_mon(5), ntp_acc(5), ntp_clock(5), ntp_misc(5)'], 32 'authopt' => ['ntp_auth', 5, 'ntp.conf(5), ntpd(@NTPD_MS@)'], 33 'monopt' => ['ntp_mon', 5, 'ntp.conf(5), ntp_decode(5)'], 34 'accopt' => ['ntp_acc', 5, 'ntp.conf(5)'], 35 'clockopt' => ['ntp_clock', 5, 'ntp.conf(5)'], 36 'decode' => ['ntp_decode', 5, 'ntpq(@NTPQ_MS@), ntp_mon(5)'], 37 'miscopt' => ['ntp_misc', 5, 'ntp.conf(5)']); 38 39%table_headers = ( 40 'ntpd' => 'l l l l.', 41 'ntpq' => 'l l.', 42 'monopt' => 'l l l.', 43 'decode' => 'l l l l.', 44 'authopt' => 'c c c c c c.' 45); 46 47# Disclaimer to go in SEE ALSO section of the man page 48$seealso_disclaimer = "The official HTML documentation.\n\n" . 49 "This file was automatically generated from HTML source.\n"; 50 51mkdir $MANDIR, 0777; 52mkdir "$MANDIR/man8", 0777; 53mkdir "$MANDIR/man5", 0777; 54 55# Do the actual processing 56foreach $file (keys %manfiles) { 57 process($file); 58} 59# End of main function 60 61 62 63# Do the real work 64sub process { 65 my($filename) = @_; 66 $fileinfo = $manfiles{$filename}; 67 68 $p = HTML::TokeParser->new("$filename.html") || die "Can't open $filename.html: $!"; 69 $fileout = "$MANDIR/man$fileinfo->[1]/$fileinfo->[0].$fileinfo->[1]"; 70 open(MANOUT, ">$fileout") 71 || die "Can't open: $!"; 72 73 $p->get_tag("title"); 74 $name = $p->get_text("/title"); 75 $p->get_tag("hr"); # Skip past image and quote, hopefully 76 77 # Setup man header 78 print MANOUT ".TH " . $fileinfo->[0] . " " . $fileinfo->[1] . "\n"; 79 print MANOUT ".SH NAME\n"; 80 $pat = $fileinfo->[0]; 81 if ($name =~ /$pat/) { 82 } else { 83 # Add the manpage name, if not in the HTML title already 84 print MANOUT "$fileinfo->[0] - "; 85 } 86 print MANOUT "$name\n.SH \\ \n\n"; 87 88 @fontstack = (); 89 $deflevel = 0; 90 $pre = 0; 91 $ignore = 0; 92 $first_td = 1; 93 # Now start scanning. We basically print everything after translating some tags. 94 # $token->[0] has "T", "S", "E" for Text, Start, End 95 # $token->[1] has the tag name, or text (for "T" case) 96 # Theres lots more in the world of tokens, but who cares? 97 while (my $token = $p->get_token) { 98 if($token->[0] eq "T") { 99 my $text = $token->[1]; 100 if (!$pre) { 101 if($tag) { 102 $text =~ s/^[\n\t ]*//; 103 } 104 $text =~ s/^[\n\t ][\n\t ]+$//; 105 $text =~ s/[\n\t ]+/ /g; 106 $text =~ s/ \;/ /g; 107 $text =~ s/>\;/>/g; 108 $text =~ s/<\;/</g; 109 $text =~ s/"\;/"/g; 110 $text =~ s/&\;/&/g; 111 $text =~ s/^\./\\[char46]/; 112 } 113 print MANOUT "$text"; 114 $tag = 0; 115 } 116 if($token->[0] eq "S") { 117 if($token->[1] eq "h4") { 118 my $text = uc($p->get_trimmed_text("/h4")); 119 # ignore these sections in ntpd.html 120 if ($filename eq "ntpd" && 121 ($text eq "CONFIGURATION OPTIONS")) { 122 $ignore = 1; 123 close(MANOUT); 124 open(MANOUT, ">/dev/null"); 125 } elsif ($ignore) { 126 $ignore = 0; 127 close(MANOUT); 128 open(MANOUT, ">>$fileout"); 129 } 130 print MANOUT "\n\n.SH $text\n"; 131 } 132 if($token->[1] eq "tt") { 133 push @fontstack, "tt"; 134 print MANOUT "\\fB"; 135 } 136 if($token->[1] eq "i") { 137 push @fontstack, "i"; 138 print MANOUT "\\fI"; 139 } 140 if($token->[1] eq "address") { 141 my $text = $p->get_trimmed_text("/address"); 142 print MANOUT "\n.SH AUTHOR\n$text\n"; 143 } 144 if($token->[1] eq "dt" || $token->[1] eq "br" && $deflevel > 0) { 145 print MANOUT "\n.TP 8\n"; 146 $tag = 1; 147 } 148 if($token->[1] eq "dd") { 149 print MANOUT "\n"; 150 $tag = 1; 151 } 152 if($token->[1] eq "dl") { 153 $deflevel+=1; 154 if ($deflevel > 0) { 155 print MANOUT "\n.RS ", $deflevel > 1 ? 8 : 0; 156 } 157 } 158 if($token->[1] eq "p") { 159 print MANOUT "\n"; 160 } 161 if($token->[1] eq "pre") { 162 print MANOUT "\n.nf"; 163 $pre = 1; 164 } 165 if($token->[1] eq "table") { 166 print MANOUT "\n.TS\n"; 167 print MANOUT "expand allbox tab(%);\n"; 168 print MANOUT $table_headers{$filename}; 169 print MANOUT "\n"; 170 } 171 if($token->[1] eq "td") { 172 if ($first_td == 0) { 173 print MANOUT " % "; 174 } 175 $first_td = 0; 176 } 177 } 178 elsif($token->[0] eq "E") { 179 if($token->[1] eq "h4") { 180 $tag = 1; 181 } 182 if($token->[1] eq "tt") { 183 $f = pop @fontstack; 184 if($f ne "tt") { 185 warn "Oops, mismatched font! Trying to continue\n"; 186 } 187 if ($#fontstack < 0) { $fontswitch = "\\fR"; } 188 elsif ($fontstack[$#fontstack] eq "tt") { $fontswitch = "\\fB"; } 189 else { $fontswitch = "\\fI"; } 190 print MANOUT "$fontswitch"; 191 } 192 if($token->[1] eq "i") { 193 $f = pop @fontstack; 194 if($f ne "i") { 195 warn "Oops, mismatched font! Trying to continue\n"; 196 } 197 if ($#fontstack < 0) { $fontswitch = "\\fR"; } 198 elsif ($fontstack[$#fontstack] eq "tt") { $fontswitch = "\\fB"; } 199 else { $fontswitch = "\\fI"; } 200 print MANOUT "$fontswitch"; 201 } 202 if($token->[1] eq "dl") { 203 if ($deflevel > 0) { 204 print MANOUT "\n.RE"; 205 } 206 print MANOUT "\n"; 207 $deflevel-=1; 208 } 209 if($token->[1] eq "p") { 210 print MANOUT "\n"; 211 $tag = 1; 212 } 213 if($token->[1] eq "pre") { 214 print MANOUT "\n.fi"; 215 $pre = 0; 216 } 217 if($token->[1] eq "table") { 218 print MANOUT ".TE\n"; 219 } 220 if($token->[1] eq "tr") { 221 print MANOUT "\n"; 222 $first_td = 1; 223 } 224 } 225 } 226 if ($ignore) { 227 close(MANOUT); 228 open(MANOUT, ">>$fileout"); 229 } 230 print MANOUT "\n.SH SEE ALSO\n\n"; 231 print MANOUT "$fileinfo->[2]\n\n"; 232 print MANOUT "$seealso_disclaimer\n"; 233 close(MANOUT); 234} 235