diff options
Diffstat (limited to 'platform/www/lib/plugins/tag/syntax/topic.php')
-rw-r--r-- | platform/www/lib/plugins/tag/syntax/topic.php | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/platform/www/lib/plugins/tag/syntax/topic.php b/platform/www/lib/plugins/tag/syntax/topic.php new file mode 100644 index 0000000..a065a94 --- /dev/null +++ b/platform/www/lib/plugins/tag/syntax/topic.php @@ -0,0 +1,129 @@ +<?php +/** + * Tag Plugin, topic component: displays links to all wiki pages with a certain tag + * + * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) + * @author Esther Brunner <wikidesign@gmail.com> + */ + +/** + * Topic syntax, displays links to all wiki pages with a certain tag + */ +class syntax_plugin_tag_topic extends DokuWiki_Syntax_Plugin { + + /** + * @return string Syntax type + */ + function getType() { return 'substition'; } + + /** + * @return string Paragraph type + */ + function getPType() { return 'block'; } + + /** + * @return int Sort order + */ + function getSort() { return 295; } + + /** + * @param string $mode Parser mode + */ + function connectTo($mode) { + $this->Lexer->addSpecialPattern('\{\{topic>.+?\}\}',$mode,'plugin_tag_topic'); + } + + /** + * Handle matches of the topic syntax + * + * @param string $match The match of the syntax + * @param int $state The state of the handler + * @param int $pos The position in the document + * @param Doku_Handler $handler The handler + * @return array Data for the renderer + */ + function handle($match, $state, $pos, Doku_Handler $handler) { + global $ID; + + $match = substr($match, 8, -2); // strip {{topic> from start and }} from end + list($match, $flags) = explode('&', $match, 2); + $flags = explode('&', $flags); + list($ns, $tag) = explode('?', $match); + + if (!$tag) { + $tag = $ns; + $ns = ''; + } + + if (($ns == '*') || ($ns == ':')) $ns = ''; + elseif ($ns == '.') $ns = getNS($ID); + else $ns = cleanID($ns); + + return array($ns, trim($tag), $flags); + } + + /** + * Render xhtml output or metadata + * + * @param string $mode Renderer mode (supported modes: xhtml and metadata) + * @param Doku_Renderer $renderer The renderer + * @param array $data The data from the handler function + * @return bool If rendering was successful. + */ + function render($mode, Doku_Renderer $renderer, $data) { + list($ns, $tag, $flags) = $data; + + /* @var helper_plugin_tag $my */ + if ($my = $this->loadHelper('tag')) $pages = $my->getTopic($ns, '', $tag); + if (!isset($pages) || !$pages) return true; // nothing to display + + if ($mode == 'xhtml') { + /* @var Doku_Renderer_xhtml $renderer */ + + // prevent caching to ensure content is always fresh + $renderer->nocache(); + + /* @var helper_plugin_pagelist $pagelist */ + // let Pagelist Plugin do the work for us + if ((!$pagelist = $this->loadHelper('pagelist'))) { + return false; + } + $pagelist->sort = false; + $pagelist->rsort = false; + + $configflags = explode(',', str_replace(" ", "", $this->getConf('pagelist_flags'))); + $flags = array_merge($configflags, $flags); + foreach($flags as $key => $flag) { + if($flag == "") unset($flags[$key]); + } + + $pagelist->setFlags($flags); + $pagelist->startList(); + + // Sort pages by pagename if required by flags + if($pagelist->sort || $pagelist->rsort) { + $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($pagelist->rsort) krsort($pages); + } + + foreach ($pages as $page) { + $pagelist->addPage($page); + } + $renderer->doc .= $pagelist->finishList(); + return true; + + // for metadata renderer +/* } elseif ($mode == 'metadata') { + foreach ($pages as $page) { + $renderer->meta['relation']['references'][$page['id']] = true; + } + + return true;*/ // causes issues with backlinks + } + return false; + } +} +// vim:ts=4:sw=4:et: |