xref: /plugin/tagging/syntax.php (revision fbf38c5b46906b92dee1ae891c8c7e34c589502f)
1<?php
2/**
3 * DokuWiki Plugin tagging (Syntax Component)
4 *
5 * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
6 * @author  Adrian Lang <lang@cosmocode.de>
7 */
8
9// must be run within Dokuwiki
10if (!defined('DOKU_INC')) die();
11
12class syntax_plugin_tagging extends DokuWiki_Syntax_Plugin {
13
14    function getType() {
15        return 'substition';
16    }
17
18    function getPType() {
19        return 'block';
20    }
21
22    function getSort() {
23        return 13;
24    }
25
26    function connectTo($mode) {
27        $this->Lexer->addSpecialPattern('{{tagging::\w+(?:>[^}]+)?}}',$mode,'plugin_tagging');
28    }
29
30    function handle($match, $state, $pos, &$handler){
31        $data = array();
32        $matches = array();
33        preg_match('/{{tagging::(\w+)(?:>([^}]+))?}}/', $match, $matches);
34        $data['cmd'] = $matches[1];
35
36        switch($data['cmd']) {
37        case 'user':
38            if (count($matches) > 2) {
39                $data['user'] = trim($matches[2]);
40            }
41            break;
42        case 'ns':
43            if (count($matches) > 2) {
44                $data['ns'] = trim($matches[2]);
45            }
46            break;
47        }
48
49        return $data;
50    }
51
52    function render($mode, &$renderer, $data) {
53        if ($mode !== 'xhtml') {
54            return false;
55        }
56
57        /** @var helper_plugin_tagging $hlp */
58        $hlp = plugin_load('helper', 'tagging');
59
60        switch($data['cmd']) {
61            case 'user':
62                $renderer->info['cache'] = false;
63                if(!isset($data['user'])) {
64                    $data['user'] = $_SERVER['REMOTE_USER'];
65                }
66                $tags = $hlp->findItems(array('tagger' => $data['user']), 'tag');
67                $renderer->doc .= $hlp->html_cloud($tags, 'tag', array($hlp, 'linkToSearch'), true, true);
68
69                break;
70            case 'ns':
71                $renderer->info['cache'] = false;
72                if(!isset($data['ns'])) {
73                    global $INFO;
74                    $data['ns'] = $INFO['namespace'];
75                }
76                global $ID;
77                $data['ns'] = resolve_id(getNS($ID), $data['ns'] . ':');
78                if($data['ns'] !== '') {
79                    // Do not match nsbla, only ns:bla
80                    $data['ns'] .= ':';
81                }
82                $data['ns'] .= '%';
83                $tags = $hlp->findItems(array('pid' => $data['ns']), 'tag');
84                $renderer->doc .= $hlp->html_cloud($tags, 'tag', array($hlp, 'linkToSearch'), true, true);
85
86                break;
87            case 'input':
88                $hlp->tpl_tags();
89
90                break;
91        }
92
93        return true;
94    }
95}
96
97// vim:ts=4:sw=4:et:enc=utf-8:
98