1*04fd306cSNickeau<?php 2*04fd306cSNickeau 3*04fd306cSNickeaunamespace ComboStrap; 4*04fd306cSNickeau 5*04fd306cSNickeauclass FetcherPageSearch extends IFetcherAbs implements IFetcherString 6*04fd306cSNickeau{ 7*04fd306cSNickeau 8*04fd306cSNickeau const NAME = "page-search"; 9*04fd306cSNickeau 10*04fd306cSNickeau private string $requestedSearchTerms; 11*04fd306cSNickeau 12*04fd306cSNickeau /** 13*04fd306cSNickeau * No cache 14*04fd306cSNickeau * @return string 15*04fd306cSNickeau */ 16*04fd306cSNickeau function getBuster(): string 17*04fd306cSNickeau { 18*04fd306cSNickeau return time(); 19*04fd306cSNickeau } 20*04fd306cSNickeau 21*04fd306cSNickeau public function getMime(): Mime 22*04fd306cSNickeau { 23*04fd306cSNickeau return Mime::getJson(); 24*04fd306cSNickeau } 25*04fd306cSNickeau 26*04fd306cSNickeau public function getFetcherName(): string 27*04fd306cSNickeau { 28*04fd306cSNickeau return self::NAME; 29*04fd306cSNickeau } 30*04fd306cSNickeau 31*04fd306cSNickeau /** 32*04fd306cSNickeau * @throws ExceptionNotFound|ExceptionBadArgument 33*04fd306cSNickeau */ 34*04fd306cSNickeau public function getFetchString(): string 35*04fd306cSNickeau { 36*04fd306cSNickeau $requestedSearchTerms = $this->getRequestedQuery(); 37*04fd306cSNickeau 38*04fd306cSNickeau if (empty($requestedSearchTerms)) return Json::createEmpty()->toPrettyJsonString(); 39*04fd306cSNickeau 40*04fd306cSNickeau 41*04fd306cSNickeau /** 42*04fd306cSNickeau * Ter info: Old call: how dokuwiki call it. 43*04fd306cSNickeau * It's then executing the SEARCH_QUERY_PAGELOOKUP event 44*04fd306cSNickeau * 45*04fd306cSNickeau * $inTitle = useHeading('navigation'); 46*04fd306cSNickeau * $pages = ft_pageLookup($query, true, $inTitle); 47*04fd306cSNickeau */ 48*04fd306cSNickeau $pages = Search::getPages($requestedSearchTerms); 49*04fd306cSNickeau $maxElements = 50; 50*04fd306cSNickeau if (count($pages) > $maxElements) { 51*04fd306cSNickeau array_splice($pages, 0, $maxElements); 52*04fd306cSNickeau } 53*04fd306cSNickeau 54*04fd306cSNickeau $data = []; 55*04fd306cSNickeau foreach ($pages as $page) { 56*04fd306cSNickeau if (!$page->exists()) { 57*04fd306cSNickeau $page->getDatabasePage()->delete(); 58*04fd306cSNickeau LogUtility::log2file("The page ($page) returned from the search query does not exist and was deleted from the database"); 59*04fd306cSNickeau continue; 60*04fd306cSNickeau } 61*04fd306cSNickeau $linkUtility = LinkMarkup::createFromPageIdOrPath($page->getWikiId()); 62*04fd306cSNickeau try { 63*04fd306cSNickeau $html = $linkUtility->toAttributes()->toHtmlEnterTag("a") . $page->getTitleOrDefault() . "</a>"; 64*04fd306cSNickeau } catch (ExceptionCompile $e) { 65*04fd306cSNickeau $html = "Unable to render the link for the page ($page). Error: {$e->getMessage()}"; 66*04fd306cSNickeau } 67*04fd306cSNickeau $data[] = $html; 68*04fd306cSNickeau } 69*04fd306cSNickeau $count = count($data); 70*04fd306cSNickeau if (!$count) { 71*04fd306cSNickeau return Json::createEmpty()->toPrettyJsonString(); 72*04fd306cSNickeau } 73*04fd306cSNickeau return Json::createFromArray($data)->toPrettyJsonString(); 74*04fd306cSNickeau 75*04fd306cSNickeau } 76*04fd306cSNickeau 77*04fd306cSNickeau /** 78*04fd306cSNickeau * @throws ExceptionNotFound 79*04fd306cSNickeau */ 80*04fd306cSNickeau private function getRequestedQuery(): string 81*04fd306cSNickeau { 82*04fd306cSNickeau if (!isset($this->requestedSearchTerms)) { 83*04fd306cSNickeau throw new ExceptionNotFound("No search terms were requested"); 84*04fd306cSNickeau } 85*04fd306cSNickeau return $this->requestedSearchTerms; 86*04fd306cSNickeau } 87*04fd306cSNickeau 88*04fd306cSNickeau public function buildFromTagAttributes(TagAttributes $tagAttributes): IFetcher 89*04fd306cSNickeau { 90*04fd306cSNickeau $searchTerms = $tagAttributes->getValueAndRemoveIfPresent("q"); 91*04fd306cSNickeau if ($searchTerms !== null) { 92*04fd306cSNickeau $this->requestedSearchTerms = $searchTerms; 93*04fd306cSNickeau } 94*04fd306cSNickeau return parent::buildFromTagAttributes($tagAttributes); 95*04fd306cSNickeau } 96*04fd306cSNickeau 97*04fd306cSNickeau 98*04fd306cSNickeau public function getLabel(): string 99*04fd306cSNickeau { 100*04fd306cSNickeau return self::NAME; 101*04fd306cSNickeau } 102*04fd306cSNickeau} 103