From: Jakub Narebski <jnareb@gmail.com>
To: git@vger.kernel.org
Cc: Jakub Narebski <jnareb@gmail.com>
Subject: [PATCH/RFC 5/5] gitweb: Highlight matched part of shortened project description
Date: Sat, 4 Feb 2012 13:47:28 +0100 [thread overview]
Message-ID: <1328359648-29511-6-git-send-email-jnareb@gmail.com> (raw)
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
next prev parent reply other threads:[~2012-02-04 12:47 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-02-04 12:47 [PATCH 0/5] gitweb: Faster and imrpoved project search Jakub Narebski
2012-02-04 12:47 ` [PATCH 1/5] gitweb: Option for filling only specified info in fill_project_list_info Jakub Narebski
2012-02-09 22:04 ` Junio C Hamano
2012-02-09 22:36 ` Jakub Narebski
2012-02-09 23:18 ` Junio C Hamano
2012-02-09 23:52 ` Jakub Narebski
2012-02-09 23:56 ` Junio C Hamano
2012-02-10 13:56 ` Jakub Narebski
2012-02-10 17:43 ` Junio C Hamano
2012-02-10 18:17 ` Jakub Narebski
2012-02-10 19:49 ` Junio C Hamano
2012-02-10 21:30 ` Jakub Narebski
2012-02-10 21:44 ` Junio C Hamano
2012-02-10 22:07 ` Jakub Narebski
2012-02-04 12:47 ` [PATCH 2/5] gitweb: Faster project search Jakub Narebski
2012-02-04 12:47 ` [PATCH 3/5] gitweb: Highlight matched part of project name when searching projects Jakub Narebski
2012-02-04 12:47 ` [PATCH 4/5] gitweb: Highlight matched part of project description " Jakub Narebski
2012-02-04 12:47 ` Jakub Narebski [this message]
2012-02-04 18:56 ` [PATCH/RFCv2 5/5] gitweb: Highlight matched part of shortened project description Jakub Narebski
2012-02-04 20:07 ` [PATCH 0/5] gitweb: Faster and imrpoved project search Felipe Contreras
2012-02-04 20:59 ` Jakub Narebski
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1328359648-29511-6-git-send-email-jnareb@gmail.com \
--to=jnareb@gmail.com \
--cc=git@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).