xref: /plugin/notification/syntax/list.php (revision f68bc0cad99c286d8e0c66eaf9a10e1ac194f587)
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