*/ // must be run within Dokuwiki if (!defined('DOKU_INC')) die(); class syntax_plugin_nsindex extends DokuWiki_Syntax_Plugin { /** * @return string Syntax mode type */ public function getType() { return 'substition'; } /** * @return string Paragraph type */ public function getPType() { return 'normal'; } /** * @return int Sort order - Low numbers go before high numbers */ public function getSort() { return 200; } /** * Connect lookup pattern to lexer. * * @param string $mode Parser mode */ public function connectTo($mode) { $this->Lexer->addSpecialPattern('{{nsindex[^}]*}}',$mode,'plugin_nsindex'); } /** * Handle matches of the nsindex syntax * * @param string $match The match of the syntax * @param int $state The state of the handler * @param int $pos The position in the document * @param Doku_Handler $handler The handler * @return array Data for the renderer */ public function handle($match, $state, $pos, Doku_Handler $handler) { $data = $this->_get_defaults(); /** * parse options and override defaults */ $match = explode(',',trim(substr($match,9,-2))); foreach ($match as $m) { if (strstr($m, '=')) { list($opt,$val) = explode('=', $m); } else { $opt = $m; $val = true; } if (array_key_exists($m, $data)) { $data[$opt] = $val; } } return $data; } /** * Render xhtml output or metadata * * @param string $mode Renderer mode (supported modes: xhtml) * @param Doku_Renderer $renderer The renderer * @param array $data The data from the handler() function * @return bool If rendering was successful. */ public function render($mode, Doku_Renderer $renderer, $data) { if($mode != 'xhtml') return false; global $conf; // Never cache the result to get fresh info $renderer->info['cache'] = false; // Do not add section edit buttons unter group headers $oldmaxecl = $conf['maxseclevel']; $conf['maxseclevel'] = 0; // To see the TOC, to not use ~~NOTOC~~ if ($renderer->info['toc']) { $oldmaxtoc = $conf['maxtoclevel']; $conf['maxtoclevel'] = 3; } else { $oldmaxtoc = -1; } // Build the list $data = $this->_build_index($data, $renderer); // Translate text to HTML for DW page $data = p_render('xhtml', p_get_instructions($data), $_dummy); // Append to current page $renderer->doc .= '
' ; $renderer->doc .= $data; $renderer->doc .= '
' ; // restore edit level and TOC $conf['maxseclevel'] = $oldmaxecl; if ($oldmaxtoc == -1) { $conf['maxtoclevel'] = $oldmaxtoc; } return true; } //------------------------------------------------------------------------// /** * Default options for nsindex */ private function _get_defaults() { return array( 'nons' => false, // exclude start-page of namespaces found 'nopages' => false, // exclude all pages found, include only startpage of sub-namespaces 'nogroup' => false, // do not add alpha-index headings in list 'notemplate' => false, // omitt pages with names like 'template' or '__template' or '_template' 'startns' => '.', // where to start lookup (default is current namespace) ); } /** * Build the index from namespace scan */ private function _build_index($opts, &$renderer) { global $conf; global $ID; // get content of namespace (pages and subdirs) if ( ! $opts['startns'] || $opts['startns'] == '.') { $ns = getNS($ID); # current namespace (default) } else { $ns = $opts['startns']; resolve_pageid(getNS($ID), $ns, $exists); $ns = getNS($ns); } $data = array(); $nsdir = str_replace(':','/',$ns); search($data,$conf['datadir'],'search_index',array(),$nsdir,1); // filter and sort the list $sort = array(); foreach ($data as $i=>$item) { if (noNS($item['id']) == $conf['start']) { continue; # ignore index-page of current namespace } // get full wikipath and heading of page if ($item['type'] == 'd') { if ($opts['nons']) { continue; # ignore namespace } $wikipath = $item['id'].':'.$conf['start']; $data[$i]['id'] = $wikipath; # change wikipath in data if ($conf['useheading']) { $title = p_get_first_heading($wikipath); } else { $title = ''; } if ( ! $title) { $title = noNS(getNS($wikipath)); } } else { # page found if ($opts['nopages']) { continue; # ignore pages } $pn = noNS($item['id']); if(($pn == 'template' || $pn == '_template' || $pn == '__template') && $opts['notemplate']) { continue; # ignore template pages } $wikipath = $item['id']; $title = p_get_first_heading($wikipath); if ( ! $title) { $title = $pn; } } // Check for access rights if(auth_quickaclcheck($wikipath) < AUTH_READ) { continue; # no access for this page, omitt from list } // build array for later sort $sortkey = cleanID($title); $sort[$i] = $sortkey; // add metadata $data[$i]['title'] = $title; $data[$i]['sortkey'] = $sortkey; $data[$i]['sortgroup'] = substr($sortkey,0,1); } // sort the indexed pages asort($sort); // build pagesource of list $txt = ''; $current_letter = ''; foreach ($sort as $i=>$sortkey) { $title = $data[$i]['title']; // show alpha-groups if ( ! $opts['nogroup']) { $first = strtoupper(substr($data[$i]['sortkey'],0,1)); if ($first != $current_letter) { $current_letter = $first; $txt .= '===== '.$current_letter.' ====='."\n"; } } $txt .= ' * [['.$data[$i]['id'].']]'."\n"; } return $txt; } } // vim:ts=4:sw=4:et: