xref: /plugin/combo/ComboStrap/FetcherPageSearch.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
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