1 <?php
2 /**
3  * DokuWiki Plugin extendpage (Action Component)
4  *
5  * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
6  * @author  Frieder Schrempf <dev@fris.de>
7  */
8 
9 use dokuwiki\plugin\extendpage\meta\Assignments;
10 use dokuwiki\plugin\extendpage\meta\ExtendPageException;
11 
12 // must be run within Dokuwiki
13 if (!defined('DOKU_INC')) {
14     die();
15 }
16 
17 class action_plugin_extendpage extends DokuWiki_Action_Plugin
18 {
19 
20     /**
21      * Registers a callback function for a given event
22      *
23      * @param Doku_Event_Handler $controller DokuWiki's event controller object
24      *
25      * @return void
26      */
27     public function register(Doku_Event_Handler $controller)
28     {
29         $controller->register_hook('PARSER_WIKITEXT_PREPROCESS', 'AFTER', $this, 'extend_page');
30     }
31 
32     /**
33      * [Custom event handler which performs action]
34      *
35      * Called for event:
36      *
37      * @param Doku_Event $event  event object by reference
38      * @param mixed      $param  [the parameters passed as fifth argument to register_hook() when this
39      *                           handler was registered]
40      *
41      * @return void
42      */
43     public function extend_page(Doku_Event $event, $param)
44     {
45         global $ID;
46         $positions = array('replace', 'top', 'bottom');
47 
48         if (!page_exists($ID)) return;
49 
50         try {
51             $assignments = Assignments::getInstance();
52         } catch (ExtendPageException $e) {
53             return false;
54         }
55 
56         foreach ($positions as $pos) {
57             $idx = $pos === 'bottom' ? strlen($event->data):0;
58             $extensions = $assignments->getPageAssignments($ID, $pos);
59             if (!$extensions) return true;
60 
61             foreach ($extensions as $ext) {
62                 if ($pos === 'replace') {
63                     $event->data = rawWiki($ext['page']);
64                 } else {
65                     $event->data = substr_replace($event->data,
66                         ($pos === 'top' ? '':'\\\ ') . rawWiki($ext['page']) . ($pos === 'top' ? '\\\ ':''),
67                         $idx, 0
68                     );
69                 }
70             }
71         }
72     }
73 }
74 
75