xref: /template/strap/ComboStrap/FsWikiUtility.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
137748cd8SNickeau<?php
237748cd8SNickeau/**
337748cd8SNickeau * Copyright (c) 2020. ComboStrap, Inc. and its affiliates. All Rights Reserved.
437748cd8SNickeau *
537748cd8SNickeau * This source code is licensed under the GPL license found in the
637748cd8SNickeau * COPYING  file in the root directory of this source tree.
737748cd8SNickeau *
837748cd8SNickeau * @license  GPL 3 (https://www.gnu.org/licenses/gpl-3.0.en.html)
937748cd8SNickeau * @author   ComboStrap <support@combostrap.com>
1037748cd8SNickeau *
1137748cd8SNickeau */
1237748cd8SNickeau
1337748cd8SNickeaunamespace ComboStrap;
1437748cd8SNickeau
1537748cd8SNickeau/**
1637748cd8SNickeau * Class PageUtility
1737748cd8SNickeau * @package ComboStrap
1837748cd8SNickeau * See also {@link pageutils.php}
1937748cd8SNickeau */
2037748cd8SNickeauclass FsWikiUtility
2137748cd8SNickeau{
2237748cd8SNickeau
2337748cd8SNickeau
2437748cd8SNickeau    /**
2537748cd8SNickeau     * Determine if the current page is a sidebar (a bar)
2637748cd8SNickeau     * @return bool
27*04fd306cSNickeau     * TODO: Duplicate of {@link MarkupPath::isSlot()} ?
2837748cd8SNickeau     */
29*04fd306cSNickeau    public static function isSideBar(): bool
3037748cd8SNickeau    {
3137748cd8SNickeau        global $INFO;
3237748cd8SNickeau        global $ID;
3337748cd8SNickeau        $isSidebar = false;
3437748cd8SNickeau        if ($INFO != null) {
3537748cd8SNickeau            $id = $INFO['id'];
3637748cd8SNickeau            if ($ID != $id) {
3737748cd8SNickeau                $isSidebar = TRUE;
3837748cd8SNickeau            }
3937748cd8SNickeau        }
4037748cd8SNickeau        return $isSidebar;
4137748cd8SNickeau    }
4237748cd8SNickeau
4337748cd8SNickeau
4437748cd8SNickeau    /**
4537748cd8SNickeau     * Return all pages and/of sub-namespaces (subdirectory) of a namespace (ie directory)
4637748cd8SNickeau     * Adapted from feed.php
4737748cd8SNickeau     *
4837748cd8SNickeau     * @param string $path The container of the pages
4937748cd8SNickeau     * @return array An array of the pages for the namespace
50*04fd306cSNickeau     * @throws ExceptionBadSyntax if the string is not a namespace path
5137748cd8SNickeau     */
524cadd4f8SNickeau    static function getChildren(string $path): array
5337748cd8SNickeau    {
544898714fSgerardnico        require_once(DOKU_INC . '/inc/search.php');
5537748cd8SNickeau        global $conf;
5637748cd8SNickeau
57*04fd306cSNickeau        WikiPath::checkNamespacePath($path);
5837748cd8SNickeau
5937748cd8SNickeau        /**
60*04fd306cSNickeau         * To the wiki id form
6137748cd8SNickeau         */
62*04fd306cSNickeau        $dokuPath = WikiPath::createMarkupPathFromPath($path);
63*04fd306cSNickeau        // delete the last separator
64*04fd306cSNickeau        $dokuwikiId = substr( $dokuPath->getWikiId(),0,-1);
65*04fd306cSNickeau        $relativeFileSystemPath = str_replace(":", "/", $dokuwikiId);
6637748cd8SNickeau
6737748cd8SNickeau
6837748cd8SNickeau        $data = array();
6937748cd8SNickeau
7037748cd8SNickeau        // Options of the callback function search_universal
7137748cd8SNickeau        // in the search.php file
7237748cd8SNickeau        $search_opts = array(
7337748cd8SNickeau            'depth' => 1,
7437748cd8SNickeau            'pagesonly' => true,
7537748cd8SNickeau            'listfiles' => true,
7637748cd8SNickeau            'listdirs' => true,
7737748cd8SNickeau            'skipacl' => true
7837748cd8SNickeau            //'firsthead' => true
7937748cd8SNickeau        );
8037748cd8SNickeau        // search_universal is a function in inc/search.php that accepts the $search_opts parameters
8137748cd8SNickeau        search($data, // The returned data
8237748cd8SNickeau            $conf['datadir'], // The root
8337748cd8SNickeau            'search_universal', // The recursive function (callback)
8437748cd8SNickeau            $search_opts, // The options given to the recursive function
8537748cd8SNickeau            $relativeFileSystemPath, // The id
8637748cd8SNickeau            1 // Only one level in the tree
8737748cd8SNickeau        );
8837748cd8SNickeau
8937748cd8SNickeau        return $data;
9037748cd8SNickeau    }
9137748cd8SNickeau
9237748cd8SNickeau    /**
93c3437056SNickeau     * Return the page index of a namespace or null if it does not exist
9437748cd8SNickeau     * ie the index.html
95c3437056SNickeau     * @param $namespacePath - in dokuwiki format
96c3437056SNickeau     * @return string - the dokuwiki path
97*04fd306cSNickeau     * @deprecated use {@link MarkupPath::getIndexPageFromNamespace()} instead
9837748cd8SNickeau     */
99c3437056SNickeau    public static function getHomePagePath($namespacePath): ?string
10037748cd8SNickeau    {
101*04fd306cSNickeau        $homePage = MarkupPath::getIndexPageFromNamespace($namespacePath);
102c3437056SNickeau        if ($homePage->exists()) {
103c3437056SNickeau            return $homePage->getAbsolutePath();
10437748cd8SNickeau        } else {
10537748cd8SNickeau            return null;
10637748cd8SNickeau        }
10737748cd8SNickeau    }
10837748cd8SNickeau
10937748cd8SNickeau    public static function getChildrenNamespace($nameSpacePath)
11037748cd8SNickeau    {
11137748cd8SNickeau        require_once(__DIR__ . '/../../../../inc/search.php');
11237748cd8SNickeau        global $conf;
11337748cd8SNickeau
11437748cd8SNickeau        $data = array();
11537748cd8SNickeau
11637748cd8SNickeau        // Options of the callback function search_universal
11737748cd8SNickeau        // in the search.php file
11837748cd8SNickeau        $search_opts = array();
11937748cd8SNickeau        // search_universal is a function in inc/search.php that accepts the $search_opts parameters
12037748cd8SNickeau        search_namespaces($data, // The returned data
12137748cd8SNickeau            $conf['datadir'], // The root
12237748cd8SNickeau            $nameSpacePath, // The directory to search
12337748cd8SNickeau            'd',
12437748cd8SNickeau            1, // Only one level in the tree
12537748cd8SNickeau            $search_opts
12637748cd8SNickeau        );
12737748cd8SNickeau
12837748cd8SNickeau        return $data;
12937748cd8SNickeau    }
13037748cd8SNickeau
13137748cd8SNickeau    /**
13237748cd8SNickeau     * @param $namespacePath
133*04fd306cSNickeau     * @return MarkupPath|null the page path of the parent or null if it does not exist
13437748cd8SNickeau     */
135*04fd306cSNickeau    public static function getParentPagePath($namespacePath): ?MarkupPath
13637748cd8SNickeau    {
13737748cd8SNickeau
13837748cd8SNickeau        /**
13937748cd8SNickeau         * Root case
14037748cd8SNickeau         */
14137748cd8SNickeau        if ($namespacePath === ":") {
14237748cd8SNickeau            return null;
14337748cd8SNickeau        }
14437748cd8SNickeau
14537748cd8SNickeau        /**
14637748cd8SNickeau         * A namespace path does not have a `:` at the end
14737748cd8SNickeau         * only for the root
14837748cd8SNickeau         */
14937748cd8SNickeau        $pos = strrpos($namespacePath, ':');
15037748cd8SNickeau        if ($pos !== false) {
15137748cd8SNickeau            if ($pos == 0) {
15237748cd8SNickeau                $parentNamespacePath = ":";
15337748cd8SNickeau            } else {
15437748cd8SNickeau                $parentNamespacePath = substr($namespacePath, 0, $pos);
15537748cd8SNickeau            }
156*04fd306cSNickeau            return MarkupPath::getIndexPageFromNamespace($parentNamespacePath);
1574cadd4f8SNickeau
15837748cd8SNickeau        } else {
15937748cd8SNickeau            return null;
16037748cd8SNickeau        }
16137748cd8SNickeau
16237748cd8SNickeau
16337748cd8SNickeau    }
16437748cd8SNickeau
16537748cd8SNickeau
16637748cd8SNickeau    /**
16737748cd8SNickeau     * Find the pages in the tree
168c3437056SNickeau     * @param $startPath
169c3437056SNickeau     * @param int $depth
17037748cd8SNickeau     * @return array
17137748cd8SNickeau     */
172c3437056SNickeau    public static function getPages($startPath, int $depth = 0): array
17337748cd8SNickeau    {
174c3437056SNickeau
175c3437056SNickeau        if ($startPath === null || $startPath === "") {
176c3437056SNickeau            throw new \RuntimeException("A start path is mandatory");
177c3437056SNickeau        }
178c3437056SNickeau
179c3437056SNickeau
18037748cd8SNickeau        // Run as admin to overcome the fact that
18137748cd8SNickeau        // anonymous user cannot set all links and backlinks
18237748cd8SNickeau        global $conf;
183c3437056SNickeau        $dataDir = $conf['datadir'];
18437748cd8SNickeau
18537748cd8SNickeau        $pages = array();
18637748cd8SNickeau
187c3437056SNickeau        // This is a page
188c3437056SNickeau        if (page_exists($startPath)) {
189c3437056SNickeau            $pages[] = array(
190c3437056SNickeau                'id' => $startPath,
191c3437056SNickeau                'ns' => getNS($startPath),
192c3437056SNickeau                'title' => p_get_first_heading($startPath, false),
193c3437056SNickeau                'size' => filesize(wikiFN($startPath)),
194c3437056SNickeau                'mtime' => filemtime(wikiFN($startPath)),
195c3437056SNickeau                'perm' => 16,
196c3437056SNickeau                'type' => 'f',
197c3437056SNickeau                'level' => 0,
198c3437056SNickeau                'open' => 1,
199c3437056SNickeau            );
200c3437056SNickeau        } else {
201c3437056SNickeau
202c3437056SNickeau            $startPath = str_replace(':', '/', $startPath);
203c3437056SNickeau
204c3437056SNickeau            /**
205c3437056SNickeau             * Directory
206c3437056SNickeau             */
20737748cd8SNickeau            search(
20837748cd8SNickeau                $pages,
209c3437056SNickeau                $dataDir,
21037748cd8SNickeau                'search_universal',
21137748cd8SNickeau                array(
21237748cd8SNickeau                    'depth' => $depth,
21337748cd8SNickeau                    'listfiles' => true,
21437748cd8SNickeau                    'listdirs' => false,
21537748cd8SNickeau                    'pagesonly' => true,
21637748cd8SNickeau                    'skipacl' => true,
21737748cd8SNickeau                    'firsthead' => false,
21837748cd8SNickeau                    'meta' => false,
21937748cd8SNickeau                ),
220c3437056SNickeau                $startPath
22137748cd8SNickeau            );
22237748cd8SNickeau        }
22337748cd8SNickeau        return $pages;
22437748cd8SNickeau    }
22537748cd8SNickeau
22637748cd8SNickeau}
227