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:
13: require 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', 8, 'ntp.conf(5), ntpq(8), ntpdc(8)'],
23: 'ntpq' => ['ntpq', 8, 'ntp_decode(5), ntpd(8), ntpdc(8)'],
24: 'ntpdate' => ['ntpdate', 8, 'ntpd(8)'],
25: 'ntpdc' => ['ntpdc', 8, 'ntpd(8)'],
26: 'ntptime' => ['ntptime', 8, 'ntpd(8), ntpdate(8)'],
27: 'ntptrace' => ['ntptrace', 8, 'ntpd(8)'],
28: 'ntp-wait' => ['ntp-wait', 8, 'ntpd(8)'],
29: 'keygen' => ['ntp-keygen', 8, 'ntpd(8), ntp_auth(5)'],
30: 'tickadj' => ['tickadj', 8, 'ntpd(8)'],
31: 'confopt' => ['ntp.conf', 5, 'ntpd(8), ntp_auth(5), ntp_mon(5), ntp_acc(5), ntp_clock(5), ntp_misc(5)'],
32: 'authopt' => ['ntp_auth', 5, 'ntp.conf(5), ntpd(8)'],
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(8), 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:
51: mkdir $MANDIR, 0777;
52: mkdir "$MANDIR/man8", 0777;
53: mkdir "$MANDIR/man5", 0777;
54:
55: # Do the actual processing
56: foreach $file (keys %manfiles) {
57: process($file);
58: }
59: # End of main function
60:
61:
62:
63: # Do the real work
64: sub 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: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>