diff --git a/lang/en b/lang/en
index 6dc58bfd6..0b38990ca 100644
--- a/lang/en
+++ b/lang/en
@@ -319,3 +319,13 @@ wsearch_inmod=In $1
wsearch_text=User interface text
wsearch_esearch=Nothing to search for was entered.
wsearch_enone=No Webmin modules or pages matching $1 were found.
+wsearch_on=(On $1)
+wsearch_helpfor=Help for $1
+wsearch_htext=Matching text
+wsearch_htype=Source
+wsearch_hcgis=References
+wsearch_type_mod=Module name
+wsearch_type_config=Configuration
+wsearch_type_help=Help page
+wsearch_type_text=UI text
+wsearch_hmod=Module
diff --git a/webmin_search.cgi b/webmin_search.cgi
index b26b0572a..026b97cc6 100644
--- a/webmin_search.cgi
+++ b/webmin_search.cgi
@@ -58,7 +58,8 @@ foreach $m (@mods) {
'type' => 'config',
'link' => "config.cgi?module=$m->{'dir'}&".
"section=".&urlize($section)."#$c",
- 'text' => $p[0] });
+ 'text' => $p[0],
+ });
}
$hfl = &help_file($mod->{'dir'}, "config_".$c);
($title, $help) = &help_file_match($hfl);
@@ -67,9 +68,12 @@ foreach $m (@mods) {
push(@rv, { 'mod' => $m,
'rank' => 6,
'type' => 'help',
- 'link' => "help.cgi/$m->{'dir'}/config_$c",
+ 'link' => "help.cgi/$m->{'dir'}/config_".$c,
'desc' => &text('wsearch_helpfor', $p[0]),
'text' => $help,
+ 'cgis' => [ "/config.cgi?".
+ "module=$m->{'dir'}§ion=".
+ &urlize($section)."#$c" ],
});
}
}
@@ -104,27 +108,14 @@ foreach $m (@mods) {
if ($grep) {
($title, $help) = &help_file_match("$helpdir/$f");
if ($title) {
- @cgis = &find_cgi_text(
+ my @cgis = &find_cgi_text(
[ "hlink\\(.*'$page'",
"hlink\\(.*\"$page\"",
], $m, 1);
- # XXX delete this block
- if (@cgis == 0) {
- $link = "";
- }
- else {
- $link = &ui_links_row([
- map { my $s = $_;
- $s =~ s/^\Q$m->{'dir'}\E\///;
- "$s" } @cgis
- ]);
- $link =~ s/
//;
- $link = &text('wsearch_on', $link);
- }
push(@rv, { 'mod' => $m,
'rank' => 6,
'type' => 'help',
- 'link' => "help.cgi/$m->{'dir'}/config_$c",
+ 'link' => "help.cgi/$m->{'dir'}/$page",
'desc' => $title,
'text' => $help,
'cgis' => \@cgis });
@@ -135,29 +126,19 @@ foreach $m (@mods) {
}
# Then do text strings
+%gtext = &load_language("");
MODULE: foreach $m (@mods) {
%mtext = &load_language($m->{'dir'});
foreach $k (keys %mtext) {
+ next if ($gtext{$k}); # Skip repeated global strings
if ($mtext{$k} =~ /\Q$re\E/i) {
- @cgis = &find_cgi_text(
+ my @cgis = &find_cgi_text(
[ "\$text{'$k'}",
"\$text{\"$k\"}",
"\$text{$k}" ], $m);
- # XXX delete this block
- if (@cgis == 0) {
- $link = "$m->{'desc'}";
- }
- else {
- $link = &ui_links_row([
- map { my $s = $_;
- $s =~ s/^\Q$m->{'dir'}\E\///;
- "$s" } @cgis ]);
- $link =~ s/
//;
- }
push(@rv, { 'mod' => $m,
'rank' => 4,
'type' => 'text',
- 'desc' => $pagetitle, # XXX
'text' => $mtext{$k},
'cgis' => \@cgis });
}
@@ -166,16 +147,35 @@ MODULE: foreach $m (@mods) {
# Sort results by relevancy
# XXX
-@rv = sort { $a->{'rank'} <=> $b->{'rank'} } @rv;
+@rv = sort { $b->{'rank'} <=> $a->{'rank'} } @rv;
# Show in table
if (@rv) {
# XXX next page link?
print &ui_columns_start(
[ $text{'wsearch_htext'}, $text{'wsearch_htype'},
- $text{'wsearch_hcgis'} ], 100);
+ $text{'wsearch_hmod'}, $text{'wsearch_hcgis'} ], 100);
foreach my $r (@rv) {
- # XXX
+ $hi = &highlight_text($r->{'text'});
+ if ($r->{'link'}) {
+ $hi = "$hi";
+ }
+ @links = ( );
+ foreach my $c (@{$r->{'cgis'}}) {
+ ($cmod, $cpage) = split(/\//, $c);
+ ($cpage, $cargs) = split(/\?/, $cpage);
+ $ctitle = &cgi_page_title($cmod, $cpage) || $cpage;
+ push(@links, "$ctitle");
+ }
+ if (@links > 2) {
+ @links = ( @links[0..1], "..." );
+ }
+ print &ui_columns_row([
+ $hi,
+ $text{'wsearch_type_'.$r->{'type'}},
+ "{'dir'}/'>$r->{'mod'}->{'desc'}",
+ &ui_links_row(\@links),
+ ]);
}
print &ui_columns_end();
}
@@ -186,11 +186,12 @@ else {
&ui_print_footer();
+# highlight_text(text, [length])
# Returns text with the search term bolded, and truncated to 60 characters
sub highlight_text
{
local ($str, $len) = @_;
-$len ||= 90;
+$len ||= 50;
local $hlen = $len / 2;
$str =~ s/<[^>]*>//g;
if ($str =~ /(.*)(\Q$re\E)(.*)/i) {
@@ -206,22 +207,6 @@ if ($str =~ /(.*)(\Q$re\E)(.*)/i) {
return $str;
}
-sub match_row
-{
-local ($m, $link, $what, $text, $module_link) = @_;
-print "$link\n";
-if ($module_link) {
- print " (".&text('wsearch_inmod',
- "$m->{'desc'}").")";
- }
-print "
\n";
-if ($text) {
- print &highlight_text($text),"
\n";
- }
-print "$m->{'desc'} - $what
\n";
-$count++;
-}
-
# find_cgi_text(®exps, module, re-mode)
# Returns the relative URLs of CGIs that matches some regexps, in the given
# module.
@@ -270,7 +255,27 @@ $data =~ s/
/\n\n/gi;
$data =~ s/
/\n/gi;
$data =~ s/<[^>]+>//g;
if ($data =~ /\Q$re\E/i) {
- return $title;
+ return ($title, $data);
}
-return undef;
+return ( );
+}
+
+# cgi_page_title(module, cgi)
+# Given a CGI, return the text for its page title, if possible
+sub cgi_page_title
+{
+local ($m, $cgi) = @_;
+local $data = &read_file_contents(&module_root_directory($m)."/".$cgi);
+local $rv;
+if ($data =~ /(header|ui_print_header|ui_print_unbuffered_header)\([^,]+,\s*(\$text{'([^']+)'|\$text{"([^"]+)"|\&text\('([^']+)'|\&text\("([^"]+)")/) {
+ local $msg = $3 || $4 || $5 || $6;
+ local %mtext = &load_language($m);
+ $rv = $mtext{$msg};
+ }
+if ($cgi eq "index.cgi" && !$rv) {
+ # If no title was found for an index.cgi, use module title
+ local %minfo = &get_module_info($m);
+ $rv = $minfo{'desc'};
+ }
+return $rv;
}