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