xref: /plugin/tagging/syntax.php (revision 4227fca4c85a398ccab3a22710b7f2c3b95ca7e5)
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')) {
11    die();
12}
13
14class syntax_plugin_tagging extends DokuWiki_Syntax_Plugin {
15
16    function getType() {
17        return 'substition';
18    }
19
20    function getPType() {
21        return 'block';
22    }
23
24    function getSort() {
25        return 13;
26    }
27
28    function connectTo($mode) {
29        $this->Lexer->addSpecialPattern('{{tagging::\w+(?:>[^}\?]+)?(?:\?[0-9]+)?}}', $mode, 'plugin_tagging');
30    }
31
32    function handle($match, $state, $pos, Doku_Handler $handler) {
33        $data = array();
34        $matches = array();
35        preg_match('/{{tagging::(\w+)(?:>([^}\?]+))?(\?[0-9]+)?}}/', $match, $matches);
36        $data['cmd'] = $matches[1];
37        $data['limit'] = (int)ltrim($matches[3], '?');
38        if (!$data['limit']) {
39            $data['limit'] = $this->getConf('cloudlimit');
40        }
41
42        switch ($data['cmd']) {
43            case 'user':
44                if (count($matches) > 2) {
45                    $data['user'] = trim($matches[2]);
46                }
47                break;
48            case 'ns':
49                if (count($matches) > 2) {
50                    $data['ns'] = trim($matches[2]);
51                }
52                break;
53            case 'manage':
54                if (count($matches) > 2) {
55                    $data['manage'] = trim($matches[2]);
56                }
57                break;
58        }
59
60        return $data;
61    }
62
63    function render($mode, Doku_Renderer $renderer, $data) {
64        if ($mode !== 'xhtml') {
65            return false;
66        }
67
68        /** @var helper_plugin_tagging $hlp */
69        $hlp = plugin_load('helper', 'tagging');
70
71        switch ($data['cmd']) {
72            case 'user':
73                $renderer->info['cache'] = false;
74                if (!isset($data['user'])) {
75                    $data['user'] = $_SERVER['REMOTE_USER'];
76                }
77                $tags = $hlp->findItems(array('tagger' => $data['user']), 'tag', $data['limit']);
78                $renderer->doc .= $hlp->html_cloud($tags, 'tag', array($hlp, 'linkToSearch'), true, true);
79
80                break;
81            case 'ns':
82                $renderer->info['cache'] = false;
83                if (!isset($data['ns'])) {
84                    global $INFO;
85                    $data['ns'] = $INFO['namespace'];
86                }
87                global $ID;
88                $data['ns'] = resolve_id(getNS($ID), $data['ns'] . ':');
89                if ($data['ns'] !== '') {
90                    // Do not match nsbla, only ns:bla
91                    $data['ns'] .= ':';
92                }
93                $tags = $hlp->findItems(['pid' => $hlp->globNamespace($data['ns'])], 'tag', $data['limit']);
94                $renderer->doc .= $hlp->html_cloud($tags, 'tag', array($hlp, 'linkToSearch'), true, true, $data['ns']);
95
96                break;
97            case 'input':
98                $renderer->nocache();
99                $renderer->doc .= $hlp->tpl_tags(false);
100                break;
101            case 'manage':
102                $renderer->nocache();
103                $ns = $data['manage'] ?: '';
104                $renderer->doc .= $hlp->manageTags($ns);
105                break;
106        }
107
108        return true;
109    }
110}
111
112// vim:ts=4:sw=4:et:enc=utf-8:
113