http://www.perlmonks.org?node_id=67804

Ovid has asked for the wisdom of the Perl Monks concerning the following question:

From perldoc CGI
By default, CGI.pm versions 2.69 and higher emit XHTML (http://www.w3.org/TR/xhtml1/). The -no_xhtml pragma disables this feature. Thanks to Michalis Kabrianis <kabrianis@hellug.gr> for this feature.
I am using CGI.pm version 2.74.

Here's the program:

#!/usr/bin/perl -wT use strict; use CGI::Pretty qw( :standard ); print header, start_html( -title => 'Password Check', -BGCOLOR => 'navy', -text => 'white' ), h1( 'It worked' ), hr(), br(), end_html;
Here's the output:
Content-Type: text/html; charset=ISO-8859-1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="en-US"><head><title>P +assword Check</title> </head><body text="white" bgcolor="navy"> <h1> It worked </h1> <hr><br></body></html>
According to the w3c spec (see section 4.6, "Empty Elements):
Empty elements must either have an end tag or the start tag must end with />. For instance, <br/> or <hr></hr>.
Unfortunately, the hr and br tags output by the CGI.pm HTML functions aren't valid XHTML. Is this a bug or is it a feature of transitional XHTML? Do others have this issue?

Cheers,
Ovid

Join the Perlmonks Setiathome Group or just click on the the link and check out our stats.

Replies are listed 'Best First'.
Re: CGI.pm and XHTML
by mirod (Canon) on Mar 28, 2001 at 17:16 UTC

    According to XHTML it should be <br /> or <br></br> and it is with use CGI. The problem seems to be with CGI::Pretty. I guess you found a bug there.

      Yup, it's a bug with CGI::Pretty. Sigh. There was a bug in $CGI::VERSION 2.46 with CGI::Pretty that was stripping the attributes of HTML tags. Yet another reason to avoid CGI::Pretty.

      Thanks!

      Cheers,
      Ovid

      Join the Perlmonks Setiathome Group or just click on the the link and check out our stats.

      It may be a bug - in my copy, the lines:

      if ($linebreak) { $break = $XHTML ? "<br />" : "<br>"; }

      .. appear, so they know about this already, it's in version 2.752 (what I got here). Perhaps you need to upgrade CGI.pm?

Re: CGI.pm and XHTML
by j.a.p.h. (Pilgrim) on Mar 28, 2001 at 18:31 UTC
    Note that at least with IE 5.01 SP 2 and XHTML Transitional, an empty <title /> element will cause the page not to render. I was almost pulling my hair out trying to hunt down that one.
Re: CGI.pm and XHTML
by little (Curate) on Mar 29, 2001 at 02:07 UTC
    CGI.pm does also omit the trailing slash (best after a space to be best recognised by browsers) before the tag closes.
    but forget it, it's late and I'm tired.