#! /usr/bin/perl # # $Id: g.html2man,v 1.9 2000/11/26 18:54:49 cho Exp $ # Slightly modified by towo for mined man page. # Usage g.html2man
############################################################################# sub basename { $slash = rindex($_[0], "/"); $suffix = rindex($_[0], $_[1]); if ($suffix == -1) {$suffix=length($_[0])}; return substr($_[0], $slash+1, $suffix-$slash-1); } sub GetTitle { while () { if (m#.*MAN page for:#i) { s#<TITLE>##i; s#MAN page for:##i; s###i; @TITLE = split; return 1; } if (m##i) { return 1; } } return 0; } sub PrintHeader { print OUT ".TH $_[0] $_[1] \"__date__\" \"__footer__\" \"__header__\"\n"; ## print OUT ".so /usr/share/lib/tmac/sml\n"; ## print OUT ".so /usr/share/lib/tmac/rsml\n"; } ############################################################################# sub DoStrip { if (m#<.*TITLE>#i) {return 1}; if (m/<.*HEADER>/i) {return 1}; if (m/<.*HEAD>/i) {return 1}; if (m/<.*BODY>/i) {return 1}; if (m/<.*HEADER>/i) {return 1}; if (m/<.*BLINK>/i) {return 1}; if (m/^<A HREF="#toc/i) {return 1}; if (s#<A HREF=".*">##i) { s#</A>##i; } return 0; } sub DoLine { if (m#^ *</PRE>#i) { s#^ *</PRE>#.DE\n\\fR#i; $preformat = 0; return 1; } ### if ($preformat) {return 1}; if (m#^ *<PRE>#i) { s#^ *<PRE>#\\fC\n.DS#i; $preformat = 1; return 1; } s#<IMG SRC=.*>##i; if (m#<A NAME="toc">#i) {return 2}; s#<A NAME=".*">##i; s#<\!\-\-#.\\\" #i; s#\-\->##i; if (m#^<HR.*>$#i) {return 0}; s#<HR>##i; s#<HR .*>##i; if (&DoStrip($_)) {return 0} &DoFont($_); if (! &DoList($_)) {return 0}; if (! &DoSection($_)) {return 0} &DoEscape($_); &DoPara($_); if (! $preformat) { if (m/^$/) {return 0}; s#^[ \t]*##; s#<[^>]*>##g; } return 1; } sub DoEscape { # s#>#>#i; # s#<#<#i; s#>#>#i; s#<#<#i; } sub DoSection { if (m#^ *Table of Contents *$#i) {return 0}; if (m#^<A NAME=".*">$#i) {return 0;} s#<A NAME=".*">##i; s#^.*<H2>#.SH #i; s#^.*<H3>#.SS #i; # s#^.*<H4>#.TP\n.SM #i; s#^.*<H4>#.SS #i; if (m#^</[^>]*>$#i) {return 0}; s#</[^>]*>##ig; s#^<BR>$#.br#i; s#<BR>#\n.br\n#i; return 1; } #================ # Paragraph breaks: <P> # sub DoPara { s/^ *<P>/.PP\n/i; s/<P>/\n.PP\n/ig; return; } #================ # Lists # <DL><DT><DD> # sub DoList { if (m#^ *</DT> *$#i) {return 0}; if (m#<DT> *$#i) {chop}; # s#^ *<DT>#.IP \"#i; # s#<DT>#\n.IP \"#i; # s#</DT>#\" 4m#i; s#^ *<DT>#.TP\n#i; s#<DT>#\n.TP\n#i; s#</DT>#\n#i; if (m#^ *<DD> *$#i) {return 0}; if (m#^ *</DD> *$#i) {return 0}; if (m#^</LI>$#i) {return 0}; s#<DD>##i; s#</DD>##i; # s#<CODE>#\n.B #i; # s#</CODE>#\n#i; # s#^.*<DL> *$##i; # s#<DL>#\n.VL 4m\n#i; # s#^.*</DL> *$#.PP#i; # s#<DL>#\n.IP\n#i; s#^.*<DL> *$##i; s#<DL>#\n.VL 4m\n#i; s#^.*</DL> *$#.PP#i; s#</DL>#\n.IP\n#i; s#^.*<UL[^>]*> *$#.RS#i; s#<UL[^>]*>#\n.RS\n#i; # s#^.*<UL[^>]*> *$##i; # s#<UL[^>]*>#\n#i; s#^.*</UL> *$#.RE#i; s#</UL>#\n.RE\n#i; # s#^.*</UL> *$##i; # s#</UL>#\n#i; s#^.*<OL> *$#..IP#i; s#<OL>#\n.AL\n#i; s#^.*</OL> *$#.PP#i; s#</OL>#\n.PP\n#i; s#</LI>##i; # s#^<LI>$#.IP#i; # s#^ *<LI> *$#.IP#i; # s#<LI>#.IP\n#i; s#^<LI>$#.IP \\(bu#i; s#^ *<LI> *$#.IP \\(bu#i; s#<LI>#.IP \\(bu\n#i; return 1; } #================ # Font transitions: # <B> => \fB # </B> => \fR # <I> => \fI # </I> => \fR # sub DoFont { s# *</B> *_ *<B> *#_#ig; s#</B> *<B># #ig; s#<B>#\\fB#ig; s#</B>#\\fR#ig; s# *</I> *_ *<I> *#_#ig; s#</I> *<I># #ig; s#<I>#\\fI#ig; s#</I>#\\fR#ig; s# *</EM> *_ *<EM> *#_#ig; s#</EM> *<EM># #ig; s#<EM>#\\fI#ig; s#</EM>#\\fR#ig; s/&NBSP;/ /ig; s/&NDASH;/-/ig; s/&MDASH;/--/ig; s/&HELLIP;/ .../ig; return; } ############################################################################# #================== # Process HTML file $infile = $ARGV[0]; $outfile = $ARGV[1]; $preformat = 0; $page = &basename($ARGV[0], ".html"); $sect = $ARGV[2]; open(INP,$infile) || die "Can't open '$infile' for reading: $!"; if (! &GetTitle($page,$sect)) { print "$infile: Did not find a valid <TITLE> line\n"; close(INP); return; } open(OUT,"> $outfile") || die "Can't open '$outfile' for writing: $!"; print "Converting: $infile to $outfile\n"; &PrintHeader($page,$sect,$TITLE[0]); while (<INP>) { $result = &DoLine($_); if ($result == 2) { close(INP); close(OUT); return; } if (&DoLine($_) == 1) { s#<#<#g; s#>#>#g; print OUT; if ($preformat == 1) { print OUT ".br\n"; } } } close(INP); close(OUT); exit; #############################################################################