1f68bc0caSSzymon Olewniczak<?php 2*6cdebc53SAnna Dabrowska 3*6cdebc53SAnna Dabrowskause dokuwiki\Extension\Event; 4*6cdebc53SAnna Dabrowskause dokuwiki\Extension\SyntaxPlugin; 5*6cdebc53SAnna Dabrowska 6f68bc0caSSzymon Olewniczak/** 7f68bc0caSSzymon Olewniczak * DokuWiki Plugin notification (Syntax Component) 8f68bc0caSSzymon Olewniczak * 9f68bc0caSSzymon Olewniczak * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html 10f68bc0caSSzymon Olewniczak * @author Szymon Olewniczak <it@rid.pl> 11f68bc0caSSzymon Olewniczak */ 12f68bc0caSSzymon Olewniczak 13*6cdebc53SAnna Dabrowskaclass syntax_plugin_notification_list extends SyntaxPlugin 14f68bc0caSSzymon Olewniczak{ 15*6cdebc53SAnna Dabrowska public function getType() 16*6cdebc53SAnna Dabrowska { 17f68bc0caSSzymon Olewniczak return 'substition'; 18f68bc0caSSzymon Olewniczak } 19f68bc0caSSzymon Olewniczak 20*6cdebc53SAnna Dabrowska public function getSort() 21*6cdebc53SAnna Dabrowska { 22f68bc0caSSzymon Olewniczak return 20; 23f68bc0caSSzymon Olewniczak } 24f68bc0caSSzymon Olewniczak 25*6cdebc53SAnna Dabrowska public function PType() 26*6cdebc53SAnna Dabrowska { 27f68bc0caSSzymon Olewniczak return 'block'; 28f68bc0caSSzymon Olewniczak } 29f68bc0caSSzymon Olewniczak 30*6cdebc53SAnna Dabrowska public function connectTo($mode) 31*6cdebc53SAnna Dabrowska { 32f68bc0caSSzymon Olewniczak $this->Lexer->addSpecialPattern('----+ *notification list *-+\n.*?----+', $mode, 'plugin_notification_list'); 33f68bc0caSSzymon Olewniczak } 34f68bc0caSSzymon Olewniczak 35*6cdebc53SAnna Dabrowska public function handle($match, $state, $pos, Doku_Handler $handler) 36*6cdebc53SAnna Dabrowska { 37f68bc0caSSzymon Olewniczak $lines = explode("\n", $match); 38f68bc0caSSzymon Olewniczak array_shift($lines); 39f68bc0caSSzymon Olewniczak array_pop($lines); 40f68bc0caSSzymon Olewniczak 41f68bc0caSSzymon Olewniczak $params = [ 42f68bc0caSSzymon Olewniczak 'plugin' => '.*', 43a8cc16e3SSzymon Olewniczak 'user' => '$USER$', 44f68bc0caSSzymon Olewniczak 'full' => true, 45a8cc16e3SSzymon Olewniczak 'date' => '%Y-%m-%d' 46f68bc0caSSzymon Olewniczak ]; 47f68bc0caSSzymon Olewniczak foreach ($lines as $line) { 48f68bc0caSSzymon Olewniczak $pair = explode(':', $line, 2); 49f68bc0caSSzymon Olewniczak if (count($pair) < 2) { 50f68bc0caSSzymon Olewniczak continue; 51f68bc0caSSzymon Olewniczak } 52f68bc0caSSzymon Olewniczak $key = trim($pair[0]); 53f68bc0caSSzymon Olewniczak $value = trim($pair[1]); 54f68bc0caSSzymon Olewniczak 55f68bc0caSSzymon Olewniczak if ($key == 'full') { 56*6cdebc53SAnna Dabrowska $value = $value != '0'; 57f68bc0caSSzymon Olewniczak } 58f68bc0caSSzymon Olewniczak 59f68bc0caSSzymon Olewniczak $params[$key] = $value; 60f68bc0caSSzymon Olewniczak } 61f68bc0caSSzymon Olewniczak return $params; 62f68bc0caSSzymon Olewniczak } 63f68bc0caSSzymon Olewniczak 64f68bc0caSSzymon Olewniczak /** 65f68bc0caSSzymon Olewniczak * Render xhtml output or metadata 66f68bc0caSSzymon Olewniczak * 67f68bc0caSSzymon Olewniczak * @param string $mode Renderer mode (supported modes: xhtml) 68f68bc0caSSzymon Olewniczak * @param Doku_Renderer $renderer The renderer 69f68bc0caSSzymon Olewniczak * @param array $data The data from the handler() function 70f68bc0caSSzymon Olewniczak * 71f68bc0caSSzymon Olewniczak * @return bool If rendering was successful. 72f68bc0caSSzymon Olewniczak */ 73f68bc0caSSzymon Olewniczak 74f68bc0caSSzymon Olewniczak public function render($mode, Doku_Renderer $renderer, $data) 75f68bc0caSSzymon Olewniczak { 76f68bc0caSSzymon Olewniczak if (!$data) { 77f68bc0caSSzymon Olewniczak return false; 78f68bc0caSSzymon Olewniczak } 79f68bc0caSSzymon Olewniczak 80f68bc0caSSzymon Olewniczak $method = 'render' . ucfirst($mode); 81f68bc0caSSzymon Olewniczak if (method_exists($this, $method)) { 82f68bc0caSSzymon Olewniczak call_user_func([$this, $method], $renderer, $data); 83f68bc0caSSzymon Olewniczak return true; 84f68bc0caSSzymon Olewniczak } 85f68bc0caSSzymon Olewniczak return false; 86f68bc0caSSzymon Olewniczak } 87f68bc0caSSzymon Olewniczak 88f68bc0caSSzymon Olewniczak /** 89f68bc0caSSzymon Olewniczak * @param $pattern 90f68bc0caSSzymon Olewniczak * @return array 91f68bc0caSSzymon Olewniczak */ 92f68bc0caSSzymon Olewniczak protected function getNotificationPlugins($pattern) 93f68bc0caSSzymon Olewniczak { 94f68bc0caSSzymon Olewniczak $plugins = []; 95*6cdebc53SAnna Dabrowska Event::createAndTrigger('PLUGIN_NOTIFICATION_REGISTER_SOURCE', $plugins); 96f68bc0caSSzymon Olewniczak $plugins = preg_grep('/' . $pattern . '/', $plugins); 97f68bc0caSSzymon Olewniczak 98f68bc0caSSzymon Olewniczak return $plugins; 99f68bc0caSSzymon Olewniczak } 100f68bc0caSSzymon Olewniczak 101f68bc0caSSzymon Olewniczak /** 102f68bc0caSSzymon Olewniczak * Render metadata 103f68bc0caSSzymon Olewniczak * 104f68bc0caSSzymon Olewniczak * @param Doku_Renderer $renderer The renderer 105f68bc0caSSzymon Olewniczak * @param array $data The data from the handler() function 106f68bc0caSSzymon Olewniczak */ 107f68bc0caSSzymon Olewniczak public function renderMetadata(Doku_Renderer $renderer, $data) 108f68bc0caSSzymon Olewniczak { 109f68bc0caSSzymon Olewniczak $plugin_name = $this->getPluginName(); 110f68bc0caSSzymon Olewniczak 111f68bc0caSSzymon Olewniczak $plugins = $this->getNotificationPlugins($data['plugin']); 112a8cc16e3SSzymon Olewniczak $old_plugins = $renderer->meta['plugin'][$plugin_name]['plugins']; 113f68bc0caSSzymon Olewniczak if (!$old_plugins) { 114f68bc0caSSzymon Olewniczak $old_plugins = []; 115f68bc0caSSzymon Olewniczak } 116f68bc0caSSzymon Olewniczak 117a8cc16e3SSzymon Olewniczak $renderer->meta['plugin'][$plugin_name]['plugins'] = array_unique(array_merge($plugins, $old_plugins)); 118a8cc16e3SSzymon Olewniczak if ($data['user'] == '$USER$') { 119a8cc16e3SSzymon Olewniczak $renderer->meta['plugin'][$plugin_name]['dynamic user'] = true; 120a8cc16e3SSzymon Olewniczak } 121f68bc0caSSzymon Olewniczak } 122f68bc0caSSzymon Olewniczak 123f68bc0caSSzymon Olewniczak /** 124f68bc0caSSzymon Olewniczak * Render xhtml 125f68bc0caSSzymon Olewniczak * 126f68bc0caSSzymon Olewniczak * @param Doku_Renderer $renderer The renderer 127f68bc0caSSzymon Olewniczak * @param array $data The data from the handler() function 128f68bc0caSSzymon Olewniczak */ 129f68bc0caSSzymon Olewniczak public function renderXhtml(Doku_Renderer $renderer, $data) 130f68bc0caSSzymon Olewniczak { 131f68bc0caSSzymon Olewniczak global $INFO; 132f68bc0caSSzymon Olewniczak 133f68bc0caSSzymon Olewniczak $plugins = $this->getNotificationPlugins($data['plugin']); 134f68bc0caSSzymon Olewniczak 135a8cc16e3SSzymon Olewniczak if ($data['user'] == '$USER$') { 136a8cc16e3SSzymon Olewniczak $data['user'] = $INFO['client']; 137a8cc16e3SSzymon Olewniczak } 138a8cc16e3SSzymon Olewniczak 139f68bc0caSSzymon Olewniczak $notifications_data = [ 140f68bc0caSSzymon Olewniczak 'plugins' => $plugins, 141a8cc16e3SSzymon Olewniczak 'user' => $data['user'], 142f68bc0caSSzymon Olewniczak 'notifications' => [] 143f68bc0caSSzymon Olewniczak ]; 144*6cdebc53SAnna Dabrowska Event::createAndTrigger('PLUGIN_NOTIFICATION_GATHER', $notifications_data); 145f68bc0caSSzymon Olewniczak 146f68bc0caSSzymon Olewniczak $notifications = $notifications_data['notifications']; 147f68bc0caSSzymon Olewniczak 148f68bc0caSSzymon Olewniczak if (!$notifications) { 149f68bc0caSSzymon Olewniczak $renderer->doc .= $this->getLang('no notifications'); 150f68bc0caSSzymon Olewniczak return; 151f68bc0caSSzymon Olewniczak } 152f68bc0caSSzymon Olewniczak 153f68bc0caSSzymon Olewniczak $renderer->doc .= '<ul>'; 154f68bc0caSSzymon Olewniczak 155f68bc0caSSzymon Olewniczak usort($notifications, function ($a, $b) { 156f68bc0caSSzymon Olewniczak if ($a['timestamp'] == $b['timestamp']) { 157f68bc0caSSzymon Olewniczak return 0; 158f68bc0caSSzymon Olewniczak } 159f68bc0caSSzymon Olewniczak return ($a['timestamp'] > $b['timestamp']) ? -1 : 1; 160f68bc0caSSzymon Olewniczak }); 161f68bc0caSSzymon Olewniczak 162f68bc0caSSzymon Olewniczak foreach ($notifications as $notification) { 163f68bc0caSSzymon Olewniczak $content = $notification[$data['full'] ? 'full' : 'brief']; 164f68bc0caSSzymon Olewniczak $timestamp = $notification['timestamp']; 165f68bc0caSSzymon Olewniczak 166f68bc0caSSzymon Olewniczak $date = ''; 167f68bc0caSSzymon Olewniczak if ($data['date']) { 168f68bc0caSSzymon Olewniczak $date = strftime($data['date'], $timestamp); 169f68bc0caSSzymon Olewniczak } 170f68bc0caSSzymon Olewniczak 171f68bc0caSSzymon Olewniczak $renderer->doc .= "<li class=\"level1\"><div class=\"li\">$date $content</div></li>"; 172f68bc0caSSzymon Olewniczak } 173f68bc0caSSzymon Olewniczak $renderer->doc .= '</ul>'; 174f68bc0caSSzymon Olewniczak } 175f68bc0caSSzymon Olewniczak} 176