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