*/
// must be run within DokuWiki
if (!defined('DOKU_INC')) die();
if (!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN', DOKU_INC . 'lib/plugins/');
require_once DOKU_PLUGIN . 'syntax.php';
require_once __DIR__ . DIRECTORY_SEPARATOR . '../packagist/vendor/autoload.php';
use enko\dokuwiki\objectrepresentation\DokuWikiIterator;
use enko\dokuwiki\objectrepresentation\DokuWikiNode;
use enko\dokuwiki\objectrepresentation\DokuWikiNameSpace;
use enko\dokuwiki\objectrepresentation\DokuWikiPage;
/**
* All DokuWiki plugins to extend the parser/rendering mechanism
* need to inherit from this class
*/
class syntax_plugin_navigation extends DokuWiki_Syntax_Plugin
{
private $maxDepth = 3;
private $depth = 0;
/** @var string A regexp to configure which pages to exclude */
private $exclusion_mask = '';
function __construct()
{
$this->exclusion_mask = $this->getConf('exclusion_mask');
$this->maxDepth = $this->getConf('treedepth');
}
function getInfo()
{
return array('author' => 'Tim Schumacher',
'email' => 'tim@bandenkrieg.hacked.jp',
'date' => '2013-11-12',
'name' => 'Navigation',
'desc' => 'A Navigation that uses the object representation class',
'url' => 'https://bk-dev.hacked.jp/project/view/3/');
}
function getType()
{
return 'substition';
}
function getSort()
{
return 32;
}
function connectTo($mode)
{
$this->Lexer->addSpecialPattern('{{indexmenu_n>.+?}}', $mode, 'plugin_navigation');
$this->Lexer->addSpecialPattern('\[Navigation\]', $mode, 'plugin_navigation');
}
function handle($match, $state, $pos, &$handler)
{
return array($match, $state, $pos);
}
function render($mode, &$renderer, $data)
{
if (preg_match('/{{indexmenu_n>(\d+)}}/', $data[0], $matches)) {
global $ACT, $INFO;
if ($INFO['isadmin'] && $ACT == 'show') {
ptln('
');
ptln('Sortorder for this node: ' . $matches[1]);
ptln('
';
}
}
// $data is what the function handle return'ed.
if ($mode == 'xhtml') {
$renderer->doc .= $content;
return true;
}
return false;
}
private function RenderNodes(DokuWikiNameSpace $node)
{
global $INFO,$conf;
$this->depth++;
$output = '';
foreach ($node->getNodes() as $node) {
/** @var DokuWikiNode $node */
if ($node->getName() == 'start')
continue;
if (preg_match($this->exclusion_mask,$node->getFullID()))
continue;
// check if the translation plugin is active and if so, hide all the translation namespaces
if (!plugin_isdisabled('translation')) {
$translations = $this->getTranslations();
if (in_array($node->getName(),$translations))
continue;
}
$title = (strlen($node->getMetaData('title')) > 0 ? $node->getMetaData('title') : $node->getName());
$access = auth_quickaclcheck($node->getFullID());
if ($node instanceof DokuWikiPage) {
if (($access > 0)) {
$output .= '
' . PHP_EOL;
}
} else if ($node instanceof DokuWikiNameSpace) {
/** @var DokuWikiNameSpace $node */
if (($this->depth <= $this->maxDepth) || (strpos($INFO['id'],$node->getFullID()) === 0)) {
if ($access > 0) {
// lets check if the the namespace has a startpage and if yes link to it
if ($start = $node->hasChild('start')) {
$access = auth_quickaclcheck($start->getFullID());
if ($access > 0) {
$title = '' . (strlen($start->getMetaData('title')) > 0 ? $start->getMetaData('title') : $start->getName()) . '';
}
}
$output .= '
' . $title . '
' . PHP_EOL;
$this->depth--;
}
} else {
// if we have reached the maximum depth, lets at least check if the namespace has a starting page and display this
if ($start = $node->hasChild('start')) {
$access = auth_quickaclcheck($start->getFullID());
if ($access > 0) {
$title = (strlen($start->getMetaData('title')) > 0 ? $start->getMetaData('title') : $start->getName());
$output .= '