debug = true; $this->start = $conf['start']; $this->useheading = $conf['useheading']; $this->datadir = $conf['datadir']; // $this->style = $this->getConf("style"); } /** * return some info */ function getInfo() { } /** * What kind of syntax are we? */ function getType() { return "substition"; } /** * Just before build in links */ function getSort() { return 299; } /** * Register the ~~SUBPAGES~~ verb */ function connectTo($mode) { $this->Lexer->addSpecialPattern('~~SUBPAGES~~', $mode, 'plugin_subpages'); } /** * Handle the match */ function handle($match, $state, $pos, Doku_Handler $handler) { return preg_replace("%~~SUBPAGES~~%", "\\2", $match); } /** * Create output */ function render($mode, Doku_Renderer $renderer, $data) { $this->rdr =& $renderer; $this->rdrMode = $mode; $data = $this->_listSubpages($data); $this->_put($data); return true; } /** * Put a debug message on screen... */ function _showDebugMsg($msg) { if(!$this->debug) return; if(is_array($msg)) { foreach($msg as $index => $m) { $this->_showDebugMsg("Array [$index]: ".$m); } return; } echo DOKU_LF."SUBPAGES_PLUGIN: ".hsc($msg)."
"; } /** * Write data to the output stream */ function _put($data) { if($data == NULL || $data == '') return; switch($this->rdrMode) { case 'xhtml': $this->rdr->doc .= $data; break; case 'latex': $this->rdr->put($data); break; } } /** * Get the namespace of the parent directory * (always prefixed and postfixed with a colon, root is ':') */ function _getParentNS($id) { // global $ID ; $curNS = getNS($id); if($curNS == '') return ':'; if(substr($curNS, 0, 1) != ':') { $curNS = ':'.$curNS; } return $curNS.':'; } /** * Create a fully qualified namespace from the specified one. * The second parameter must be true when the given namespace * is never a page id. In that case, the returned namespace * always ends with a colon. */ function _getFqidOfNS($ns, $mustBeNSnoPage) { global $ID; if(substr($ns, 0, 2) == '.:') { $ns = ':'.getNS($ID).substr($ns, 1); } elseif(substr($ns, 0, 3) == '..:') { $ns = $this->_getParentNS($ID).substr($ns, 3); } elseif($ns == '..') { $ns = $this->_getParentNS($ID); } elseif(substr($ns, 0, 1) == ':') { } elseif($ns == '.' || $ns == '*') { $ns = ':'.getNS($ID); } else { $ns = ':'.getNS($ID).':'.$ns; } if($mustBeNSnoPage && substr($ns, -1) <> ':') $ns .= ':'; return $ns; } /** * Convert namespace to its path */ function _getPathOfNS($ns) { if($ns == ':' || $ns == '') return $this->datadir; $ns = trim($ns, ':'); $path = $this->datadir.'/'.utf8_encodeFN(str_replace(':', '/', $ns)); return $path; } /** * Get title of page */ function _getPageTitle($fqid) { if ($this->useheading == 1) { $p = p_get_first_heading($fqid); } if(!empty($p)) return $p; $p = noNS($fqid); if ($p == $this->start || $p == false) { $p = noNS(getNS($fqid)); if ($p == false) { return $this->start; } } return $p; } /** * Receive the search result and add it to pages-array */ function _searchCallback(&$data, $base, $file, $type, $level, $opts) { $this->_showDebugMsg('Entering '.__FUNCTION__); global $ID; if ($type == 'd') { // subdirectory $chkfile = $file.'/'.$this->start.'.txt'; $pgid = pathID($chkfile); $fqid = $opts['ns'].$pgid; if (auth_quickaclcheck($pgid) > AUTH_NONE) { $data['title'] = $this->_getPageTitle($fqid); $data['linkid'] = $fqid; $data['type'] = $type; $data['level'] = $level; } else return false; // no access } else { // page in current directory $pgid = pathID($file); $fqid = $opts['ns'].$pgid; if ($fqid != ':'.$ID) { if (auth_quickaclcheck($pgid) > AUTH_NONE) { $data['title'] = $this->_getPageTitle($fqid); $data['linkid'] = $fqid; $data['type'] = $type; $data['level'] = $level; } else return false; // no access } else return false; // don't display current page } array_push($this->pages, $data); $this->_showDebugMsg('Leaving '.__FUNCTION__); } /** * Search all pages below the current one */ function _listSubpages($data) { $this->_showDebugMsg('Entering '.__FUNCTION__); $ns = '.'; $ns = $this->_getFqidOfNS($ns, true); $path = $this->_getPathOfNS($ns); // // Search the directory $dir, only if the pages array // is empty, since we can pass here several times (xhtml, latex). // $this->_showDebugMsg("Namespace is $ns"); $this->_showDebugMsg("Search dir is $path"); if (count($this->pages) == 0) { // https://xref.dokuwiki.org/reference/dokuwiki/////nav.html?inc/Search/index.html $dummy = array(); search($dummy, $path, array($this, '_searchCallback'), array('ns' => $ns),'',1,'natural'); //echo highlight_string(print_r($this->pages, true)); //asort($this->pages); sort($this->pages); //echo highlight_string(print_r($this->pages, true)); } $count = count($this->pages); //$this->_showDebugMsg("Found ".$count." pages!"); //foreach ($this->pages as $page) { // $this->_showDebugMsg($page); //} if (count($this->pages) > 0) { $ret = ''; } else $ret = ''; $this->_showDebugMsg('Leaving '.__FUNCTION__); return $ret; } } // syntax_plugin_subpages