version 4.16, 2019/11/11 13:15:09 |
version 4.19, 2019/11/11 14:56:27 |
|
|
%input $query $barequery $sortby $bydate $byrev $byauthor |
%input $query $barequery $sortby $bydate $byrev $byauthor |
$bylog $byfile $defaultDiffType $logsort $cvstree $cvsroot |
$bylog $byfile $defaultDiffType $logsort $cvstree $cvsroot |
$charset $output_filter |
$charset $output_filter |
@command_path %CMD $allow_compress $backicon $diricon $fileicon $graphicon |
@command_path %CMD $allow_compress $backicon $diricon $fileicon |
$fullname $cvstreedefault $logo $defaulttitle $address $binfileicon |
$fullname $cvstreedefault $logo $defaulttitle $address $binfileicon |
$long_intro $short_instruction $shortLogLen $show_author |
$long_intro $short_instruction $shortLogLen $show_author |
$tablepadding $hr_breakable $showfunc $hr_ignwhite $hr_ignkeysubst |
$tablepadding $hr_breakable $showfunc $hr_ignwhite $hr_ignkeysubst |
$inputTextSize $mime_types $allow_annotate $allow_markup $allow_mailtos |
$inputTextSize $mime_types $allow_annotate $allow_markup $allow_mailtos |
$allow_log_extra $allow_dir_extra $allow_source_extra |
$allow_log_extra $allow_dir_extra $allow_source_extra |
$allow_cvsgraph $cvsgraph_config $use_java_script $edit_option_form |
$edit_option_form |
$show_subdir_lastmod $show_log_in_markup $preformat_in_markup |
$show_subdir_lastmod $show_log_in_markup $preformat_in_markup |
$tabstop $state $annTable $sel @ForbiddenFiles |
$tabstop $state $annTable $sel @ForbiddenFiles |
$use_descriptions %descriptions @mytz $dwhere |
$use_descriptions %descriptions @mytz $dwhere |
|
|
$allow_tar @tar_options @gzip_options @zip_options @cvs_options |
$allow_tar @tar_options @gzip_options @zip_options @cvs_options |
@annotate_options @rcsdiff_options |
@annotate_options @rcsdiff_options |
$HTML_DOCTYPE $HTML_META $cssurl $CSS $cvshistory_url |
$HTML_DOCTYPE $HTML_META $cssurl $CSS $cvshistory_url |
$allow_enscript @enscript_options %enscript_types |
|
); |
); |
|
|
require Compress::Zlib; |
require Compress::Zlib; |
|
|
$HTML_META = <<EOM; |
$HTML_META = <<EOM; |
<meta name="robots" content="nofollow" /> |
<meta name="robots" content="nofollow" /> |
<meta name="generator" content="CVSweb $VERSION" /> |
<meta name="generator" content="CVSweb $VERSION" /> |
<meta http-equiv="Content-Script-Type" content="text/javascript" /> |
|
<meta http-equiv="Content-Style-Type" content="text/css" /> |
<meta http-equiv="Content-Style-Type" content="text/css" /> |
EOM |
EOM |
|
|
|
|
|
|
# ----------------------------------------------------------------------------- |
# ----------------------------------------------------------------------------- |
|
|
sub printDiffSelect($); |
sub printDiffSelect(); |
sub printDiffSelectStickyVars(); |
sub printDiffSelectStickyVars(); |
sub getDiffLinks($$$); |
sub getDiffLinks($$$); |
sub printLogSortSelect($); |
sub printLogSortSelect(); |
sub findLastModifiedSubdirs(@); |
sub findLastModifiedSubdirs(@); |
sub htmlify_sub(&$); |
sub htmlify_sub(&$); |
sub htmlify($;$); |
sub htmlify($;$); |
Line 151 sub config_error($$); |
|
Line 149 sub config_error($$); |
|
sub redirect($;$); |
sub redirect($;$); |
sub safeglob($); |
sub safeglob($); |
sub search_path($); |
sub search_path($); |
sub getEnscriptHL($); |
|
sub getMimeType($;$); |
sub getMimeType($;$); |
sub head($;$); |
sub head($;$); |
sub scan_directives(@); |
sub scan_directives(@); |
sub openOutputFilter(); |
sub openOutputFilter(); |
sub doAnnotate($$); |
sub doAnnotate($$); |
sub doCheckout($$$); |
sub doCheckout($$$); |
sub doEnscript($$$;$); |
|
sub doGraph(); |
|
sub doGraphView(); |
|
sub cvswebMarkup($$$$$$;$); |
sub cvswebMarkup($$$$$$;$); |
sub viewable($); |
sub viewable($); |
sub doDiff($$$$$$); |
sub doDiff($$$$$$); |
Line 181 sub download_url($$;$); |
|
Line 175 sub download_url($$;$); |
|
sub download_link($$$;$); |
sub download_link($$$;$); |
sub display_url($$;$); |
sub display_url($$;$); |
sub display_link($$;$$); |
sub display_link($$;$$); |
sub graph_link($;$); |
|
sub history_link($$;$); |
sub history_link($$;$); |
sub toggleQuery($;$); |
sub toggleQuery($;$); |
sub htmlquote($); |
sub htmlquote($); |
Line 212 $cvstreedefault = $logo = $defaulttitle = |
|
Line 205 $cvstreedefault = $logo = $defaulttitle = |
|
$address = $long_intro = $short_instruction = $shortLogLen = $show_author = |
$address = $long_intro = $short_instruction = $shortLogLen = $show_author = |
$tablepadding = $hr_breakable = $showfunc = $hr_ignwhite = |
$tablepadding = $hr_breakable = $showfunc = $hr_ignwhite = |
$hr_ignkeysubst = $inputTextSize = $mime_types = $allow_annotate = |
$hr_ignkeysubst = $inputTextSize = $mime_types = $allow_annotate = |
$allow_markup = $allow_compress = $use_java_script = $edit_option_form = |
$allow_markup = $allow_compress = $edit_option_form = |
$show_subdir_lastmod = $show_log_in_markup = $preformat_in_markup = |
$show_subdir_lastmod = $show_log_in_markup = $preformat_in_markup = |
$tabstop = $use_moddate = $gzip_open = $DEBUG = $allow_cvsgraph = |
$tabstop = $use_moddate = $gzip_open = $DEBUG = |
$cvsgraph_config = $cvshistory_url = $allow_tar = undef; |
$cvshistory_url = $allow_tar = undef; |
|
|
$allow_version_select = $allow_mailtos = $allow_log_extra = 1; |
$allow_version_select = $allow_mailtos = $allow_log_extra = 1; |
|
|
Line 374 if (defined($ENV{QUERY_STRING})) { |
|
Line 367 if (defined($ENV{QUERY_STRING})) { |
|
undef %input; |
undef %input; |
|
|
my $t; |
my $t; |
for my $p (qw(graph hideattic hidecvsroot hidenonreadable ignorecase ln copt |
for my $p (qw(hideattic hidecvsroot hidenonreadable ignorecase ln copt |
makeimage options tarball)) { |
options tarball)) { |
$t = $query{$p}; |
$t = $query{$p}; |
if (defined($t)) { |
if (defined($t)) { |
($input{$p}) = ($t =~ /^([01]|on)$/) |
($input{$p}) = ($t =~ /^([01]|on)$/) |
Line 538 foreach (@stickyvars) { |
|
Line 531 foreach (@stickyvars) { |
|
} |
} |
} |
} |
|
|
if ($allow_enscript) { |
|
push(@DIFFTYPES, qw(uc cc)); |
|
@DIFFTYPES{qw(uc cc)} = ( |
|
{ |
|
'descr' => 'unified, colored', |
|
'opts' => ['-u'], |
|
'colored' => 0, |
|
}, |
|
{ |
|
'descr' => 'context, colored', |
|
'opts' => ['-c'], |
|
'colored' => 0, |
|
}, |
|
); |
|
} else { |
|
# No Enscript -> respect difftype, but don't offer colorization. |
|
if ($input{f} && $input{f} =~ /^([ucs])c$/) { |
|
$input{f} = $1; |
|
} |
|
} |
|
|
|
# is there any query ? |
# is there any query ? |
if (@barequery) { |
if (@barequery) { |
$barequery = join (';', @barequery); |
$barequery = join (';', @barequery); |
|
|
$filesfound++; |
$filesfound++; |
|
|
printf "<tr class=\"%s\">\n", ($dirrow % 2) ? 'even' : 'odd'; |
printf "<tr class=\"%s\">\n", ($dirrow % 2) ? 'even' : 'odd'; |
printf '<td class="file"%s>', $allow_cvsgraph ? '' : ' colspan="2"'; |
printf '<td class="file" colspan="2">'; |
|
|
my $icon = $isbinary ? $binfileicon : $fileicon; |
my $icon = $isbinary ? $binfileicon : $fileicon; |
print $nofilelinks ? $icon : &link($icon, $url); |
print $nofilelinks ? $icon : &link($icon, $url); |
print ' ', &link(htmlquote($file), $url), $attic; |
print ' ', &link(htmlquote($file), $url), $attic; |
print '</td><td class="graph">', graph_link($fileurl) if $allow_cvsgraph; |
|
print "</td>\n<td width=\"30\">", display_link($fileurl, $rev); |
print "</td>\n<td width=\"30\">", display_link($fileurl, $rev); |
my $ageclass = 'age'; |
my $ageclass = 'age'; |
my $age = ''; |
my $age = ''; |
|
|
|| $input{$var} ne $DEFAULTVALUE{$var}) |
|| $input{$var} ne $DEFAULTVALUE{$var}) |
&& $var ne 'only_with_tag'); |
&& $var ne 'only_with_tag'); |
} |
} |
printf(<<EOF, ($use_java_script ? ' onchange="this.form.submit()"' : '')); |
print <<EOF; |
<span class="nowrap"> |
<span class="nowrap"> |
<label for="only_with_tag" accesskey="T">Show only files with tag: |
<label for="only_with_tag" accesskey="T">Show only files with tag: |
<select id="only_with_tag" name="only_with_tag"%s> |
<select id="only_with_tag" name="only_with_tag"> |
<option value="">All tags / default branch</option> |
<option value="">All tags / default branch</option> |
EOF |
EOF |
foreach my $tag (reverse sort { lc $a cmp lc $b } keys %tags) { |
foreach my $tag (reverse sort { lc $a cmp lc $b } keys %tags) { |
|
|
</td> |
</td> |
<td class="opt-value"> |
<td class="opt-value"> |
EOF |
EOF |
printLogSortSelect(0); |
printLogSortSelect(); |
print <<EOF; |
print <<EOF; |
</td> |
</td> |
<td class="opt-label"> |
<td class="opt-label"> |
|
|
</td> |
</td> |
<td> |
<td> |
EOF |
EOF |
printDiffSelect(0); |
printDiffSelect(); |
print <<EOF; |
print <<EOF; |
</td> |
</td> |
<td colspan="2" class="opt-label"> |
<td colspan="2" class="opt-label"> |
Line 1286 elsif (-f $fullname . ',v') { |
|
Line 1257 elsif (-f $fullname . ',v') { |
|
exit; |
exit; |
} |
} |
|
|
if ($allow_cvsgraph && $input{graph}) { |
|
if ($input{makeimage}) { |
|
doGraph(); |
|
} else { |
|
doGraphView(); |
|
} |
|
gzipclose(); |
|
exit; |
|
} |
|
|
|
&doLog($fullname); |
&doLog($fullname); |
} |
} |
|
|
|
|
## End MAIN |
## End MAIN |
|
|
|
|
sub printDiffSelect($) |
sub printDiffSelect() |
{ |
{ |
my ($use_java_script) = @_; |
|
|
|
print '<select id="f" name="f"'; |
print '<select id="f" name="f"'; |
print ' onchange="this.form.submit()"' if $use_java_script; |
|
print ">\n"; |
print ">\n"; |
|
|
for my $difftype (@DIFFTYPES) { |
for my $difftype (@DIFFTYPES) { |
Line 1400 sub printDiffSelectStickyVars() |
|
Line 1358 sub printDiffSelectStickyVars() |
|
} |
} |
|
|
|
|
sub printLogSortSelect($) |
sub printLogSortSelect() |
{ |
{ |
my ($use_java_script) = @_; |
|
|
|
print '<select id="logsort" name="logsort"'; |
print '<select id="logsort" name="logsort"'; |
print ' onchange="this.form.submit()"' if $use_java_script; |
|
print ">\n"; |
print ">\n"; |
|
|
for my $sortkey (@LOGSORTKEYS) { |
for my $sortkey (@LOGSORTKEYS) { |
Line 1709 sub search_path($) |
|
Line 1664 sub search_path($) |
|
|
|
|
|
# |
# |
# Gets the enscript(1) highlight mode corresponding to the given filename, |
|
# or undef if unsupported. |
|
# |
|
sub getEnscriptHL($) |
|
{ |
|
return undef unless $allow_enscript; |
|
my ($filename) = @_; |
|
while (my ($hl, $regex) = each %enscript_types) { |
|
return $hl if ($filename =~ $regex); |
|
} |
|
return undef; |
|
} |
|
|
|
|
|
# |
|
# Gets the MIME type for the given file name. |
# Gets the MIME type for the given file name. |
# |
# |
sub getMimeType($;$) |
sub getMimeType($;$) |
|
|
printf '<embed src="%s" width="100%%" height="100%%" /><br />', |
printf '<embed src="%s" width="100%%" height="100%%" /><br />', |
$url . $barequery; |
$url . $barequery; |
} else { |
} else { |
|
|
print "<pre>\n"; |
print "<pre>\n"; |
my $linenumbers = $input{ln} || 0; |
my $linenumbers = $input{ln} || 0; |
|
|
if (my $enscript_hl = getEnscriptHL($filename)) { |
|
doEnscript($filehandle, $enscript_hl, $linenumbers); |
|
|
|
} else { |
|
my $ln = 0; |
my $ln = 0; |
my @buf = (); |
my @buf = (); |
my $ts = undef; |
my $ts = undef; |
|
|
} |
} |
print $preformat_in_markup ? spacedHtmlText($_, $ts) : htmlquote($_); |
print $preformat_in_markup ? spacedHtmlText($_, $ts) : htmlquote($_); |
} |
} |
} |
|
|
|
print "</pre>\n"; |
print "</pre>\n"; |
} |
} |
html_footer(); |
html_footer(); |
Line 2322 sub doDiff($$$$$$) |
|
Line 2254 sub doDiff($$$$$$) |
|
html_footer(); |
html_footer(); |
gzipclose(); |
gzipclose(); |
exit; |
exit; |
|
|
} elsif ($f =~ /^([ucs])c$/) { |
|
# |
|
# Enscript colored diff. |
|
# |
|
my $hl = 'diff'; |
|
$hl .= $1 if ($1 eq 'u' || $1 eq 's'); |
|
(my $where_nd = $where) =~ s/\.diff$//; |
|
(my $pathname = $where_nd) =~ s|((?<=/)Attic/)?[^/]*$||; |
|
(my $filename = $where_nd) =~ s|^.*/||; |
|
(my $swhere = $scriptwhere) =~ s|\.diff$||; |
|
navigateHeader($swhere, $pathname, $filename, $rev2, 'diff'); |
|
printf(<<EOF, $where_nd, $rev1, $rev2); |
|
<h3 style="text-align: center">Diff for /%s between versions %s and %s</h3> |
|
<pre> |
|
EOF |
|
doEnscript(\$fh, $hl, 0, 'cvsweb_diff'); |
|
print <<EOF; |
|
</pre> |
|
<hr style="width: 100%" /> |
|
<form method="get" action="$scriptwhere"> |
|
EOF |
|
printDiffSelectStickyVars(); |
|
print 'Diff format: '; |
|
printDiffSelect($use_java_script); |
|
print "<input type=\"submit\" value=\"Show\" />\n</form>\n"; |
|
html_footer(); |
|
gzipclose(); |
|
exit; |
|
|
|
} else { |
} else { |
# |
# |
# Plain diff. |
# Plain diff. |
Line 2919 sub printLog($$$;$$) |
|
Line 2821 sub printLog($$$;$$) |
|
$fileurl, $_, $barequery, $_)); |
$fileurl, $_, $barequery, $_)); |
} |
} |
} |
} |
print ' - ', graph_link('', 'revision graph') |
|
if (!$inlogview && $allow_cvsgraph); |
|
} |
} |
print "<br />\n"; |
print "<br />\n"; |
|
|
Line 3053 sub printLog($$$;$$) |
|
Line 2953 sub printLog($$$;$$) |
|
} |
} |
|
|
|
|
# |
|
# Generates the HTML view for CvsGraph. |
|
# |
|
sub doGraphView() |
|
{ |
|
(my $pathname = $where) =~ s|[^/]*$||; |
|
(my $filename = $where) =~ s|^.*/||; |
|
|
|
navigateHeader($scriptwhere, $pathname, $filename, undef, 'graph'); |
|
|
|
my $title = 'Revision graph of ' . htmlquote($pathname . $filename); |
|
my $mapname = 'CvsGraphMap'; |
|
|
|
printf(<<EOF, $title, $mapname, $cvstree, $title); |
|
<h3 style="text-align: center">%s</h3> |
|
<div style="text-align: center"><img border="0" usemap="#%s" src="?cvsroot=%s;graph=1;makeimage=1" alt="%s" /> |
|
EOF |
|
|
|
# Remove any pre-existing tag/branch names from branch links. |
|
(my $notag_query = $barequery) =~ s/;+only_with_tag=.*?(?=;|$)//g; |
|
|
|
my @graph_cmd = |
|
($CMD{cvsgraph}, |
|
'-r', $cvsroot, |
|
'-m', $pathname, |
|
'-i', |
|
'-M', $mapname, |
|
'-x', 'x', |
|
"-Omap_branch_href=\"href=\\\"./?only_with_tag=%(%t%)$notag_query\\\"\"", |
|
"-Omap_rev_href=\"href=\\\"?rev=%(%R%)$barequery\\\"\"", |
|
"-Omap_diff_href=\"href=\\\"%(%F%).diff" . |
|
"?r1=%(%P%);r2=%(%R%)$barequery\\\"\"", |
|
); |
|
push(@graph_cmd, '-c', $cvsgraph_config) if $cvsgraph_config; |
|
push(@graph_cmd, $filename . ',v'); |
|
|
|
local *CVSGRAPH_OUT; |
|
my ($h, $err) = |
|
startproc(\@graph_cmd, \"", '>pipe', \*CVSGRAPH_OUT); |
|
fatal('500 Internal Error', $err) unless $h; |
|
|
|
# Browser compatibility kludge: many browsers do not support client side |
|
# image maps where the <map> element contains only the id attribute. Let's |
|
# add the corresponding name attribute to it on the fly. |
|
while (<CVSGRAPH_OUT>) { |
|
s/(<map\s+id="([^"]+)")\s*>/$1 name="$2">/; |
|
print; |
|
} |
|
|
|
$h->finish(); |
|
print "</div>\n"; |
|
|
|
html_footer(); |
|
} |
|
|
|
|
|
# |
|
# Generates a graph using CvsGraph. |
|
# |
|
sub doGraph() |
|
{ |
|
(my $pathname = $where) =~ s|[^/]*$||; |
|
(my $filename = $where) =~ s|^.*/||; |
|
|
|
http_header('image/png'); |
|
|
|
my @graph_cmd = ($CMD{cvsgraph}, '-r', $cvsroot, '-m', $pathname); |
|
push(@graph_cmd, '-c', $cvsgraph_config) if $cvsgraph_config; |
|
push(@graph_cmd, $filename . ',v'); |
|
|
|
local *CVSGRAPH_OUT; |
|
my ($h, $err) = |
|
startproc(\@graph_cmd, \"", '>pipe', \*CVSGRAPH_OUT); |
|
fatal('500 Internal Error', $err) unless $h; |
|
{ |
|
local $/ = undef; |
|
binmode(\*STDOUT); |
|
print <CVSGRAPH_OUT>; |
|
} |
|
$h->finish(); |
|
} |
|
|
|
|
|
sub doLog($) |
sub doLog($) |
{ |
{ |
my ($fullname) = @_; |
my ($fullname) = @_; |
|
|
&clickablePath($upwhere, 1), "</b>\n</p>\n"; |
&clickablePath($upwhere, 1), "</b>\n</p>\n"; |
print "<p>\n "; |
print "<p>\n "; |
print &link('Request diff between arbitrary revisions', '#diff'); |
print &link('Request diff between arbitrary revisions', '#diff'); |
print ' - ', &graph_link('', 'Display revisions graphically') |
|
if $allow_cvsgraph; |
|
if ($cvshistory_url) { |
if ($cvshistory_url) { |
(my $d = $upwhere) =~ s|/+$||; |
(my $d = $upwhere) =~ s|/+$||; |
print ' - ', history_link($d, $filename); |
print ' - ', history_link($d, $filename); |
|
|
</td> |
</td> |
<td class="opt-value"> |
<td class="opt-value"> |
EOF |
EOF |
printDiffSelect($use_java_script); |
printDiffSelect(); |
print <<EOF; |
print <<EOF; |
</td> |
</td> |
<td></td> |
<td></td> |
|
|
|
|
if (@branchnames) { |
if (@branchnames) { |
|
|
printf(<<EOF, $use_java_script ? ' onchange="this.form.submit()"' : ''); |
print <<EOF; |
<tr> |
<tr> |
<td class="opt-label"> |
<td class="opt-label"> |
<label for="only_with_tag" accesskey="B">View only branch:</label> |
<label for="only_with_tag" accesskey="B">View only branch:</label> |
</td> |
</td> |
<td class="opt-value"> |
<td class="opt-value"> |
<a name="branch"> |
<a name="branch"> |
<select id="only_with_tag" name="only_with_tag"%s> |
<select id="only_with_tag" name="only_with_tag"> |
EOF |
EOF |
|
|
my @tmp = (); |
my @tmp = (); |
|
|
</td> |
</td> |
<td> |
<td> |
EOF |
EOF |
printLogSortSelect($use_java_script); |
printLogSortSelect(); |
print <<EOF; |
print <<EOF; |
</td> |
</td> |
<td><input type="submit" value="Set" accesskey="S" /></td> |
<td><input type="submit" value="Set" accesskey="S" /></td> |
|
|
<label for="f">Diff format:<br /> |
<label for="f">Diff format:<br /> |
EOF |
EOF |
printDiffSelectStickyVars(); |
printDiffSelectStickyVars(); |
printDiffSelect($use_java_script); |
printDiffSelect(); |
printf(<<EOF, $rev1, $rev2); |
printf(<<EOF, $rev1, $rev2); |
</label> |
</label> |
<input type="submit" value="Show" /> |
<input type="submit" value="Show" /> |
|
|
} |
} |
|
|
|
|
sub doEnscript($$$;$) |
|
{ |
|
my ($filehandle, $highlight, $linenumbers, $lang) = @_; |
|
$lang ||= 'cvsweb'; |
|
|
|
my @cmd = ($CMD{enscript}, |
|
@enscript_options, |
|
'-q', "--language=$lang", '-o', '-', "--highlight=$highlight"); |
|
|
|
local *ENSCRIPT_OUT; |
|
my ($h, $err) = |
|
startproc(\@cmd, $filehandle, '>pipe', \*ENSCRIPT_OUT); |
|
fatal('500 Internal Error', $err) unless $h; |
|
|
|
# We could short-circuit and have enscript output directly to STDOUT above, |
|
# but that doesn't work with mod_perl (at least some 1.99 versions). |
|
if ($linenumbers) { |
|
my $ln = 0; |
|
while (<ENSCRIPT_OUT>) { |
|
printf '<a id="l%d" class="src">%5d: </a>', (++$ln) x 2; |
|
print $_; |
|
} |
|
} else { |
|
local $/ = undef; |
|
print <ENSCRIPT_OUT>; |
|
} |
|
$h->finish(); |
|
} |
|
|
|
|
|
# |
# |
# The passed in $path and $filename should not be URI escaped, and $swhere |
# The passed in $path and $filename should not be URI escaped, and $swhere |
# *should* be. |
# *should* be. |
Line 3749 sub chooseCVSRoot() |
|
Line 3534 sub chooseCVSRoot() |
|
if ($input{$k} && $k ne 'cvsroot'); |
if ($input{$k} && $k ne 'cvsroot'); |
} |
} |
|
|
printf(<<EOF, $use_java_script ? ' onchange="this.form.submit()"' : ''); |
print <<EOF; |
<label for="cvsroot" accesskey="C">CVS Root: |
<label for="cvsroot" accesskey="C">CVS Root: |
<select id="cvsroot" name="cvsroot"%s> |
<select id="cvsroot" name="cvsroot"> |
EOF |
EOF |
|
|
foreach my $k (@CVSROOT) { |
foreach my $k (@CVSROOT) { |
Line 3926 sub display_link($$;$$) |
|
Line 3711 sub display_link($$;$$) |
|
return sprintf('<a href="%s" class="display-link">%s</a>', |
return sprintf('<a href="%s" class="display-link">%s</a>', |
display_url($url, $revision, $mtype) . $barequery, |
display_url($url, $revision, $mtype) . $barequery, |
htmlquote($textlink)); |
htmlquote($textlink)); |
} |
|
|
|
# |
|
# Expects the passed in URL to be URI escaped, and without a query string. |
|
# The passed in link text should be already HTML escaped as appropriate. |
|
# |
|
sub graph_link($;$) |
|
{ |
|
my ($url, $text) = @_; |
|
$text ||= $graphicon; |
|
return sprintf('<a href="%s?graph=1%s">%s</a>', $url, $barequery, $text); |
|
} |
} |
|
|
# |
# |