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

[PATCH/RFC 5/5] gitweb: Highlight matched part of shortened project description

From
Jakub Narebski <jnareb@gmail.com>
Date
Feb 4, 2012, 12:47 UTC
Message-ID
<1328359648-29511-6-git-send-email-jnareb@gmail.com>
In-Reply-To
<1328359648-29511-1-git-send-email-jnareb@gmail.com>

Previous commit make gitweb use esc_html_match_hl() to mark match in the _whole_ description of a project when searching projects.

This commit makes gitweb highlight match in _shortened_ description, based on match in whole description, using esc_html_match_hl_chopped() subroutine (with some code duplication with esc_html_match_hl()). If match is in shortened part, then trailing "... " is highlighted.

Signed-off-by: Jakub Narebski <jnareb@gmail.com>
---
This is an RFC because of code duplication between esc_html_match_hl()
and esc_html_match_hl_chopped().
 gitweb/gitweb.perl |   41 ++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 40 insertions(+), 1 deletions(-)
diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl
index c650268..174b4d2 100755
--- a/gitweb/gitweb.perl
+++ b/gitweb/gitweb.perl
@@ -1739,6 +1739,44 @@ sub esc_html_match_hl {
 	return $out;
 }
 
+# highlight match (if any) of shortened string, and escape HTML
+sub esc_html_match_hl_chopped {
+	my ($str, $chopped, $regexp) = @_;
+	return esc_html($chopped) unless defined $regexp;
+	return esc_html_match_hl($str, $regexp) if ($str eq $chopped);
+
+	my @matches;
+	while ($str =~ /$regexp/g) {
+		push @matches, [$-[0], $+[0]];
+	}
+	return esc_html($chopped) unless @matches;
+
+	my $tail = "... ";
+	$chopped =~ s/\Q$tail\E$//; # see chop_str
+	my $len = length($chopped);
+	my $out = '';
+	my $pos = 0;
+	for my $m (@matches) {
+		if ($m->[0] > $len) {
+			$tail = $cgi->span({-class => 'match'}, $tail);
+			last;
+		}
+		$out .= esc_html(substr $str, $pos, $m->[0] - $pos);
+		$out .= $cgi->span({-class => 'match'},
+		                   esc_html(substr $chopped, $m->[0],
+		                            ($m->[1] > $len ? $len : $m->[1]) - $m->[0]));
+		if ($m->[1] > $len) {
+			$tail = $cgi->span({-class => 'match'}, $tail);
+			$pos = $len;
+			last;
+		}
+		$pos = $m->[1];
+	}
+	$out .= esc_html(substr($chopped, $pos)).$tail;
+
+	return $out;
+}
+
 ## ----------------------------------------------------------------------
 ## functions returning short strings
 
@@ -5372,7 +5410,8 @@ sub git_project_list_rows {
 		      "<td>" . $cgi->a({-href => href(project=>$pr->{'path'}, action=>"summary"),
 		                        -class => "list", -title => $pr->{'descr_long'}},
 		                        $search_regexp
-		                        ? esc_html_match_hl($pr->{'descr_long'}, $search_regexp)
+		                        ? esc_html_match_hl_chopped($pr->{'descr_long'},
+		                                                    $pr->{'descr'}, $search_regexp)
 		                        : esc_html($pr->{'descr'})) .
 		      "</td>\n" .
 		      "<td><i>" . chop_and_escape_str($pr->{'owner'}, 15) . "</i></td>\n";
-- 
1.7.9
Previous: Jakub NarebskiNext: Jakub Narebski
Message 18 of 21 in “gitweb: Faster and imrpoved project search”
  1. 0/5 gitweb: Faster and imrpoved project searchJakub Narebski, Feb 4, 2012
  2. 1/5 gitweb: Option for filling only specified info in fill_project_list_infoJakub Narebski, Feb 4, 2012
  3. Junio C HamanoFeb 9, 2012
  4. Jakub NarebskiFeb 9, 2012
  5. Junio C HamanoFeb 9, 2012
  6. Jakub NarebskiFeb 9, 2012
  7. Junio C HamanoFeb 9, 2012
  8. Jakub NarebskiFeb 10, 2012
  9. Junio C HamanoFeb 10, 2012
  10. Jakub NarebskiFeb 10, 2012
  11. Junio C HamanoFeb 10, 2012
  12. Jakub NarebskiFeb 10, 2012
  13. Junio C HamanoFeb 10, 2012
  14. Jakub NarebskiFeb 10, 2012
  15. 2/5 gitweb: Faster project searchJakub Narebski, Feb 4, 2012
  16. 3/5 gitweb: Highlight matched part of project name when searching projectsJakub Narebski, Feb 4, 2012
  17. 4/5 gitweb: Highlight matched part of project description when searching projectsJakub Narebski, Feb 4, 2012
  18. 5/5 gitweb: Highlight matched part of shortened project descriptionJakub Narebski, Feb 4, 2012
  19. 5/5 gitweb: Highlight matched part of shortened project descriptionJakub Narebski, Feb 4, 2012
  20. Felipe ContrerasFeb 4, 2012
  21. Jakub NarebskiFeb 4, 2012

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.