This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
[ID 20020213.015] Pod::Html XHTML update for 5.7.2
[perl5.git] / lib / Pod / Html.pm
index 9586f8e..c61e7d5 100644 (file)
@@ -41,8 +41,8 @@ Pod::Html takes the following arguments:
 
     --backlink="Back to Top"
 
-Adds "Back to Top" links in front of every HEAD1 heading (except for
-the first).  By default, no backlink are being generated.
+Adds "Back to Top" links in front of every C<head1> heading (except for
+the first).  By default, no backlinks are generated.
 
 =item cachedir
 
@@ -54,7 +54,8 @@ Creates the item and directory caches in the given directory.
 
     --css=stylesheet
 
-Specify the URL of a cascading style sheet.
+Specify the URL of a cascading style sheet.  Also disables all HTML/CSS
+C<style> attributes that are output by default (to avoid conflicts).
 
 =item flush
 
@@ -67,8 +68,8 @@ Flushes the item and directory caches.
     --header
     --noheader
 
-Creates header and footer blocks containing the text of the NAME
-section.  By default, no headers are being generated.
+Creates header and footer blocks containing the text of the C<NAME>
+section.  By default, no headers are generated.
 
 =item help
 
@@ -118,8 +119,7 @@ List of page names (eg, "perlfunc") which contain linkable C<=item>s.
     --netscape
     --nonetscape
 
-Use Netscape HTML directives when applicable.  By default, they will
-B<not> be used.
+B<Deprecated>, has no effect. For backwards compatibility only.
 
 =item outfile
 
@@ -133,7 +133,7 @@ is specified.
     --podpath=name:...:name
 
 Specify which subdirectories of the podroot contain pod files whose
-HTML converted forms can be linked-to in cross-references.
+HTML converted forms can be linked to in cross references.
 
 =item podroot
 
@@ -175,7 +175,7 @@ Display progress messages.  By default, they won't be displayed.
 =head1 EXAMPLE
 
     pod2html("pod2html",
-            "--podpath=lib:ext:pod:vms", 
+            "--podpath=lib:ext:pod:vms",
             "--podroot=/usr/src/perl",
             "--htmlroot=/perl/nmanual",
             "--libpods=perlfunc:perlguts:perlvar:perlrun:perlop",
@@ -185,7 +185,7 @@ Display progress messages.  By default, they won't be displayed.
 
 =head1 ENVIRONMENT
 
-Uses $Config{pod2html} to setup default options.
+Uses C<$Config{pod2html}> to setup default options.
 
 =head1 AUTHOR
 
@@ -238,11 +238,10 @@ my $ignore = 1;                   # whether or not to format text.  we don't
 
 my %items_named = ();          # for the multiples of the same item in perlfunc
 my @items_seen = ();
-my $netscape = 0;              # whether or not to use netscape directives.
 my $title;                     # title to give the pod(s)
 my $header = 0;                        # produce block header/footer
 my $top = 1;                   # true if we are at the top of the doc.  used
-                               #   to prevent the first <HR> directive.
+                               #   to prevent the first <hr /> directive.
 my $paragraph;                 # which paragraph we're processing (used
                                #   for error messages)
 my $ptQuote = 0;                # status of double-quote conversion
@@ -285,11 +284,10 @@ $ignore = 1;                      # whether or not to format text.  we don't
 
 @items_seen = ();
 %items_named = ();
-$netscape = 0;         # whether or not to use netscape directives.
 $header = 0;                   # produce block header/footer
 $title = '';                   # title to give the pod(s)
 $top = 1;                      # true if we are at the top of the doc.  used
-                               #   to prevent the first <HR> directive.
+                               #   to prevent the first <hr /> directive.
 $paragraph = '';                       # which paragraph we're processing (used
                                #   for error messages)
 %sections = ();                # sections within this page
@@ -337,27 +335,30 @@ sub pod2html {
     # parse the command-line parameters
     parse_command_line();
 
+    # escape the backlink argument (same goes for title but is done later...)
+    $backlink = html_escape($backlink) if defined $backlink;
+
     # set some variables to their default values if necessary
     local *POD;
-    unless (@ARGV && $ARGV[0]) { 
+    unless (@ARGV && $ARGV[0]) {
        $podfile  = "-" unless $podfile;        # stdin
        open(POD, "<$podfile")
                || die "$0: cannot open $podfile file for input: $!\n";
     } else {
        $podfile = $ARGV[0];  # XXX: might be more filenames
        *POD = *ARGV;
-    } 
+    }
     $htmlfile = "-" unless $htmlfile;  # stdout
     $htmlroot = "" if $htmlroot eq "/";        # so we don't get a //
     $htmldir =~ s#/\z## ;               # so we don't get a //
     if (  $htmlroot eq ''
-       && defined( $htmldir ) 
+       && defined( $htmldir )
        && $htmldir ne ''
-       && substr( $htmlfile, 0, length( $htmldir ) ) eq $htmldir 
-       ) 
+       && substr( $htmlfile, 0, length( $htmldir ) ) eq $htmldir
+       )
     {
        # Set the 'base' url for this file, so that we can use it
-       # as the location from which to calculate relative links 
+       # as the location from which to calculate relative links
        # to other files. If this is '', then absolute links will
        # be used throughout.
         $htmlfileurl= "$htmldir/" . substr( $htmlfile, length( $htmldir ) + 1);
@@ -384,25 +385,25 @@ sub pod2html {
     # put a title in the HTML file if one wasn't specified
     if ($title eq '') {
        TITLE_SEARCH: {
-           for my $i ( 0..$#poddata ) {
+           for (my $i = 0; $i < @poddata; $i++) {
                if ($poddata[$i] =~ /^=head1\s*NAME\b/m) {
-                   for my $para ( @poddata[$i, $i+1] ) { 
+                   for my $para ( @poddata[$i, $i+1] ) {
                        last TITLE_SEARCH
                            if ($title) = $para =~ /(\S+\s+-+.*\S)/s;
                    }
-               } 
+               }
 
-           } 
+           }
        }
     }
     if (!$title and $podfile =~ /\.pod\z/) {
        # probably a split pod so take first =head[12] as title
-       for my $i ( 0..$#poddata ) {
+       for (my $i = 0; $i < @poddata; $i++) {
            last if ($title) = $poddata[$i] =~ /^=head[12]\s*(.*)/;
-       } 
+       }
        warn "adopted '$title' as title for $podfile\n"
            if $verbose and $title;
-    } 
+    }
     if ($title) {
        $title =~ s/\s*\(.*\)//;
     } else {
@@ -411,25 +412,38 @@ sub pod2html {
        $title = ($podfile eq "-" ? 'No Title' : $1);
        warn "using $title" if $verbose;
     }
-    my $csslink = $css ? qq(\n<LINK REL="stylesheet" HREF="$css" TYPE="text/css">) : '';
-    $csslink =~ s,\\,/,g;
-    $csslink =~ s,(/.):,$1|,;
-
-    my $block = $header ? <<END_OF_BLOCK : '';
-<TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH=100%>
-<TR><TD CLASS=block VALIGN=MIDDLE WIDTH=100% BGCOLOR="#cccccc">
-<FONT SIZE=+1><STRONG><P CLASS=block>&nbsp;$title</P></STRONG></FONT>
-</TD></TR>
-</TABLE>
+    $title = html_escape($title);
+
+    my $csslink = '';
+    my $bodystyle = ' style="background-color: white"';
+    my $tdstyle = ' style="background-color: #cccccc"';
+
+    if ($css) {
+      $csslink = qq(\n<link rel="stylesheet" href="$css" type="text/css" />);
+      $csslink =~ s,\\,/,g;
+      $csslink =~ s,(/.):,$1|,;
+      $bodystyle = '';
+      $tdstyle = '';
+    }
+
+      my $block = $header ? <<END_OF_BLOCK : '';
+<table border="0" width="100%" cellspacing="0" cellpadding="3">
+<tr><td class="block"$tdstyle valign="middle">
+<big><strong><span class="block">&nbsp;$title</span></strong></big>
+</td></tr>
+</table>
 END_OF_BLOCK
 
     print HTML <<END_OF_HEAD;
-<HTML>
-<HEAD>
-<TITLE>$title</TITLE>$csslink
-</HEAD>
-
-<BODY>
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+head>
+<title>$title</title>$csslink
+<link rev="made" href="mailto:$Config{perladmin}" />
+</head>
+
+<body$bodystyle>
 $block
 END_OF_HEAD
 
@@ -443,16 +457,17 @@ END_OF_HEAD
     # still generate an index, but surround it with an html comment.
     # that way some other program can extract it if desired.
     $index =~ s/--+/-/g;
-    print HTML "<A NAME=\"__index__\"></A>\n";
+    print HTML "<p><a name=\"__index__\"></a></p>\n";
     print HTML "<!-- INDEX BEGIN -->\n";
     print HTML "<!--\n" unless $doindex;
     print HTML $index;
     print HTML "-->\n" unless $doindex;
     print HTML "<!-- INDEX END -->\n\n";
-    print HTML "<HR>\n" if $doindex and $index;
+    print HTML "<hr />\n" if $doindex and $index;
 
     # now convert this file
     my $after_item;             # set to true after an =item
+    my $need_dd = 0;
     warn "Converting input file $podfile\n" if $verbose;
     foreach my $i (0..$#poddata){
         $ptQuote = 0; # status of quote conversion
@@ -462,6 +477,7 @@ END_OF_HEAD
        if (/^(=.*)/s) {        # is it a pod directive?
            $ignore = 0;
            $after_item = 0;
+           $need_dd = 0;
            $_ = $1;
            if (/^=begin\s+(\S+)\s*(.*)/si) {# =begin
                process_begin($1, $2);
@@ -479,7 +495,7 @@ END_OF_HEAD
                } elsif (/^=item\s*(.*\S)?/sm) {        # =item text
                    warn "$0: $podfile: =item without bullet, number or text"
                       . " in paragraph $paragraph.\n" if !defined($1) or $1 eq '';
-                   process_item( $1 );
+                   $need_dd = process_item( $1 );
                    $after_item = 1;
                } elsif (/^=over\s*(.*)/) {             # =over N
                    process_over();
@@ -498,11 +514,12 @@ END_OF_HEAD
        else {
            next if $ignore;
            next if @begin_stack && $begin_stack[-1] ne 'html';
-            print HTML and next if @begin_stack && $begin_stack[-1] eq 'html';
+           print HTML and next if @begin_stack && $begin_stack[-1] eq 'html';
+           print HTML "<dd>\n" if $need_dd;
            my $text = $_;
            if( $text =~ /\A\s+/ ){
                process_pre( \$text );
-               print HTML "<PRE>\n$text</PRE>\n";
+               print HTML "<pre>\n$text</pre>\n";
 
            } else {
                process_text( \$text );
@@ -520,10 +537,10 @@ END_OF_HEAD
                            }
                        }
                        if( $all > 0 ){
-                           $text =~ s/\t+/<TD>/g;
-                           $text =~ s/^/<TR><TD>/gm;
-                           $text = '<TABLE CELLSPACING=0 CELLPADDING=0>' .
-                                    $text . '</TABLE>';
+                           $text =~ s/\t+/<td>/g;
+                           $text =~ s/^/<tr><td>/gm;
+                           $text = '<table cellspacing="0" cellpadding="0">' .
+                                    $text . '</table>';
                        }
                    }
                }
@@ -533,9 +550,10 @@ END_OF_HEAD
                    print HTML "$text\n";
                    $after_lpar = 1;
                } else {
-                   print HTML "<P>$text</P>\n";
+                   print HTML "<p>$text</p>\n";
                }
            }
+           print HTML "</dd>\n" if $need_dd;
            $after_item = 0;
        }
     }
@@ -544,14 +562,14 @@ END_OF_HEAD
     finish_list();
 
     # link to page index
-    print HTML "<P><A HREF=\"#__index__\"><SMALL>$backlink</SMALL></A></P>\n"
+    print HTML "<p><a href=\"#__index__\"><small>$backlink</small></a></p>\n"
        if $doindex and $index and $backlink;
 
     print HTML <<END_OF_TAIL;
 $block
-</BODY>
+</body>
 
-</HTML>
+</html>
 END_OF_TAIL
 
     # close the html file
@@ -592,8 +610,6 @@ Usage:  $0 --help --htmlroot=<name> --infile=<name> --outfile=<name>
                    directives in as targets of C<> and implicit links (empty
                    by default).  note, these are not filenames, but rather
                    page names like those that appear in L<> links.
-  --[no]netscape - will use netscape html directives when applicable.
-                   (default is not to use them).
   --outfile      - filename for the resulting html file (output sent to
                    stdout by default).
   --podpath      - colon-separated list of directories containing library
@@ -605,6 +621,7 @@ Usage:  $0 --help --htmlroot=<name> --infile=<name> --outfile=<name>
                    (default behaviour).
   --title        - title that will appear in resulting html file.
   --[no]verbose  - self-explanatory (off by default).
+  --[no]netscape - deprecated, has no effect. for backwards compatibility only.
 
 END_OF_USAGE
 
@@ -652,7 +669,6 @@ sub parse_command_line {
     $htmlroot = $opt_htmlroot if defined $opt_htmlroot;
     $doindex  = $opt_index    if defined $opt_index;
     $podfile  = $opt_infile   if defined $opt_infile;
-    $netscape = $opt_netscape if defined $opt_netscape;
     $htmlfile = $opt_outfile  if defined $opt_outfile;
     $podroot  = $opt_podroot  if defined $opt_podroot;
     $quiet    = $opt_quiet    if defined $opt_quiet;
@@ -944,37 +960,38 @@ sub scan_headings {
     # scan for =head directives, note their name, and build an index
     #  pointing to each of them.
     foreach my $line (@data) {
-       if ($line =~ /^=(head)([1-6])\s+(.*)/) {
-           ($tag, $which_head, $otitle) = ($1,$2,$3);
+      if ($line =~ /^=(head)([1-6])\s+(.*)/) {
+        ($tag, $which_head, $otitle) = ($1,$2,$3);
 
-            my $title = depod( $otitle );
-            my $name = htmlify( $title );
-           $$sections{$name} = 1;
-           $title = process_text( \$otitle );
+        my $title = depod( $otitle );
+        my $name = htmlify( $title );
+        $$sections{$name} = 1;
+        $name =~ s/\s/_/g; # htmlify keeps spaces but we don't want them here..
+        $title = process_text( \$otitle );
 
            while ($which_head != $listdepth) {
                if ($which_head > $listdepth) {
-                   $index .= "\n" . ("\t" x $listdepth) . "<UL>\n";
+                   $index .= "\n" . ("\t" x $listdepth) . "<ul>\n";
                    $listdepth++;
                } elsif ($which_head < $listdepth) {
                    $listdepth--;
-                   $index .= "\n" . ("\t" x $listdepth) . "</UL>\n";
+                   $index .= "\n" . ("\t" x $listdepth) . "</ul>\n";
                }
            }
 
-           $index .= "\n" . ("\t" x $listdepth) . "<LI>" .
-                     "<A HREF=\"#" . $name . "\">" .
-                     $title . "</A></LI>";
+           $index .= "\n" . ("\t" x $listdepth) . "<li>" .
+                     "<a href=\"#" . $name . "\">" .
+                     $title . "</a></li>";
        }
     }
 
     # finish off the lists
     while ($listdepth--) {
-       $index .= "\n" . ("\t" x $listdepth) . "</UL>\n";
+       $index .= "\n" . ("\t" x $listdepth) . "</ul>\n";
     }
 
     # get rid of bogus lists
-    $index =~ s,\t*<UL>\s*</UL>\n,,g;
+    $index =~ s,\t*<ul>\s*</ul>\n,,g;
 
     $ignore = 1;       # restore old value;
 
@@ -1030,16 +1047,19 @@ sub process_head {
         }
     }
 
-    print HTML "<P>\n";
+    print HTML "<p>\n";
     if( $level == 1 && ! $top ){
-       print HTML "<A HREF=\"#__index__\"><SMALL>$backlink</SMALL></A>\n"
-           if $hasindex and $backlink;
-       print HTML "<HR>\n"
+      print HTML "<a href=\"#__index__\"><small>$backlink</small></a>\n"
+        if $hasindex and $backlink;
+      print HTML "</p>\n<hr />\n"
+    } else {
+      print HTML "</p>\n";
     }
 
     my $name = htmlify( depod( $heading ) );
+    $name =~ s/\s/_/g; # htmlify keeps spaces but we don't want them here...
     my $convert = process_text( \$heading );
-    print HTML "<H$level><A NAME=\"$name\">$convert</A></H$level>\n";
+    print HTML "<h$level><a name=\"$name\">$convert</a></h$level>\n";
 }
 
 
@@ -1056,14 +1076,15 @@ sub emit_item_tag($$$){
     $EmittedItem = $item;
     ### print STDERR "emit_item_tag=$item ($text)\n";
 
-    print HTML '<STRONG>';
+    print HTML '<strong>';
     if ($items_named{$item}++) {
        print HTML process_text( \$otext );
     } else {
        my $name = 'item_' . $item;
-       print HTML qq{<A NAME="$name">}, process_text( \$otext ), '</A>';
+       $name =~ s/\s/_/g; # we don't want spaces here...
+       print HTML qq{<a name="$name">}, process_text( \$otext ), '</a>';
     }
-    print HTML "</STRONG><BR>\n";
+    print HTML "</strong><br />\n";
     undef( $EmittedItem );
 }
 
@@ -1073,7 +1094,9 @@ sub emit_li {
        push( @listend, "</$tag>" );
        print HTML "<$tag>\n";
     }
-    print HTML $tag eq 'DL' ? '<DT>' : '<LI>';
+    my $emitted = $tag eq 'dl' ? 'dt' : 'li';
+    print HTML "<$emitted>";
+    return $emitted;
 }
 
 #
@@ -1081,6 +1104,7 @@ sub emit_li {
 #
 sub process_item {
     my( $otext ) = @_;
+    my $need_dd = 0; # set to 1 if we need a <dd></dd> after an item
 
     # lots of documents start a list without doing an =over.  this is
     # bad!  but, the proper thing to do seems to be to just assume
@@ -1092,38 +1116,42 @@ sub process_item {
 
     # formatting: insert a paragraph if preceding item has >1 paragraph
     if( $after_lpar ){
-       print HTML "<P></P>\n";
+       print HTML "<p></p>\n";
        $after_lpar = 0;
     }
 
     # remove formatting instructions from the text
     my $text = depod( $otext );
 
+    my $emitted; # the tag actually emitted, used for closing
+
     # all the list variants:
     if( $text =~ /\A\*/ ){ # bullet
-        emit_li( 'UL' );
-       if ($text =~ /\A\*\s+(.+)\Z/s ) { # with additional text
-           my $tag = $1;
-           $otext =~ s/\A\*\s+//;
-           emit_item_tag( $otext, $tag, 1 );
-       }
+        $emitted = emit_li( 'ul' );
+        if ($text =~ /\A\*\s+(.+)\Z/s ) { # with additional text
+            my $tag = $1;
+            $otext =~ s/\A\*\s+//;
+            emit_item_tag( $otext, $tag, 1 );
+        }
 
     } elsif( $text =~ /\A\d+/ ){ # numbered list
-       emit_li( 'OL' );
-       if ($text =~ /\A(?>\d+\.?)\s*(.+)\Z/s ) { # with additional text
-           my $tag = $1;
-           $otext =~ s/\A\d+\.?\s*//;
-           emit_item_tag( $otext, $tag, 1 );
-       }
+        $emitted = emit_li( 'ol' );
+        if ($text =~ /\A(?>\d+\.?)\s*(.+)\Z/s ) { # with additional text
+            my $tag = $1;
+            $otext =~ s/\A\d+\.?\s*//;
+            emit_item_tag( $otext, $tag, 1 );
+        }
 
     } else {                   # definition list
-       emit_li( 'DL' );
-       if ($text =~ /\A(.+)\Z/s ){ # should have text
-           emit_item_tag( $otext, $text, 1 );
-       }
-       print HTML '<DD>';
+        $emitted = emit_li( 'dl' );
+        if ($text =~ /\A(.+)\Z/s ){ # should have text
+            emit_item_tag( $otext, $text, 1 );
+        }
+        $need_dd = 1;
     }
+    print HTML "</$emitted>" if $emitted;
     print HTML "\n";
+    return $need_dd;
 }
 
 #
@@ -1150,7 +1178,7 @@ sub process_back {
     # $listend[$listlevel] may have never been initialized.
     $listlevel--;
     if( defined $listend[$listlevel] ){
-       print HTML '<P></P>' if $after_lpar;
+       print HTML '<p></p>' if $after_lpar;
        print HTML $listend[$listlevel];
         print HTML "\n";
         pop( @listend );
@@ -1189,7 +1217,7 @@ sub process_for {
        for my $ext (qw[.png .gif .jpeg .jpg .tga .pcl .bmp]) {
          $text .= $ext, last if -r "$text$ext";
        }
-        print HTML qq{<p align = "center"><img src = "$text" alt = "$text illustration"></p>};
+        print HTML qq{<p align="center"><img src="$text" alt="$text illustration" /></p>};
     }
 }
 
@@ -1216,12 +1244,12 @@ sub process_end {
     $whom = lc($whom);
     if ($begin_stack[-1] ne $whom ) {
        die "Unmatched begin/end at chunk $paragraph\n"
-    } 
+    }
     pop( @begin_stack );
 }
 
 #
-# process_pre - indented paragraph, made into <PRE></PRE>
+# process_pre - indented paragraph, made into <pre></pre>
 #
 sub process_pre {
     my( $text ) = @_;
@@ -1238,10 +1266,7 @@ sub process_pre {
        #eg;
 
     # convert some special chars to HTML escapes
-    $rest =~ s/&/&amp;/g;
-    $rest =~ s/</&lt;/g;
-    $rest =~ s/>/&gt;/g;
-    $rest =~ s/"/&quot;/g;
+    $rest = html_escape($rest);
 
     # try and create links for all occurrences of perl.* within
     # the preformatted text.
@@ -1249,19 +1274,19 @@ sub process_pre {
                 (\s*)(perl\w+)
              }{
                 if ( defined $pages{$2} ){     # is a link
-                    qq($1<A HREF="$htmlroot/$pages{$2}">$2</A>);
+                    qq($1<a href="$htmlroot/$pages{$2}">$2</a>);
                 } elsif (defined $pages{dosify($2)}) { # is a link
-                    qq($1<A HREF="$htmlroot/$pages{dosify($2)}">$2</A>);
+                    qq($1<a href="$htmlroot/$pages{dosify($2)}">$2</a>);
                 } else {
                     "$1$2";
                 }
              }xeg;
      $rest =~ s{
-                (<A\ HREF="?) ([^>:]*:)? ([^>:]*) \.pod: ([^>:]*:)?
+                (<a\ href="?) ([^>:]*:)? ([^>:]*) \.pod: ([^>:]*:)?
                }{
                   my $url ;
                   if ( $htmlfileurl ne '' ){
-                    # Here, we take advantage of the knowledge 
+                    # Here, we take advantage of the knowledge
                     # that $htmlfileurl ne '' implies $htmlroot eq ''.
                     # Since $htmlroot eq '', we need to prepend $htmldir
                     # on the fron of the link to get the absolute path
@@ -1288,9 +1313,9 @@ sub process_pre {
                 file
                 wais
                 ftp
-            } ) 
+            } )
         . ')';
-  
+
     my $ltrs = '\w';
     my $gunk = '/#~:.?+=&%@!\-';
     my $punc = '.:?\-';
@@ -1312,7 +1337,7 @@ sub process_pre {
             |                       # or else
                 $                   #   then end of the string
         )
-      }{<A HREF="$1">$1</A>}igox;
+      }{<a href="$1">$1</a>}igox;
 
     # text should be as it is (verbatim)
     $$text = $rest;
@@ -1374,7 +1399,7 @@ sub process_puretext {
             if( $args =~ /^\d+$/ ){
                 my $url = page_sect( $word, '' );
                 if( defined $url ){
-                    $word = "<A HREF=\"$url\">the $word manpage</A>";
+                    $word = "<a href=\"$url\">the $word manpage</a>";
                     next;
                 }
             }
@@ -1389,17 +1414,14 @@ sub process_puretext {
        } elsif ($word =~ m,^\w+://\w,) {
            # looks like a URL
             # Don't relativize it: leave it as the author intended
-           $word = qq(<A HREF="$word">$word</A>);
+           $word = qq(<a href="$word">$word</a>);
        } elsif ($word =~ /[\w.-]+\@[\w-]+\.\w/) {
            # looks like an e-mail address
            my ($w1, $w2, $w3) = ("", $word, "");
            ($w1, $w2, $w3) = ("(", $1, ")$2") if $word =~ /^\((.*?)\)(,?)/;
            ($w1, $w2, $w3) = ("&lt;", $1, "&gt;$2") if $word =~ /^<(.*?)>(,?)/;
-           $word = qq($w1<A HREF="mailto:$w2">$w2</A>$w3);
-       } elsif ($word !~ /[a-z]/ && $word =~ /[A-Z]/) {  # all uppercase?
-           $word = html_escape($word) if $word =~ /["&<>]/;
-           $word = "\n<FONT SIZE=-1>$word</FONT>" if $netscape;
-       } else { 
+           $word = qq($w1<a href="mailto:$w2">$w2</a>$w3);
+       } else {
            $word = html_escape($word) if $word =~ /["&<>]/;
        }
     }
@@ -1437,10 +1459,10 @@ sub process_text1($$;$$){
 
     if( $func eq 'B' ){
        # B<text> - boldface
-       $res = '<STRONG>' . process_text1( $lev, $rstr ) . '</STRONG>';
+       $res = '<strong>' . process_text1( $lev, $rstr ) . '</strong>';
 
     } elsif( $func eq 'C' ){
-       # C<code> - can be a ref or <CODE></CODE>
+       # C<code> - can be a ref or <code></code>
        # need to extract text
        my $par = go_ahead( $rstr, 'C', $closing );
 
@@ -1448,7 +1470,7 @@ sub process_text1($$;$$){
         my $text = depod( $par );
 
        ### my $x = $par =~ /[BI]</ ? 'yes' : 'no' ;
-        ### print STDERR "-->call emit_C($par) lev=$lev, par with BI=$x\n"; 
+        ### print STDERR "-->call emit_C($par) lev=$lev, par with BI=$x\n";
 
        $res = emit_C( $text, $lev > 1 || ($par =~ /[BI]</) );
 
@@ -1461,15 +1483,15 @@ sub process_text1($$;$$){
 
     } elsif( $func eq 'F' ){
        # F<filename> - italizice
-       $res = '<EM>' . process_text1( $lev, $rstr ) . '</EM>';
+       $res = '<em>' . process_text1( $lev, $rstr ) . '</em>';
 
     } elsif( $func eq 'I' ){
        # I<text> - italizice
-       $res = '<EM>' . process_text1( $lev, $rstr ) . '</EM>';
+       $res = '<em>' . process_text1( $lev, $rstr ) . '</em>';
 
     } elsif( $func eq 'L' ){
        # L<link> - link
-       ## L<text|cross-ref> => produce text, use cross-ref for linking 
+       ## L<text|cross-ref> => produce text, use cross-ref for linking
        ## L<cross-ref> => make text from cross-ref
        ## need to extract text
        my $par = go_ahead( $rstr, 'L', $closing );
@@ -1492,7 +1514,7 @@ sub process_text1($$;$$){
        if( $par =~ s{^([^|]+)\|}{} ){
            $linktext = $1;
        }
-    
+
        # make sure sections start with a /
        $par =~ s{^"}{/"};
 
@@ -1500,7 +1522,7 @@ sub process_text1($$;$$){
 
        # check for link patterns
        if( $par =~ m{^([^/]+?)/(?!")(.*?)$} ){     # name/ident
-            # we've got a name/ident (no quotes) 
+            # we've got a name/ident (no quotes)
             ( $page, $ident ) = ( $1, $2 );
             ### print STDERR "--> L<$par> to page $page, ident $ident\n";
 
@@ -1551,7 +1573,7 @@ sub process_text1($$;$$){
                 ### print STDERR "got page/section url=$url\n";
                 last RESOLVE;
             }
-            ## no luck: go for an ident 
+            ## no luck: go for an ident
             if( $section ){
                 $ident = $section;
             } else {
@@ -1577,9 +1599,9 @@ sub process_text1($$;$$){
         # now we have a URL or just plain code
         $$rstr = $linktext . '>' . $$rstr;
         if( defined( $url ) ){
-            $res = "<A HREF=\"$url\">" . process_text1( $lev, $rstr ) . '</A>';
+            $res = "<a href=\"$url\">" . process_text1( $lev, $rstr ) . '</a>';
         } else {
-           $res = '<EM>' . process_text1( $lev, $rstr ) . '</EM>';
+           $res = '<em>' . process_text1( $lev, $rstr ) . '</em>';
         }
 
     } elsif( $func eq 'S' ){
@@ -1592,7 +1614,7 @@ sub process_text1($$;$$){
        $$rstr =~ s/^[^>]*>//;
 
     } elsif( $func eq 'Z' ){
-       # Z<> - empty 
+       # Z<> - empty
        warn "$0: $podfile: invalid X<> in paragraph $paragraph."
            unless $$rstr =~ s/^>//;
 
@@ -1655,11 +1677,11 @@ sub emit_C($;$$){
 
     if( defined( $url ) &&
         (!defined( $EmittedItem ) || $EmittedItem ne $fid ) ){
-       $res = "<A HREF=\"$url\"><CODE>$linktext</CODE></A>";
+       $res = "<a href=\"$url\"><code>$linktext</code></a>";
     } elsif( 0 && $nocode ){
        $res = $linktext;
     } else {
-       $res = "<CODE>$linktext</CODE>";
+       $res = "<code>$linktext</code>";
     }
     return $res;
 }
@@ -1673,8 +1695,9 @@ sub html_escape {
     $rest   =~ s/</&lt;/g;
     $rest   =~ s/>/&gt;/g;
     $rest   =~ s/"/&quot;/g;
+    $rest   =~ s/'/&apos;/g;
     return $rest;
-} 
+}
 
 
 #
@@ -1717,8 +1740,8 @@ sub page_sect($$) {
        # an intermediate page that is an index to all such pages.
        my $page_name = $page ;
        $page_name =~ s,^.*/,,s ;
-       if ( defined( $pages{ $page_name } ) && 
-            $pages{ $page_name } =~ /([^:]*$page)\.(?:pod|pm):/ 
+       if ( defined( $pages{ $page_name } ) &&
+            $pages{ $page_name } =~ /([^:]*$page)\.(?:pod|pm):/
           ) {
            $page = $1 ;
        }
@@ -1796,11 +1819,11 @@ sub page_sect($$) {
 sub relativize_url {
     my ($dest,$source) = @_ ;
 
-    my ($dest_volume,$dest_directory,$dest_file) = 
+    my ($dest_volume,$dest_directory,$dest_file) =
         File::Spec::Unix->splitpath( $dest ) ;
     $dest = File::Spec::Unix->catpath( $dest_volume, $dest_directory, '' ) ;
 
-    my ($source_volume,$source_directory,$source_file) = 
+    my ($source_volume,$source_directory,$source_file) =
         File::Spec::Unix->splitpath( $source ) ;
     $source = File::Spec::Unix->catpath( $source_volume, $source_directory, '' ) ;
 
@@ -1809,9 +1832,9 @@ sub relativize_url {
        $rel_path = File::Spec::Unix->abs2rel( $dest, $source ) ;
     }
 
-    if ( $rel_path ne ''                && 
+    if ( $rel_path ne ''                &&
          substr( $rel_path, -1 ) ne '/' &&
-         substr( $dest_file, 0, 1 ) ne '#' 
+         substr( $dest_file, 0, 1 ) ne '#'
         ) {
         $rel_path .= "/$dest_file" ;
     }
@@ -1876,7 +1899,7 @@ sub coderef($$){
        }
 
        confess "url has space: $url" if $url =~ /"[^"]*\s[^"]*"/;
-    }       
+    }
     return( $url, $fid );
 }
 
@@ -1900,7 +1923,7 @@ sub relative_url {
 #
 sub finish_list {
     while ($listlevel > 0) {
-       print HTML "</DL>\n";
+       print HTML "</dl>\n";
        $listlevel--;
     }
 }
@@ -1942,7 +1965,7 @@ sub depod($){
     } else {
        $string =  $_[0];
         depod1( \$string );
-    }    
+    }
 }
 
 sub depod1($;$$){
@@ -1964,7 +1987,7 @@ sub depod1($;$$){
       # X<> - ignore
       $$rstr =~ s/^[^>]*>//;
   } elsif( $func eq 'Z' ){
-      # Z<> - empty 
+      # Z<> - empty
       $$rstr =~ s/^>//;
   } else {
       # all others: either recurse into new function or
@@ -2027,9 +2050,9 @@ sub fragment_id {
 #
 sub make_URL_href($){
     my( $url ) = @_;
-    if( $url !~ 
-        s{^(http:[-\w/#~:.+=&%@!]+)(\?.*)$}{<A HREF="$1$2">$1</A>}i ){
-        $url = "<A HREF=\"$url\">$url</A>";
+    if( $url !~
+        s{^(http:[-\w/#~:.+=&%@!]+)(\?.*)$}{<a href="$1$2">$1</a>}i ){
+        $url = "<a href=\"$url\">$url</a>";
     }
     return $url;
 }