diff options
Diffstat (limited to 'platform/www/lib/plugins/pagelist/syntax.php')
-rw-r--r-- | platform/www/lib/plugins/pagelist/syntax.php | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/platform/www/lib/plugins/pagelist/syntax.php b/platform/www/lib/plugins/pagelist/syntax.php new file mode 100644 index 0000000..a3ea0b2 --- /dev/null +++ b/platform/www/lib/plugins/pagelist/syntax.php @@ -0,0 +1,106 @@ +<?php +/** + * Pagelist Plugin: lists pages + * + * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) + * @author Esther Brunner <wikidesign@gmail.com> + */ + +class syntax_plugin_pagelist extends DokuWiki_Syntax_Plugin { + + function getType() { return 'substition';} + function getPType() { return 'block';} + function getSort() { return 168; } + + /** + * Connect pattern to lexer + */ + function connectTo($mode) { + $this->Lexer->addSpecialPattern('<pagelist.+?</pagelist>', $mode, 'plugin_pagelist'); + } + + /** + * Handle the match + */ + function handle($match, $state, $pos, Doku_Handler $handler) { + global $ID; + + $match = substr($match, 9, -11); // strip markup + list($flags, $match) = explode('>', $match, 2); + $flags = explode('&', substr($flags, 1)); + $items = explode('*', $match); + + $pages = array(); + $c = count($items); + for ($i = 0; $i < $c; $i++) { + if (!preg_match('/\[\[(.+?)\]\]/', $items[$i], $match)) continue; + list($id, $title, $description) = explode('|', $match[1], 3); + list($id, $section) = explode('#', $id, 2); + if (!$id) $id = $ID; + resolve_pageid(getNS($ID), $id, $exists); + + // page has an image title + if (($title) && (preg_match('/\{\{(.+?)\}\}/', $title, $match))) { + list($image, $title) = explode('|', $match[1], 2); + list($ext, $mime) = mimetype($image); + if (!substr($mime, 0, 5) == 'image') $image = ''; + $pages[] = array( + 'id' => $id, + 'section' => cleanID($section), + 'title' => trim($title), + 'titleimage' => trim($image), + 'description' => trim($description), // Holds the added parameter for own descriptions + 'exists' => $exists, + ); + + // text title (if any) + } else { + $pages[] = array( + 'id' => $id, + 'section' => cleanID($section), + 'title' => trim($title), + 'description' => trim($description), // Holds the added parameter for own descriptions + 'exists' => $exists, + ); + } + } + return array($flags, $pages); + } + + /** + * Create output + */ + function render($mode, Doku_Renderer $renderer, $data) { + list($flags, $pages) = $data; + + // for XHTML output + if ($mode == 'xhtml') { + if (!$my =& plugin_load('helper', 'pagelist')) return false; + $my->setFlags($flags); + $my->startList(); + + if($my->sort || $my->rsort) { // pages should be sorted by pagename + $keys = array(); + $fnc = create_function('$a, $b', 'return strcmp(noNS($a["id"]), noNS($b["id"])); '); + usort($pages, $fnc); + // rsort is true - revserse sort the pages + if($my->rsort) krsort($pages); + } + + foreach($pages as $page) { + $my->addPage($page); + } + $renderer->doc .= $my->finishList(); + return true; + + // for metadata renderer + } elseif ($mode == 'metadata') { + foreach ($pages as $page) { + $renderer->meta['relation']['references'][$page['id']] = $page['exists']; + } + return true; + } + return false; + } +} +// vim:ts=4:sw=4:et: |