search: dedicated page with query form
[minimedit.git] / search.php
1 <?php
2 $limit = @$Place['limit'] ?: 10;
3 $path = ' '.escapeshellarg('*.html');
4 $query = @$_REQUEST['q'] ?: $Args ?: $Page;
5
6 if (!trim($query, '/')) return;
7
8 $cmd = "git grep -li -- ".escapeshellarg($query).$path;
9 exec($cmd, $results);
10 if (count($results) > $limit) {
11         shuffle($results);
12         array_splice($results, $limit);
13 }
14
15 $cmd = "git ls-files -- $path";
16 exec($cmd, $ls);
17 if ($ls) {
18         # order files by similarity to query
19         $ls = array_combine($ls, array_map(function ($row) use ($query) {
20                 $row = preg_replace('{(?:^|/)index\.html$}', '', $row);
21                 return similar_text($row, $query) - strlen($row) / 8;
22         }, $ls));
23         arsort($ls);
24
25         # prepend best match, replace unless duplicate
26         array_unshift($results, key($ls));
27         $results = array_unique($results);
28         array_splice($results, $limit);
29 }
30
31 elseif (!$results) {
32         $results = ['index.html'];
33 }
34
35 if (isset($Place['verbose'])) {
36         printf("<p>%s gevonden voor <q>%s</q>:</p>\n",
37                 $results ? count($results).' resultaten' : 'Niets',
38                 htmlspecialchars($query)
39         );
40 }
41
42 require_once('nieuws.inc.php');
43 print '<ul>';
44 foreach ($results as $result) {
45         $page = new ArchiveArticle($result);
46         printf('<li><a href="/%s">%s</a></li>'."\n", $page->link, $page->name);
47 }
48 print "</ul>\n";