WIP Checkin
Sorting works, and you can iterate all the nodes :).
This commit is contained in:
parent
76781550dd
commit
de0a5423a6
2 changed files with 297 additions and 50 deletions
|
@ -6,22 +6,245 @@
|
||||||
* Time: 22:09
|
* Time: 22:09
|
||||||
*/
|
*/
|
||||||
|
|
||||||
class DokuWikiNode {
|
abstract class DokuWikiNode {
|
||||||
|
/** @var String */
|
||||||
|
protected $filename;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $name;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $content;
|
||||||
|
|
||||||
|
/** @var ArrayObject */
|
||||||
|
protected $metadata;
|
||||||
|
|
||||||
|
/** @var ArrayObject */
|
||||||
|
public $metadata_extractor;
|
||||||
|
|
||||||
|
/** @var DokuWikiNameSpace */
|
||||||
|
protected $parent = null;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getContent() {
|
||||||
|
return $this->content;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $content
|
||||||
|
* @return $this
|
||||||
|
*/
|
||||||
|
public function setContent($content = '') {
|
||||||
|
$this->content = $content;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param $key
|
||||||
|
* @param $value
|
||||||
|
*/
|
||||||
|
public function setMetaData($key,$value) {
|
||||||
|
$this->metadata[$key] = $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param $key
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
public function getMetaData($key) {
|
||||||
|
return $this->metadata[$key];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
public function getName() {
|
||||||
|
return $this->name;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param $filename
|
||||||
|
* @param null $parent
|
||||||
|
*/
|
||||||
|
function __construct ($filename, $parent = null) {
|
||||||
|
$this->filename = $filename;
|
||||||
|
$this->parent = $parent;
|
||||||
|
if (is_null ($parent) && is_dir ($filename)) {
|
||||||
|
$this->name = 'root';
|
||||||
|
} else {
|
||||||
|
$parts = pathinfo($filename);
|
||||||
|
if (is_dir($filename)) {
|
||||||
|
$this->name = $parts['basename'];
|
||||||
|
} else {
|
||||||
|
$this->name = $parts['filename'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return String
|
||||||
|
*/
|
||||||
|
public function getFilename () {
|
||||||
|
return $this->filename;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function toString () {
|
||||||
|
return $this->name;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getFullID() {
|
||||||
|
$path = array();
|
||||||
|
$node = $this;
|
||||||
|
while ($parent = $node->parent) {
|
||||||
|
if ($parent->name != 'root') {
|
||||||
|
$path[] = $parent->name;
|
||||||
|
}
|
||||||
|
$node = $parent;
|
||||||
|
}
|
||||||
|
if ($this->name != 'root') {
|
||||||
|
$path[] = $this->name;
|
||||||
|
}
|
||||||
|
return implode(':',$path);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class DokuWikiNameSpace
|
||||||
|
*/
|
||||||
class DokuWikiNameSpace extends DokuWikiNode {
|
class DokuWikiNameSpace extends DokuWikiNode {
|
||||||
|
|
||||||
|
/** @var \ArrayObject */
|
||||||
|
public $nodes;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param $path
|
||||||
|
* @param null $parent
|
||||||
|
*/
|
||||||
|
function __construct ($path, $parent = null) {
|
||||||
|
parent::__construct ($path, $parent);
|
||||||
|
$files = dir ($path);
|
||||||
|
|
||||||
|
$this->nodes = new ArrayObject();
|
||||||
|
|
||||||
|
while (($realfile = $files->read ())) {
|
||||||
|
$node = null;
|
||||||
|
$file = $path . DIRECTORY_SEPARATOR . $realfile;
|
||||||
|
if (is_dir ($file)) {
|
||||||
|
if (!(($realfile == '.') or ($realfile == '..'))) {
|
||||||
|
$node = new DokuWikiNameSpace($file, $this);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$node = new DokuWikiPage($file, $this);
|
||||||
|
}
|
||||||
|
if ($node) {
|
||||||
|
$this->nodes->append ($node);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function toString () {
|
||||||
|
$retval = '';
|
||||||
|
foreach ($this->nodes as $node) {
|
||||||
|
if ($this->name == 'root') {
|
||||||
|
$retval .= $node->toString() . "\n";
|
||||||
|
} else {
|
||||||
|
$retval .= $this->name . ":" . $node->toString() . "\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $retval;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class DokuWikiIterator {
|
/**
|
||||||
|
* Class DokuWikiPage
|
||||||
private $nodes = array();
|
*/
|
||||||
|
class DokuWikiPage extends DokuWikiNode {
|
||||||
function __construct () {
|
/**
|
||||||
global $conf;
|
* @param $filename
|
||||||
$basedir = $conf['datadir'] . DIRECTORY_SEPARATOR;
|
* @param null $parent
|
||||||
|
*/
|
||||||
|
public function __construct($filename, $parent = null) {
|
||||||
|
parent::__construct($filename,$parent);
|
||||||
|
$this->content = file_get_contents($this->filename);
|
||||||
|
if (($this->name == 'start') && ($this->parent->name != 'root')) {
|
||||||
|
$this->parent->content = $this->content;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class DokuWikiIterator
|
||||||
|
*/
|
||||||
|
class DokuWikiIterator {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var DokuWikiNameSpace
|
||||||
|
*/
|
||||||
|
private $root;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param callable $callback
|
||||||
|
*/
|
||||||
|
public function runMetadataExtractor(Callable $callback) {
|
||||||
|
$this->all($callback);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param DokuWikiNameSpace $ns
|
||||||
|
* @param callable $callback
|
||||||
|
*/
|
||||||
|
private function _all(DokuWikiNameSpace $ns, Callable $callback) {
|
||||||
|
$callback($ns);
|
||||||
|
foreach($ns->nodes as $node) {
|
||||||
|
/** $node DokuWikiNode */
|
||||||
|
$callback($node);
|
||||||
|
if ($node instanceof DokuWikiNameSpace) {
|
||||||
|
$this->_all($node,$callback);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param callable $callback
|
||||||
|
* @return $this
|
||||||
|
*/
|
||||||
|
public function all(Callable $callback) {
|
||||||
|
$this->_all($this->root,$callback);
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public function __construct () {
|
||||||
|
global $conf;
|
||||||
|
$basedir = $conf['datadir'];
|
||||||
|
|
||||||
|
$this->root = new DokuWikiNameSpace($basedir);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function toString () {
|
||||||
|
return $this->root->toString();
|
||||||
}
|
}
|
||||||
}
|
}
|
66
syntax.php
66
syntax.php
|
@ -7,23 +7,21 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// must be run within DokuWiki
|
// must be run within DokuWiki
|
||||||
if (!defined('DOKU_INC')) die();
|
if (!defined ('DOKU_INC')) die();
|
||||||
|
|
||||||
if (!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN', DOKU_INC . 'lib/plugins/');
|
if (!defined ('DOKU_PLUGIN')) define('DOKU_PLUGIN', DOKU_INC . 'lib/plugins/');
|
||||||
require_once DOKU_PLUGIN . 'syntax.php';
|
require_once DOKU_PLUGIN . 'syntax.php';
|
||||||
|
|
||||||
require_once dirname(__FILE__) . DIRECTORY_SEPARATOR . 'DokuWikiObjectRepresentation.class.php';
|
require_once dirname (__FILE__) . DIRECTORY_SEPARATOR . 'DokuWikiObjectRepresentation.class.php';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* All DokuWiki plugins to extend the parser/rendering mechanism
|
* All DokuWiki plugins to extend the parser/rendering mechanism
|
||||||
* need to inherit from this class
|
* need to inherit from this class
|
||||||
*/
|
*/
|
||||||
class syntax_plugin_objectrepresentation extends DokuWiki_Syntax_Plugin
|
class syntax_plugin_objectrepresentation extends DokuWiki_Syntax_Plugin {
|
||||||
{
|
|
||||||
|
|
||||||
function getInfo()
|
function getInfo () {
|
||||||
{
|
return array ('author' => 'me',
|
||||||
return array('author' => 'me',
|
|
||||||
'email' => 'me@someplace.com',
|
'email' => 'me@someplace.com',
|
||||||
'date' => '2005-07-28',
|
'date' => '2005-07-28',
|
||||||
'name' => 'Now Plugin',
|
'name' => 'Now Plugin',
|
||||||
|
@ -31,34 +29,60 @@ class syntax_plugin_objectrepresentation extends DokuWiki_Syntax_Plugin
|
||||||
'url' => 'http://www.dokuwiki.org/devel:syntax_plugins');
|
'url' => 'http://www.dokuwiki.org/devel:syntax_plugins');
|
||||||
}
|
}
|
||||||
|
|
||||||
function getType()
|
function getType () {
|
||||||
{
|
|
||||||
return 'substition';
|
return 'substition';
|
||||||
}
|
}
|
||||||
|
|
||||||
function getSort()
|
function getSort () {
|
||||||
{
|
|
||||||
return 32;
|
return 32;
|
||||||
}
|
}
|
||||||
|
|
||||||
function connectTo($mode)
|
function connectTo ($mode) {
|
||||||
{
|
$this->Lexer->addSpecialPattern('{{indexmenu_n>(\d+)}}',$mode,'plugin_objectrepresentation');
|
||||||
$this->Lexer->addSpecialPattern('\[NOW\]', $mode, 'plugin_objectrepresentation');
|
$this->Lexer->addSpecialPattern ('\[NOW\]', $mode, 'plugin_objectrepresentation');
|
||||||
}
|
}
|
||||||
|
|
||||||
function handle($match, $state, $pos, &$handler)
|
function handle ($match, $state, $pos, &$handler) {
|
||||||
{
|
return array ($match, $state, $pos);
|
||||||
return array($match, $state, $pos);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function render($mode, &$renderer, $data)
|
function render ($mode, &$renderer, $data) {
|
||||||
{
|
|
||||||
global $ID;
|
global $ID;
|
||||||
|
|
||||||
$iter = new DokuWikiIterator();
|
$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;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$content = '<ul>';
|
||||||
|
|
||||||
|
$iter->all(function(DokuWikiNode $node) use (&$content){
|
||||||
|
if ($node->getName() != 'root') {
|
||||||
|
$content .= '<li>' . $node->getFullID() . ':' . $node->getMetaData('sortorder') . '</li>';
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$content .= '</ul>';
|
||||||
|
|
||||||
// $data is what the function handle return'ed.
|
// $data is what the function handle return'ed.
|
||||||
if ($mode == 'xhtml') {
|
if ($mode == 'xhtml') {
|
||||||
$renderer->doc .= date('r');
|
$renderer->doc .= $content;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
|
Reference in a new issue