Re: [PATCH] gitweb: Better chopping in commit search results
- From
Jakub Narebski <jnareb@gmail.com>
- Date
- Feb 22, 2008, 19:14 UTC
- Message-ID
- <200802222014.13205.jnareb@gmail.com>
- In-Reply-To
- <200802221849.44054.jnareb@gmail.com>
Jakub Narebski wrote:
> On Fri, 22 Feb 2008, Junio C Hamano wrote:
Show 13 quoted lines
>> For example, if you are looking for "very long ... and how" >> in the first paragraph of message (if it were all on a single >> line), wouldn't you want to see: >> >> ...st this with <<very long ... and how>> the actual out... >> >> rather than: >> >> Could som... <<very long search stri...>> the actual out... >> >> in the result? > > ...but I think it is better left for another patch.
End here is proposed improved chop_str which can do chopping at beginning, in the middle, and (as it used to do) at the end.
Some questions about the code: * should we divide slop in two also when chopping in the middle? * what should extra option be named, and what should be names of posible values of this option (the option deciding where to chop) * $add_len has default value if not provided, or if 0 (!), or if ''; you have to use chop_str($str, 20, undef, -pos=>'center') trick to use it with extra options. * can the code be improved? I'm not Perl expert.
-- >8 --
sub chop_str {
my $str = shift;
my $len = shift;
my $add_len = shift || 10;
# supported opts:
# * -pos => 'left' | 'center' | 'right', defaults to 'right'
# denotes where (which part) to chop
my %opts = @_;# allow only $len chars, but don't cut a word if it would fit in $add_len # if it doesn't fit, cut it if it's still longer than the dots we would add # remove chopped character entities entirely
# when chopping in the middle, distribute $len into left and right part
if (defined $opts{'-pos'} && $opts{'-pos'} eq 'center') {
$len = int($len/2);
} # regexps: ending and beginning with word part up to $add_len
my $endre = qr/.{0,$len}[^ \/\-_:\.@]{0,$add_len}/;
my $begre = qr/[^ \/\-_:\.@]{0,$add_len}.{0,$len}/; if (defined $opts{'-pos'} && $opts{'-pos'} eq 'left') {
$str =~ m/^(.*?)($begre)$/;
my ($lead, $body) = ($1, $2);
if (length($lead) > 4) {
if ($lead =~ m/&[^;]*$/) {
$body =~ s/^[^;]*;//;
}
$lead = "... ";
}
return "$lead$body"; } elsif (defined $opts{'-pos'} && $opts{'-pos'} eq 'center') {
$str =~ m/^($endre)(.*)$/;
my ($left, $str) = ($1, $2);
$str =~ m/^(.*?)($begre)$/;
my ($mid, $right) = ($1, $2);
if (length($mid) > 5) {
$left =~ s/&[^;]*$//;
if ($mid =~ m/&[^;]*$/) {
$right =~ s/^[^;]*;//;
}
$mid = " ... ";
}
return "$left$mid$right"; } else {
$str =~ m/^($endre)(.*)$/;
my $body = $1;
my $tail = $2;
if (length($tail) > 4) {
$body =~ s/&[^;]*$//;
$tail = " ...";
}
return "$body$tail";
}
}
-- >8 --Example usage: chop_str($str, 15, 5, -pos=>'center')
-- Jakub Narebski Poland