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