1f62ea8a1Sandi<?php 245a30e7cSAndreas Gohr 3*8788dbbdSsplitbrainuse dokuwiki\Parsing\Handler; 48553d24dSAndreas Gohruse dokuwiki\Extension\SyntaxPlugin; 554cc7aa4SAndreas Gohruse dokuwiki\Extension\PluginInterface; 6560c6061SAndreas Gohruse dokuwiki\Parsing\ModeRegistry; 7d4f83172SAndreas Gohr 8f62ea8a1Sandi/** 9f62ea8a1Sandi * Info Plugin: Displays information about various DokuWiki internals 10f62ea8a1Sandi * 11f62ea8a1Sandi * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) 12f62ea8a1Sandi * @author Andreas Gohr <andi@splitbrain.org> 13c06c1c7aSEsther Brunner * @author Esther Brunner <wikidesign@gmail.com> 14f62ea8a1Sandi */ 158553d24dSAndreas Gohrclass syntax_plugin_info extends SyntaxPlugin 16957f36a6SAndreas Gohr{ 17f62ea8a1Sandi /** 18f62ea8a1Sandi * What kind of syntax are we? 19f62ea8a1Sandi */ 20957f36a6SAndreas Gohr public function getType() 21957f36a6SAndreas Gohr { 22560c6061SAndreas Gohr return ModeRegistry::CATEGORY_SUBSTITUTION; 23f62ea8a1Sandi } 24f62ea8a1Sandi 25f62ea8a1Sandi /** 26896a5c22Sandi * What about paragraphs? 27896a5c22Sandi */ 28957f36a6SAndreas Gohr public function getPType() 29957f36a6SAndreas Gohr { 30896a5c22Sandi return 'block'; 31896a5c22Sandi } 32896a5c22Sandi 33896a5c22Sandi /** 34f62ea8a1Sandi * Where to sort in? 35f62ea8a1Sandi */ 36957f36a6SAndreas Gohr public function getSort() 37957f36a6SAndreas Gohr { 38f62ea8a1Sandi return 155; 39f62ea8a1Sandi } 40f62ea8a1Sandi 41f62ea8a1Sandi /** 42f62ea8a1Sandi * Connect pattern to lexer 43f62ea8a1Sandi */ 44957f36a6SAndreas Gohr public function connectTo($mode) 45957f36a6SAndreas Gohr { 46f62ea8a1Sandi $this->Lexer->addSpecialPattern('~~INFO:\w+~~', $mode, 'plugin_info'); 47f62ea8a1Sandi } 48f62ea8a1Sandi 49f62ea8a1Sandi /** 50f62ea8a1Sandi * Handle the match 51253d4b48SGerrit Uitslag * 52253d4b48SGerrit Uitslag * @param string $match The text matched by the patterns 53253d4b48SGerrit Uitslag * @param int $state The lexer state for the match 54253d4b48SGerrit Uitslag * @param int $pos The character position of the matched text 55*8788dbbdSsplitbrain * @param Handler $handler The Doku_Handler object 56253d4b48SGerrit Uitslag * @return array Return an array with all data you want to use in render 57f62ea8a1Sandi */ 58*8788dbbdSsplitbrain public function handle($match, $state, $pos, Handler $handler) 59957f36a6SAndreas Gohr { 60f62ea8a1Sandi $match = substr($match, 7, -2); //strip ~~INFO: from start and ~~ from end 6154cc7aa4SAndreas Gohr return [strtolower($match)]; 62f62ea8a1Sandi } 63f62ea8a1Sandi 64f62ea8a1Sandi /** 65f62ea8a1Sandi * Create output 66253d4b48SGerrit Uitslag * 67253d4b48SGerrit Uitslag * @param string $format string output format being rendered 68253d4b48SGerrit Uitslag * @param Doku_Renderer $renderer the current renderer object 69253d4b48SGerrit Uitslag * @param array $data data created by handler() 70253d4b48SGerrit Uitslag * @return boolean rendered correctly? 71f62ea8a1Sandi */ 72957f36a6SAndreas Gohr public function render($format, Doku_Renderer $renderer, $data) 73957f36a6SAndreas Gohr { 74f4e5a570Schris if ($format == 'xhtml') { 7574ed54d4SGerrit Uitslag /** @var Doku_Renderer_xhtml $renderer */ 76f62ea8a1Sandi //handle various info stuff 77093fe67eSAndreas Gohr match ($data[0]) { 78093fe67eSAndreas Gohr 'syntaxmodes' => $renderer->doc .= $this->renderSyntaxModes(), 79093fe67eSAndreas Gohr 'syntaxtypes' => $renderer->doc .= $this->renderSyntaxTypes(), 80093fe67eSAndreas Gohr 'syntaxplugins' => $this->renderPlugins('syntax', $renderer), 81093fe67eSAndreas Gohr 'adminplugins' => $this->renderPlugins('admin', $renderer), 82093fe67eSAndreas Gohr 'actionplugins' => $this->renderPlugins('action', $renderer), 83093fe67eSAndreas Gohr 'rendererplugins' => $this->renderPlugins('renderer', $renderer), 84093fe67eSAndreas Gohr 'helperplugins' => $this->renderPlugins('helper', $renderer), 85093fe67eSAndreas Gohr 'authplugins' => $this->renderPlugins('auth', $renderer), 86093fe67eSAndreas Gohr 'remoteplugins' => $this->renderPlugins('remote', $renderer), 87093fe67eSAndreas Gohr 'helpermethods' => $this->renderHelperMethods($renderer), 88093fe67eSAndreas Gohr 'hooks' => $this->renderHooks($renderer), 89093fe67eSAndreas Gohr 'datetime' => $renderer->doc .= date('r'), 90093fe67eSAndreas Gohr default => $renderer->doc .= "no info about " . htmlspecialchars($data[0]), 91093fe67eSAndreas Gohr }; 92f62ea8a1Sandi return true; 93f62ea8a1Sandi } 94f62ea8a1Sandi return false; 95f62ea8a1Sandi } 96f62ea8a1Sandi 97f62ea8a1Sandi /** 98c06c1c7aSEsther Brunner * list all installed plugins 99896a5c22Sandi * 100896a5c22Sandi * uses some of the original renderer methods 101253d4b48SGerrit Uitslag * 102253d4b48SGerrit Uitslag * @param string $type 1034baa5c86SAndreas Gohr * @param Doku_Renderer $renderer 104896a5c22Sandi */ 1054baa5c86SAndreas Gohr protected function renderPlugins($type, Doku_Renderer $renderer) 106957f36a6SAndreas Gohr { 107896a5c22Sandi global $lang; 108c06c1c7aSEsther Brunner $plugins = plugin_list($type); 10954cc7aa4SAndreas Gohr $plginfo = []; 1105f5f3ddcSAndreas Gohr 1115f5f3ddcSAndreas Gohr // remove subparts 112896a5c22Sandi foreach ($plugins as $p) { 11354cc7aa4SAndreas Gohr $po = plugin_load($type, $p); 11454cc7aa4SAndreas Gohr if (! $po instanceof PluginInterface) continue; 115a19c9aa0SGerrit Uitslag [$name, /* part */] = explode('_', $p, 2); 1165f5f3ddcSAndreas Gohr $plginfo[$name] = $po->getInfo(); 1175f5f3ddcSAndreas Gohr } 118896a5c22Sandi 1195f5f3ddcSAndreas Gohr // list them 1204baa5c86SAndreas Gohr $renderer->listu_open(); 1215f5f3ddcSAndreas Gohr foreach ($plginfo as $info) { 1224baa5c86SAndreas Gohr $renderer->listitem_open(1); 1234baa5c86SAndreas Gohr $renderer->listcontent_open(); 124896a5c22Sandi $renderer->externallink($info['url'], $info['name']); 1254baa5c86SAndreas Gohr $renderer->cdata(' '); 1264baa5c86SAndreas Gohr $renderer->emphasis_open(); 1274baa5c86SAndreas Gohr $renderer->cdata($info['date']); 1284baa5c86SAndreas Gohr $renderer->emphasis_close(); 1294baa5c86SAndreas Gohr $renderer->cdata(' ' . $lang['by'] . ' '); 130896a5c22Sandi $renderer->emaillink($info['email'], $info['author']); 1314baa5c86SAndreas Gohr $renderer->linebreak(); 1324baa5c86SAndreas Gohr $renderer->cdata($info['desc']); 1334baa5c86SAndreas Gohr $renderer->listcontent_close(); 1344baa5c86SAndreas Gohr $renderer->listitem_close(); 135896a5c22Sandi } 1364baa5c86SAndreas Gohr $renderer->listu_close(); 137896a5c22Sandi } 138896a5c22Sandi 139896a5c22Sandi /** 140c06c1c7aSEsther Brunner * list all installed plugins 141c06c1c7aSEsther Brunner * 142c06c1c7aSEsther Brunner * uses some of the original renderer methods 143253d4b48SGerrit Uitslag * 144253d4b48SGerrit Uitslag * @param Doku_Renderer_xhtml $renderer 145c06c1c7aSEsther Brunner */ 146957f36a6SAndreas Gohr protected function renderHelperMethods(Doku_Renderer_xhtml $renderer) 147957f36a6SAndreas Gohr { 148c06c1c7aSEsther Brunner $plugins = plugin_list('helper'); 149c06c1c7aSEsther Brunner foreach ($plugins as $p) { 15054cc7aa4SAndreas Gohr $po = plugin_load('helper', $p); 15154cc7aa4SAndreas Gohr if (!$po instanceof PluginInterface) continue; 152c06c1c7aSEsther Brunner 153c06c1c7aSEsther Brunner if (!method_exists($po, 'getMethods')) continue; 154c06c1c7aSEsther Brunner $methods = $po->getMethods(); 155c06c1c7aSEsther Brunner $info = $po->getInfo(); 156c06c1c7aSEsther Brunner 157957f36a6SAndreas Gohr $hid = $this->addToToc($info['name'], 2, $renderer); 158c06c1c7aSEsther Brunner $doc = '<h2><a name="' . $hid . '" id="' . $hid . '">' . hsc($info['name']) . '</a></h2>'; 159c06c1c7aSEsther Brunner $doc .= '<div class="level2">'; 16054cc7aa4SAndreas Gohr $doc .= '<p>' . strtr(hsc($info['desc']), ["\n" => "<br />"]) . '</p>'; 1619b3b9e8eSGerrit Uitslag $doc .= '<pre class="code">$' . $p . " = plugin_load('helper', '" . $p . "');</pre>"; 162c06c1c7aSEsther Brunner $doc .= '</div>'; 163c06c1c7aSEsther Brunner foreach ($methods as $method) { 164c06c1c7aSEsther Brunner $title = '$' . $p . '->' . $method['name'] . '()'; 165957f36a6SAndreas Gohr $hid = $this->addToToc($title, 3, $renderer); 166c06c1c7aSEsther Brunner $doc .= '<h3><a name="' . $hid . '" id="' . $hid . '">' . hsc($title) . '</a></h3>'; 167c06c1c7aSEsther Brunner $doc .= '<div class="level3">'; 168c7b28ffdSAnika Henke $doc .= '<div class="table"><table class="inline"><tbody>'; 169c06c1c7aSEsther Brunner $doc .= '<tr><th>Description</th><td colspan="2">' . $method['desc'] . 170c06c1c7aSEsther Brunner '</td></tr>'; 171c06c1c7aSEsther Brunner if ($method['params']) { 172c06c1c7aSEsther Brunner $c = count($method['params']); 173c06c1c7aSEsther Brunner $doc .= '<tr><th rowspan="' . $c . '">Parameters</th><td>'; 17454cc7aa4SAndreas Gohr $params = []; 175c06c1c7aSEsther Brunner foreach ($method['params'] as $desc => $type) { 176c06c1c7aSEsther Brunner $params[] = hsc($desc) . '</td><td>' . hsc($type); 177c06c1c7aSEsther Brunner } 17854cc7aa4SAndreas Gohr $doc .= implode('</td></tr><tr><td>', $params) . '</td></tr>'; 179c06c1c7aSEsther Brunner } 180c06c1c7aSEsther Brunner if ($method['return']) { 181c06c1c7aSEsther Brunner $doc .= '<tr><th>Return value</th><td>' . hsc(key($method['return'])) . 182c06c1c7aSEsther Brunner '</td><td>' . hsc(current($method['return'])) . '</td></tr>'; 183c06c1c7aSEsther Brunner } 184c7b28ffdSAnika Henke $doc .= '</tbody></table></div>'; 185c06c1c7aSEsther Brunner $doc .= '</div>'; 186c06c1c7aSEsther Brunner } 187c06c1c7aSEsther Brunner unset($po); 188c06c1c7aSEsther Brunner 189c06c1c7aSEsther Brunner $renderer->doc .= $doc; 190c06c1c7aSEsther Brunner } 191c06c1c7aSEsther Brunner } 192c06c1c7aSEsther Brunner 193c06c1c7aSEsther Brunner /** 194f62ea8a1Sandi * lists all known syntax types and their registered modes 195253d4b48SGerrit Uitslag * 196253d4b48SGerrit Uitslag * @return string 197f62ea8a1Sandi */ 198957f36a6SAndreas Gohr protected function renderSyntaxTypes() 199957f36a6SAndreas Gohr { 200f62ea8a1Sandi global $PARSER_MODES; 201f62ea8a1Sandi $doc = ''; 202f62ea8a1Sandi 203c7b28ffdSAnika Henke $doc .= '<div class="table"><table class="inline"><tbody>'; 204f62ea8a1Sandi foreach ($PARSER_MODES as $mode => $modes) { 205f62ea8a1Sandi $doc .= '<tr>'; 206f62ea8a1Sandi $doc .= '<td class="leftalign">'; 207f62ea8a1Sandi $doc .= $mode; 208f62ea8a1Sandi $doc .= '</td>'; 209f62ea8a1Sandi $doc .= '<td class="leftalign">'; 21054cc7aa4SAndreas Gohr $doc .= implode(', ', $modes); 211f62ea8a1Sandi $doc .= '</td>'; 212f62ea8a1Sandi $doc .= '</tr>'; 213f62ea8a1Sandi } 214c7b28ffdSAnika Henke $doc .= '</tbody></table></div>'; 215f62ea8a1Sandi return $doc; 216f62ea8a1Sandi } 217f62ea8a1Sandi 218f62ea8a1Sandi /** 219f62ea8a1Sandi * lists all known syntax modes and their sorting value 220253d4b48SGerrit Uitslag * 221253d4b48SGerrit Uitslag * @return string 222f62ea8a1Sandi */ 223957f36a6SAndreas Gohr protected function renderSyntaxModes() 224957f36a6SAndreas Gohr { 225f62ea8a1Sandi $modes = p_get_parsermodes(); 226f62ea8a1Sandi 22754cc7aa4SAndreas Gohr $compactmodes = []; 228f62ea8a1Sandi foreach ($modes as $mode) { 229a27c9d6fSGerrit Uitslag $compactmodes[$mode['sort']][] = $mode['mode']; 230f62ea8a1Sandi } 231a27c9d6fSGerrit Uitslag $doc = ''; 232a27c9d6fSGerrit Uitslag $doc .= '<div class="table"><table class="inline"><tbody>'; 233a27c9d6fSGerrit Uitslag 234a27c9d6fSGerrit Uitslag foreach ($compactmodes as $sort => $modes) { 235a27c9d6fSGerrit Uitslag $rowspan = ''; 236a27c9d6fSGerrit Uitslag if (count($modes) > 1) { 237a27c9d6fSGerrit Uitslag $rowspan = ' rowspan="' . count($modes) . '"'; 238a27c9d6fSGerrit Uitslag } 239a27c9d6fSGerrit Uitslag 240a27c9d6fSGerrit Uitslag foreach ($modes as $index => $mode) { 241a27c9d6fSGerrit Uitslag $doc .= '<tr>'; 242a27c9d6fSGerrit Uitslag $doc .= '<td class="leftalign">'; 243a27c9d6fSGerrit Uitslag $doc .= $mode; 244a27c9d6fSGerrit Uitslag $doc .= '</td>'; 245a27c9d6fSGerrit Uitslag 246a27c9d6fSGerrit Uitslag if ($index === 0) { 247a27c9d6fSGerrit Uitslag $doc .= '<td class="rightalign" ' . $rowspan . '>'; 248a27c9d6fSGerrit Uitslag $doc .= $sort; 249a27c9d6fSGerrit Uitslag $doc .= '</td>'; 250a27c9d6fSGerrit Uitslag } 251a27c9d6fSGerrit Uitslag $doc .= '</tr>'; 252a27c9d6fSGerrit Uitslag } 253a27c9d6fSGerrit Uitslag } 254a27c9d6fSGerrit Uitslag 255a27c9d6fSGerrit Uitslag $doc .= '</tbody></table></div>'; 256f62ea8a1Sandi return $doc; 257f62ea8a1Sandi } 258c06c1c7aSEsther Brunner 259c06c1c7aSEsther Brunner /** 260e9ac59e9SAndreas Gohr * Render all currently registered event handlers 261e9ac59e9SAndreas Gohr * 262e9ac59e9SAndreas Gohr * @param Doku_Renderer $renderer 263e9ac59e9SAndreas Gohr */ 264e9ac59e9SAndreas Gohr protected function renderHooks(Doku_Renderer $renderer) 265e9ac59e9SAndreas Gohr { 266e9ac59e9SAndreas Gohr global $EVENT_HANDLER; 267e9ac59e9SAndreas Gohr 268e9ac59e9SAndreas Gohr $list = $EVENT_HANDLER->getEventHandlers(); 269e9ac59e9SAndreas Gohr ksort($list); 270e9ac59e9SAndreas Gohr 271e9ac59e9SAndreas Gohr $renderer->listu_open(); 272e9ac59e9SAndreas Gohr foreach ($list as $event => $handlers) { 273e9ac59e9SAndreas Gohr $renderer->listitem_open(1); 274e9ac59e9SAndreas Gohr $renderer->listcontent_open(); 275e9ac59e9SAndreas Gohr $renderer->cdata($event); 276e9ac59e9SAndreas Gohr $renderer->listcontent_close(); 277e9ac59e9SAndreas Gohr 278e9ac59e9SAndreas Gohr $renderer->listo_open(); 279e9ac59e9SAndreas Gohr foreach ($handlers as $sequence) { 280e9ac59e9SAndreas Gohr foreach ($sequence as $handler) { 281e9ac59e9SAndreas Gohr $renderer->listitem_open(2); 282e9ac59e9SAndreas Gohr $renderer->listcontent_open(); 283093fe67eSAndreas Gohr $renderer->cdata($handler[0]::class . '::' . $handler[1] . '()'); 284e9ac59e9SAndreas Gohr $renderer->listcontent_close(); 285e9ac59e9SAndreas Gohr $renderer->listitem_close(); 286e9ac59e9SAndreas Gohr } 287e9ac59e9SAndreas Gohr } 288e9ac59e9SAndreas Gohr $renderer->listo_close(); 289e9ac59e9SAndreas Gohr $renderer->listitem_close(); 290e9ac59e9SAndreas Gohr } 291e9ac59e9SAndreas Gohr $renderer->listu_close(); 292e9ac59e9SAndreas Gohr } 293e9ac59e9SAndreas Gohr 294e9ac59e9SAndreas Gohr /** 295c06c1c7aSEsther Brunner * Adds a TOC item 29659bc3b48SGerrit Uitslag * 29759bc3b48SGerrit Uitslag * @param string $text 29859bc3b48SGerrit Uitslag * @param int $level 29959bc3b48SGerrit Uitslag * @param Doku_Renderer_xhtml $renderer 30059bc3b48SGerrit Uitslag * @return string 301c06c1c7aSEsther Brunner */ 302957f36a6SAndreas Gohr protected function addToToc($text, $level, Doku_Renderer_xhtml $renderer) 303957f36a6SAndreas Gohr { 304c06c1c7aSEsther Brunner global $conf; 305c06c1c7aSEsther Brunner 30659bc3b48SGerrit Uitslag $hid = ''; 307c06c1c7aSEsther Brunner if (($level >= $conf['toptoclevel']) && ($level <= $conf['maxtoclevel'])) { 308e0c26282SGerrit Uitslag $hid = $renderer->_headerToLink($text, true); 30954cc7aa4SAndreas Gohr $renderer->toc[] = [ 310c06c1c7aSEsther Brunner 'hid' => $hid, 311c06c1c7aSEsther Brunner 'title' => $text, 312c06c1c7aSEsther Brunner 'type' => 'ul', 31354cc7aa4SAndreas Gohr 'level' => $level - $conf['toptoclevel'] + 1 31454cc7aa4SAndreas Gohr ]; 315c06c1c7aSEsther Brunner } 316c06c1c7aSEsther Brunner return $hid; 317c06c1c7aSEsther Brunner } 318f62ea8a1Sandi} 319