# -*-perl-*-
#
-# $Id: SWDoc.pm,v 1.2 1999/08/18 17:10:07 mdw Exp $
+# $Id: SWDoc.pm,v 1.3 1999/08/19 12:11:09 mdw Exp $
#
# Display documentation files
#
#----- Revision history -----------------------------------------------------
#
# $Log: SWDoc.pm,v $
+# Revision 1.3 1999/08/19 12:11:09 mdw
+# More improvements to URL recognizer.
+#
# Revision 1.2 1999/08/18 17:10:07 mdw
# Slight improvements to URL and email address parsing.
#
while (my $line = $fh->getline()) {
last if $line =~ /\f/;
$line =~ s/\&/&/g;
- $line =~ s/\</</g;
- $line =~ s/\>/>/g;
- $line =~ s!\b(https?|ftp|file|news):[^]&)\s]*[^]&).,\s\']!<a href="$&">$&</a>!g;
- $line =~ s!info:([^]&)\s]*[^]&).,\s\'\"])!<a href="$ref?act=info&file=$1&node=Top">$&</a>!g;
- $line =~ s!(?:\bmailto:)?([^\s()&;:{}.,\`\"][^\s()&;:{}\`\"]*\@[^\s()&;:{}\'\"]*[^\s()&;:{}.,\'\"])!<a href="mailto:$1">$&</a>!g;
- $line =~ s!([-_.\w]+)\((\d+\w*)\)!SWMan::subst("$1($2)", $1, $2)!eg;
+ $line =~ s/\</<</g;
+ $line =~ s/\>/>>/g;
+
+ # --- Spot URLs (except `mailto') ---
+
+ $line =~ s! \b (http s? | ftp | file | news) :
+ [^])\s<>]* [^]<>&).,\s\']
+ !SWMan::urlsubst($&, $&)!egx;
+
+ # --- Spot email addresses (including `mailto' URLs) ---
+
+ $line =~ s! (?:\bmailto:)?
+ ([^\s()&;:<>&{}.,\`\'\"] [^\s()&;:<>&{}\`\'\"]*
+ \@
+ [^\s()&;:{}<>&\'\"]* [^\s()&;:{}<>&.,\'\"])
+ !<a href="mailto:$1">$&</a>!gx;
+
+ # --- Spot info references ---
+
+ $line =~ s! \b info: ([^]&)\s<>]* [^]&).,\s<>\'\"])
+ !<a href="$ref?act=info&file=$1&node=Top">$&</a>!gx;
+
+ # --- Spot manpage references ---
+
+ $line =~ s! ([-_.\w]+) \( (\d+\w*) \)
+ !SWMan::subst("$1($2)", $1, $2)!egx;
+
+ # --- Finally fix up the HTML properly ---
+
+ $line =~ s/\<\;\</</g;
+ $line =~ s/\>\>\;/>/g;
+
print $line;
}
print "</pre>\n";
# -*-perl-*-
#
-# $Id: SWInfo.pm,v 1.2 1999/08/18 17:10:07 mdw Exp $
+# $Id: SWInfo.pm,v 1.3 1999/08/19 12:11:10 mdw Exp $
#
# Read and output GNU Info files
#
#----- Revision history -----------------------------------------------------
#
# $Log: SWInfo.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.
#
# --- Now translate the node into HTML, first line first ---
$n =~ s/\&/&/;
- $n =~ s/\</</;
- $n =~ s/\>/>/;
+ $n =~ s/\</<</;
+ $n =~ s/\>/>>/;
$n =~ s/\A( [^\n]* Next:\ *) ([^,\n]*) / $1 . subst($2, $file, $i) /eix;
$n =~ s/\A( [^\n]* Prev:\ *) ([^,\n]*) / $1 . subst($2, $file, $i) /eix;
$n =~ s/\A( [^\n]* Up:\ *) ([^,\n]*) / $1 . subst($2, $file, $i) /eix;
}
$out .= $n;
- $out =~ s!\b(https?|ftp|file|news):[^]&)\s]*[^]&).,\s\'\"]!<a href="$&">$&</a>!g;
- $out =~ s!(?:\bmailto:)?([^\s()&;:{}.,\`\"][^\s()&;:{}\`\"]*\@[^\s()&;:{}\'\"]*[^\s()&;:{}.,\'\"])!<a href="mailto:$1">$&</a>!g;
- $out =~ s!([-_.\w]+)\((\d+\w*)\)!SWMan::subst("$1($2)", $1, $2)!eg;
+ # --- Spot URLs (except `mailto') ---
+
+ $out =~ s! \b (http s? | ftp | file | news) :
+ [^]<>)\s]* [^]<>).,\s\']
+ !urlsubst($&, $&)!egx;
+
+ # --- Spot email addresses (including `mailto' URLs) ---
+
+ $out =~ s! (?:\bmailto:)?
+ ([^\s()<>&;:{}.,\`\'\"] [^\s()<>&;:{}\`\'\"]*
+ \@
+ [^\s()<>&;:{}\'\"]* [^\s()<>&;:{}.,\'\"])
+ !<a href="mailto:$1">$&</a>!gx;
+
+ # --- Spot manpage references ---
+
+ $out =~ s! ([-_.\w]+) \( (\d+\w*) \)
+ !SWMan::subst("$1($2)", $1, $2)!egx;
+
+ # --- Fix up the HTML ---
+
+ $out =~ s/\<\</</g;
+ $out =~ s/\>\>/>/g;
header("Info: ($file)$node");
print("<pre>\n$out</pre>\n");
# -*-perl-*-
#
-# $Id: SWMan.pm,v 1.2 1999/08/18 17:10:07 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.
#
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
- ((?:https?|ftp|file|news) # A protocol name
+ ( \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
+ [^]<>)\s<>\'\"]+ # Most characters are allowed
+ [^]<>).,\s<>\'\"]) # Don't end on punctuation
((?:\</[bi]\>)*) # Closing tags, optional
- !$1<a href="$2">$&</a>$3!gx;
+ !urlsubst($2, $&)!egx;
- $l =~ s! ((?:\<[bi]\>)*(?:\bmailto:)?)
- ( [^\s()&;:{}<>,.\`\"] [^\s()&;:{}<>\`\"]* \@
- [^\s()&;:{}<>\'\"]* [^\s()&;:{}<>.,\'\"])
+ $l =~ s! ( (?:\<[bi]\>)* (?:\bmailto:)? )
+ ( [^\s()<>;:{}&<>,.\`\'\"] [^\s()<>;:{}&<>\`\'\"]* \@
+ [^\s()<>;:{&}<>\'\"]* [^\s()<>;:{}&<>.,\'\"])
((?:\</[bi]\>)*)
- !$1<a href="mailto:$2">$&</a>$3!gx;
+ !<a href="mailto:$2">$&</a>!gx;
+
+ # --- Fix up the HTML ---
+
+ $l =~ s/\<\;\</</g;
+ $l =~ s/\>\>\;/>/g;
# --- Done! ---