xref: /plugin/tagging/syntax.php (revision 4aeb1ac5839c609ec9950b88d8819e50216e1910)
1fc7056c4SAdrian Lang<?php
2df43a7beSAndreas Gohr
3df43a7beSAndreas Gohruse dokuwiki\Extension\SyntaxPlugin;
4df43a7beSAndreas Gohruse dokuwiki\File\PageResolver;
5df43a7beSAndreas Gohr
6fc7056c4SAdrian Lang/**
7fc7056c4SAdrian Lang * DokuWiki Plugin tagging (Syntax Component)
8fc7056c4SAdrian Lang *
9fc7056c4SAdrian Lang * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
10fc7056c4SAdrian Lang * @author  Adrian Lang <lang@cosmocode.de>
11fc7056c4SAdrian Lang */
12df43a7beSAndreas Gohrclass syntax_plugin_tagging extends SyntaxPlugin
13df43a7beSAndreas Gohr{
14df43a7beSAndreas Gohr    public function getType()
15df43a7beSAndreas Gohr    {
16fc7056c4SAdrian Lang        return 'substition';
17fc7056c4SAdrian Lang    }
18fc7056c4SAdrian Lang
19df43a7beSAndreas Gohr    public function getPType()
20df43a7beSAndreas Gohr    {
21fc7056c4SAdrian Lang        return 'block';
22fc7056c4SAdrian Lang    }
23fc7056c4SAdrian Lang
24df43a7beSAndreas Gohr    public function getSort()
25df43a7beSAndreas Gohr    {
26fc7056c4SAdrian Lang        return 13;
27fc7056c4SAdrian Lang    }
28fc7056c4SAdrian Lang
29df43a7beSAndreas Gohr    public function connectTo($mode)
30df43a7beSAndreas Gohr    {
31df43a7beSAndreas Gohr        $this->Lexer->addSpecialPattern('{{tagging::\w+(?:>[^}\?]+)?(?:\?\d+)?}}', $mode, 'plugin_tagging');
32fc7056c4SAdrian Lang    }
33fc7056c4SAdrian Lang
34df43a7beSAndreas Gohr    public function handle($match, $state, $pos, Doku_Handler $handler)
35df43a7beSAndreas Gohr    {
36df43a7beSAndreas Gohr        $data = [];
37df43a7beSAndreas Gohr        $matches = [];
38df43a7beSAndreas Gohr        preg_match('/{{tagging::(\w+)(?:>([^}\?]+))?(\?\d+)?}}/', $match, $matches);
39fc7056c4SAdrian Lang        $data['cmd'] = $matches[1];
40*4aeb1ac5SAndreas Gohr        $data['limit'] = (int)ltrim($matches[3] ?? '', '?');
410cfde7e9SMichael Große        if (!$data['limit']) {
420cfde7e9SMichael Große            $data['limit'] = $this->getConf('cloudlimit');
430cfde7e9SMichael Große        }
44fc7056c4SAdrian Lang
45fc7056c4SAdrian Lang        switch ($data['cmd']) {
46fc7056c4SAdrian Lang            case 'user':
47fc7056c4SAdrian Lang                if (count($matches) > 2) {
48fc7056c4SAdrian Lang                    $data['user'] = trim($matches[2]);
49fc7056c4SAdrian Lang                }
50fc7056c4SAdrian Lang                break;
510b6fad27Ssandos187            case 'tag':
520b6fad27Ssandos187                if (count($matches) > 2) {
530b6fad27Ssandos187                    $data['tag'] = trim($matches[2]);
540b6fad27Ssandos187                }
550b6fad27Ssandos187                break;
560797641fSAdrian Lang            case 'ns':
570797641fSAdrian Lang                if (count($matches) > 2) {
580797641fSAdrian Lang                    $data['ns'] = trim($matches[2]);
590797641fSAdrian Lang                }
600797641fSAdrian Lang                break;
614227fca4SAnna Dabrowska            case 'manage':
624227fca4SAnna Dabrowska                if (count($matches) > 2) {
634227fca4SAnna Dabrowska                    $data['manage'] = trim($matches[2]);
644227fca4SAnna Dabrowska                }
654227fca4SAnna Dabrowska                break;
66fc7056c4SAdrian Lang        }
67fc7056c4SAdrian Lang
68fc7056c4SAdrian Lang        return $data;
69fc7056c4SAdrian Lang    }
70fc7056c4SAdrian Lang
71df43a7beSAndreas Gohr    public function render($mode, Doku_Renderer $renderer, $data)
72df43a7beSAndreas Gohr    {
73fc7056c4SAdrian Lang        if ($mode !== 'xhtml') {
74fc7056c4SAdrian Lang            return false;
75fc7056c4SAdrian Lang        }
76fc7056c4SAdrian Lang
770a518a11SAndreas Gohr        /** @var helper_plugin_tagging $hlp */
78f61105deSAdrian Lang        $hlp = plugin_load('helper', 'tagging');
79fc7056c4SAdrian Lang
80fc7056c4SAdrian Lang        switch ($data['cmd']) {
81fc7056c4SAdrian Lang            case 'user':
82fc7056c4SAdrian Lang                $renderer->info['cache'] = false;
83fc7056c4SAdrian Lang                if (!isset($data['user'])) {
84fc7056c4SAdrian Lang                    $data['user'] = $_SERVER['REMOTE_USER'];
85fc7056c4SAdrian Lang                }
86df43a7beSAndreas Gohr                $tags = $hlp->findItems(['tagger' => $data['user']], 'tag', $data['limit']);
870b6fad27Ssandos187
88df43a7beSAndreas Gohr                $renderer->doc .= $hlp->html_cloud($tags, 'tag', [$hlp, 'linkToSearch'], true, true);
89fc7056c4SAdrian Lang
90fc7056c4SAdrian Lang                break;
910b6fad27Ssandos187            case 'tag':
920b6fad27Ssandos187                $renderer->info['cache'] = false;
930b6fad27Ssandos187
94df43a7beSAndreas Gohr                $pids = $hlp->findItems(['tag' => $data['tag']], 'pid', $data['limit']);
950b6fad27Ssandos187
960b6fad27Ssandos187                $renderer->doc .= $hlp->html_page_list($pids);
970b6fad27Ssandos187
980b6fad27Ssandos187                break;
990797641fSAdrian Lang            case 'ns':
1000797641fSAdrian Lang                $renderer->info['cache'] = false;
1010797641fSAdrian Lang                if (!isset($data['ns'])) {
1020797641fSAdrian Lang                    global $INFO;
1030797641fSAdrian Lang                    $data['ns'] = $INFO['namespace'];
1040797641fSAdrian Lang                }
1050797641fSAdrian Lang                global $ID;
106df43a7beSAndreas Gohr                $resolver = new PageResolver($ID);
107df43a7beSAndreas Gohr                $data['ns'] = $resolver->resolveId($data['ns'] . ':');
1080797641fSAdrian Lang                if ($data['ns'] !== '') {
1090797641fSAdrian Lang                    // Do not match nsbla, only ns:bla
1100797641fSAdrian Lang                    $data['ns'] .= ':';
1110797641fSAdrian Lang                }
112a448a407SAnna Dabrowska                $tags = $hlp->findItems(['pid' => $hlp->globNamespace($data['ns'])], 'tag', $data['limit']);
113df43a7beSAndreas Gohr                $renderer->doc .= $hlp->html_cloud($tags, 'tag', [$hlp, 'linkToSearch'], true, true, $data['ns']);
1140797641fSAdrian Lang
1150797641fSAdrian Lang                break;
116fbf38c5bSAndreas Gohr            case 'input':
1173496cc8aSAndreas Gohr                $renderer->nocache();
1183496cc8aSAndreas Gohr                $renderer->doc .= $hlp->tpl_tags(false);
119fbf38c5bSAndreas Gohr                break;
1204227fca4SAnna Dabrowska            case 'manage':
1214227fca4SAnna Dabrowska                $renderer->nocache();
1224227fca4SAnna Dabrowska                $ns = $data['manage'] ?: '';
1234227fca4SAnna Dabrowska                $renderer->doc .= $hlp->manageTags($ns);
1244227fca4SAnna Dabrowska                break;
125fc7056c4SAdrian Lang        }
126fc7056c4SAdrian Lang
127fc7056c4SAdrian Lang        return true;
128fc7056c4SAdrian Lang    }
129fc7056c4SAdrian Lang}
130