summaryrefslogtreecommitdiff
path: root/platform/www/lib/plugins/pagelist/syntax.php
diff options
context:
space:
mode:
Diffstat (limited to 'platform/www/lib/plugins/pagelist/syntax.php')
-rw-r--r--platform/www/lib/plugins/pagelist/syntax.php106
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: