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