<?PHP /** * This file provides search functions. * * @file * * @author Joshua Ramon Enslin <joshua@jrenslin.de> */ /** * Function for searching in all static pages. * * @param string $searchTerm Search term. * * @return array */ function searchInPages(string $searchTerm):array { $files = scanDirConts(__DIR__ . "/../data/static"); $results = []; foreach ($files as $file) { $curResults = []; $contents = json_decode(file_get_contents(__DIR__ . "/../data/static/$file"), true); if (!$contents['public']) continue; // Don't display non-public files. $curResults['inTitle'] = substr_count($contents['title'], $searchTerm); $curResults['inDescription'] = substr_count($contents['content'], $searchTerm); $curResults['priority'] = $curResults['inTitle'] * 3 + $curResults['inDescription']; if ($curResults['priority'] == 0) continue; $curResults['title'] = $contents['title']; // Sanitize content for snippets. $snippet = preg_replace('/[\[{\(].*[\]}\)]/U', '', strip_tags($contents['content'])); $curResults['snippet'] = createTextSnippet($snippet, 180); $results[$file] = $curResults; } usort($results, function($a, $b) { if ($a['priority'] == $b['priority']) return 0; return ($a['priority'] > $b['priority']) ? -1 : 1; }); return $results; } /** * Function for generating and listing search results. * * @param string $searchTerm Search term. * * @return string */ function displaySearchResults(string $searchTerm):string { $searchResults = searchInPages($searchTerm); $output = ' <ul id="pagesSearchList">'; foreach ($searchResults as $file => $item) { $output .= ' <li> <a href="./?id=' . str_replace(".json", "", $file) . '"><h4>' . $item['title'] . '</h4></a> <p>' . (string)($item['snippet']) . '</p> <dl class="searchMetadataLine"> <dt class="toTranslate" data-content="Hits"></dt> <dd>' . (string)($item['inTitle'] + $item['inDescription']) . '</dd> </dl> </li> '; } $output .= " </ul>"; return $output; } ?>