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