1<?php
2
3/**
4 * DokuWiki Plugin structsection (Action Component)
5 *
6 * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
7 * @author  Michael Große <mic.grosse@googlemail.com>
8 */
9
10class action_plugin_structsection extends \DokuWiki_Action_Plugin
11{
12    /**
13     * Registers a callback function for a given event
14     *
15     * @param \Doku_Event_Handler $controller DokuWiki's event controller object
16     * @return void
17     */
18    public function register(\Doku_Event_Handler $controller)
19    {
20        $controller->register_hook('DOKUWIKI_STARTED', 'AFTER', $this, 'addPageRevisionToJSINFO');
21        $controller->register_hook('PARSER_HANDLER_DONE', 'AFTER', $this, 'appendPluginOutputToPage');
22        $controller->register_hook('PLUGIN_STRUCT_TYPECLASS_INIT', 'BEFORE', $this, 'registerTypeWithStructPlugin');
23    }
24
25    public function addPageRevisionToJSINFO(\Doku_Event $event, $param)
26    {
27        global $ACT;
28
29        if (act_clean($ACT) !== 'show') {
30            return;
31        }
32        global $JSINFO, $INFO;
33        $JSINFO['plugin_structsection'] = [
34            'rev' => $INFO['currentrev'],
35        ];
36    }
37
38    /**
39     * Event handler for PARSER_HANDLER_DONE
40     *
41     * @param \Doku_Event $event event object by reference
42     * @param mixed $param [the parameters passed as fifth argument to register_hook() when this
43     *                           handler was registered]
44     * @return void
45     */
46    final public function appendPluginOutputToPage(\Doku_Event $event, $param)
47    {
48        static $instructionsAdded = false;
49
50        /** @var \helper_plugin_struct $struct */
51        $struct = plugin_load('helper', 'struct');
52        if (!$struct) {
53            return;
54        }
55
56        global $ACT;
57
58        if (act_clean($ACT) != 'show') {
59            return;
60        }
61
62        if ($instructionsAdded) {
63            return;
64        }
65
66        $instructionsAdded = true;
67
68        $last = end($event->data->calls);
69
70        $INSTRUCTION_POSITION_INDEX = 2;
71        $pos = $last[$INSTRUCTION_POSITION_INDEX];
72
73        $event->data->calls[] = array(
74            'plugin',
75            array(
76                'structsection', array('pos' => $pos), DOKU_LEXER_SPECIAL, '',
77            ),
78            $pos,
79        );
80    }
81
82    /**
83     * Event handler for PLUGIN_STRUCT_TYPECLASS_INIT
84     *
85     * @param \Doku_Event $event
86     * @param            $param
87     */
88    final public function registerTypeWithStructPlugin(\Doku_Event $event, $param)
89    {
90        $event->data['Section'] = 'dokuwiki\\plugin\\structsection\\types\\Section';
91    }
92}
93
94// vim:ts=4:sw=4:et:
95