2 # Search Webmin modules and help pages and text and config.info
4 BEGIN { push(@INC, ".."); };
10 $prod = &get_product_name();
11 $ucprod = ucfirst($prod);
12 &ui_print_header(undef, &text('wsearch_title', $ucprod), "", undef, 0, 1);
14 # Validate search text
17 &error($text{'wsearch_esearch'});
22 # Search module names and add to results list
24 @mods = sort { $b->{'longdesc'} cmp $a->{'longdesc'} }
25 grep { !$_->{'clone'} } &get_available_module_infos();
27 if ($m->{'desc'} =~ /\Q$re\E/i) {
28 push(@rv, { 'mod' => $m,
31 'link' => $m->{'dir'}.'/',
32 'text' => $m->{'desc'} });
36 # Search module configs and their help pages
38 %access = &get_module_acl(undef, $m);
39 next if ($access{'noconfig'});
40 $file = $prod eq 'webmin' ? "$m->{'dir'}/config.info"
41 : "$m->{'dir'}/uconfig.info";
44 &read_file($file, \%info, \@info_order);
45 foreach $o (@lang_order_list) {
46 &read_file("$file.$o", \%info);
49 foreach $c (@info_order) {
50 @p = split(/,/, $info{$c});
54 if ($p[0] =~ /\Q$re\E/i) {
55 # Config description matches
56 push(@rv, { 'mod' => $m,
59 'link' => "config.cgi?module=$m->{'dir'}&".
60 "section=".&urlize($section)."#$c",
63 $hfl = &help_file($mod->{'dir'}, "config_".$c);
64 ($title, $help) = &help_file_match($hfl);
67 push(@rv, { 'mod' => $m,
70 'link' => "help.cgi/$m->{'dir'}/config_$c",
71 'desc' => &text('wsearch_helpfor', $p[0]),
78 # Search other help pages
79 %lang_order_list = map { $_, 1 } @lang_order_list;
81 $helpdir = &module_root_directory($m->{'dir'})."/help";
83 opendir(DIR, $helpdir);
84 foreach $f (sort { length($b) <=> length($a) } readdir(DIR)) {
85 next if ($f =~ /^config_/); # For config help, already done
87 # Work out if we should grep this help page - don't do the same
88 # page twice for different languages
90 if ($f =~ /^(\S+)\.([^\.]+)\.html$/) {
91 ($page, $lang) = ($1, $2);
92 if ($lang_order_list{$lang} && !$donepage{$page}++) {
96 elsif ($f =~ /^(\S+)\.html$/) {
98 if (!$donepage{$page}++) {
105 ($title, $help) = &help_file_match("$helpdir/$f");
107 @cgis = &find_cgi_text(
108 [ "hlink\\(.*'$page'",
109 "hlink\\(.*\"$page\"",
111 # XXX delete this block
116 $link = &ui_links_row([
118 $s =~ s/^\Q$m->{'dir'}\E\///;
119 "<a href='$_'>$s</a>" } @cgis
122 $link = &text('wsearch_on', $link);
124 push(@rv, { 'mod' => $m,
127 'link' => "help.cgi/$m->{'dir'}/config_$c",
137 # Then do text strings
138 MODULE: foreach $m (@mods) {
139 %mtext = &load_language($m->{'dir'});
140 foreach $k (keys %mtext) {
141 if ($mtext{$k} =~ /\Q$re\E/i) {
142 @cgis = &find_cgi_text(
146 # XXX delete this block
148 $link = "<a href='$m->{'dir'}/'>$m->{'desc'}</a>";
151 $link = &ui_links_row([
153 $s =~ s/^\Q$m->{'dir'}\E\///;
154 "<a href='$_'>$s</a>" } @cgis ]);
157 push(@rv, { 'mod' => $m,
160 'desc' => $pagetitle, # XXX
161 'text' => $mtext{$k},
167 # Sort results by relevancy
169 @rv = sort { $a->{'rank'} <=> $b->{'rank'} } @rv;
173 # XXX next page link?
174 print &ui_columns_start(
175 [ $text{'wsearch_htext'}, $text{'wsearch_htype'},
176 $text{'wsearch_hcgis'} ], 100);
177 foreach my $r (@rv) {
180 print &ui_columns_end();
183 print "<b>",&text('wsearch_enone',
184 "<tt>".&html_escape($re)."</tt>"),"</b><p>\n";
189 # Returns text with the search term bolded, and truncated to 60 characters
192 local ($str, $len) = @_;
194 local $hlen = $len / 2;
195 $str =~ s/<[^>]*>//g;
196 if ($str =~ /(.*)(\Q$re\E)(.*)/i) {
197 local ($before, $match, $after) = ($1, $2, $3);
198 if (length($before) > $hlen) {
199 $before = "...".substr($before, length($before)-$hlen);
201 if (length($after) > $hlen) {
202 $after = substr($after, 0, $hlen)."...";
204 $str = $before."<b>".&html_escape($match)."</b>".$after;
211 local ($m, $link, $what, $text, $module_link) = @_;
212 print "<font size=+1>$link</font>\n";
214 print " (".&text('wsearch_inmod',
215 "<a href='$m->{'dir'}/'>$m->{'desc'}</a>").")";
219 print &highlight_text($text),"<br>\n";
221 print "<font color=#4EBF37>$m->{'desc'} - $what</font><br> <br>\n";
225 # find_cgi_text(®exps, module, re-mode)
226 # Returns the relative URLs of CGIs that matches some regexps, in the given
230 local ($res, $m, $remode) = @_;
231 local $mdir = &module_root_directory($m);
233 foreach my $f (glob("$mdir/*.cgi")) {
236 LINE: while(my $line = <CGI>) {
237 foreach my $r (@$res) {
238 if (!$remode && index($line, $r) >= 0 ||
239 $remode && $line =~ /$r/) {
248 $url =~ s/^\Q$root_directory\E\///;
255 # help_file_match(file)
256 # Returns the title if some help file matches the current search
260 local $data = &read_file_contents($f);
262 if ($data =~ /<header>([^<]*)<\/header>/) {
269 $data =~ s/<p>/\n\n/gi;
270 $data =~ s/<br>/\n/gi;
271 $data =~ s/<[^>]+>//g;
272 if ($data =~ /\Q$re\E/i) {