xref: /plugin/tagging/syntax.php (revision 3496cc8a340142b071d9dbd955e2ad094fbea0a8)
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
10fc7056c4SAdrian Langif(!defined('DOKU_INC')) die();
11fc7056c4SAdrian Lang
12fc7056c4SAdrian Langclass syntax_plugin_tagging extends DokuWiki_Syntax_Plugin {
13fc7056c4SAdrian Lang
14fc7056c4SAdrian Lang    function getType() {
15fc7056c4SAdrian Lang        return 'substition';
16fc7056c4SAdrian Lang    }
17fc7056c4SAdrian Lang
18fc7056c4SAdrian Lang    function getPType() {
19fc7056c4SAdrian Lang        return 'block';
20fc7056c4SAdrian Lang    }
21fc7056c4SAdrian Lang
22fc7056c4SAdrian Lang    function getSort() {
23fc7056c4SAdrian Lang        return 13;
24fc7056c4SAdrian Lang    }
25fc7056c4SAdrian Lang
26fc7056c4SAdrian Lang    function connectTo($mode) {
27077ff864SAndreas Gohr        $this->Lexer->addSpecialPattern('{{tagging::\w+(?:>[^}\?]+)?(?:\?[0-9]+)?}}', $mode, 'plugin_tagging');
28fc7056c4SAdrian Lang    }
29fc7056c4SAdrian Lang
30fc7056c4SAdrian Lang    function handle($match, $state, $pos, &$handler) {
31fc7056c4SAdrian Lang        $data    = array();
32fc7056c4SAdrian Lang        $matches = array();
33077ff864SAndreas Gohr        preg_match('/{{tagging::(\w+)(?:>([^}\?]+))?(\?[0-9]+)?}}/', $match, $matches);
34fc7056c4SAdrian Lang        $data['cmd'] = $matches[1];
35077ff864SAndreas Gohr        $data['limit'] = (int) ltrim($matches[3], '?');
36077ff864SAndreas Gohr        if(!$data['limit']) $data['limit'] = $this->getConf('cloudlimit');
37fc7056c4SAdrian Lang
38fc7056c4SAdrian Lang        switch($data['cmd']) {
39fc7056c4SAdrian Lang            case 'user':
40fc7056c4SAdrian Lang                if(count($matches) > 2) {
41fc7056c4SAdrian Lang                    $data['user'] = trim($matches[2]);
42fc7056c4SAdrian Lang                }
43fc7056c4SAdrian Lang                break;
440797641fSAdrian Lang            case 'ns':
450797641fSAdrian Lang                if(count($matches) > 2) {
460797641fSAdrian Lang                    $data['ns'] = trim($matches[2]);
470797641fSAdrian Lang                }
480797641fSAdrian Lang                break;
49fc7056c4SAdrian Lang        }
50fc7056c4SAdrian Lang
51fc7056c4SAdrian Lang        return $data;
52fc7056c4SAdrian Lang    }
53fc7056c4SAdrian Lang
54fc7056c4SAdrian Lang    function render($mode, &$renderer, $data) {
55fc7056c4SAdrian Lang        if($mode !== 'xhtml') {
56fc7056c4SAdrian Lang            return false;
57fc7056c4SAdrian Lang        }
58fc7056c4SAdrian Lang
590a518a11SAndreas Gohr        /** @var helper_plugin_tagging $hlp */
60f61105deSAdrian Lang        $hlp = plugin_load('helper', 'tagging');
61fc7056c4SAdrian Lang
62fc7056c4SAdrian Lang        switch($data['cmd']) {
63fc7056c4SAdrian Lang            case 'user':
64fc7056c4SAdrian Lang                $renderer->info['cache'] = false;
65fc7056c4SAdrian Lang                if(!isset($data['user'])) {
66fc7056c4SAdrian Lang                    $data['user'] = $_SERVER['REMOTE_USER'];
67fc7056c4SAdrian Lang                }
68077ff864SAndreas Gohr                $tags = $hlp->findItems(array('tagger' => $data['user']), 'tag', $data['limit']);
69f61105deSAdrian Lang                $renderer->doc .= $hlp->html_cloud($tags, 'tag', array($hlp, 'linkToSearch'), true, true);
70fc7056c4SAdrian Lang
71fc7056c4SAdrian Lang                break;
720797641fSAdrian Lang            case 'ns':
730797641fSAdrian Lang                $renderer->info['cache'] = false;
740797641fSAdrian Lang                if(!isset($data['ns'])) {
750797641fSAdrian Lang                    global $INFO;
760797641fSAdrian Lang                    $data['ns'] = $INFO['namespace'];
770797641fSAdrian Lang                }
780797641fSAdrian Lang                global $ID;
790797641fSAdrian Lang                $data['ns'] = resolve_id(getNS($ID), $data['ns'] . ':');
800797641fSAdrian Lang                if($data['ns'] !== '') {
810797641fSAdrian Lang                    // Do not match nsbla, only ns:bla
820797641fSAdrian Lang                    $data['ns'] .= ':';
830797641fSAdrian Lang                }
84077ff864SAndreas Gohr                $tags = $hlp->findItems(array('pid' => $data['ns'] . '%'), 'tag', $data['limit']);
855540f91dSAndreas Gohr                $renderer->doc .= $hlp->html_cloud($tags, 'tag', array($hlp, 'linkToSearch'), true, true, $data['ns']);
860797641fSAdrian Lang
870797641fSAdrian Lang                break;
88fbf38c5bSAndreas Gohr            case 'input':
89*3496cc8aSAndreas Gohr                $renderer->nocache();
90*3496cc8aSAndreas Gohr                $renderer->doc .= $hlp->tpl_tags(false);
91fbf38c5bSAndreas Gohr                break;
92fc7056c4SAdrian Lang        }
93fc7056c4SAdrian Lang
94fc7056c4SAdrian Lang        return true;
95fc7056c4SAdrian Lang    }
96fc7056c4SAdrian Lang}
97fc7056c4SAdrian Lang
98fc7056c4SAdrian Lang// vim:ts=4:sw=4:et:enc=utf-8:
99