xref: /plugin/notification/syntax/list.php (revision 8966b361aabafbae8692633f59dfbbd04f701bc9)
1f68bc0caSSzymon Olewniczak<?php
26cdebc53SAnna Dabrowska
36cdebc53SAnna Dabrowskause dokuwiki\Extension\Event;
46cdebc53SAnna Dabrowskause dokuwiki\Extension\SyntaxPlugin;
56cdebc53SAnna 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
136cdebc53SAnna Dabrowskaclass syntax_plugin_notification_list extends SyntaxPlugin
14f68bc0caSSzymon Olewniczak{
156cdebc53SAnna Dabrowska    public function getType()
166cdebc53SAnna Dabrowska    {
17f68bc0caSSzymon Olewniczak        return 'substition';
18f68bc0caSSzymon Olewniczak    }
19f68bc0caSSzymon Olewniczak
206cdebc53SAnna Dabrowska    public function getSort()
216cdebc53SAnna Dabrowska    {
22f68bc0caSSzymon Olewniczak        return 20;
23f68bc0caSSzymon Olewniczak    }
24f68bc0caSSzymon Olewniczak
256cdebc53SAnna Dabrowska    public function PType()
266cdebc53SAnna Dabrowska    {
27f68bc0caSSzymon Olewniczak        return 'block';
28f68bc0caSSzymon Olewniczak    }
29f68bc0caSSzymon Olewniczak
306cdebc53SAnna Dabrowska    public function connectTo($mode)
316cdebc53SAnna Dabrowska    {
32f68bc0caSSzymon Olewniczak        $this->Lexer->addSpecialPattern('----+ *notification list *-+\n.*?----+', $mode, 'plugin_notification_list');
33f68bc0caSSzymon Olewniczak    }
34f68bc0caSSzymon Olewniczak
356cdebc53SAnna Dabrowska    public function handle($match, $state, $pos, Doku_Handler $handler)
366cdebc53SAnna 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') {
566cdebc53SAnna 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 = [];
956cdebc53SAnna 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();
110*8966b361SSzymon Olewniczak        if (!isset($renderer->meta['plugin'][$plugin_name])) {
111*8966b361SSzymon Olewniczak            $renderer->meta['plugin'][$plugin_name] = ['plugins' => []];
112*8966b361SSzymon Olewniczak        }
113f68bc0caSSzymon Olewniczak        $plugins = $this->getNotificationPlugins($data['plugin']);
114a8cc16e3SSzymon Olewniczak        $old_plugins = $renderer->meta['plugin'][$plugin_name]['plugins'];
115f68bc0caSSzymon Olewniczak
116a8cc16e3SSzymon Olewniczak        $renderer->meta['plugin'][$plugin_name]['plugins'] = array_unique(array_merge($plugins, $old_plugins));
117a8cc16e3SSzymon Olewniczak        if ($data['user'] == '$USER$') {
118a8cc16e3SSzymon Olewniczak            $renderer->meta['plugin'][$plugin_name]['dynamic user'] = true;
119a8cc16e3SSzymon Olewniczak        }
120f68bc0caSSzymon Olewniczak    }
121f68bc0caSSzymon Olewniczak
122f68bc0caSSzymon Olewniczak    /**
123f68bc0caSSzymon Olewniczak     * Render xhtml
124f68bc0caSSzymon Olewniczak     *
125f68bc0caSSzymon Olewniczak     * @param Doku_Renderer $renderer The renderer
126f68bc0caSSzymon Olewniczak     * @param array         $data     The data from the handler() function
127f68bc0caSSzymon Olewniczak     */
128f68bc0caSSzymon Olewniczak    public function renderXhtml(Doku_Renderer $renderer, $data)
129f68bc0caSSzymon Olewniczak    {
130f68bc0caSSzymon Olewniczak        global $INFO;
131f68bc0caSSzymon Olewniczak
132f68bc0caSSzymon Olewniczak        $plugins = $this->getNotificationPlugins($data['plugin']);
133f68bc0caSSzymon Olewniczak
134a8cc16e3SSzymon Olewniczak        if ($data['user'] == '$USER$') {
135a8cc16e3SSzymon Olewniczak            $data['user'] = $INFO['client'];
136a8cc16e3SSzymon Olewniczak        }
137a8cc16e3SSzymon Olewniczak
138f68bc0caSSzymon Olewniczak        $notifications_data = [
139f68bc0caSSzymon Olewniczak            'plugins' => $plugins,
140a8cc16e3SSzymon Olewniczak            'user' => $data['user'],
141f68bc0caSSzymon Olewniczak            'notifications' => []
142f68bc0caSSzymon Olewniczak        ];
1436cdebc53SAnna Dabrowska        Event::createAndTrigger('PLUGIN_NOTIFICATION_GATHER', $notifications_data);
144f68bc0caSSzymon Olewniczak
145f68bc0caSSzymon Olewniczak        $notifications = $notifications_data['notifications'];
146f68bc0caSSzymon Olewniczak
147f68bc0caSSzymon Olewniczak        if (!$notifications) {
148f68bc0caSSzymon Olewniczak            $renderer->doc .= $this->getLang('no notifications');
149f68bc0caSSzymon Olewniczak            return;
150f68bc0caSSzymon Olewniczak        }
151f68bc0caSSzymon Olewniczak
152f68bc0caSSzymon Olewniczak        $renderer->doc .= '<ul>';
153f68bc0caSSzymon Olewniczak
154f68bc0caSSzymon Olewniczak        usort($notifications, function ($a, $b) {
155f68bc0caSSzymon Olewniczak            if ($a['timestamp'] == $b['timestamp']) {
156f68bc0caSSzymon Olewniczak                return 0;
157f68bc0caSSzymon Olewniczak            }
158f68bc0caSSzymon Olewniczak            return ($a['timestamp'] > $b['timestamp']) ? -1 : 1;
159f68bc0caSSzymon Olewniczak        });
160f68bc0caSSzymon Olewniczak
161f68bc0caSSzymon Olewniczak        foreach ($notifications as $notification) {
162f68bc0caSSzymon Olewniczak            $content = $notification[$data['full'] ? 'full' : 'brief'];
163f68bc0caSSzymon Olewniczak            $timestamp = $notification['timestamp'];
164f68bc0caSSzymon Olewniczak
165f68bc0caSSzymon Olewniczak            $date = '';
166f68bc0caSSzymon Olewniczak            if ($data['date']) {
167f68bc0caSSzymon Olewniczak                $date = strftime($data['date'], $timestamp);
168f68bc0caSSzymon Olewniczak            }
169f68bc0caSSzymon Olewniczak
170f68bc0caSSzymon Olewniczak            $renderer->doc .= "<li class=\"level1\"><div class=\"li\">$date $content</div></li>";
171f68bc0caSSzymon Olewniczak        }
172f68bc0caSSzymon Olewniczak        $renderer->doc .= '</ul>';
173f68bc0caSSzymon Olewniczak    }
174f68bc0caSSzymon Olewniczak}
175