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>
Junio C Hamano committed
Feb 22, 2008 at 17:33 UTC
be8b9063810f0c47f825c47045c7ca137f520edb
1 file changed
+15
-9
gitweb/gitweb.perl
+15
-9
@@ -3784,18 +3784,24 @@ sub git_search_grep_body {
3784
print "<td title=\"$co{'age_string_age'}\"><i>$co{'age_string_date'}</i></td>\n" .
3785
"<td><i>" . $author . "</i></td>\n" .
3786
"<td>" .
3787
- $cgi->a({-href => href(action=>"commit", hash=>$co{'id'}), -class => "list subject"},
3788
- chop_and_escape_str($co{'title'}, 50) . "<br/>");
3787
+ $cgi->a({-href => href(action=>"commit", hash=>$co{'id'}),
3788
+ -class => "list subject"},
3789
+ chop_and_escape_str($co{'title'}, 50) . "<br/>");
3790
my $comment = $co{'comment'};
3791
foreach my $line (@$comment) {
3792
if ($line =~ m/^(.*)($search_regexp)(.*)$/i) {
3792
- my $lead = esc_html($1) || "";
3793
- $lead = chop_str($lead, 30, 10);
3794
- my $match = esc_html($2) || "";
3795
- my $trail = esc_html($3) || "";
3796
- $trail = chop_str($trail, 30, 10);
3797
- my $text = "$lead<span class=\"match\">$match</span>$trail";
3798
- print chop_str($text, 80, 5) . "<br/>\n";
3793
+ my ($lead, $match, $trail) = ($1, $2, $3);
3794
+ $match = chop_str($match, 70, 5); # in case match is very long
3795
+ my $contextlen = (80 - len($match))/2; # is left for the remainder
3796
+ $contextlen = 30 if ($contextlen > 30); # but not too much
3797
+ $lead = chop_str($lead, $contextlen, 10);
3798
+ $trail = chop_str($trail, $contextlen, 10);
3799
+
3800
+ $lead = esc_html($lead);
3801
+ $match = esc_html($match);
3802
+ $trail = esc_html($trail);
3803
+
3804
+ print "$lead<span class=\"match\">$match</span>$trail<br />";
3805
}
3806
}
3807
print "</td>\n" .