Re-factor search functions
[webmin.git] / webmin_search.cgi
1 #!/usr/local/bin/perl
2 # Search Webmin modules and help pages and text and config.info
3
4 BEGIN { push(@INC, ".."); };
5 use WebminCore;
6
7 &init_config();
8 do 'webmin-search-lib.pl';
9 &ReadParse();
10
11 $prod = &get_product_name();
12 $ucprod = ucfirst($prod);
13 &ui_print_unbuffered_header(
14         undef, &text('wsearch_title', $ucprod), "", undef, 0, 1);
15
16 # Validate search text
17 $re = $in{'search'};
18 if ($re !~ /\S/) {
19         &error($text{'wsearch_esearch'});
20         }
21 $re =~ s/^\s+//;
22 $re =~ s/\s+$//;
23
24 # Do the search
25 print &text('wsearch_searching', "<i>".&html_escape($re)."</i>"),"\n";
26 @rv = &search_webmin($re, \&print_search_dot);
27 print &text('wsearch_found', scalar(@rv)),"<p>\n";
28
29 # Show in table
30 if (@rv) {
31         print &ui_columns_start(
32                 [ $text{'wsearch_htext'}, $text{'wsearch_htype'},
33                   $text{'wsearch_hmod'}, $text{'wsearch_hcgis'} ], 100);
34         foreach my $r (@rv) {
35                 $hi = &highlight_text($r->{'text'});
36                 if ($r->{'link'}) {
37                         $hi = "<a href='$r->{'link'}'>$hi</a>";
38                         }
39                 @links = ( );
40                 foreach my $c (@{$r->{'cgis'}}) {
41                         ($cmod, $cpage) = split(/\//, $c);
42                         ($cpage, $cargs) = split(/\?/, $cpage);
43                         $ctitle = &cgi_page_title($cmod, $cpage) || $cpage;
44                         if ($r->{'mod'}->{'installed'}) {
45                                 $cargs ||= &cgi_page_args($cmod, $cpage);
46                                 }
47                         else {
48                                 # For modules that aren't installed, linking
49                                 # to a CGI is likely useless
50                                 $cargs ||= "none";
51                                 }
52                         if ($cargs eq "none") {
53                                 push(@links, $ctitle);
54                                 }
55                         else {
56                                 $cargs = "?".$cargs if ($cargs ne '' &&
57                                                         $cargs !~ /^(\/|%2F)/);
58                                 push(@links,
59                                    "<a href='$cmod/$cpage$cargs'>$ctitle</a>");
60                                 }
61                         }
62                 if (@links > 2) {
63                         @links = ( @links[0..1], "..." );
64                         }
65                 print &ui_columns_row([
66                         $hi,
67                         $text{'wsearch_type_'.$r->{'type'}},
68                         "<a href='$r->{'mod'}->{'dir'}/'>$r->{'mod'}->{'desc'}</a>",
69                         &ui_links_row(\@links),
70                         ]);
71                 }
72         print &ui_columns_end();
73         }
74 else {
75         print "<b>",&text('wsearch_enone',
76                 "<tt>".&html_escape($re)."</tt>"),"</b><p>\n";
77         }
78
79 &ui_print_footer();
80
81 # print_search_dot()
82 # Print one dot per second
83 sub print_search_dot
84 {
85 local $now = time();
86 if ($now > $last_print_search_dot) {
87         print ". ";
88         $last_print_search_dot = $now;
89         }
90 }
91