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