Jakub Narebski wrote: > On Fri, 22 Feb 2008, Junio C Hamano wrote: >> 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 - To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html