'Thanos Massias', 'email' => 'thanos.massias@gmail.com', 'date' => '2007-06-14', 'name' => 'navilevel Plugin', 'desc' => 'Add smart Navigation Capability', 'url' => 'http://www.acsys.gr/plugins/navilevel/', ); } /** * What kind of syntax are we? */ function getType(){ return 'protected'; } /** * What kind of syntax do we allow (optional) */ function getAllowedTypes() { return array('protected'); } /** * What about paragraphs? (optional) */ function getPType(){ return 'block'; } /** * Where to sort in? */ function getSort(){ return 203; } /** * Connect pattern to lexer */ function connectTo($mode) { $this->Lexer->addEntryPattern('(?=.*?)',$mode,'plugin_navilevel'); } function postConnect() { $this->Lexer->addExitPattern('','plugin_navilevel'); } /** * Handle the match */ function handle($match, $state, $pos, &$handler){ switch ($state) { case DOKU_LEXER_ENTER : break; case DOKU_LEXER_MATCHED : break; case DOKU_LEXER_UNMATCHED : break; case DOKU_LEXER_EXIT : break; case DOKU_LEXER_SPECIAL : break; } return array($match, $state); } /** * Create output */ function render($mode, &$renderer, $data) { // You may have to configure $rellevel to suite your site // // $lowlevel = 1; --> sites not based on per-namespace start pages (default) // $lowlevel = 2; --> sites based on per-namespace start pages // $lowlevel = 1; global $ID; global $ullevellast; $linklineID = ':'.$ID; // In case you want the plugin to work correctly within a sidebar add the // following two lines in '/dokuwiki_home/lib/tpl/template_name/main.php': // --------------------- // global $PPID; // $PPID = $ID; // --------------------- global $PPID; if ('X'.$PPID != 'X'){ if ($ID != $PPID){ $linklineID = ':'.$PPID; } } $partsID = explode(':', $linklineID); $countpartsID = count($partsID); $showall = 0; if (($countpartsID == 2) && ($partsID[1] == 'sitemap')){ $showall = 1; } if($mode == 'xhtml'){ switch ($data[1]) { case DOKU_LEXER_ENTER : $renderer->doc .= "\n"; break; case DOKU_LEXER_MATCHED : break; case DOKU_LEXER_UNMATCHED : $content = $data[0]; // clean up the input data // clear any trailing or leading empty lines from the data set $content = preg_replace("/[\r\n]*$/","",$content); $content = preg_replace("/^\s*[\r\n]*/","",$content); // Not sure if PHP handles the DOS \r\n or Mac \r, so being paranoid // and converting them if they exist to \n $content = preg_replace("/\r\n/","\n",$content); $content = preg_replace("/\r/","\n",$content); $result = $this->tree_explode_node($content); $ullevellast = 0; foreach ($result as $input){ $arrinput = explode('|', $input); $linkline = $arrinput[0]; $linkline = trim($linkline); $linktext_before = $arrinput[1]; $linktext_before = trim($linktext_before); $linkname = $arrinput[2]; $linkname = trim($linkname); $linktext_after = $arrinput[3]; $linktext_after = trim($linktext_after); if (strlen($linkline) > 0) { $linkline = cleanID($linkline); if (substr($linkline,0,1) != ':'){ $linkline = ':'.$linkline; } $parts = explode(':', $linkline); $countparts = count($parts); $listlink = 0; // low level links if ($countparts < (2 + $lowlevel)){ $listlink = 1; }else{ // children, yes - grandchildren and beyond, no if ($countparts <= $countpartsID + 1){ $listlink = 1; $tmppathID = ''; $tmppath = ''; $i = 0; foreach ($parts as $part){ if (($i > 0) && ($i < $countparts - 2)){ if ('X'.$partsID[$i] != 'X') { $tmppathID .= ':'.$partsID[$i]; $tmppath .= ':'.$parts[$i]; if ($tmppathID !== $tmppath){ $listlink = 0; } } } $i++; } } } if ($listlink || $showall){ $ullevel = $countparts - 1; if ($ullevel == $ullevellast){ $renderer->doc .= "\n"; } if ($ullevel > $ullevellast){ $renderer->doc .= "\n"; } $renderer->doc .= "\n"; } $ullevellast = $ullevel; $renderer->doc .= "\n".'
  • '; if (strlen($linktext_before) > 0) { $renderer->doc .= $linktext_before.' '; } if (strlen($linkname) > 0) { $renderer->doc .= $renderer->internallink($linkline,$linkname); }else{ $renderer->doc .= $renderer->internallink($linkline); } if (strlen($linktext_after) > 0) { $renderer->doc .= ' '.$linktext_after; } $renderer->doc .= "
    "; }else{ $renderer->doc .= ""; } } } break; case DOKU_LEXER_EXIT : $ullevel = 1; if ($ullevel == $ullevellast){ $renderer->doc .= "\n
  • "; } if ($ullevel > $ullevellast){ $renderer->doc .= "\n"; } $renderer->doc .= "\n"; } $renderer->doc .= "\n"; break; case DOKU_LEXER_SPECIAL : break; } return false; } // unsupported $mode return false; } function tree_explode_node(&$str) { $len = strlen($str) + 1; $inside = false; $word = ''; for ($i = 0; $i < $len; ++$i) { $next = $i+1; if ($str[$i] == "\n") { $out[] = $word; $word = ''; } elseif ($next == $len) { $out[] = $word; $word = ''; } else { $word .= $str[$i]; } } $str = substr($str, $next); $out[] = $word; return $out; } } //Setup VIM: ex: et ts=4 enc=utf-8 : ?>