=================================================================== RCS file: /cvs/cvsweb/cvsweb.cgi,v retrieving revision 3.35 retrieving revision 3.36 diff -u -p -r3.35 -r3.36 --- cvsweb/cvsweb.cgi 2000/10/10 21:14:05 3.35 +++ cvsweb/cvsweb.cgi 2000/10/20 12:28:45 3.36 @@ -43,7 +43,7 @@ # SUCH DAMAGE. # # $zId: cvsweb.cgi,v 1.103 2000/09/20 17:02:29 jumager Exp $ -# $Id: cvsweb.cgi,v 3.35 2000/10/10 21:14:05 knu Exp $ +# $Id: cvsweb.cgi,v 3.36 2000/10/20 12:28:45 knu Exp $ # ### @@ -84,6 +84,7 @@ use vars qw ( sub printDiffSelect($); sub findLastModifiedSubdirs(@); +sub htmlify_sub(&$); sub htmlify($;$); sub spacedHtmlText($;$); sub link($$); @@ -117,6 +118,7 @@ sub download_link($$$;$); sub toggleQuery($$); sub urlencode($); sub htmlquote($); +sub htmlunquote($); sub http_header(;$); sub html_header($); sub html_footer(); @@ -327,7 +329,7 @@ else { $byfile = 1; } -$hr_default = $input{'f'} eq 'h'; +$hr_default = ($input{'f'} eq 'h' || $input{'f'} eq 'H'); $logsort = $input{'logsort'}; @@ -482,9 +484,8 @@ elsif (-d $fullname) { } print "\n"; $infocols++; - print ""; $infocols++; - print ""; if ($show_author) { $infocols++; - print ""; } $infocols++; - print ""; } elsif ($use_descriptions) { - print "
"; + printf '
', + $byfile ? $columnHeaderColorSorted : $columnHeaderColorDefault; if ($byfile) { print 'File'; } else { @@ -496,9 +497,8 @@ elsif (-d $fullname) { # with revision information: if (scalar(%fileinfo)) { $infocols++; - print ""; + printf '', + $byrev ? $columnHeaderColorSorted : $columnHeaderColorDefault; if ($byrev) { print 'Rev.'; } else { @@ -507,21 +507,19 @@ elsif (-d $fullname) { } print ""; + printf '', + $bydate ? $columnHeaderColorSorted : $columnHeaderColorDefault; if ($bydate) { print 'Age'; } else { print &link('Age', sprintf('./%s#dirlist', - &toggleQuery("sortby", "date"))); + &toggleQuery("sortby", "date"))); } print ""; + printf '', + $byauthor ? $columnHeaderColorSorted : $columnHeaderColorDefault; if ($byauthor) { print 'Author'; } else { @@ -531,19 +529,18 @@ elsif (-d $fullname) { print ""; + printf '', + $bylog ? $columnHeaderColorSorted : $columnHeaderColorDefault; if ($bylog) { print 'Last log entry'; } else { print &link('Last log entry', sprintf('./%s#dirlist', - &toggleQuery("sortby", "log"))); + &toggleQuery("sortby", "log"))); } print ""; + printf '', $columnHeaderColorDefault; print "Description"; $infocols++; } @@ -608,9 +605,9 @@ elsif (-d $fullname) { next if ($_ eq '..' && $where eq '/'); my ($rev,$date,$log,$author,$filename) = @{$fileinfo{$_}} if (defined($fileinfo{$_})); - print "
" if ($dirtable); + printf '
', $tabcolors[$dirrow % 2] if $dirtable; if ($_ eq '..') { - $url = "../" . $query; + $url = "../$query"; if ($nofilelinks) { print $backicon; } @@ -620,7 +617,7 @@ elsif (-d $fullname) { print " ", &link("Previous Directory", $url); } else { - $url = urlencode($_) . '/' . $query; + $url = urlencode($_) . "/$query"; print ""; if ($nofilelinks) { print $diricon; @@ -639,7 +636,7 @@ elsif (-d $fullname) { if ($filename) { print "  " if ($dirtable); if ($date) { - print " " . readableTime(time() - $date,0) . ""; + print " ", readableTime(time() - $date,0), ""; } if ($show_author) { print " " if ($dirtable); @@ -650,8 +647,8 @@ elsif (-d $fullname) { print "$filename/$rev"; print "
" if ($dirtable); if ($log) { - print " " - . &htmlify(substr($log,0,$shortLogLen)); + print " ", + &htmlify(substr($log,0,$shortLogLen)); if (length $log > 80) { print "..."; } @@ -661,7 +658,7 @@ elsif (-d $fullname) { else { my ($dwhere) = ($where ne "/" ? $where : "") . $_; if ($use_descriptions && defined $descriptions{$dwhere}) { - print "
 " if $dirtable; + print " " if $dirtable; print $descriptions{$dwhere}; } elsif ($dirtable && $infocols > 1) { # close the row with the appropriate number of @@ -692,7 +689,7 @@ elsif (-d $fullname) { next if (!defined($fileinfo{$_})); ($rev,$date,$log,$author) = @{$fileinfo{$_}}; $filesfound++; - print "
" if ($dirtable); + printf '
', $tabcolors[$dirrow % 2] if $dirtable; print ""; if ($nofilelinks) { print $fileicon; @@ -707,7 +704,7 @@ elsif (-d $fullname) { $defaultViewable ? "text/x-cvsweb-markup" : undef); print " " if ($dirtable); if ($date) { - print " " . readableTime(time() - $date,0) . ""; + print " ", readableTime(time() - $date,0), ""; } if ($show_author) { print " " if ($dirtable); @@ -715,7 +712,7 @@ elsif (-d $fullname) { } print " " if ($dirtable); if ($log) { - print " " . &htmlify(substr($log,0,$shortLogLen)); + print " ", &htmlify(substr($log,0,$shortLogLen)); if (length $log > 80) { print "..."; } @@ -730,7 +727,7 @@ elsif (-d $fullname) { if ($dirtable && defined($tableBorderColor)) { print "
"; } - print "". ($dirtable == 1) ? "" : "" . "\n"; + print( $dirtable == 1 ? "\n" : "\n" ); if ($filesexists && !$filesfound) { print "

NOTE: There are $filesexists files, but none matches the current tag ($input{only_with_tag})\n"; @@ -933,30 +930,92 @@ sub findLastModifiedSubdirs(@) { return @files; } +sub htmlify_sub(&$) { + (my $proc, local $_) = @_; + local @_ = split(m`(]+>[^<]*)`i); + my ($linked, $result); + + while (($_, $linked) = splice(@_, 0, 2)) { + &$proc(); + $result .= $_; + $result .= $linked; + } + + $result; +} + sub htmlify($;$) { - (local $_, my $extra) = @_; + (local $_, my $extra) = @_; - $_ = htmlquote($_); + $_ = htmlquote($_); - # get URL's as link - s`(http|ftp|https)(://[-a-zA-Z0-9%.~:_/]+)([?&]([-a-zA-Z0-9%.~:_]+)=([-a-zA-Z0-9%.~:_])+)*`&link("$1$2$3", "$1$2$3")`ge; # ` - # get e-mails as link - s`[-a-zA-Z0-9_.]+@([-a-zA-Z0-9]+\.)+[A-Za-z]{2,4}`&link($&, "mailto:$&")`ge; # ` + # get URL's as link + s{ + (http|ftp|https)://\S+ + }{ + &link($&, htmlunquote($&)) + }egx; - if ($extra) { - # get PR #'s as link: "PR#nnnn" "PR: nnnn, ..." "PR nnnn, ..." "bin/nnnn" - if (defined($prcgi)) { - 1 while s`\b(pr[:#]?\s*(?:#?\d+[,\s]\s*)*#?)(\d+)\b`$1 . &link($2, sprintf($prcgi, $2))`ie; # `; - s`\b${prcategories}/(\d+)\b`&link($&, sprintf($prcgi, $1))`igeo; # `; - } + # get e-mails as link + $_ = htmlify_sub { + s< + [\w+=\-.!]+@[\w\-]+(\.[\w\-]+)+ + >< + &link($&, "mailto:$&") + >egix; + } $_; - # get manpage specs as link: "foo.1" "foo(1)" - if (defined($mancgi)) { - s`\b([a-zA-Z]\w+)(?:\(([0-9n])\)\B|\.([0-9n])\b)`&link($&, sprintf($mancgi, $2 ne '' ? $2 : $3, $1))`ge; # `x; - } + if ($extra) { + # get PR #'s as link: "PR#nnnn" "PR: nnnn, ..." "PR nnnn, ..." "bin/nnnn" + if (defined($prcgi)) { + my $prev; + + do { + $prev = $_; + + $_ = htmlify_sub { + s{ + (\bPR[:\#]?\s* + (?: + \#? + \d+[,\s]\s* + )* + \#?) + (\d+)\b + }{ + $1 . &link($2, sprintf($prcgi, $2)) . $3 + }egix; + } $_; + } while ($_ ne $prev); + + $_ = htmlify_sub { + s{ + (\b$prcategories/(\d+)\b) + }{ + &link($1, sprintf($prcgi, $2)) . $3 + }egox; + } $_; } - $_; + # get manpage specs as link: "foo.1" "foo(1)" + if (defined($mancgi)) { + $_ = htmlify_sub { + s{ + (\b([a-zA-Z][\w_.]+) + (?: + \( ([0-9n]) \)\B + | + \.([0-9n])\b + ) + ) + }{ + &link($1, sprintf($mancgi, $3 ne '' ? $3 : $4, $2)) . $5 + }egx; + } $_; + } + } + + $_; } sub spacedHtmlText($;$) { @@ -1066,7 +1125,7 @@ sub safeglob($) { $glob =~ s/{([^}]+)}/($t = $1) =~ s-,-|-g; "($t)"/eg; foreach (readdir($dh)) { if (/^${glob}$/) { - push(@results, $dirname . "/" .$_); + push(@results, "$dirname/" .$_); } } } @@ -1265,7 +1324,7 @@ sub doAnnotate($$) { } else { $revprint = sprintf('%-8s', $lrev); - $revprint =~ s`\S+`&link($&, "$scriptwhere$barequery#rev$&")`e; # ` + $revprint =~ s`\S+`&link($&, "$scriptwhere$query#rev$&")`e; # ` $oldLusr = ''; } if ($lusr eq $oldLusr) { @@ -1296,7 +1355,7 @@ sub doAnnotate($$) { # CVS command line client. But for simplicity, we don't. } elsif ($words[0] eq "error") { - fatal ("500 Internal Error", "Error occured during annotate: $_"); + fatal("500 Internal Error", "Error occured during annotate: $_"); } } if ($annTable) { @@ -1595,14 +1654,14 @@ sub doDiff($$$$$$) { s|$cvsroot/||o; if ($sym1) { chop; - $_ .= " " . $sym1 . "\n"; + $_ .= " $sym1\n"; } } elsif (m|^$f2 $cvsroot|o) { s|$cvsroot/||o; if ($sym2) { chop; - $_ .= " " . $sym2 . "\n"; + $_ .= " $sym2\n"; } } print $_; @@ -1724,9 +1783,9 @@ again: # End of a log entry. my $revbranch; ($revbranch = $rev) =~ s/\.\d+$//; - print "$filename $rev Wanted: $revwanted " - . "Revbranch: $revbranch Branch: $branch " - . "Branchpoint: $branchpoint\n" if ($verbose); + print "$filename $rev Wanted: $revwanted ", + "Revbranch: $revbranch Branch: $branch ", + "Branchpoint: $branchpoint\n" if ($verbose); if (!defined($revwanted) && defined($branch) && $branch eq $revbranch || !defined($tag)) { print "File revision $rev found for branch $branch\n" @@ -1764,7 +1823,7 @@ again: next; } else { - $log = $log . $_; + $log .= $_; } } if (/$LOG_FILESEPARATOR/o) { @@ -2083,13 +2142,13 @@ sub printLog($;$) { } if (defined @mytz) { my ($est) = $mytz[(localtime($date{$_}))[8]]; - print ", " . scalar localtime($date{$_}) . " $est ("; + print ", ", scalar localtime($date{$_}), " $est ("; } else { - print ", " . scalar gmtime($date{$_}) . " UTC ("; + print ", ", scalar gmtime($date{$_}), " UTC ("; } - print readableTime(time() - $date{$_},1) . " ago)"; + print readableTime(time() - $date{$_},1), " ago)"; print " by "; - print "" . $author{$_} . "\n"; + print "", $author{$_}, "\n"; print "
Branch: ",$link?link_tags($revsym{$br}):$revsym{$br},"\n" if ($revsym{$br}); print "
CVS Tags: ",$link?link_tags($revsym{$_}):$revsym{$_},"" @@ -2133,7 +2192,7 @@ sub printLog($;$) { print " to previous "; print &link($prev, $url); if (!$hr_default) { # offer a human readable version if not default - print &link('colored', "$url&f=h"); + print ' (', &link('colored', "$url&f=h"), ')'; } } # @@ -2149,7 +2208,7 @@ sub printLog($;$) { print " to branchpoint "; print &link($brp, $url); if (!$hr_default) { # offer a human readable version if not default - print &link('colored', "$url&f=h"); + print ' (', &link('colored', "$url&f=h"), ')'; } } # @@ -2185,7 +2244,7 @@ sub printLog($;$) { print " next main "; print &link($nextmain, $url); if (!$hr_default) { # offer a human readable version if not default - print &link('colored', "$url&f=h"); + print ' (', &link('colored', "$url&f=h"), ')'; } } } @@ -2203,7 +2262,7 @@ sub printLog($;$) { print " to selected "; print &link($input{'r1'}, $url); if (!$hr_default) { # offer a human readable version if not default - print &link('colored', "$url&f=h"); + print ' (', &link('colored', "$url&f=h"), ')'; } } } @@ -2396,17 +2455,16 @@ sub human_readable_diff($){ $date2 = $r2d; } - print "

Diff for /$where_nd between version $rev1 and $rev2

\n"; - - print "\n"; - print "\n"; - print "
"; - print "version $rev1"; + print "

Diff for /$where_nd between version $rev1 and $rev2

\n", + "\n", + "\n", + "\n"; - print "\n", + "\n"; @@ -2531,7 +2589,7 @@ sub navigateHeader($$$$$) { $swhere = urlencode($filename) if ($swhere eq ""); print "<\!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">"; print "\n\n"; - print ''; + print ''; print "\n$path$filename - $title - $rev\n"; print "$body_tag_for_src\n"; print "
", + "version $rev1"; print ", $date1" if (defined($date1)); print "
Tag: $sym1\n" if ($sym1); - print "
"; - print "version $rev2"; + print "", + "version $rev2"; print ", $date2" if (defined($date2)); print "
Tag: $sym2\n" if ($sym1); print "
"; @@ -2547,10 +2605,10 @@ sub navigateHeader($$$$$) { sub plural_write($$) { my ($num,$text) = @_; if ($num != 1) { - $text = $text . "s"; + $text .= "s"; } if ($num > 0) { - return $num . " " . $text; + return join(' ', $num, $text); } else { return ""; @@ -2594,7 +2652,7 @@ sub readableTime($$) { my $resttime = plural_write(int ($rest / $break), $desc{$break}); if ($resttime) { - $retval = $retval . ", " . $resttime; + $retval .= ", $resttime"; } } @@ -2624,8 +2682,8 @@ sub clickablePath($$) { my $wherepath = ''; my ($lastslash) = $pathname =~ m|/$|; foreach (split(/\//, $pathname)) { - $retval = $retval . " / "; - $wherepath = $wherepath . '/' . $_; + $retval .= " / "; + $wherepath .= "/$_"; my ($last) = "$wherepath/" eq "/$pathname" || $wherepath eq "/$pathname"; if ($clickLast || !$last) { @@ -2669,8 +2727,7 @@ sub chooseCVSRoot() { foreach $k (@foo) { print "\n"; + print ">", ($CVSROOTdescr{$k} ? $CVSROOTdescr{$k} : $k), "\n"; } print "\n"; print ""; @@ -2845,6 +2902,18 @@ sub htmlquote($) { $_; } +sub htmlunquote($) { + local($_) = @_; + + # Special Characters; RFC 1866 + s/"/\"/g; + s/<//g; + s/&/&/g; + + $_; +} + sub http_header(;$) { my $content_type = shift || "text/html"; if (defined($moddate)) { @@ -2852,7 +2921,7 @@ sub http_header(;$) { Apache->request->header_out("Last-Modified" => scalar gmtime($moddate) . " GMT"); } else { - print "Last-Modified: " . scalar gmtime($moddate) . " GMT\r\n"; + print "Last-Modified: ", scalar gmtime($moddate), " GMT\r\n"; } } if ($is_mod_perl) { @@ -2903,7 +2972,7 @@ sub http_header(;$) { sub html_header($) { my ($title) = @_; - my $version = '$zRevision: 1.103 $ $Revision: 3.35 $'; #' + my $version = '$zRevision: 1.103 $ $Revision: 3.36 $'; #' http_header(); print <