diff --git a/DokuWikiObjectRepresentation.class.php b/DokuWikiObjectRepresentation.class.php index c5a2093..95f9821 100644 --- a/DokuWikiObjectRepresentation.class.php +++ b/DokuWikiObjectRepresentation.class.php @@ -6,22 +6,245 @@ * 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 { + /** @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 DokuWikiPage + */ +class DokuWikiPage extends DokuWikiNode { + /** + * @param $filename + * @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 { - private $nodes = array(); + /** + * @var DokuWikiNameSpace + */ + private $root; - function __construct () { + /** + * @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'] . DIRECTORY_SEPARATOR; + $basedir = $conf['datadir']; + $this->root = new DokuWikiNameSpace($basedir); + } + /** + * @return string + */ + public function toString () { + return $this->root->toString(); } } \ No newline at end of file diff --git a/syntax.php b/syntax.php index 8949f45..6d79688 100644 --- a/syntax.php +++ b/syntax.php @@ -7,60 +7,84 @@ */ // 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 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 * need to inherit from this class */ -class syntax_plugin_objectrepresentation extends DokuWiki_Syntax_Plugin -{ +class syntax_plugin_objectrepresentation extends DokuWiki_Syntax_Plugin { - function getInfo() - { - return array('author' => 'me', - 'email' => 'me@someplace.com', - 'date' => '2005-07-28', - 'name' => 'Now Plugin', - 'desc' => 'Include the current date and time', - 'url' => 'http://www.dokuwiki.org/devel:syntax_plugins'); - } - - function getType() - { - return 'substition'; - } - - function getSort() - { - return 32; - } - - function connectTo($mode) - { - $this->Lexer->addSpecialPattern('\[NOW\]', $mode, 'plugin_objectrepresentation'); - } - - function handle($match, $state, $pos, &$handler) - { - return array($match, $state, $pos); - } - - function render($mode, &$renderer, $data) - { - global $ID; - - $iter = new DokuWikiIterator(); - // $data is what the function handle return'ed. - if ($mode == 'xhtml') { - $renderer->doc .= date('r'); - return true; - } - return false; + function getInfo () { + return array ('author' => 'me', + 'email' => 'me@someplace.com', + 'date' => '2005-07-28', + 'name' => 'Now Plugin', + 'desc' => 'Include the current date and time', + 'url' => 'http://www.dokuwiki.org/devel:syntax_plugins'); + } + + function getType () { + return 'substition'; + } + + function getSort () { + return 32; + } + + function connectTo ($mode) { + $this->Lexer->addSpecialPattern('{{indexmenu_n>(\d+)}}',$mode,'plugin_objectrepresentation'); + $this->Lexer->addSpecialPattern ('\[NOW\]', $mode, 'plugin_objectrepresentation'); + } + + function handle ($match, $state, $pos, &$handler) { + return array ($match, $state, $pos); + } + + function render ($mode, &$renderer, $data) { + global $ID; + + $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 = '