@matheusbsbs / matheus-bagliano / commits / be8b906381
Fork 0

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" .