1f62ea8a1Sandi<?php 245a30e7cSAndreas Gohr 38553d24dSAndreas Gohruse dokuwiki\Extension\SyntaxPlugin; 454cc7aa4SAndreas Gohruse dokuwiki\Extension\PluginInterface; 5*d4f83172SAndreas Gohr 6f62ea8a1Sandi/** 7f62ea8a1Sandi * Info Plugin: Displays information about various DokuWiki internals 8f62ea8a1Sandi * 9f62ea8a1Sandi * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) 10f62ea8a1Sandi * @author Andreas Gohr <andi@splitbrain.org> 11c06c1c7aSEsther Brunner * @author Esther Brunner <wikidesign@gmail.com> 12f62ea8a1Sandi */ 138553d24dSAndreas Gohrclass syntax_plugin_info extends SyntaxPlugin 14957f36a6SAndreas Gohr{ 15f62ea8a1Sandi /** 16f62ea8a1Sandi * What kind of syntax are we? 17f62ea8a1Sandi */ 18957f36a6SAndreas Gohr public function getType() 19957f36a6SAndreas Gohr { 20f62ea8a1Sandi return 'substition'; 21f62ea8a1Sandi } 22f62ea8a1Sandi 23f62ea8a1Sandi /** 24896a5c22Sandi * What about paragraphs? 25896a5c22Sandi */ 26957f36a6SAndreas Gohr public function getPType() 27957f36a6SAndreas Gohr { 28896a5c22Sandi return 'block'; 29896a5c22Sandi } 30896a5c22Sandi 31896a5c22Sandi /** 32f62ea8a1Sandi * Where to sort in? 33f62ea8a1Sandi */ 34957f36a6SAndreas Gohr public function getSort() 35957f36a6SAndreas Gohr { 36f62ea8a1Sandi return 155; 37f62ea8a1Sandi } 38f62ea8a1Sandi 39f62ea8a1Sandi /** 40f62ea8a1Sandi * Connect pattern to lexer 41f62ea8a1Sandi */ 42957f36a6SAndreas Gohr public function connectTo($mode) 43957f36a6SAndreas Gohr { 44f62ea8a1Sandi $this->Lexer->addSpecialPattern('~~INFO:\w+~~', $mode, 'plugin_info'); 45f62ea8a1Sandi } 46f62ea8a1Sandi 47f62ea8a1Sandi /** 48f62ea8a1Sandi * Handle the match 49253d4b48SGerrit Uitslag * 50253d4b48SGerrit Uitslag * @param string $match The text matched by the patterns 51253d4b48SGerrit Uitslag * @param int $state The lexer state for the match 52253d4b48SGerrit Uitslag * @param int $pos The character position of the matched text 53253d4b48SGerrit Uitslag * @param Doku_Handler $handler The Doku_Handler object 54253d4b48SGerrit Uitslag * @return array Return an array with all data you want to use in render 55f62ea8a1Sandi */ 56957f36a6SAndreas Gohr public function handle($match, $state, $pos, Doku_Handler $handler) 57957f36a6SAndreas Gohr { 58f62ea8a1Sandi $match = substr($match, 7, -2); //strip ~~INFO: from start and ~~ from end 5954cc7aa4SAndreas Gohr return [strtolower($match)]; 60f62ea8a1Sandi } 61f62ea8a1Sandi 62f62ea8a1Sandi /** 63f62ea8a1Sandi * Create output 64253d4b48SGerrit Uitslag * 65253d4b48SGerrit Uitslag * @param string $format string output format being rendered 66253d4b48SGerrit Uitslag * @param Doku_Renderer $renderer the current renderer object 67253d4b48SGerrit Uitslag * @param array $data data created by handler() 68253d4b48SGerrit Uitslag * @return boolean rendered correctly? 69f62ea8a1Sandi */ 70957f36a6SAndreas Gohr public function render($format, Doku_Renderer $renderer, $data) 71957f36a6SAndreas Gohr { 72f4e5a570Schris if ($format == 'xhtml') { 7374ed54d4SGerrit Uitslag /** @var Doku_Renderer_xhtml $renderer */ 74f62ea8a1Sandi //handle various info stuff 75f62ea8a1Sandi switch ($data[0]) { 76896a5c22Sandi case 'syntaxmodes': 77957f36a6SAndreas Gohr $renderer->doc .= $this->renderSyntaxModes(); 78f62ea8a1Sandi break; 79896a5c22Sandi case 'syntaxtypes': 80957f36a6SAndreas Gohr $renderer->doc .= $this->renderSyntaxTypes(); 81f62ea8a1Sandi break; 82896a5c22Sandi case 'syntaxplugins': 83957f36a6SAndreas Gohr $this->renderPlugins('syntax', $renderer); 84c06c1c7aSEsther Brunner break; 85c06c1c7aSEsther Brunner case 'adminplugins': 86957f36a6SAndreas Gohr $this->renderPlugins('admin', $renderer); 87c06c1c7aSEsther Brunner break; 88c06c1c7aSEsther Brunner case 'actionplugins': 89957f36a6SAndreas Gohr $this->renderPlugins('action', $renderer); 90c06c1c7aSEsther Brunner break; 91c06c1c7aSEsther Brunner case 'rendererplugins': 92957f36a6SAndreas Gohr $this->renderPlugins('renderer', $renderer); 93c06c1c7aSEsther Brunner break; 94c06c1c7aSEsther Brunner case 'helperplugins': 95957f36a6SAndreas Gohr $this->renderPlugins('helper', $renderer); 96c06c1c7aSEsther Brunner break; 97603a6381SKlap-in case 'authplugins': 98957f36a6SAndreas Gohr $this->renderPlugins('auth', $renderer); 99603a6381SKlap-in break; 100603a6381SKlap-in case 'remoteplugins': 101957f36a6SAndreas Gohr $this->renderPlugins('remote', $renderer); 102603a6381SKlap-in break; 103c06c1c7aSEsther Brunner case 'helpermethods': 104957f36a6SAndreas Gohr $this->renderHelperMethods($renderer); 105896a5c22Sandi break; 106e9ac59e9SAndreas Gohr case 'hooks': 107e9ac59e9SAndreas Gohr $this->renderHooks($renderer); 108e9ac59e9SAndreas Gohr break; 1097210c855SAndreas Gohr case 'datetime': 1107210c855SAndreas Gohr $renderer->doc .= date('r'); 1117210c855SAndreas Gohr break; 112f62ea8a1Sandi default: 113f62ea8a1Sandi $renderer->doc .= "no info about " . htmlspecialchars($data[0]); 114f62ea8a1Sandi } 115f62ea8a1Sandi return true; 116f62ea8a1Sandi } 117f62ea8a1Sandi return false; 118f62ea8a1Sandi } 119f62ea8a1Sandi 120f62ea8a1Sandi /** 121c06c1c7aSEsther Brunner * list all installed plugins 122896a5c22Sandi * 123896a5c22Sandi * uses some of the original renderer methods 124253d4b48SGerrit Uitslag * 125253d4b48SGerrit Uitslag * @param string $type 1264baa5c86SAndreas Gohr * @param Doku_Renderer $renderer 127896a5c22Sandi */ 1284baa5c86SAndreas Gohr protected function renderPlugins($type, Doku_Renderer $renderer) 129957f36a6SAndreas Gohr { 130896a5c22Sandi global $lang; 131c06c1c7aSEsther Brunner $plugins = plugin_list($type); 13254cc7aa4SAndreas Gohr $plginfo = []; 1335f5f3ddcSAndreas Gohr 1345f5f3ddcSAndreas Gohr // remove subparts 135896a5c22Sandi foreach ($plugins as $p) { 13654cc7aa4SAndreas Gohr $po = plugin_load($type, $p); 13754cc7aa4SAndreas Gohr if (! $po instanceof PluginInterface) continue; 138a19c9aa0SGerrit Uitslag [$name, /* part */] = explode('_', $p, 2); 1395f5f3ddcSAndreas Gohr $plginfo[$name] = $po->getInfo(); 1405f5f3ddcSAndreas Gohr } 141896a5c22Sandi 1425f5f3ddcSAndreas Gohr // list them 1434baa5c86SAndreas Gohr $renderer->listu_open(); 1445f5f3ddcSAndreas Gohr foreach ($plginfo as $info) { 1454baa5c86SAndreas Gohr $renderer->listitem_open(1); 1464baa5c86SAndreas Gohr $renderer->listcontent_open(); 147896a5c22Sandi $renderer->externallink($info['url'], $info['name']); 1484baa5c86SAndreas Gohr $renderer->cdata(' '); 1494baa5c86SAndreas Gohr $renderer->emphasis_open(); 1504baa5c86SAndreas Gohr $renderer->cdata($info['date']); 1514baa5c86SAndreas Gohr $renderer->emphasis_close(); 1524baa5c86SAndreas Gohr $renderer->cdata(' ' . $lang['by'] . ' '); 153896a5c22Sandi $renderer->emaillink($info['email'], $info['author']); 1544baa5c86SAndreas Gohr $renderer->linebreak(); 1554baa5c86SAndreas Gohr $renderer->cdata($info['desc']); 1564baa5c86SAndreas Gohr $renderer->listcontent_close(); 1574baa5c86SAndreas Gohr $renderer->listitem_close(); 158896a5c22Sandi } 1594baa5c86SAndreas Gohr $renderer->listu_close(); 160896a5c22Sandi } 161896a5c22Sandi 162896a5c22Sandi /** 163c06c1c7aSEsther Brunner * list all installed plugins 164c06c1c7aSEsther Brunner * 165c06c1c7aSEsther Brunner * uses some of the original renderer methods 166253d4b48SGerrit Uitslag * 167253d4b48SGerrit Uitslag * @param Doku_Renderer_xhtml $renderer 168c06c1c7aSEsther Brunner */ 169957f36a6SAndreas Gohr protected function renderHelperMethods(Doku_Renderer_xhtml $renderer) 170957f36a6SAndreas Gohr { 171c06c1c7aSEsther Brunner $plugins = plugin_list('helper'); 172c06c1c7aSEsther Brunner foreach ($plugins as $p) { 17354cc7aa4SAndreas Gohr $po = plugin_load('helper', $p); 17454cc7aa4SAndreas Gohr if (!$po instanceof PluginInterface) continue; 175c06c1c7aSEsther Brunner 176c06c1c7aSEsther Brunner if (!method_exists($po, 'getMethods')) continue; 177c06c1c7aSEsther Brunner $methods = $po->getMethods(); 178c06c1c7aSEsther Brunner $info = $po->getInfo(); 179c06c1c7aSEsther Brunner 180957f36a6SAndreas Gohr $hid = $this->addToToc($info['name'], 2, $renderer); 181c06c1c7aSEsther Brunner $doc = '<h2><a name="' . $hid . '" id="' . $hid . '">' . hsc($info['name']) . '</a></h2>'; 182c06c1c7aSEsther Brunner $doc .= '<div class="level2">'; 18354cc7aa4SAndreas Gohr $doc .= '<p>' . strtr(hsc($info['desc']), ["\n" => "<br />"]) . '</p>'; 1849b3b9e8eSGerrit Uitslag $doc .= '<pre class="code">$' . $p . " = plugin_load('helper', '" . $p . "');</pre>"; 185c06c1c7aSEsther Brunner $doc .= '</div>'; 186c06c1c7aSEsther Brunner foreach ($methods as $method) { 187c06c1c7aSEsther Brunner $title = '$' . $p . '->' . $method['name'] . '()'; 188957f36a6SAndreas Gohr $hid = $this->addToToc($title, 3, $renderer); 189c06c1c7aSEsther Brunner $doc .= '<h3><a name="' . $hid . '" id="' . $hid . '">' . hsc($title) . '</a></h3>'; 190c06c1c7aSEsther Brunner $doc .= '<div class="level3">'; 191c7b28ffdSAnika Henke $doc .= '<div class="table"><table class="inline"><tbody>'; 192c06c1c7aSEsther Brunner $doc .= '<tr><th>Description</th><td colspan="2">' . $method['desc'] . 193c06c1c7aSEsther Brunner '</td></tr>'; 194c06c1c7aSEsther Brunner if ($method['params']) { 195c06c1c7aSEsther Brunner $c = count($method['params']); 196c06c1c7aSEsther Brunner $doc .= '<tr><th rowspan="' . $c . '">Parameters</th><td>'; 19754cc7aa4SAndreas Gohr $params = []; 198c06c1c7aSEsther Brunner foreach ($method['params'] as $desc => $type) { 199c06c1c7aSEsther Brunner $params[] = hsc($desc) . '</td><td>' . hsc($type); 200c06c1c7aSEsther Brunner } 20154cc7aa4SAndreas Gohr $doc .= implode('</td></tr><tr><td>', $params) . '</td></tr>'; 202c06c1c7aSEsther Brunner } 203c06c1c7aSEsther Brunner if ($method['return']) { 204c06c1c7aSEsther Brunner $doc .= '<tr><th>Return value</th><td>' . hsc(key($method['return'])) . 205c06c1c7aSEsther Brunner '</td><td>' . hsc(current($method['return'])) . '</td></tr>'; 206c06c1c7aSEsther Brunner } 207c7b28ffdSAnika Henke $doc .= '</tbody></table></div>'; 208c06c1c7aSEsther Brunner $doc .= '</div>'; 209c06c1c7aSEsther Brunner } 210c06c1c7aSEsther Brunner unset($po); 211c06c1c7aSEsther Brunner 212c06c1c7aSEsther Brunner $renderer->doc .= $doc; 213c06c1c7aSEsther Brunner } 214c06c1c7aSEsther Brunner } 215c06c1c7aSEsther Brunner 216c06c1c7aSEsther Brunner /** 217f62ea8a1Sandi * lists all known syntax types and their registered modes 218253d4b48SGerrit Uitslag * 219253d4b48SGerrit Uitslag * @return string 220f62ea8a1Sandi */ 221957f36a6SAndreas Gohr protected function renderSyntaxTypes() 222957f36a6SAndreas Gohr { 223f62ea8a1Sandi global $PARSER_MODES; 224f62ea8a1Sandi $doc = ''; 225f62ea8a1Sandi 226c7b28ffdSAnika Henke $doc .= '<div class="table"><table class="inline"><tbody>'; 227f62ea8a1Sandi foreach ($PARSER_MODES as $mode => $modes) { 228f62ea8a1Sandi $doc .= '<tr>'; 229f62ea8a1Sandi $doc .= '<td class="leftalign">'; 230f62ea8a1Sandi $doc .= $mode; 231f62ea8a1Sandi $doc .= '</td>'; 232f62ea8a1Sandi $doc .= '<td class="leftalign">'; 23354cc7aa4SAndreas Gohr $doc .= implode(', ', $modes); 234f62ea8a1Sandi $doc .= '</td>'; 235f62ea8a1Sandi $doc .= '</tr>'; 236f62ea8a1Sandi } 237c7b28ffdSAnika Henke $doc .= '</tbody></table></div>'; 238f62ea8a1Sandi return $doc; 239f62ea8a1Sandi } 240f62ea8a1Sandi 241f62ea8a1Sandi /** 242f62ea8a1Sandi * lists all known syntax modes and their sorting value 243253d4b48SGerrit Uitslag * 244253d4b48SGerrit Uitslag * @return string 245f62ea8a1Sandi */ 246957f36a6SAndreas Gohr protected function renderSyntaxModes() 247957f36a6SAndreas Gohr { 248f62ea8a1Sandi $modes = p_get_parsermodes(); 249f62ea8a1Sandi 25054cc7aa4SAndreas Gohr $compactmodes = []; 251f62ea8a1Sandi foreach ($modes as $mode) { 252a27c9d6fSGerrit Uitslag $compactmodes[$mode['sort']][] = $mode['mode']; 253f62ea8a1Sandi } 254a27c9d6fSGerrit Uitslag $doc = ''; 255a27c9d6fSGerrit Uitslag $doc .= '<div class="table"><table class="inline"><tbody>'; 256a27c9d6fSGerrit Uitslag 257a27c9d6fSGerrit Uitslag foreach ($compactmodes as $sort => $modes) { 258a27c9d6fSGerrit Uitslag $rowspan = ''; 259a27c9d6fSGerrit Uitslag if (count($modes) > 1) { 260a27c9d6fSGerrit Uitslag $rowspan = ' rowspan="' . count($modes) . '"'; 261a27c9d6fSGerrit Uitslag } 262a27c9d6fSGerrit Uitslag 263a27c9d6fSGerrit Uitslag foreach ($modes as $index => $mode) { 264a27c9d6fSGerrit Uitslag $doc .= '<tr>'; 265a27c9d6fSGerrit Uitslag $doc .= '<td class="leftalign">'; 266a27c9d6fSGerrit Uitslag $doc .= $mode; 267a27c9d6fSGerrit Uitslag $doc .= '</td>'; 268a27c9d6fSGerrit Uitslag 269a27c9d6fSGerrit Uitslag if ($index === 0) { 270a27c9d6fSGerrit Uitslag $doc .= '<td class="rightalign" ' . $rowspan . '>'; 271a27c9d6fSGerrit Uitslag $doc .= $sort; 272a27c9d6fSGerrit Uitslag $doc .= '</td>'; 273a27c9d6fSGerrit Uitslag } 274a27c9d6fSGerrit Uitslag $doc .= '</tr>'; 275a27c9d6fSGerrit Uitslag } 276a27c9d6fSGerrit Uitslag } 277a27c9d6fSGerrit Uitslag 278a27c9d6fSGerrit Uitslag $doc .= '</tbody></table></div>'; 279f62ea8a1Sandi return $doc; 280f62ea8a1Sandi } 281c06c1c7aSEsther Brunner 282c06c1c7aSEsther Brunner /** 283e9ac59e9SAndreas Gohr * Render all currently registered event handlers 284e9ac59e9SAndreas Gohr * 285e9ac59e9SAndreas Gohr * @param Doku_Renderer $renderer 286e9ac59e9SAndreas Gohr */ 287e9ac59e9SAndreas Gohr protected function renderHooks(Doku_Renderer $renderer) 288e9ac59e9SAndreas Gohr { 289e9ac59e9SAndreas Gohr global $EVENT_HANDLER; 290e9ac59e9SAndreas Gohr 291e9ac59e9SAndreas Gohr $list = $EVENT_HANDLER->getEventHandlers(); 292e9ac59e9SAndreas Gohr ksort($list); 293e9ac59e9SAndreas Gohr 294e9ac59e9SAndreas Gohr $renderer->listu_open(); 295e9ac59e9SAndreas Gohr foreach ($list as $event => $handlers) { 296e9ac59e9SAndreas Gohr $renderer->listitem_open(1); 297e9ac59e9SAndreas Gohr $renderer->listcontent_open(); 298e9ac59e9SAndreas Gohr $renderer->cdata($event); 299e9ac59e9SAndreas Gohr $renderer->listcontent_close(); 300e9ac59e9SAndreas Gohr 301e9ac59e9SAndreas Gohr $renderer->listo_open(); 302e9ac59e9SAndreas Gohr foreach ($handlers as $sequence) { 303e9ac59e9SAndreas Gohr foreach ($sequence as $handler) { 304e9ac59e9SAndreas Gohr $renderer->listitem_open(2); 305e9ac59e9SAndreas Gohr $renderer->listcontent_open(); 306e9ac59e9SAndreas Gohr $renderer->cdata(get_class($handler[0]) . '::' . $handler[1] . '()'); 307e9ac59e9SAndreas Gohr $renderer->listcontent_close(); 308e9ac59e9SAndreas Gohr $renderer->listitem_close(); 309e9ac59e9SAndreas Gohr } 310e9ac59e9SAndreas Gohr } 311e9ac59e9SAndreas Gohr $renderer->listo_close(); 312e9ac59e9SAndreas Gohr $renderer->listitem_close(); 313e9ac59e9SAndreas Gohr } 314e9ac59e9SAndreas Gohr $renderer->listu_close(); 315e9ac59e9SAndreas Gohr } 316e9ac59e9SAndreas Gohr 317e9ac59e9SAndreas Gohr /** 318c06c1c7aSEsther Brunner * Adds a TOC item 31959bc3b48SGerrit Uitslag * 32059bc3b48SGerrit Uitslag * @param string $text 32159bc3b48SGerrit Uitslag * @param int $level 32259bc3b48SGerrit Uitslag * @param Doku_Renderer_xhtml $renderer 32359bc3b48SGerrit Uitslag * @return string 324c06c1c7aSEsther Brunner */ 325957f36a6SAndreas Gohr protected function addToToc($text, $level, Doku_Renderer_xhtml $renderer) 326957f36a6SAndreas Gohr { 327c06c1c7aSEsther Brunner global $conf; 328c06c1c7aSEsther Brunner 32959bc3b48SGerrit Uitslag $hid = ''; 330c06c1c7aSEsther Brunner if (($level >= $conf['toptoclevel']) && ($level <= $conf['maxtoclevel'])) { 331e0c26282SGerrit Uitslag $hid = $renderer->_headerToLink($text, true); 33254cc7aa4SAndreas Gohr $renderer->toc[] = [ 333c06c1c7aSEsther Brunner 'hid' => $hid, 334c06c1c7aSEsther Brunner 'title' => $text, 335c06c1c7aSEsther Brunner 'type' => 'ul', 33654cc7aa4SAndreas Gohr 'level' => $level - $conf['toptoclevel'] + 1 33754cc7aa4SAndreas Gohr ]; 338c06c1c7aSEsther Brunner } 339c06c1c7aSEsther Brunner return $hid; 340c06c1c7aSEsther Brunner } 341f62ea8a1Sandi} 342