2 # Search Webmin modules and help pages and text and config.info
9 $prod = &get_product_name();
10 $ucprod = ucfirst($prod);
11 &ui_print_header(undef, &text('wsearch_title', $ucprod), "", undef, 0, 1);
15 &error($text{'wsearch_esearch'});
20 # Search module names first
22 @mods = grep { !$_->{'clone'} } &get_available_module_infos();
24 if ($m->{'desc'} =~ /\Q$re\E/i || $m->{'dir'} =~ /\Q$re\E/i) {
27 "<a href='$m->{'dir'}/'>$m->{'desc'}</a>",
28 $text{'wsearch_mtitle'},
35 # Then do module configs
37 %access = &get_module_acl(undef, $m);
38 next if ($access{'noconfig'});
39 $file = $prod eq 'webmin' ? "$m->{'dir'}/config.info"
40 : "$m->{'dir'}/uconfig.info";
43 &read_file($file, \%info, \@info_order);
44 foreach $o (@lang_order_list) {
45 &read_file("$file.$o", \%info);
48 foreach $c (@info_order) {
49 @p = split(/,/, $info{$c});
53 if ($p[0] =~ /\Q$re\E/i) {
56 "<a href='config.cgi?module=$m->{'dir'}&".
57 "section=".&urlize($section)."#$c'>$p[0]</a>",
58 $text{'wsearch_config_'.$prod},
67 %lang_order_list = map { $_, 1 } @lang_order_list;
69 $helpdir = &module_root_directory($m->{'dir'})."/help";
71 opendir(DIR, $helpdir);
72 foreach $f (sort { length($b) <=> length($a) } readdir(DIR)) {
73 # Work out if we should grep this help page - don't do the same
74 # page twice for different languages
76 if ($f =~ /^(\S+)\.([^\.]+)\.html$/) {
77 ($page, $lang) = ($1, $2);
78 if ($lang_order_list{$lang} && !$donepage{$page}++) {
82 elsif ($f =~ /^(\S+)\.html$/) {
84 if (!$donepage{$page}++) {
91 $data = &read_file_contents("$helpdir/$f");
92 if ($data =~ /<header>([^<]*)<\/header>/) {
99 $data =~ s/<p>/\n\n/gi;
100 $data =~ s/<br>/\n/gi;
101 $data =~ s/<[^>]+>//g;
102 if ($data =~ /\Q$re\E/) {
105 &hlink($title, $page, $m->{'dir'}),
106 $text{'wsearch_help'},
116 # Then do text strings
117 MODULE: foreach $m (@mods) {
118 %mtext = &load_language($m->{'dir'});
119 foreach $k (keys %mtext) {
120 if ($mtext{$k} =~ /\Q$re\E/i) {
123 "<a href='$m->{'dir'}/'>$m->{'desc'}</a>",
124 $text{'wsearch_text'},
134 print "<b>",&text('wsearch_enone', "<tt>$re</tt>"),"</b><p>\n";
139 # Returns text with the search term bolded, and truncated to 60 characters
142 local ($str, $len) = @_;
144 local $hlen = $len / 2;
145 if ($str =~ /(.*)(\Q$re\E)(.*)/i) {
146 local ($before, $match, $after) = ($1, $2, $3);
147 if (length($before) > $hlen) {
148 $before = "...".substr($before, length($before)-$hlen);
150 if (length($after) > $hlen) {
151 $after = substr($after, 0, $hlen)."...";
153 $str = $before."<b>".$match."</b>".$after;
160 local ($m, $link, $what, $text, $module_link) = @_;
161 print "<font size=+1>$link</font>\n";
163 print " (".&text('wsearch_inmod',
164 "<a href='$m->{'dir'}/'>$m->{'desc'}</a>").")";
168 print &highlight_text($text),"<br>\n";
170 print "<font color=#4EBF37>$m->{'desc'} - $what</font><br> <br>\n";