2013-11-26 20:57:26 +01:00
|
|
|
<?php
|
|
|
|
/**
|
|
|
|
* Plugin Now: Inserts a timestamp.
|
|
|
|
*
|
|
|
|
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
|
|
|
|
* @author Christopher Smith <chris@jalakai.co.uk>
|
|
|
|
*/
|
|
|
|
|
|
|
|
// must be run within DokuWiki
|
2014-01-24 18:34:46 +01:00
|
|
|
if (!defined('DOKU_INC')) die();
|
2013-11-26 20:57:26 +01:00
|
|
|
|
2014-01-24 18:34:46 +01:00
|
|
|
if (!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN', DOKU_INC . 'lib/plugins/');
|
2013-11-26 20:57:26 +01:00
|
|
|
require_once DOKU_PLUGIN . 'syntax.php';
|
|
|
|
|
2013-12-03 21:04:50 +01:00
|
|
|
// TODO migrate this to composer
|
2014-01-24 18:34:46 +01:00
|
|
|
require_once dirname(__FILE__) . DIRECTORY_SEPARATOR . 'objectrepresentation' . DIRECTORY_SEPARATOR . 'DokuWikiObjectRepresentation.class.php';
|
2013-11-26 20:57:26 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* All DokuWiki plugins to extend the parser/rendering mechanism
|
|
|
|
* need to inherit from this class
|
|
|
|
*/
|
2014-01-24 18:34:46 +01:00
|
|
|
class syntax_plugin_navigation extends DokuWiki_Syntax_Plugin
|
|
|
|
{
|
|
|
|
|
|
|
|
// TODO add a config option for this
|
|
|
|
private $maxDepth = 3;
|
|
|
|
private $depth = 0;
|
|
|
|
|
2014-01-25 09:32:43 +01:00
|
|
|
/** @var string A regexp to configure which pages to exclude */
|
|
|
|
private $exclusion_mask = '/sidebar/';
|
|
|
|
|
2014-01-24 18:34:46 +01:00
|
|
|
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/');
|
2013-12-10 21:24:09 +01:00
|
|
|
}
|
2014-01-24 18:34:46 +01:00
|
|
|
|
|
|
|
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');
|
2013-11-26 21:33:45 +01:00
|
|
|
}
|
2013-11-26 20:57:26 +01:00
|
|
|
|
2014-01-24 18:34:46 +01:00
|
|
|
function handle($match, $state, $pos, &$handler)
|
|
|
|
{
|
|
|
|
return array($match, $state, $pos);
|
2013-11-26 20:57:26 +01:00
|
|
|
}
|
2014-01-24 18:34:46 +01:00
|
|
|
|
|
|
|
function render($mode, &$renderer, $data)
|
|
|
|
{
|
|
|
|
if (preg_match('/{{indexmenu_n>(\d+)}}/', $data[0], $matches)) {
|
|
|
|
global $ACT, $INFO;
|
|
|
|
if ($INFO['isadmin'] && $ACT == 'show') {
|
|
|
|
ptln('<div class="info">');
|
|
|
|
ptln('Sortorder for this node: ' . $matches[1]);
|
|
|
|
ptln('</div>');
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
$iter = new DokuWikiIterator();
|
|
|
|
|
|
|
|
$iter->all(function (DokuWikiNode $node) {
|
|
|
|
if (preg_match('/{{indexmenu_n>(\d+)}}/', $node->getContent(), $matches)) {
|
|
|
|
$node->setMetaData('sortorder', $matches[1]);
|
|
|
|
} else {
|
|
|
|
$node->setMetaData('sortorder', 9999999);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
$iter->all(function (DokuWikiNode $node) {
|
|
|
|
if ($node instanceof DokuWikiNameSpace) {
|
|
|
|
$node->nodes->uasort(function (DokuWikiNode $a, DokuWikiNode $b) {
|
|
|
|
if ($a->getMetaData('sortorder') == $b->getMetaData('sortorder')) {
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
return ($a->getMetaData('sortorder') < $b->getMetaData('sortorder')) ? -1 : 1;
|
|
|
|
});
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
$root = $iter->getRoot();
|
|
|
|
$content = '';
|
|
|
|
if ($root instanceof DokuWikiNameSpace) {
|
|
|
|
$nodes = $root->getNodes();
|
|
|
|
if ($nodes->count() > 0) {
|
|
|
|
$content .= '<ul>';
|
|
|
|
$content .= $this->RenderNodes($root);
|
|
|
|
$content .= '</ul>';
|
|
|
|
}
|
2013-12-03 21:03:10 +01:00
|
|
|
}
|
|
|
|
|
2014-01-24 18:34:46 +01:00
|
|
|
// $data is what the function handle return'ed.
|
|
|
|
if ($mode == 'xhtml') {
|
|
|
|
$renderer->doc .= $content;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
private function RenderNodes(DokuWikiNameSpace $node)
|
|
|
|
{
|
|
|
|
$this->depth++;
|
|
|
|
$output = '';
|
|
|
|
foreach ($node->getNodes() as $node) {
|
|
|
|
/** @var DokuWikiNode $node */
|
|
|
|
if ($node->getName() == 'start')
|
|
|
|
continue;
|
2014-01-25 11:55:03 +01:00
|
|
|
if (preg_match($this->exclusion_mask,$node->getFullID()))
|
|
|
|
continue;
|
2014-01-24 18:34:46 +01:00
|
|
|
$title = (strlen($node->getMetaData('title')) > 0 ? $node->getMetaData('title') : $node->getName());
|
|
|
|
$access = auth_quickaclcheck($node->getFullID());
|
|
|
|
if ($node instanceof DokuWikiPage) {
|
2014-01-25 11:55:03 +01:00
|
|
|
if (($access > 0)) {
|
2014-01-24 18:34:46 +01:00
|
|
|
$output .= '<li><a href="' . wl($node->getFullID()) . '">' . $title . '</a></li>' . PHP_EOL;
|
|
|
|
}
|
|
|
|
|
|
|
|
} else if ($node instanceof DokuWikiNameSpace) {
|
|
|
|
/** @var DokuWikiNameSpace $node */
|
|
|
|
if ($this->depth <= $this->maxDepth) {
|
|
|
|
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) {
|
2014-01-25 11:52:28 +01:00
|
|
|
$title = '<a href="' . wl($start->getFullID()) . '">' . (strlen($start->getMetaData('title')) > 0 ? $start->getMetaData('title') : $start->getName()) . '</a>';
|
2014-01-24 18:34:46 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
$output .= '<li>' . $title . '<ul>' . $this->RenderNodes($node) . '</ul></li>' . PHP_EOL;
|
|
|
|
}
|
|
|
|
}
|
2013-12-10 21:26:42 +01:00
|
|
|
}
|
2013-11-28 14:36:02 +01:00
|
|
|
}
|
2014-01-24 18:34:46 +01:00
|
|
|
return $output;
|
2013-11-26 21:33:45 +01:00
|
|
|
}
|
2013-11-26 20:57:26 +01:00
|
|
|
}
|