xref: /plugin/combo/ComboStrap/Index.php (revision ea801fd8623a40cbbf46cb40416f7bada79b0eea)
1c3437056SNickeau<?php
2c3437056SNickeau
3c3437056SNickeau
4c3437056SNickeaunamespace ComboStrap;
5c3437056SNickeau
6c3437056SNickeau
7c3437056SNickeauclass Index
8c3437056SNickeau{
9c3437056SNickeau    /**
10c3437056SNickeau     * @var Index
11c3437056SNickeau     */
12c3437056SNickeau    private static $index;
13c3437056SNickeau
14c3437056SNickeau    /**
15c3437056SNickeau     * @var \dokuwiki\Search\Indexer
16c3437056SNickeau     */
17c3437056SNickeau    private $indexer;
18c3437056SNickeau
19c3437056SNickeau
20c3437056SNickeau    /**
21c3437056SNickeau     * Index constructor.
22c3437056SNickeau     */
23c3437056SNickeau    public function __construct()
24c3437056SNickeau    {
25c3437056SNickeau        $this->indexer = idx_get_indexer();
26c3437056SNickeau    }
27c3437056SNickeau
28c3437056SNickeau    public static function getOrCreate(): Index
29c3437056SNickeau    {
30c3437056SNickeau        if (self::$index === null) {
31c3437056SNickeau            self::$index = new Index();
32c3437056SNickeau        }
33c3437056SNickeau        return self::$index;
34c3437056SNickeau    }
35c3437056SNickeau
3604fd306cSNickeau    public function getPagesForMedia(WikiPath $media): array
37c3437056SNickeau    {
3804fd306cSNickeau        $dokuwikiId = $media->getWikiId();
39c3437056SNickeau        return $this->indexer->lookupKey('relation_media', $dokuwikiId);
40c3437056SNickeau    }
41c3437056SNickeau
42c3437056SNickeau    /**
43c3437056SNickeau     * Return a list of page id that have the same last name
44c3437056SNickeau     *
4504fd306cSNickeau     * @param MarkupPath $pageToMatch
4604fd306cSNickeau     * @return MarkupPath[]
47c3437056SNickeau     */
4804fd306cSNickeau    public function getPagesWithSameLastName(MarkupPath $pageToMatch): array
49c3437056SNickeau    {
50c3437056SNickeau        /**
51c3437056SNickeau         * * A shortcut to:
52c3437056SNickeau         * ```
53c3437056SNickeau         * $pagesWithSameName = ft_pageLookup($pageName);
54c3437056SNickeau         * ```
55c3437056SNickeau         * where {@link ft_pageLookup()}
56c3437056SNickeau         */
57c3437056SNickeau
58*ea801fd8Sgerardnico        try {
59*ea801fd8Sgerardnico            $lastNameToFind = $pageToMatch->getPathObject()->getLastNameWithoutExtension();
60*ea801fd8Sgerardnico            $wikiIdToFind = $pageToMatch->getWikiId();
61*ea801fd8Sgerardnico        } catch (ExceptionNotFound|ExceptionBadArgument $e) {
62*ea801fd8Sgerardnico            return [];
63*ea801fd8Sgerardnico        }
64*ea801fd8Sgerardnico
65c3437056SNickeau        // There is two much pages with the start name
66*ea801fd8Sgerardnico        if ($lastNameToFind === Site::getIndexPageName()) {
67c3437056SNickeau            return [];
68c3437056SNickeau        }
69c3437056SNickeau
7004fd306cSNickeau        $pageIdList = $this->indexer->getPages();
71c3437056SNickeau
7204fd306cSNickeau        $matchedPages = [];
7304fd306cSNickeau        foreach ($pageIdList as $pageId) {
74*ea801fd8Sgerardnico            if ($wikiIdToFind === $pageId) {
75*ea801fd8Sgerardnico                // don't return the page to find in the result
76c3437056SNickeau                continue;
77c3437056SNickeau            }
78*ea801fd8Sgerardnico            $actualPage = WikiPath::createMarkupPathFromId($pageId);
79*ea801fd8Sgerardnico            try {
80*ea801fd8Sgerardnico                if ($actualPage->getLastNameWithoutExtension() === $lastNameToFind) {
81*ea801fd8Sgerardnico                    $matchedPages[] = MarkupPath::createPageFromPathObject($actualPage);
82*ea801fd8Sgerardnico                }
83*ea801fd8Sgerardnico            } catch (ExceptionNotFound $e) {
84*ea801fd8Sgerardnico                // root, should not happen
85c3437056SNickeau            }
86c3437056SNickeau        }
8704fd306cSNickeau        return $matchedPages;
88c3437056SNickeau
89c3437056SNickeau    }
90c3437056SNickeau
9104fd306cSNickeau    public function deletePage(MarkupPath $page)
92c3437056SNickeau    {
93c3437056SNickeau
9404fd306cSNickeau        $this->indexer->deletePage($page->getWikiId());
95c3437056SNickeau
96c3437056SNickeau    }
97c3437056SNickeau}
98