📄 tk2html.perl
字号:
#!/usr/bin/perl# Lightly modified man2html to make html equivs of tk/tcl man pages# probably a dead end soln since works on output after troff processing# Set the man path array to the paths to search...@manpath = ('/usr/share/man','/usr/gnu/man','/usr/local/man');#@manpath = ('/s/usr/hops/src/ftp/tcl/tk3.4/docs');# There has to be a blank line after this...#print "Content-type:text/html\n\n";if (!$ARGV[0]) { print "<isindex>\n"; chop($os = `uname`); chop($ver = `uname -r`); print "<title> $os $ver Manual Pages </title><h1> $os $ver Manual Pages </h1>Enter the name of the man page, optionally surroundedby parenthesis with the number. For example:<p><ul><li> stat to find one or more man pages for ls<li> stat(2) for the system call stat</ul>This converter is still in development. I intend toimprove the handling of multiple matches, and adda interface to apropos (or man -k (or whatis...))<p><a href=\"/users/bcutter/intro.html\">Brooks Cutter</a>"; exit(0);}$_ = $ARGV[0];$manpages[0] = $_;if ((/^-$/)) { $manpages[0] = $_;} elsif ((m!^/!)) { $manpages[0] = $_;#} elsif (($name, $sect) = /(\S+)\((\d.*)\)/) {# @manpages = &findman($name, $sect, @manpath);#} elsif (($name, $sect) = /(\S+)<(\d.*)>/) {# @manpages = &findman($name, $sect, @manpath);#} elsif (($name, $sect) = /(\S+)\[(\d.*)\]/) {# @manpages = &findman($name, $sect, @manpath);#} else {# @manpages = &findman($_, '', @manpath);}if (!scalar @manpages) { print "Sorry, I was unable to find a match for <b>$_</b>\n"; exit(0);} elsif (scalar @manpages > 1) { &which_manpage(@manpages);} else { if (!-e $manpages[0]) { die "man2html: Error, Can't locate file '$manpages[0]'\n"; } chop($type=`file -L $manpages[0]`); if ($type =~ /roff/i) { $manpages[0] = "nroff -man $manpages[0]|col -b|"; } elsif ($type =~ /text/i) {# #$manpages[0] = $manpages[0]; # ; # NOP (No Operation) $manpages[0] = "nroff -man $manpages[0]| col -b|"; } else { print "<title>Man2HTML: An Error has occurred</title><h1>Man2HTML: An Error has occurred</h1>man2html found the following match for your query:</hr>$manpages[0]<p>When 'file -L $manpages[0]' was run (which should follow symbolic links)it returned the following value '$type'<p>"; if ($type =~ /link/i) { print "This problem appears to be that there is a symbolic link for a man page that is pointing to a file that doesn't exist.<p>"; } print "Please report this problem to someone who can do something about it.<i>(Assuming you aren't that person...)</i>If you don't know who that is, try emailing 'root' or 'postmaster'.<p>There was only one match for your query - and it can't currently be accessed."; exit(0); #die "Unknown type '$type' for manpage '$manpages[0]'"; } &print_manpage($manpages[0]);}exit(0);sub findman {# Take a argument like 'ls' or 'vi(1)' or 'tip(1c)' and return# a list of one or more manpages.# Arguments 2- are the directories to search in local($lookfor) = shift(@_); local($section) = shift(@_); local($file, @files, @return, $return); local(%men,%man); die "lookfor($lookfor) is null\n" unless($lookfor); for (@_) { # I'm... too lazy... for... opendir()... too lazy for readdir()... # too lazy for closedir() ... I'm too lazy! if (!$section) { @files = `/bin/ls $_/*/$lookfor.* 2> /dev/null`; } else { # if the section is like '1b' then just search *1b # otherwise if '1' search *1* (to catch all sub-sections) # Reason for wildcards: ($_/*$section*/$lookfor.*) # (given $section = '2') # 1st: So it catches cat2 and man2 # 2nd: So it catches man2 and man2v # (This should make it compatiable with HP/UX's man2.Z - not tested) # 3rd: So it catches stat.2 and stat.2v # if (length($section) == 1) { @files = `/bin/ls $_/*$section*/$lookfor.* 2> /dev/null`; } else { local($section_num) = substr($section, 0, 1); # Just the number... @files = `/bin/ls $_/*$section_num*/$lookfor.* $_/*$section/$lookfor.* 2> /dev/null`; } } next if (!scalar @files); # This part checks the files that were found... for $file (@files) { chop($file); local(@dirs) = split(/\//,$file); local($fn) = pop(@dirs); local($catman) = pop(@dirs); local($dir) = join('/',@dirs); local($key) = "$dir/$fn"; next if ($man{$key}); # forces unique if (!$men{$key}) { $men{$key} = $catman; $man{$key} = $file; } else { # pre-formatted man pages always take precedence unless zero bytes... next if (($men{$key} =~ /^cat/i) && (!(-z $man{$key}))); $men{$key} = $catman; $man{$key} = $file; } } } return(values %man);}sub which_manpage {# Print a list of manpages... print "There were multiple matches for the argument '$ARGV[0]'.Below are the fully qualified pathnames of the matches, pleaseclick on the appropriate one.<ul>"; for (@_) { print "<li><a href=\"/htbin/man2html?$_\">$_</a>\n"; } print "</ul>\n"; return;}sub print_manpage { local($page) = @_; local($label, $before, $after, $begtag, $endtag, $blanks, $begtag2, $endtag2); local($pre); local($standard_indent) = 0; if ($page eq '-') { open(MAN, '-'); } elsif (index($page,'|') == length($page)) { # A Pipe local($eval) = 'open(MAN, "'.$page.'") || die "Can'."'t open pipe to '$page' for reading: ".'$!";'; eval($eval); die "Eval error line $. : '$eval' returned '$@' : $!\n"; } else { open(MAN, $page) || die "Can't open '$page' for reading: $!"; } while (<MAN>) { s/\|\|*[ ]*$//; # Delete trailing change bars if (/^\s*$/) { $blanks++; #if ($pre) { print "</pre>\n"; $pre = 0; } if (($. != 1) && ($blanks == 1)) { if (($pre) || ($section_pre)) { print "\n"; } else { print "<p>\n"; } } next; } #next if (!/^[A-Z]{2,}\(.*\).*/); if (//) { s/.//g; } # Escape & < and > s/&/\&/g; s/</\</g; s/>/\>/g; # if (/^(\w+.*)\s*$/) { $label = $1; $next_action = ''; if (/^[A-Z ]{2,}\s*$/) { if (($pre) || ($section_pre)) { print "</pre>\n"; } $pre = $section_pre = $section_fmt = 0; if (!$standard_indent) { $next_action = 'check_indent'; } } if ($label eq 'NAME') { $begtag = '<title>'; $endtag = '</title>'; $begtag2 = '<h1>'; $endtag2 = '</h1>'; $next_action = 'check_indent'; next; } if ($label eq 'SYNOPSIS') { $section_fmt = 1; } if ($label eq 'SEE ALSO') { $next_action = 'create_links'; } if (($label =~ /OPTIONS$/) || ($label eq 'FILES')) { $section_pre = 1; print "</pre>\n";# print "</pre OPTION>\n"; } elsif (/^[A-Z ]+\s*$/) { print "</pre>\n" if (($pre) || ($section_pre)); $section_pre = 0; }print "..$label..\n"; if (/^[-A-Z ]+\s*$/) { print "<h2>$label</h2>\n"; $blanks = 0; print "<pre>\n" if ($section_pre); next; } next; } if ($section_fmt) { print; $blanks = 0; next; } if ($next_action eq 'create_links') { # Parse see also looking for man page links. Make it # call this program. use '+' notation for spaces local($page); local($first) = 1; for $page (split(/,/)) { $page =~ tr/\x00-\x20//d; # Delete all control chars, spaces if ($page =~ /.+\(\d.*\).*$/) { $url_page = $page; $url_page =~ tr/()/[]/; print "," if (!$first); $first = 0; print "<a href=\"/tk2html?$url_page\">$page</a>\n"; } else { print "," if (!$first); $first = 0; print "$page"; } } next; } # This is to detect preformatted blocks. I look at the first # line after header 'DESCRIPTION' and count the leading white # space as the "standard indent". If I encounter a line with # a indent greater than the value of standard_indent then # surround it with <pre> and </pre> if ($next_action eq 'check_indent') { if (/^(\s+)\S+.*/) { $standard_indent = length($1); $next_action = ''; } } # $before = length($_); $saved = $_; s/^[ ][ ]*//; # Delete leading whitespace $after = length($_); s/[ ][ ]*$//; # Delete trailing whitespace if ($begtag) { chop; print "$begtag$_$endtag\n"; print "$begtag2$_$endtag2\n" if ($begtag2); $blanks = 0; $begtag2 = $endtag2 = $begtag = $endtag = ''; next; } if ((!$section_fmt) && (!$section_pre) && ($standard_indent)) { if (($blanks == 1) && (!$pre) && ($after + $standard_indent) < $before) { $pre = 1; print "<pre>\n"; } elsif (($pre) && ($after + $standard_indent) >= $before) { $pre = 0; print "</pre>\n"; } } if (($section_pre) || ($pre)) { print "$saved"; $blanks = 0; next; } # Handle word cont- # inuations if ($prefix) { print $prefix; $prefix = ''; } if (/^(.+)\s+(\w+)\-\s*$/) { $prefix = $2; print "$1\n"; $blanks = 0; next; } print; $blanks = 0; } close(MAN);}# EOF
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -