home *** CD-ROM | disk | FTP | other *** search
/ HTML - Publishing on the Internet / html_cdrom.iso / tools / html / linux / check / makemenu.pl < prev    next >
Perl Script  |  1995-01-21  |  7KB  |  164 lines

  1. #!/usr/local/bin/perl
  2. #makemenu.pl -- Makes simple menu for HTML files, based on each file's <title>,
  3. #            and can make simple table of contents based on <h1>-<h6> headings.
  4. #
  5. #Typical use:
  6. #
  7. #  perl makemenu.pl [options] infiles.html > menu.html
  8. #
  9. #    Where command-line options have the form "option=value".  The possible
  10. # options are title="...", toc=1, and dirprefix="..." and should appear on the
  11. # command line _before_ the names of files to be processed.
  12. #
  13. #    The menu contains a list of <A HREF="file.html">....</A> elements: the
  14. # content of each of these menu items is taken from that of the
  15. # <TITLE>...</TITLE> element of the corresponding file.
  16. #
  17. #    The title="..." option specifies the title of the menu itself:
  18. #
  19. #  perl makemenu.pl title="Menu for HTML files" *.html > menu.html
  20. #
  21. #    To make a menu of all the files in one's personal hierarchy under Unix:
  22. #
  23. #  cd $HOME/public_html
  24. #  perl makemenu.pl title="My Files" `find . -name \*.html -print` > menu.html
  25. #
  26. #    The toc=1 command-line option attempts to construct a table of contents
  27. # for each file as part of the menu, based on the <H1>-<H6> headings in the
  28. # file.  If there are links inside headings, then makemenu.pl will attempt to
  29. # preserve the validity of <A HREF="..."> references, and transform an
  30. # <A NAME="..."> into an <A HREF="..."> link to the heading from the menu file;
  31. # however, makemenu.pl is limited by the fact that it does not examine each
  32. # <A> tag in a heading individually, but only does global search-and-replace
  33. # operations on the whole <Hn>...</Hn> element (for this reason, the values
  34. # of <A HREF=> and <A NAME=> are only operated on if they are quoted).
  35. #
  36. #    A dirprefix="..."  option can also be specified on the command line; this
  37. # specifies a string which is prefixed to filenames, and which can be used to
  38. # convert local filesystem references (relative URL's) to absolute URL's.
  39. # An example:
  40. #
  41. #  perl makemenu.pl dirprefix=http://myhost.edu/~myself/ *.html > menu.html
  42. #
  43. #    This program is rather simple-minded; if an HTML file does not have a
  44. # <TITLE>...</TITLE> element, it will not appear in the menu.  If the closing
  45. # </TITLE> tag is not present, it will try to stuff the whole remaining text of
  46. # the file into the menu.  The closing `>' character of the <TITLE>, </TITLE>,
  47. # <H1>-<H6> and </H1>-</H6> tags should not be on a different line from the
  48. # rest of the tag.  Also, multiple headings should not be contained on a single
  49. # line.  This is not an error-checking program, and illegal HTML input may
  50. # result in incorrect HTML output.
  51. #
  52. # Copyright 1995 by H. Churchyard, churchh@uts.cc.utexas.edu -- freely
  53. # redistributable.  This program is a port to perl of the original makemenu.awk
  54. # (the port was fairly mechanical, so programming style and efficency may not
  55. # be high).
  56. #
  57. #  Version 1.0 12/94?? -- Was for my personal use only.
  58. #  Version 1.1 1/8/95 -- Made more general, added documentation comments,
  59. # ported from awk to perl.
  60. #  Version 1.2 1/12/95 -- Added heading-to-Table-of-Contents stuff.  Included
  61. # in htmlchek 4.0 release.
  62. #
  63. eval "exec /usr/local/bin/perl -S $0 $*"
  64.     if $running_under_some_shell; # this emulates #! processing on NIH machines.
  65. $title = ''; $toc = 0; $dirprefix = '';
  66. eval '$'.$1.'$2;' while $ARGV[0] =~ /^(title=|toc=|dirprefix=)(.*)/ && shift;
  67. $[ = 1;                 # set array base to 1
  68. $\ = "\n";              # set output record separator
  69. foreach $X (@ARGV) {
  70.     if ($X =~ /^[^=]+=/) {
  71.         print STDERR "Apparent misspelled or badly-placed command-line option $&";
  72.         print STDERR "Attempting to continue anyway...";}}
  73. $accum = ''; $haccum = '';
  74. $xRS = $/;
  75. #
  76. while (<>) {
  77.     if ($_ =~ /$xRS$/o) {chop;} # strip record separator
  78.     if (($.-$FNRbase) == 1) {
  79.         if ($. == 1) {
  80.             if (!$title) {
  81.                 $title = 'Menu for HTML files';}
  82.             print "<html><head><title>$title</title></head>";
  83.             print "<body><h1>$title</h1><hr><ul>";}
  84.         else {
  85.             if ($toc) {
  86.                 &liout();}}
  87.         $hlevel = 0;}
  88.     #
  89.     if (/<[Tt][Ii][Tt][Ll][Ee][^<>]*>/ .. /<\/[Tt][Ii][Tt][Ll][Ee][^<>]*>/) {
  90.         $line = $_;
  91.         $line =~ s/^.*<[Tt][Ii][Tt][Ll][Ee][^<>]*>//;
  92.         $X = ($line =~ s/<\/[Tt][Ii][Tt][Ll][Ee][^<>]*>.*$//);
  93.         $accum = ($accum . ' ' . $line);
  94.         if ($X) {
  95.             if ($toc) {
  96.                 &liout();}
  97.             $fn = $ARGV;
  98.             $fn =~ s/^\.\///;
  99.             $accum =~ s/^  *//; $accum =~ s/  *$//;
  100.             print " <LI><A HREF=\042$dirprefix$fn\042>$accum</A> <tt>($fn)</tt>";
  101.             $accum = '';}}
  102.     #
  103.     if ((/<[Hh][1-6][^<>]*>/ .. /<\/[Hh][1-6][^<>]*>/)&&($toc)) {
  104.         if (((($_ =~ /<[Hh][1-6]/) eq 1) && ($RSTART = length($`)+1)) != 0) {
  105.             $newhlevel = substr($_, ($RSTART + 2), 1);
  106.             if ($newhlevel > $hlevel) {
  107.                 printf '%' . (($newhlevel * 2) + 1) . 's', '';
  108.                 for ($i = ($newhlevel - $hlevel); $i >= 1; --$i) {
  109.                     printf '<UL>';}
  110.                 printf "\n";}
  111.             else {
  112.                 if ($newhlevel < $hlevel) {
  113.                     printf '%' . (($hlevel * 2) + 1) . 's', '';
  114.                     for ($i = ($hlevel - $newhlevel); $i >= 1; --$i) {
  115.                         printf '</UL>';}
  116.                     printf "\n";}}
  117.             $hlevel = $newhlevel;}
  118.         $line = $_;
  119.         $line =~ s/^.*<[Hh][1-6][^<>]*>//;
  120.         $X = ($line =~ s/<\/[Hh][1-6][^<>]*>.*$//);
  121.         $haccum = ($haccum . ' ' . $line);
  122.         if ($X) {
  123.             $fn = $ARGV;
  124.             $fn =~ s/^\.\///;
  125.             $haccum =~ s/^  *//;
  126.             $haccum =~ s/  *$//;
  127.             # The following code attempts to preserve the validity of HREF's,
  128.             # and transform <A NAME>'s into HREF's where possible, but it's kind
  129.             # of lame because it doesn't examine each <A> tag individually.
  130.             if ($haccum =~ /<[Aa]/) {
  131.             $haccum =~ s/[ \t]*=[ \t]*\042/=\042/g;
  132.             $z = ($haccum =~ s/[Hh][Rr][Ee][Ff]=\042#/HREF=\042$dirprefix$fn#/g);
  133.             if ((!$z) && ($haccum !~
  134.               /[Hh][Rr][Ee][Ff]=\042[^\042]*[:\057][^\042]*\042/)) {
  135.                 $haccum =~ s/[Hh][Rr][Ee][Ff]=\042/HREF=\042$dirprefix/g;}
  136.             if (($haccum !~ /[Hh][Rr][Ee][Ff]=\042/) || (($haccum !~
  137.               /<[Aa][^<>]*[Hh][Rr][Ee][Ff][ \t]*=[^<>]*[Nn][Aa][Mm][Ee][ \t]*=[^<>]*>/) &&
  138.               ($haccum !~
  139.               /<[Aa][^<>]*[Nn][Aa][Mm][Ee][ \t]*=[^<>]*[Hh][Rr][Ee][Ff][ \t]*=[^<>]*>/))) {
  140.                 $haccum =~ s/[Nn][Aa][Mm][Ee]=\042/HREF=\042$dirprefix$fn#/g;}}
  141.             # </lame>
  142.             printf '%' . (($hlevel * 2) + 1) . "s<LI>%s\n", '', $haccum;
  143.             $haccum = '';}}}
  144. continue {
  145.     $FNRbase = $. if eof;}
  146. #
  147. #END
  148. #
  149. if ($. > 0) {
  150.     if ($toc) {
  151.         &liout();}
  152.     print '</ul>';
  153.     print '<!-- Replace this comment with your signature stuff -->';
  154.     print '</body></html>';}
  155. #
  156. sub liout {
  157.     if ($hlevel > 0) {
  158.         printf '%' . (($hlevel * 2) + 1) . 's', '';
  159.         for ($i = $hlevel; $i >= 1; --$i) {
  160.             printf '</UL>';}
  161.         printf "\n";}
  162.     $hlevel = 0;}
  163. ##EOF
  164.