123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337 |
- <?php
- /**
- * Info Plugin: Displays information about various DokuWiki internals
- *
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- * @author Andreas Gohr <andi@splitbrain.org>
- * @author Esther Brunner <wikidesign@gmail.com>
- */
- class syntax_plugin_info extends DokuWiki_Syntax_Plugin
- {
- /**
- * What kind of syntax are we?
- */
- public function getType()
- {
- return 'substition';
- }
- /**
- * What about paragraphs?
- */
- public function getPType()
- {
- return 'block';
- }
- /**
- * Where to sort in?
- */
- public function getSort()
- {
- return 155;
- }
- /**
- * Connect pattern to lexer
- */
- public function connectTo($mode)
- {
- $this->Lexer->addSpecialPattern('~~INFO:\w+~~', $mode, 'plugin_info');
- }
- /**
- * Handle the match
- *
- * @param string $match The text matched by the patterns
- * @param int $state The lexer state for the match
- * @param int $pos The character position of the matched text
- * @param Doku_Handler $handler The Doku_Handler object
- * @return array Return an array with all data you want to use in render
- */
- public function handle($match, $state, $pos, Doku_Handler $handler)
- {
- $match = substr($match, 7, -2); //strip ~~INFO: from start and ~~ from end
- return array(strtolower($match));
- }
- /**
- * Create output
- *
- * @param string $format string output format being rendered
- * @param Doku_Renderer $renderer the current renderer object
- * @param array $data data created by handler()
- * @return boolean rendered correctly?
- */
- public function render($format, Doku_Renderer $renderer, $data)
- {
- if ($format == 'xhtml') {
- /** @var Doku_Renderer_xhtml $renderer */
- //handle various info stuff
- switch ($data[0]) {
- case 'syntaxmodes':
- $renderer->doc .= $this->renderSyntaxModes();
- break;
- case 'syntaxtypes':
- $renderer->doc .= $this->renderSyntaxTypes();
- break;
- case 'syntaxplugins':
- $this->renderPlugins('syntax', $renderer);
- break;
- case 'adminplugins':
- $this->renderPlugins('admin', $renderer);
- break;
- case 'actionplugins':
- $this->renderPlugins('action', $renderer);
- break;
- case 'rendererplugins':
- $this->renderPlugins('renderer', $renderer);
- break;
- case 'helperplugins':
- $this->renderPlugins('helper', $renderer);
- break;
- case 'authplugins':
- $this->renderPlugins('auth', $renderer);
- break;
- case 'remoteplugins':
- $this->renderPlugins('remote', $renderer);
- break;
- case 'helpermethods':
- $this->renderHelperMethods($renderer);
- break;
- case 'hooks':
- $this->renderHooks($renderer);
- break;
- case 'datetime':
- $renderer->doc .= date('r');
- break;
- default:
- $renderer->doc .= "no info about " . htmlspecialchars($data[0]);
- }
- return true;
- }
- return false;
- }
- /**
- * list all installed plugins
- *
- * uses some of the original renderer methods
- *
- * @param string $type
- * @param Doku_Renderer $renderer
- */
- protected function renderPlugins($type, Doku_Renderer $renderer)
- {
- global $lang;
- $plugins = plugin_list($type);
- $plginfo = array();
- // remove subparts
- foreach ($plugins as $p) {
- if (!$po = plugin_load($type, $p)) continue;
- list($name,/* $part */) = explode('_', $p, 2);
- $plginfo[$name] = $po->getInfo();
- }
- // list them
- $renderer->listu_open();
- foreach ($plginfo as $info) {
- $renderer->listitem_open(1);
- $renderer->listcontent_open();
- $renderer->externallink($info['url'], $info['name']);
- $renderer->cdata(' ');
- $renderer->emphasis_open();
- $renderer->cdata($info['date']);
- $renderer->emphasis_close();
- $renderer->cdata(' ' . $lang['by'] . ' ');
- $renderer->emaillink($info['email'], $info['author']);
- $renderer->linebreak();
- $renderer->cdata($info['desc']);
- $renderer->listcontent_close();
- $renderer->listitem_close();
- }
- $renderer->listu_close();
- }
- /**
- * list all installed plugins
- *
- * uses some of the original renderer methods
- *
- * @param Doku_Renderer_xhtml $renderer
- */
- protected function renderHelperMethods(Doku_Renderer_xhtml $renderer)
- {
- $plugins = plugin_list('helper');
- foreach ($plugins as $p) {
- if (!$po = plugin_load('helper', $p)) continue;
- if (!method_exists($po, 'getMethods')) continue;
- $methods = $po->getMethods();
- $info = $po->getInfo();
- $hid = $this->addToToc($info['name'], 2, $renderer);
- $doc = '<h2><a name="' . $hid . '" id="' . $hid . '">' . hsc($info['name']) . '</a></h2>';
- $doc .= '<div class="level2">';
- $doc .= '<p>' . strtr(hsc($info['desc']), array("\n" => "<br />")) . '</p>';
- $doc .= '<pre class="code">$' . $p . " = plugin_load('helper', '" . $p . "');</pre>";
- $doc .= '</div>';
- foreach ($methods as $method) {
- $title = '$' . $p . '->' . $method['name'] . '()';
- $hid = $this->addToToc($title, 3, $renderer);
- $doc .= '<h3><a name="' . $hid . '" id="' . $hid . '">' . hsc($title) . '</a></h3>';
- $doc .= '<div class="level3">';
- $doc .= '<div class="table"><table class="inline"><tbody>';
- $doc .= '<tr><th>Description</th><td colspan="2">' . $method['desc'] .
- '</td></tr>';
- if ($method['params']) {
- $c = count($method['params']);
- $doc .= '<tr><th rowspan="' . $c . '">Parameters</th><td>';
- $params = array();
- foreach ($method['params'] as $desc => $type) {
- $params[] = hsc($desc) . '</td><td>' . hsc($type);
- }
- $doc .= join('</td></tr><tr><td>', $params) . '</td></tr>';
- }
- if ($method['return']) {
- $doc .= '<tr><th>Return value</th><td>' . hsc(key($method['return'])) .
- '</td><td>' . hsc(current($method['return'])) . '</td></tr>';
- }
- $doc .= '</tbody></table></div>';
- $doc .= '</div>';
- }
- unset($po);
- $renderer->doc .= $doc;
- }
- }
- /**
- * lists all known syntax types and their registered modes
- *
- * @return string
- */
- protected function renderSyntaxTypes()
- {
- global $PARSER_MODES;
- $doc = '';
- $doc .= '<div class="table"><table class="inline"><tbody>';
- foreach ($PARSER_MODES as $mode => $modes) {
- $doc .= '<tr>';
- $doc .= '<td class="leftalign">';
- $doc .= $mode;
- $doc .= '</td>';
- $doc .= '<td class="leftalign">';
- $doc .= join(', ', $modes);
- $doc .= '</td>';
- $doc .= '</tr>';
- }
- $doc .= '</tbody></table></div>';
- return $doc;
- }
- /**
- * lists all known syntax modes and their sorting value
- *
- * @return string
- */
- protected function renderSyntaxModes()
- {
- $modes = p_get_parsermodes();
- $compactmodes = array();
- foreach ($modes as $mode) {
- $compactmodes[$mode['sort']][] = $mode['mode'];
- }
- $doc = '';
- $doc .= '<div class="table"><table class="inline"><tbody>';
- foreach ($compactmodes as $sort => $modes) {
- $rowspan = '';
- if (count($modes) > 1) {
- $rowspan = ' rowspan="' . count($modes) . '"';
- }
- foreach ($modes as $index => $mode) {
- $doc .= '<tr>';
- $doc .= '<td class="leftalign">';
- $doc .= $mode;
- $doc .= '</td>';
- if ($index === 0) {
- $doc .= '<td class="rightalign" ' . $rowspan . '>';
- $doc .= $sort;
- $doc .= '</td>';
- }
- $doc .= '</tr>';
- }
- }
- $doc .= '</tbody></table></div>';
- return $doc;
- }
- /**
- * Render all currently registered event handlers
- *
- * @param Doku_Renderer $renderer
- */
- protected function renderHooks(Doku_Renderer $renderer)
- {
- global $EVENT_HANDLER;
- $list = $EVENT_HANDLER->getEventHandlers();
- ksort($list);
- $renderer->listu_open();
- foreach ($list as $event => $handlers) {
- $renderer->listitem_open(1);
- $renderer->listcontent_open();
- $renderer->cdata($event);
- $renderer->listcontent_close();
- $renderer->listo_open();
- foreach ($handlers as $sequence) {
- foreach ($sequence as $handler) {
- $renderer->listitem_open(2);
- $renderer->listcontent_open();
- $renderer->cdata(get_class($handler[0]) . '::' . $handler[1] . '()');
- $renderer->listcontent_close();
- $renderer->listitem_close();
- }
- }
- $renderer->listo_close();
- $renderer->listitem_close();
- }
- $renderer->listu_close();
- }
- /**
- * Adds a TOC item
- *
- * @param string $text
- * @param int $level
- * @param Doku_Renderer_xhtml $renderer
- * @return string
- */
- protected function addToToc($text, $level, Doku_Renderer_xhtml $renderer)
- {
- global $conf;
- $hid = '';
- if (($level >= $conf['toptoclevel']) && ($level <= $conf['maxtoclevel'])) {
- $hid = $renderer->_headerToLink($text, true);
- $renderer->toc[] = array(
- 'hid' => $hid,
- 'title' => $text,
- 'type' => 'ul',
- 'level' => $level - $conf['toptoclevel'] + 1,
- );
- }
- return $hid;
- }
- }
|