search: distinct url suggestion results
authorMischa POSLAWSKY <perl@shiar.org>
Fri, 26 Oct 2018 18:42:47 +0000 (20:42 +0200)
committerMischa POSLAWSKY <perl@shiar.org>
Fri, 26 Oct 2018 19:02:59 +0000 (21:02 +0200)
Option to select either filename suggestion or contents matches,
displayed separately.

404.html
search.php

index 04acb33958c9b7e2baa4bb8a79fd3ec6d952b995..88fef2a7060990ff959a9da1c178cb75898b5ada 100644 (file)
--- a/404.html
+++ b/404.html
@@ -2,6 +2,7 @@
 
 <p>De gevraagde pagina <em>[[url]]</em> bestaat niet.</p>
 
-<p>Misschien is de gewenste inhoud hier te vinden:</p>
+<p>Misschien bedoelde je [[search suggest=1 limit=1]],
+       of is het gewenste resultaat te vinden door op inhoud te <a href="/search">zoeken</a>:</p>
 
-[[search]]
+[[search limit=10]]
index 2f093c9d8dacf517747298a11d686be5a8895873..0b156078e81efee776c3a384c4a4a0b8822995a9 100644 (file)
@@ -5,31 +5,27 @@ $query = @$_REQUEST['q'] ?: $Args ?: $Page;
 
 if (!trim($query, '/')) return;
 
-$cmd = "git grep -li -- ".escapeshellarg($query).$path;
-exec($cmd, $results);
-if (count($results) > $limit) {
-       shuffle($results);
-       array_splice($results, $limit);
-}
+if (!empty($Place['suggest'])) {
+       $cmd = "git ls-files -- $path";
+       exec($cmd, $ls);
+       if (!$ls) {
+               die("fout bij zoeken van bestanden");
+       }
 
-$cmd = "git ls-files -- $path";
-exec($cmd, $ls);
-if ($ls) {
        # 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);
-
-       # prepend best match, replace unless duplicate
-       array_unshift($results, key($ls));
-       $results = array_unique($results);
-       array_splice($results, $limit);
+       $results = array_keys($ls);
 }
-
-elseif (!$results) {
-       $results = ['index.html'];
+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'])) {
@@ -40,9 +36,23 @@ if (isset($Place['verbose'])) {
 }
 
 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";