excludedNs = $excludedNs; $this->customTitle = $customTitle; $this->customTitleAllowListMetadata = $customTitleAllowListMetadata; $this->sortByMetadata = $sortByMetadata; $this->excludeSelfPage = $excludeSelfPage; } function isFileWanted($file, $useTitle){ global $ID; return ($file['type'] != 'd') && parent::isFileWanted($file, $useTitle) && $this->passSubNsfilterInRecursiveMode($file) && (!$this->excludeSelfPage || $ID !== $file['id']); } function prepareFileTitle(&$file){ // Nothing to do: for pages the title is already set } private function passSubNsfilterInRecursiveMode($file){ $subNss = explode(':', $file['id']); if ( count($subNss) < 2 ){ //It means we're not in recursive mode return true; } for ($i = 0; $i < count($subNss) - 1; $i++) { if (in_array($subNss[$i], $this->excludedNs)) { return false; } } return true; } function prepareFile(&$page){ $page['nameToDisplay'] = $this->buildNameToDisplay($page); $page['sort'] = $this->buildSortAttribute($page['nameToDisplay'], $page['id'], $page['mtime']); } /** * Get the a metadata value from a certain path. * * @param $metadata - The metadata object of a page. More details on https://www.dokuwiki.org/devel:metadata * @param $path - The path. * Examples: * date.created * contributor.0 * * @return mixed - The metadata value from a certain path. */ private function getMetadataFromPath($metadata, $path) { return array_reduce( explode('.', $path), function ($object, $property) { return is_numeric($property) ? $object[$property] : $object[$property]; }, $metadata ); } private function isPathInMetadataAllowList($path) { $metadataAllowList = explode(',', preg_replace('/\s+/', '', $this->customTitleAllowListMetadata)); return in_array($path, $metadataAllowList); } /** * Get the page custom title from a template. * * @param $customTitle - The custom tile template. * Examples: * {title} ({data.created} by {user}) * @param $metadata - The metadata object of a page. More details on https://www.dokuwiki.org/devel:metadata * * @return string - the custom title */ private function getCustomTitleFromTemplate($customTitle, $metadata) { return preg_replace_callback( '/{(.*?)}/', function ($matches) use($metadata) { $path = $matches[1]; if ($this->isPathInMetadataAllowList($path)) { return $this->getMetadataFromPath($metadata, $path); } else { return $path; } }, $customTitle ); } private function buildNameToDisplay($page){ $title = $page['title']; $pageId = $page['id']; if ($this->customTitle !== null) { $meta = p_get_metadata($pageId); return $this->getCustomTitleFromTemplate($this->customTitle, $meta); } if($this->useIdAndTitle && $title !== null ){ return noNS($pageId) . " - " . $title; } if(!$this->useTitle || $title === null) { return noNS($pageId); } return $title; } private function buildSortAttribute($nameToDisplay, $pageId, $mtime){ if ($this->sortByMetadata !== null) { $meta = p_get_metadata($pageId); return $this->getMetadataFromPath($meta, $this->sortByMetadata); } else if($this->sortPageById) { return noNS($pageId); } else if ( $this->sortPageByDate) { return $mtime; } else if ($this->sortByCreationDate) { $meta = p_get_metadata($pageId); return $meta['date']['created']; } else { return $nameToDisplay; } } }