develooper Front page | perl.perl5.porters | Postings from April 2006

[perl #39020] Pod::Html generates incorrect href's in some html anchors

bgstewart @ covad . net
April 29, 2006 03:07
[perl #39020] Pod::Html generates incorrect href's in some html anchors
Message ID:
# New Ticket Created by 
# Please include the string:  [perl #39020]
# in the subject line of all future correspondence about this issue. 
# <URL: >

This is a bug report for perl from,
generated with the help of perlbug 1.35 running under perl v5.8.8.

Pod::Html generates bad links for multiple-line =head# paragraphs
that include X<> elements. Other directives that generate HTML
Anchors may exhibit the same problem.

An example from perlop.pod in the base documentation:

=head2 Operator Precedence and Associativity
X<operator, precedence> X<precedence> X<associativity>

<h2><a name="operator_precedence_and_associativity_x_operator__precedence__x_precedence__x_associativity_">Operator Precedence and Associativity

rather than the more useful:
<h2><a name="operator_precedence_and_associativity">Operator Precedence and Associativity

I believe the problem lies in sub dpod1 as indicated below.

Bruce Stewart

sub depod1($;$$){
  my( $rstr, $func, $closing ) = @_;
  my $res = '';
  return $res unless defined $$rstr;
  if( ! defined( $func ) ){
      # skip to next begin of an interior sequence
      while( $$rstr =~ s/\A(.*?)([BCEFILSXZ])<(<+[^\S\n]+)?// ){
# previous line should be
#     while( $$rstr =~ s/\A(.*?)([BCEFILSXZ])<(<+[^\S\n]+)?//s ){
         # recurse into its text
          $res .= $1 . depod1( $rstr, $2, closing $3);
      $res .= $$rstr;
  } elsif( $func eq 'E' ){
      # E<x> - convert to character
      $$rstr =~ s/^([^>]*)>//;
      $res .= $E2c{$1} || "";
  } elsif( $func eq 'X' ){
      # X<> - ignore
      $$rstr =~ s/^[^>]*>//;
  } elsif( $func eq 'Z' ){
      # Z<> - empty
      $$rstr =~ s/^>//;
  } else {
      # all others: either recurse into new function or
      # terminate at closing angle bracket
      my $term = pattern $closing;
     while( $$rstr =~ s/\A(.*?)(([BCEFILSXZ])<(<+[^\S\n]+)?|$term)// ){
# previous line should be
#     while( $$rstr =~ s/\A(.*?)(([BCEFILSXZ])<(<+[^\S\n]+)?|$term)//s ){
          $res .= $1;
          last unless $3;

[Please do not change anything below this line]
Site configuration information for perl v5.8.8:

Configured by builder at Mon Mar 20 17:54:00 2006.

Summary of my perl5 (revision 5 version 8 subversion 8) configuration:
    osname=MSWin32, osvers=5.0, archname=MSWin32-x86-multi-thread
    hint=recommended, useposix=true, d_sigaction=undef
    usethreads=define use5005threads=undef useithreads=define usemultiplicity=define
    useperlio=define d_sfio=undef uselargefiles=define usesocks=undef
    use64bitint=undef use64bitall=undef uselongdouble=undef
    usemymalloc=n, bincompat5005=undef
    optimize='-MD -Zi -DNDEBUG -O1',
    ccversion='12.00.8804', gccversion='', gccosandvers=''
    intsize=4, longsize=4, ptrsize=4, doublesize=8, byteorder=1234
    d_longlong=undef, longlongsize=8, d_longdbl=define, longdblsize=10
    ivtype='long', ivsize=4, nvtype='double', nvsize=8, Off_t='__int64', lseeksize=8
    alignbytes=8, prototype=define
  Linker and Libraries:
    ld='link', ldflags ='-nologo -nodefaultlib -debug -opt:ref,icf  -libpath:"C:\Perl\lib\CORE"  -machine:x86'
    libs=  oldnames.lib kernel32.lib user32.lib gdi32.lib winspool.lib  comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib  netapi32.lib uuid.lib ws2_32.lib mpr.lib winmm.lib  version.lib odbc32.lib odbccp32.lib msvcrt.lib
    perllibs=  oldnames.lib kernel32.lib user32.lib gdi32.lib winspool.lib  comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib  netapi32.lib uuid.lib ws2_32.lib mpr.lib winmm.lib  version.lib odbc32.lib odbccp32.lib msvcrt.lib
    libc=msvcrt.lib, so=dll, useshrplib=yes, libperl=perl58.lib
  Dynamic Linking:
    dlsrc=dl_win32.xs, dlext=dll, d_dlsymun=undef, ccdlflags=' '
    cccdlflags=' ', lddlflags='-dll -nologo -nodefaultlib -debug -opt:ref,icf  -libpath:"C:\Perl\lib\CORE"  -machine:x86'

Locally applied patches:
    Iin_load_module moved for compatibility with build 806
    Avoid signal flag SA_RESTART for older versions of HP-UX
    PerlEx support in CGI::Carp
    Less verbose ExtUtils::Install and Pod::Find
    Patch for CAN-2005-0448 from Debian with modifications
    Partly reverted 24733 to preserve binary compatibilty
    27528 win32_pclose() error exit doesn't unlock mutex
    27527 win32_async_check() can loop indefinitely
    27515 ignore directories when searching @INC
    27359 Fix -d:Foo=bar syntax
    27210 Fix quote typo in c2ph
    27203 Allow compiling swigged C++ code
    27200 Make stat() on Windows handle trailing slashes correctly
    27194 Get perl_fini() running on HP-UX again
    27133 Initialise lastparen in the regexp structure
    27034 Avoid \"Prototype mismatch\" warnings with autouse
    26970 Make Passive mode the default for Net::FTP
    26921 Avoid getprotobyname/number calls in IO::Socket::INET
    26897,26903 Make common IPPROTO_* constants always available
    26670 Make '-s' on the shebang line parse -foo=bar switches
    26379 Fix alarm() for Windows 2003
    26087 Storable 0.1 compatibility
    25861 IO::File performace issue
    25084 long groups entry could cause memory exhaustion
    24699 ICMP_UNREACHABLE handling in Net::Ping

@INC for perl v5.8.8:

Environment for perl v5.8.8:
    LANG (unset)
    LANGUAGE (unset)
    LD_LIBRARY_PATH (unset)
    LOGDIR (unset)
    PATH=C:\Perl\bin;C:\MKS\bin;C:\MKS\bin\x11;C:\MKS\mksnt;C:\Program Files\tcl84\bin;C:\Program Files\Tcl83\bin;C:\Python24\.;C:\Program Files\imagemagick-5.5.6-q16;C:\bin;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Program Files\UltraEdit;C:\Program Files\Debugging Tools for Windows;C:\TIBCO\TIBRV71\bin;C:\Program Files\Microsoft SQL Server\80\Tools\BINN;C:\Program Files\Subversion\bin;C:\Program Files\Objective Caml\bin;C:\Program Files\Gltrade\apitools\bin;C:\Program Files\Gltrade\apitools\tools
    PERL_BADLANG (unset)
    SHELL=C:\MKS\mksnt\sh.exe Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at | Group listing | About