xref: /plugin/tagging/syntax.php (revision f7ac61fbb58a0b804511e767479472fffd933150)
1fc7056c4SAdrian Lang<?php
2fc7056c4SAdrian Lang/**
3fc7056c4SAdrian Lang * DokuWiki Plugin tagging (Syntax Component)
4fc7056c4SAdrian Lang *
5fc7056c4SAdrian Lang * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
6fc7056c4SAdrian Lang * @author  Adrian Lang <lang@cosmocode.de>
7fc7056c4SAdrian Lang */
8fc7056c4SAdrian Lang
9fc7056c4SAdrian Lang// must be run within Dokuwiki
100cfde7e9SMichael Großeif (!defined('DOKU_INC')) {
110cfde7e9SMichael Große    die();
120cfde7e9SMichael Große}
13fc7056c4SAdrian Lang
14fc7056c4SAdrian Langclass syntax_plugin_tagging extends DokuWiki_Syntax_Plugin {
15fc7056c4SAdrian Lang
16fc7056c4SAdrian Lang    function getType() {
17fc7056c4SAdrian Lang        return 'substition';
18fc7056c4SAdrian Lang    }
19fc7056c4SAdrian Lang
20fc7056c4SAdrian Lang    function getPType() {
21fc7056c4SAdrian Lang        return 'block';
22fc7056c4SAdrian Lang    }
23fc7056c4SAdrian Lang
24fc7056c4SAdrian Lang    function getSort() {
25fc7056c4SAdrian Lang        return 13;
26fc7056c4SAdrian Lang    }
27fc7056c4SAdrian Lang
28fc7056c4SAdrian Lang    function connectTo($mode) {
29077ff864SAndreas Gohr        $this->Lexer->addSpecialPattern('{{tagging::\w+(?:>[^}\?]+)?(?:\?[0-9]+)?}}', $mode, 'plugin_tagging');
30fc7056c4SAdrian Lang    }
31fc7056c4SAdrian Lang
329e3ba1b1SAndreas Gohr    function handle($match, $state, $pos, Doku_Handler $handler) {
33fc7056c4SAdrian Lang        $data = array();
34fc7056c4SAdrian Lang        $matches = array();
35077ff864SAndreas Gohr        preg_match('/{{tagging::(\w+)(?:>([^}\?]+))?(\?[0-9]+)?}}/', $match, $matches);
36fc7056c4SAdrian Lang        $data['cmd'] = $matches[1];
37*f7ac61fbSAndreas Gohr        $data['limit'] = (int)ltrim($matches[3] ?: '', '?');
380cfde7e9SMichael Große        if (!$data['limit']) {
390cfde7e9SMichael Große            $data['limit'] = $this->getConf('cloudlimit');
400cfde7e9SMichael Große        }
41fc7056c4SAdrian Lang
42fc7056c4SAdrian Lang        switch ($data['cmd']) {
43fc7056c4SAdrian Lang            case 'user':
44fc7056c4SAdrian Lang                if (count($matches) > 2) {
45fc7056c4SAdrian Lang                    $data['user'] = trim($matches[2]);
46fc7056c4SAdrian Lang                }
47fc7056c4SAdrian Lang                break;
480b6fad27Ssandos187            case 'tag':
490b6fad27Ssandos187                if (count($matches) > 2) {
500b6fad27Ssandos187                    $data['tag'] = trim($matches[2]);
510b6fad27Ssandos187                }
520b6fad27Ssandos187                break;
530797641fSAdrian Lang            case 'ns':
540797641fSAdrian Lang                if (count($matches) > 2) {
550797641fSAdrian Lang                    $data['ns'] = trim($matches[2]);
560797641fSAdrian Lang                }
570797641fSAdrian Lang                break;
584227fca4SAnna Dabrowska            case 'manage':
594227fca4SAnna Dabrowska                if (count($matches) > 2) {
604227fca4SAnna Dabrowska                    $data['manage'] = trim($matches[2]);
614227fca4SAnna Dabrowska                }
624227fca4SAnna Dabrowska                break;
63fc7056c4SAdrian Lang        }
64fc7056c4SAdrian Lang
65fc7056c4SAdrian Lang        return $data;
66fc7056c4SAdrian Lang    }
67fc7056c4SAdrian Lang
689e3ba1b1SAndreas Gohr    function render($mode, Doku_Renderer $renderer, $data) {
69fc7056c4SAdrian Lang        if ($mode !== 'xhtml') {
70fc7056c4SAdrian Lang            return false;
71fc7056c4SAdrian Lang        }
72fc7056c4SAdrian Lang
730a518a11SAndreas Gohr        /** @var helper_plugin_tagging $hlp */
74f61105deSAdrian Lang        $hlp = plugin_load('helper', 'tagging');
75fc7056c4SAdrian Lang
76fc7056c4SAdrian Lang        switch ($data['cmd']) {
77fc7056c4SAdrian Lang            case 'user':
78fc7056c4SAdrian Lang                $renderer->info['cache'] = false;
79fc7056c4SAdrian Lang                if (!isset($data['user'])) {
80fc7056c4SAdrian Lang                    $data['user'] = $_SERVER['REMOTE_USER'];
81fc7056c4SAdrian Lang                }
82077ff864SAndreas Gohr                $tags = $hlp->findItems(array('tagger' => $data['user']), 'tag', $data['limit']);
830b6fad27Ssandos187
84f61105deSAdrian Lang                $renderer->doc .= $hlp->html_cloud($tags, 'tag', array($hlp, 'linkToSearch'), true, true);
85fc7056c4SAdrian Lang
86fc7056c4SAdrian Lang                break;
870b6fad27Ssandos187            case 'tag':
880b6fad27Ssandos187                $renderer->info['cache'] = false;
890b6fad27Ssandos187
900b6fad27Ssandos187                $pids = $hlp->findItems(array('tag' => $data['tag']), 'pid', $data['limit']);
910b6fad27Ssandos187
920b6fad27Ssandos187                $renderer->doc .= $hlp->html_page_list($pids);
930b6fad27Ssandos187
940b6fad27Ssandos187                break;
950797641fSAdrian Lang            case 'ns':
960797641fSAdrian Lang                $renderer->info['cache'] = false;
970797641fSAdrian Lang                if (!isset($data['ns'])) {
980797641fSAdrian Lang                    global $INFO;
990797641fSAdrian Lang                    $data['ns'] = $INFO['namespace'];
1000797641fSAdrian Lang                }
1010797641fSAdrian Lang                global $ID;
1020797641fSAdrian Lang                $data['ns'] = resolve_id(getNS($ID), $data['ns'] . ':');
1030797641fSAdrian Lang                if ($data['ns'] !== '') {
1040797641fSAdrian Lang                    // Do not match nsbla, only ns:bla
1050797641fSAdrian Lang                    $data['ns'] .= ':';
1060797641fSAdrian Lang                }
107a448a407SAnna Dabrowska                $tags = $hlp->findItems(['pid' => $hlp->globNamespace($data['ns'])], 'tag', $data['limit']);
1085540f91dSAndreas Gohr                $renderer->doc .= $hlp->html_cloud($tags, 'tag', array($hlp, 'linkToSearch'), true, true, $data['ns']);
1090797641fSAdrian Lang
1100797641fSAdrian Lang                break;
111fbf38c5bSAndreas Gohr            case 'input':
1123496cc8aSAndreas Gohr                $renderer->nocache();
1133496cc8aSAndreas Gohr                $renderer->doc .= $hlp->tpl_tags(false);
114fbf38c5bSAndreas Gohr                break;
1154227fca4SAnna Dabrowska            case 'manage':
1164227fca4SAnna Dabrowska                $renderer->nocache();
1174227fca4SAnna Dabrowska                $ns = $data['manage'] ?: '';
1184227fca4SAnna Dabrowska                $renderer->doc .= $hlp->manageTags($ns);
1194227fca4SAnna Dabrowska                break;
120fc7056c4SAdrian Lang        }
121fc7056c4SAdrian Lang
122fc7056c4SAdrian Lang        return true;
123fc7056c4SAdrian Lang    }
124fc7056c4SAdrian Lang}
125fc7056c4SAdrian Lang
126fc7056c4SAdrian Lang// vim:ts=4:sw=4:et:enc=utf-8:
127