Browse Source

gitweb: Better chopping in commit search results

When searching commit messages (commit search), if matched string is
too long, the generated HTML was munged leading to an ill-formed XHTML
document.

Now gitweb chop leading, trailing and matched parts, HTML escapes
those parts, then composes and marks up match info.  HTML output is
never chopped.  Limiting matched info to 80 columns (with slop) is now
done by dividing remaining characters after chopping match equally to
leading and trailing part, not by chopping composed and HTML marked
output.

Noticed-by: Jean-Baptiste Quenot <jbq@caraldi.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Jakub Narebski <jnareb@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Junio C Hamano 17 years ago
parent
commit
be8b906381
  1. 22
      gitweb/gitweb.perl

22
gitweb/gitweb.perl

@ -3784,18 +3784,24 @@ sub git_search_grep_body {
print "<td title=\"$co{'age_string_age'}\"><i>$co{'age_string_date'}</i></td>\n" . print "<td title=\"$co{'age_string_age'}\"><i>$co{'age_string_date'}</i></td>\n" .
"<td><i>" . $author . "</i></td>\n" . "<td><i>" . $author . "</i></td>\n" .
"<td>" . "<td>" .
$cgi->a({-href => href(action=>"commit", hash=>$co{'id'}), -class => "list subject"}, $cgi->a({-href => href(action=>"commit", hash=>$co{'id'}),
-class => "list subject"},
chop_and_escape_str($co{'title'}, 50) . "<br/>"); chop_and_escape_str($co{'title'}, 50) . "<br/>");
my $comment = $co{'comment'}; my $comment = $co{'comment'};
foreach my $line (@$comment) { foreach my $line (@$comment) {
if ($line =~ m/^(.*)($search_regexp)(.*)$/i) { if ($line =~ m/^(.*)($search_regexp)(.*)$/i) {
my $lead = esc_html($1) || ""; my ($lead, $match, $trail) = ($1, $2, $3);
$lead = chop_str($lead, 30, 10); $match = chop_str($match, 70, 5); # in case match is very long
my $match = esc_html($2) || ""; my $contextlen = (80 - len($match))/2; # is left for the remainder
my $trail = esc_html($3) || ""; $contextlen = 30 if ($contextlen > 30); # but not too much
$trail = chop_str($trail, 30, 10); $lead = chop_str($lead, $contextlen, 10);
my $text = "$lead<span class=\"match\">$match</span>$trail"; $trail = chop_str($trail, $contextlen, 10);
print chop_str($text, 80, 5) . "<br/>\n";
$lead = esc_html($lead);
$match = esc_html($match);
$trail = esc_html($trail);

print "$lead<span class=\"match\">$match</span>$trail<br />";
} }
} }
print "</td>\n" . print "</td>\n" .

Loading…
Cancel
Save