git/list[1] front-page[2] threads[3] people[4] search[5] about
 

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
Previous: Jakub NarebskiNext: Jakub Narebski
Message 7 of 16 in “Do not chop HTML tags in commit search result”
  1. Do not chop HTML tags in commit search resultJean-Baptiste Quenot, Feb 13, 2008
  2. Jakub NarebskiFeb 13, 2008
  3. Junio C HamanoFeb 13, 2008
  4. gitweb: Better chopping in commit search resultsJakub Narebski, Feb 22, 2008
  5. Junio C HamanoFeb 22, 2008
  6. Jakub NarebskiFeb 22, 2008
  7. Jakub NarebskiFeb 22, 2008
  8. gitweb: Option to chop at beginning and in the middle in chop_strJakub Narebski, Feb 23, 2008
  9. Junio C HamanoFeb 23, 2008
  10. Jakub NarebskiFeb 23, 2008
  11. gitweb: Option to chop at beginning and in the middle in chop_strJakub Narebski, Feb 24, 2008
  12. Junio C HamanoFeb 25, 2008
  13. gitweb: Better cutting matched string and its contextJakub Narebski, Feb 25, 2008
  14. Junio C HamanoFeb 25, 2008
  15. Karl HasselströmFeb 23, 2008
  16. Jakub NarebskiFeb 23, 2008

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.