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);
16 &error($text{'wsearch_esearch'});
21 # Search module names first
23 @mods = sort { $b->{'longdesc'} cmp $a->{'longdesc'} }
24 grep { !$_->{'clone'} } &get_available_module_infos();
26 if ($m->{'desc'} =~ /\Q$re\E/i || $m->{'dir'} =~ /\Q$re\E/i) {
29 "<a href='$m->{'dir'}/'>$m->{'desc'}</a>",
30 $text{'wsearch_mtitle'},
37 # Then do module configs
39 %access = &get_module_acl(undef, $m);
40 next if ($access{'noconfig'});
41 $file = $prod eq 'webmin' ? "$m->{'dir'}/config.info"
42 : "$m->{'dir'}/uconfig.info";
45 &read_file($file, \%info, \@info_order);
46 foreach $o (@lang_order_list) {
47 &read_file("$file.$o", \%info);
50 foreach $c (@info_order) {
51 @p = split(/,/, $info{$c});
55 if ($p[0] =~ /\Q$re\E/i) {
58 "<a href='config.cgi?module=$m->{'dir'}&".
59 "section=".&urlize($section)."#$c'>$p[0]</a>",
60 $text{'wsearch_config_'.$prod},
69 %lang_order_list = map { $_, 1 } @lang_order_list;
71 $helpdir = &module_root_directory($m->{'dir'})."/help";
73 opendir(DIR, $helpdir);
74 foreach $f (sort { length($b) <=> length($a) } readdir(DIR)) {
75 # Work out if we should grep this help page - don't do the same
76 # page twice for different languages
78 if ($f =~ /^(\S+)\.([^\.]+)\.html$/) {
79 ($page, $lang) = ($1, $2);
80 if ($lang_order_list{$lang} && !$donepage{$page}++) {
84 elsif ($f =~ /^(\S+)\.html$/) {
86 if (!$donepage{$page}++) {
93 $data = &read_file_contents("$helpdir/$f");
94 if ($data =~ /<header>([^<]*)<\/header>/) {
101 $data =~ s/<p>/\n\n/gi;
102 $data =~ s/<br>/\n/gi;
103 $data =~ s/<[^>]+>//g;
104 if ($data =~ /\Q$re\E/i) {
105 @cgis = &find_cgi_text(
106 [ "hlink\\(.*'$page'",
107 "hlink\\(.*\"$page\"",
109 if ($page =~ /^config_(\S+)$/) {
110 # Special config.info page link
117 $link = &ui_links_row([
119 $s =~ s/^\Q$m->{'dir'}\E\///;
120 "<a href='$_'>$s</a>" } @cgis
123 $link = &text('wsearch_on', $link);
127 &hlink($title, $page, $m->{'dir'}).
129 $text{'wsearch_help'},
139 # Then do text strings
140 MODULE: foreach $m (@mods) {
141 %mtext = &load_language($m->{'dir'});
142 foreach $k (keys %mtext) {
143 if ($mtext{$k} =~ /\Q$re\E/i) {
144 @cgis = &find_cgi_text(
149 $link = "<a href='$m->{'dir'}/'>$m->{'desc'}</a>";
152 $link = &ui_links_row([
154 $s =~ s/^\Q$m->{'dir'}\E\///;
155 "<a href='$_'>$s</a>" } @cgis ]);
161 $text{'wsearch_text'},
171 print "<b>",&text('wsearch_enone',
172 "<tt>".&html_escape($re)."</tt>"),"</b><p>\n";
177 # Returns text with the search term bolded, and truncated to 60 characters
180 local ($str, $len) = @_;
182 local $hlen = $len / 2;
183 $str =~ s/<[^>]*>//g;
184 if ($str =~ /(.*)(\Q$re\E)(.*)/i) {
185 local ($before, $match, $after) = ($1, $2, $3);
186 if (length($before) > $hlen) {
187 $before = "...".substr($before, length($before)-$hlen);
189 if (length($after) > $hlen) {
190 $after = substr($after, 0, $hlen)."...";
192 $str = $before."<b>".&html_escape($match)."</b>".$after;
199 local ($m, $link, $what, $text, $module_link) = @_;
200 print "<font size=+1>$link</font>\n";
202 print " (".&text('wsearch_inmod',
203 "<a href='$m->{'dir'}/'>$m->{'desc'}</a>").")";
207 print &highlight_text($text),"<br>\n";
209 print "<font color=#4EBF37>$m->{'desc'} - $what</font><br> <br>\n";
213 # find_cgi_text(®exps, module, re-mode)
214 # Returns the relative URLs of CGIs that matches some regexps, in the given
218 local ($res, $m, $remode) = @_;
219 local $mdir = &module_root_directory($m);
221 foreach my $f (glob("$mdir/*.cgi")) {
224 LINE: while(my $line = <CGI>) {
225 foreach my $r (@$res) {
226 if (!$remode && index($line, $r) >= 0 ||
227 $remode && $line =~ /$r/) {
236 $url =~ s/^\Q$root_directory\E\///;