nieuws/feed: include domain part in article link
[minimedit.git] / search.php
index e1da846057329535512477e3148d85b9da6c554e..0b156078e81efee776c3a384c4a4a0b8822995a9 100644 (file)
@@ -1,17 +1,58 @@
 <?php
+$limit = @$Place['limit'] ?: 10;
 $path = ' '.escapeshellarg('*.html');
-$cmd = "git grep -li -- ".escapeshellarg($Page).$path;
-$cmd .= ' |sort -R |head -n 10'; # random selection
-exec($cmd, $results);
+$query = @$_REQUEST['q'] ?: $Args ?: $Page;
 
-if (!$results) {
-       $results = ['index.html'];
+if (!trim($query, '/')) return;
+
+if (!empty($Place['suggest'])) {
+       $cmd = "git ls-files -- $path";
+       exec($cmd, $ls);
+       if (!$ls) {
+               die("fout bij zoeken van bestanden");
+       }
+
+       # order files by similarity to query
+       $ls = array_combine($ls, array_map(function ($row) use ($query) {
+               $row = preg_replace('{(?:^|/)index\.html$}', '', $row);
+               return similar_text($row, $query) - strlen($row) / 8;
+       }, $ls));
+       arsort($ls);
+       $results = array_keys($ls);
+}
+else {
+       $cmd = "git grep -li -- ".escapeshellarg($query).$path;
+       exec($cmd, $results);
+       if (count($results) > $limit) {
+               shuffle($results); // avoid alphabetical top set
+       }
+}
+
+if (isset($Place['verbose'])) {
+       printf("<p>%s gevonden voor <q>%s</q>:</p>\n",
+               $results ? count($results).' resultaten' : 'Niets',
+               htmlspecialchars($query)
+       );
 }
 
 require_once('nieuws.inc.php');
-print '<ul>';
+
+if (!$results) {
+       print "Niets gevonden.";
+       return;
+}
+if (count($results) > $limit) {
+       array_splice($results, $limit);
+}
+
+if ($limit > 1) {
+       print '<ul>';
+}
 foreach ($results as $result) {
        $page = new ArchiveArticle($result);
-       printf('<li><a href="/%s">%s</a></li>'."\n", $page->link, $page->name);
+       $name = sprintf('<a href="/%s">%s</a>', $page->link, $page->name);
+       print $limit > 1 ? "<li>$name</li>\n" : $name;
+}
+if ($limit > 1) {
+       print "</ul>\n";
 }
-print "</ul>\n";