# -*-perl-*-
#
-# $Id: SWMan.pm,v 1.1 1999/07/30 18:46:37 mdw Exp $
+# $Id: SWMan.pm,v 1.3 1999/08/19 12:11:10 mdw Exp $
#
# Display and other fiddling of manual pages
#
#----- Revision history -----------------------------------------------------
#
# $Log: SWMan.pm,v $
+# Revision 1.3 1999/08/19 12:11:10 mdw
+# More improvements to URL recognizer.
+#
+# Revision 1.2 1999/08/18 17:10:07 mdw
+# Slight improvements to URL and email address parsing.
+#
# Revision 1.1 1999/07/30 18:46:37 mdw
# New CGI script for browsing installed software and documentation.
#
use SWCGI qw(:DEFAULT :layout);
@ISA = qw(Exporter);
-@EXPORT_OK = qw(subst check);
+@EXPORT_OK = qw(subst urlsubst check);
#----- Useful functions -----------------------------------------------------
return "$s";
}
+# --- @urlsubst(URL, STRING)@ ---
+#
+# Substitutes in a URL reference. The important bit is that embedded `&'
+# characters are un-entitied from `&'. This doesn't seem to upset
+# Netscape or Lynx as much as I'd expect (or, in fact, at all), but it's
+# slightly untidy.
+
+sub urlsubst($$) {
+ my ($url, $name) = @_;
+ $url =~ s/\&\;/&/;
+ return "<a href=\"$url\">$name</a>";
+}
+
# --- @sections()@ ---
#
# Return a list of manual sections.
# --- Translate the character if it's magical ---
$ch eq "&" and $ch = "&";
- $ch eq "<" and $ch = "<";
- $ch eq ">" and $ch = ">";
+ $ch eq "<" and $ch = "<<";
+ $ch eq ">" and $ch = ">>";
$l .= $ch;
}
$state and $l .= "</$state>";
# --- And email and hypertext references too ---
$l =~ s! ((?:\<[bi]\>)*) # Leading highlighting
- ((?:http|ftp) # A protocol name
- :// # The important and obvious bit
- [^]&)\s]+ # Most characters are allowed
- [^]&).,\s\'\"]) # Don't end on punctuation
+ ( \b (?: http s? | ftp | file | news ) # A protocol name
+ : # The important and obvious bit
+ [^]<>)\s<>\'\"]+ # Most characters are allowed
+ [^]<>).,\s<>\'\"]) # Don't end on punctuation
((?:\</[bi]\>)*) # Closing tags, optional
- !<a href="$2">$&</a>!gx;
+ !urlsubst($2, $&)!egx;
- $l =~ s! ((?:\<[bi]\>)*)
- ( [^\s()&;{}<>,.\`\"] [^\s()&;{}<>\`\"]* \@
- [^\s()&;{}<>\'\"]* [^\s()&;{}<>.,\'\"])
+ $l =~ s! ( (?:\<[bi]\>)* (?:\bmailto:)? )
+ ( [^\s()<>;:{}&<>,.\`\'\"] [^\s()<>;:{}&<>\`\'\"]* \@
+ [^\s()<>;:{&}<>\'\"]* [^\s()<>;:{}&<>.,\'\"])
((?:\</[bi]\>)*)
!<a href="mailto:$2">$&</a>!gx;
+ # --- Fix up the HTML ---
+
+ $l =~ s/\<\;\</</g;
+ $l =~ s/\>\>\;/>/g;
+
# --- Done! ---
print $l, "\n";