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 274cadd4f8SNickeau * TODO: Duplicate of {@link Page::isSecondarySlot()} 2837748cd8SNickeau */ 2937748cd8SNickeau public static function isSideBar() 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 5037748cd8SNickeau */ 514cadd4f8SNickeau static function getChildren(string $path): array 5237748cd8SNickeau { 53*4898714fSgerardnico require_once(DOKU_INC . '/inc/search.php'); 5437748cd8SNickeau global $conf; 5537748cd8SNickeau 5637748cd8SNickeau 5737748cd8SNickeau /** 5837748cd8SNickeau * To a relative file system path 5937748cd8SNickeau */ 6037748cd8SNickeau $dokuPath = DokuPath::createPagePathFromPath($path); 61c3437056SNickeau $relativeFileSystemPath = str_replace(":", "/", $dokuPath->getDokuwikiId()); 6237748cd8SNickeau 6337748cd8SNickeau 6437748cd8SNickeau $data = array(); 6537748cd8SNickeau 6637748cd8SNickeau // Options of the callback function search_universal 6737748cd8SNickeau // in the search.php file 6837748cd8SNickeau $search_opts = array( 6937748cd8SNickeau 'depth' => 1, 7037748cd8SNickeau 'pagesonly' => true, 7137748cd8SNickeau 'listfiles' => true, 7237748cd8SNickeau 'listdirs' => true, 7337748cd8SNickeau 'skipacl' => true 7437748cd8SNickeau //'firsthead' => true 7537748cd8SNickeau ); 7637748cd8SNickeau // search_universal is a function in inc/search.php that accepts the $search_opts parameters 7737748cd8SNickeau search($data, // The returned data 7837748cd8SNickeau $conf['datadir'], // The root 7937748cd8SNickeau 'search_universal', // The recursive function (callback) 8037748cd8SNickeau $search_opts, // The options given to the recursive function 8137748cd8SNickeau $relativeFileSystemPath, // The id 8237748cd8SNickeau 1 // Only one level in the tree 8337748cd8SNickeau ); 8437748cd8SNickeau 8537748cd8SNickeau return $data; 8637748cd8SNickeau } 8737748cd8SNickeau 8837748cd8SNickeau /** 89c3437056SNickeau * Return the page index of a namespace or null if it does not exist 9037748cd8SNickeau * ie the index.html 91c3437056SNickeau * @param $namespacePath - in dokuwiki format 92c3437056SNickeau * @return string - the dokuwiki path 93c3437056SNickeau * @deprecated use {@link Page::getHomePageFromNamespace()} instead 9437748cd8SNickeau */ 95c3437056SNickeau public static function getHomePagePath($namespacePath): ?string 9637748cd8SNickeau { 97c3437056SNickeau $homePage = Page::getHomePageFromNamespace($namespacePath); 98c3437056SNickeau if ($homePage->exists()) { 99c3437056SNickeau return $homePage->getAbsolutePath(); 10037748cd8SNickeau } else { 10137748cd8SNickeau return null; 10237748cd8SNickeau } 10337748cd8SNickeau } 10437748cd8SNickeau 10537748cd8SNickeau public static function getChildrenNamespace($nameSpacePath) 10637748cd8SNickeau { 10737748cd8SNickeau require_once(__DIR__ . '/../../../../inc/search.php'); 10837748cd8SNickeau global $conf; 10937748cd8SNickeau 11037748cd8SNickeau $data = array(); 11137748cd8SNickeau 11237748cd8SNickeau // Options of the callback function search_universal 11337748cd8SNickeau // in the search.php file 11437748cd8SNickeau $search_opts = array(); 11537748cd8SNickeau // search_universal is a function in inc/search.php that accepts the $search_opts parameters 11637748cd8SNickeau search_namespaces($data, // The returned data 11737748cd8SNickeau $conf['datadir'], // The root 11837748cd8SNickeau $nameSpacePath, // The directory to search 11937748cd8SNickeau 'd', 12037748cd8SNickeau 1, // Only one level in the tree 12137748cd8SNickeau $search_opts 12237748cd8SNickeau ); 12337748cd8SNickeau 12437748cd8SNickeau return $data; 12537748cd8SNickeau } 12637748cd8SNickeau 12737748cd8SNickeau /** 12837748cd8SNickeau * @param $namespacePath 1294cadd4f8SNickeau * @return Page|null the page path of the parent or null if it does not exist 13037748cd8SNickeau */ 1314cadd4f8SNickeau public static function getParentPagePath($namespacePath): ?Page 13237748cd8SNickeau { 13337748cd8SNickeau 13437748cd8SNickeau /** 13537748cd8SNickeau * Root case 13637748cd8SNickeau */ 13737748cd8SNickeau if ($namespacePath === ":") { 13837748cd8SNickeau return null; 13937748cd8SNickeau } 14037748cd8SNickeau 14137748cd8SNickeau /** 14237748cd8SNickeau * A namespace path does not have a `:` at the end 14337748cd8SNickeau * only for the root 14437748cd8SNickeau */ 14537748cd8SNickeau $pos = strrpos($namespacePath, ':'); 14637748cd8SNickeau if ($pos !== false) { 14737748cd8SNickeau if ($pos == 0) { 14837748cd8SNickeau $parentNamespacePath = ":"; 14937748cd8SNickeau } else { 15037748cd8SNickeau $parentNamespacePath = substr($namespacePath, 0, $pos); 15137748cd8SNickeau } 1524cadd4f8SNickeau return Page::getHomePageFromNamespace($parentNamespacePath); 1534cadd4f8SNickeau 15437748cd8SNickeau } else { 15537748cd8SNickeau return null; 15637748cd8SNickeau } 15737748cd8SNickeau 15837748cd8SNickeau 15937748cd8SNickeau } 16037748cd8SNickeau 16137748cd8SNickeau 16237748cd8SNickeau /** 16337748cd8SNickeau * Find the pages in the tree 164c3437056SNickeau * @param $startPath 165c3437056SNickeau * @param int $depth 16637748cd8SNickeau * @return array 16737748cd8SNickeau */ 168c3437056SNickeau public static function getPages($startPath, int $depth = 0): array 16937748cd8SNickeau { 170c3437056SNickeau 171c3437056SNickeau if ($startPath === null || $startPath === "") { 172c3437056SNickeau throw new \RuntimeException("A start path is mandatory"); 173c3437056SNickeau } 174c3437056SNickeau 175c3437056SNickeau 17637748cd8SNickeau // Run as admin to overcome the fact that 17737748cd8SNickeau // anonymous user cannot set all links and backlinks 17837748cd8SNickeau global $conf; 179c3437056SNickeau $dataDir = $conf['datadir']; 18037748cd8SNickeau 18137748cd8SNickeau $pages = array(); 18237748cd8SNickeau 183c3437056SNickeau // This is a page 184c3437056SNickeau if (page_exists($startPath)) { 185c3437056SNickeau $pages[] = array( 186c3437056SNickeau 'id' => $startPath, 187c3437056SNickeau 'ns' => getNS($startPath), 188c3437056SNickeau 'title' => p_get_first_heading($startPath, false), 189c3437056SNickeau 'size' => filesize(wikiFN($startPath)), 190c3437056SNickeau 'mtime' => filemtime(wikiFN($startPath)), 191c3437056SNickeau 'perm' => 16, 192c3437056SNickeau 'type' => 'f', 193c3437056SNickeau 'level' => 0, 194c3437056SNickeau 'open' => 1, 195c3437056SNickeau ); 196c3437056SNickeau } else { 197c3437056SNickeau 198c3437056SNickeau $startPath = str_replace(':', '/', $startPath); 199c3437056SNickeau 200c3437056SNickeau /** 201c3437056SNickeau * Directory 202c3437056SNickeau */ 20337748cd8SNickeau search( 20437748cd8SNickeau $pages, 205c3437056SNickeau $dataDir, 20637748cd8SNickeau 'search_universal', 20737748cd8SNickeau array( 20837748cd8SNickeau 'depth' => $depth, 20937748cd8SNickeau 'listfiles' => true, 21037748cd8SNickeau 'listdirs' => false, 21137748cd8SNickeau 'pagesonly' => true, 21237748cd8SNickeau 'skipacl' => true, 21337748cd8SNickeau 'firsthead' => false, 21437748cd8SNickeau 'meta' => false, 21537748cd8SNickeau ), 216c3437056SNickeau $startPath 21737748cd8SNickeau ); 21837748cd8SNickeau } 21937748cd8SNickeau return $pages; 22037748cd8SNickeau } 22137748cd8SNickeau 22237748cd8SNickeau} 223