xref: /plugin/ireadit/syntax/list.php (revision dfc7cf2977051d04499fe61d5eaf52bafa3d8038)
1ce9be9e9SSzymon Olewniczak<?php
2ce9be9e9SSzymon Olewniczak
3ce9be9e9SSzymon Olewniczak// must be run within DokuWiki
4ce9be9e9SSzymon Olewniczakif(!defined('DOKU_INC')) die();
5ce9be9e9SSzymon Olewniczak
6ce9be9e9SSzymon Olewniczak
7ce9be9e9SSzymon Olewniczakclass syntax_plugin_ireadit_list extends DokuWiki_Syntax_Plugin {
8ce9be9e9SSzymon Olewniczak
9ce9be9e9SSzymon Olewniczak    function getType() {
10ce9be9e9SSzymon Olewniczak        return 'substition';
11ce9be9e9SSzymon Olewniczak    }
12ce9be9e9SSzymon Olewniczak
13ce9be9e9SSzymon Olewniczak    function getSort() {
14ce9be9e9SSzymon Olewniczak        return 20;
15ce9be9e9SSzymon Olewniczak    }
16ce9be9e9SSzymon Olewniczak
17ce9be9e9SSzymon Olewniczak    function PType() {
18ce9be9e9SSzymon Olewniczak        return 'block';
19ce9be9e9SSzymon Olewniczak    }
20ce9be9e9SSzymon Olewniczak
21ce9be9e9SSzymon Olewniczak    function connectTo($mode) {
22ce9be9e9SSzymon Olewniczak        $this->Lexer->addSpecialPattern('----+ *ireadit list *-+\n.*?----+', $mode,'plugin_ireadit_list');
23ce9be9e9SSzymon Olewniczak    }
24ce9be9e9SSzymon Olewniczak
25ce9be9e9SSzymon Olewniczak    function handle($match, $state, $pos, Doku_Handler $handler){
26ce9be9e9SSzymon Olewniczak        $lines = explode("\n", $match);
27ce9be9e9SSzymon Olewniczak        array_shift($lines);
28ce9be9e9SSzymon Olewniczak        array_pop($lines);
29ce9be9e9SSzymon Olewniczak
30824684eaSSzymon Olewniczak        $statemap = [
31824684eaSSzymon Olewniczak            'read' => ['read'],
32824684eaSSzymon Olewniczak            'outdated' => ['outdated'],
33824684eaSSzymon Olewniczak            'unread' => ['unread'],
34824684eaSSzymon Olewniczak            'not read' => ['outdated', 'unread'],
35824684eaSSzymon Olewniczak            'all' => ['read', 'outdated', 'unread'],
36824684eaSSzymon Olewniczak        ];
37824684eaSSzymon Olewniczak
38ce9be9e9SSzymon Olewniczak        $params = [
39ce9be9e9SSzymon Olewniczak            'user' => '$USER$',
40b5c6cf14SSzymon Olewniczak            'state' => $statemap['all'],
4190e37b17SErik Inge Bolsø            'lastread' => '0',
42*dfc7cf29SErik Inge Bolsø            'overview' => '0',
43*dfc7cf29SErik Inge Bolsø            'namespace' => '',
44*dfc7cf29SErik Inge Bolsø            'filter' => false
45ce9be9e9SSzymon Olewniczak        ];
46ce9be9e9SSzymon Olewniczak
47ce9be9e9SSzymon Olewniczak        foreach ($lines as $line) {
48ce9be9e9SSzymon Olewniczak            $pair = explode(':', $line, 2);
49ce9be9e9SSzymon Olewniczak            if (count($pair) < 2) {
50ce9be9e9SSzymon Olewniczak                continue;
51ce9be9e9SSzymon Olewniczak            }
52ce9be9e9SSzymon Olewniczak            $key = trim($pair[0]);
53ce9be9e9SSzymon Olewniczak            $value = trim($pair[1]);
546116c7f6SJan-Philipp Litza            if ($key == 'state') {
55c6a33c44SJan-Philipp Litza                $states = array_map('trim', explode(',', strtolower($value)));
56c6a33c44SJan-Philipp Litza                $value = [];
57c6a33c44SJan-Philipp Litza                foreach ($states as $state) {
58c6a33c44SJan-Philipp Litza                    if (isset($statemap[$state])) {
59b5c6cf14SSzymon Olewniczak                        $value = array_merge($value, $statemap[$state]);
60c6a33c44SJan-Philipp Litza                    } else {
61c6a33c44SJan-Philipp Litza                        msg('ireadit plugin: unknown state "'.$state.'" should be: ' .
62824684eaSSzymon Olewniczak                            implode(', ', array_keys($statemap)), -1);
63ce9be9e9SSzymon Olewniczak                        return false;
64ce9be9e9SSzymon Olewniczak                    }
65ce9be9e9SSzymon Olewniczak                }
66*dfc7cf29SErik Inge Bolsø            } elseif ($key == 'namespace') {
67*dfc7cf29SErik Inge Bolsø                $value = trim(cleanID($value), ':');
68*dfc7cf29SErik Inge Bolsø            } elseif($key == 'filter') {
69*dfc7cf29SErik Inge Bolsø                $value = trim($value, '/');
70*dfc7cf29SErik Inge Bolsø                if (preg_match('/' . $value . '/', null) === false) {
71*dfc7cf29SErik Inge Bolsø                    msg('ireadit plugin: invalid filter regex', -1);
72*dfc7cf29SErik Inge Bolsø                    return false;
73*dfc7cf29SErik Inge Bolsø                }
74b5c6cf14SSzymon Olewniczak            } elseif ($key == 'lastread') {
75b5c6cf14SSzymon Olewniczak                if ($value != '0' && $value != '1') {
76b5c6cf14SSzymon Olewniczak                    msg('ireadit plugin: lastread should be 0 or 1', -1);
77b5c6cf14SSzymon Olewniczak                    return false;
78b5c6cf14SSzymon Olewniczak                }
7990e37b17SErik Inge Bolsø            } elseif ($key == 'overview') {
8090e37b17SErik Inge Bolsø                if ($value != '0' && $value != '1') {
8190e37b17SErik Inge Bolsø                    msg('ireadit plugin: overview should be 0 or 1', -1);
8290e37b17SErik Inge Bolsø                    return false;
8390e37b17SErik Inge Bolsø                }
843b11506fSJan-Philipp Litza            }
85ce9be9e9SSzymon Olewniczak            $params[$key] = $value;
86ce9be9e9SSzymon Olewniczak        }
87ce9be9e9SSzymon Olewniczak        return $params;
88ce9be9e9SSzymon Olewniczak    }
89ce9be9e9SSzymon Olewniczak
90ce9be9e9SSzymon Olewniczak    /**
91ce9be9e9SSzymon Olewniczak     * Render xhtml output or metadata
92ce9be9e9SSzymon Olewniczak     *
93ce9be9e9SSzymon Olewniczak     * @param string        $mode     Renderer mode (supported modes: xhtml)
94ce9be9e9SSzymon Olewniczak     * @param Doku_Renderer $renderer The renderer
95ce9be9e9SSzymon Olewniczak     * @param array         $data     The data from the handler() function
96ce9be9e9SSzymon Olewniczak     *
97ce9be9e9SSzymon Olewniczak     * @return bool If rendering was successful.
98ce9be9e9SSzymon Olewniczak     */
99ce9be9e9SSzymon Olewniczak
100ce9be9e9SSzymon Olewniczak    public function render($mode, Doku_Renderer $renderer, $data)
101ce9be9e9SSzymon Olewniczak    {
102ce9be9e9SSzymon Olewniczak        $method = 'render' . ucfirst($mode);
103ce9be9e9SSzymon Olewniczak        if (method_exists($this, $method)) {
104ce9be9e9SSzymon Olewniczak            call_user_func([$this, $method], $renderer, $data);
105ce9be9e9SSzymon Olewniczak            return true;
106ce9be9e9SSzymon Olewniczak        }
107ce9be9e9SSzymon Olewniczak        return false;
108ce9be9e9SSzymon Olewniczak    }
109ce9be9e9SSzymon Olewniczak
110ce9be9e9SSzymon Olewniczak    /**
111ce9be9e9SSzymon Olewniczak     * Render metadata
112ce9be9e9SSzymon Olewniczak     *
113ce9be9e9SSzymon Olewniczak     * @param Doku_Renderer $renderer The renderer
114ce9be9e9SSzymon Olewniczak     * @param array         $params     The data from the handler() function
115ce9be9e9SSzymon Olewniczak     */
116ce9be9e9SSzymon Olewniczak    public function renderMetadata(Doku_Renderer $renderer, $params)
117ce9be9e9SSzymon Olewniczak    {
118ce9be9e9SSzymon Olewniczak        $renderer->meta['plugin']['ireadit_list'] = [];
119ce9be9e9SSzymon Olewniczak
120ce9be9e9SSzymon Olewniczak        if ($params['user'] == '$USER$') {
121ce9be9e9SSzymon Olewniczak            $renderer->meta['plugin']['ireadit_list']['dynamic_user'] = true;
122ce9be9e9SSzymon Olewniczak        }
123ce9be9e9SSzymon Olewniczak    }
124ce9be9e9SSzymon Olewniczak
125ce9be9e9SSzymon Olewniczak    public function renderXhtml(Doku_Renderer $renderer, $params)
126ce9be9e9SSzymon Olewniczak    {
127ce9be9e9SSzymon Olewniczak        global $INFO;
128ce9be9e9SSzymon Olewniczak
129692a1450SSzymon Olewniczak        try {
130ce9be9e9SSzymon Olewniczak            /** @var \helper_plugin_ireadit_db $db_helper */
131ce9be9e9SSzymon Olewniczak            $db_helper = plugin_load('helper', 'ireadit_db');
132ce9be9e9SSzymon Olewniczak            $sqlite = $db_helper->getDB();
133692a1450SSzymon Olewniczak        } catch (Exception $e) {
134692a1450SSzymon Olewniczak            msg($e->getMessage(), -1);
135692a1450SSzymon Olewniczak            return false;
136692a1450SSzymon Olewniczak        }
137692a1450SSzymon Olewniczak
138ce9be9e9SSzymon Olewniczak        if ($params['user'] == '$USER$') {
139ce9be9e9SSzymon Olewniczak            $params['user'] = $INFO['client'];
140ce9be9e9SSzymon Olewniczak        }
141ce9be9e9SSzymon Olewniczak
142*dfc7cf29SErik Inge Bolsø        $query_args = [$params['namespace'].'%'];
143*dfc7cf29SErik Inge Bolsø	$filter_q = '';
144*dfc7cf29SErik Inge Bolsø
145*dfc7cf29SErik Inge Bolsø        if ($params['filter']) {
146*dfc7cf29SErik Inge Bolsø            $query_args[] = $params['filter'];
147*dfc7cf29SErik Inge Bolsø            $filter_q .= " AND I.page REGEXP ?";
148*dfc7cf29SErik Inge Bolsø        }
149*dfc7cf29SErik Inge Bolsø
15090e37b17SErik Inge Bolsø        if ($params['overview'] == '1') {
151*dfc7cf29SErik Inge Bolsø            $q = "SELECT I.page, I.timestamp,
15290e37b17SErik Inge Bolsø                    (SELECT T.rev FROM ireadit T
15390e37b17SErik Inge Bolsø                    WHERE T.page=I.page AND T.timestamp IS NOT NULL
15490e37b17SErik Inge Bolsø                    ORDER BY rev DESC LIMIT 1) lastread
15590e37b17SErik Inge Bolsø                    FROM ireadit I INNER JOIN meta M ON I.page = M.page AND I.rev = M.last_change_date
156*dfc7cf29SErik Inge Bolsø                    WHERE I.page LIKE ? ESCAPE '_'
157*dfc7cf29SErik Inge Bolsø                    $filter_q";
158*dfc7cf29SErik Inge Bolsø            $res = $sqlite->query($q, $query_args);
15990e37b17SErik Inge Bolsø        } else {
160*dfc7cf29SErik Inge Bolsø            array_unshift($query_args, $params['user'], $params['user']);
161*dfc7cf29SErik Inge Bolsø            $q = "SELECT I.page, I.timestamp,
162b5c6cf14SSzymon Olewniczak                    (SELECT T.rev FROM ireadit T
163b5c6cf14SSzymon Olewniczak                    WHERE T.page=I.page AND T.user=? AND T.timestamp IS NOT NULL
164b5c6cf14SSzymon Olewniczak                    ORDER BY rev DESC LIMIT 1) lastread
165824684eaSSzymon Olewniczak                    FROM ireadit I INNER JOIN meta M ON I.page = M.page AND I.rev = M.last_change_date
166*dfc7cf29SErik Inge Bolsø                    WHERE I.user=?
167*dfc7cf29SErik Inge Bolsø                    AND I.page LIKE ? ESCAPE '_'
168*dfc7cf29SErik Inge Bolsø                    $filter_q";
169*dfc7cf29SErik Inge Bolsø            $res = $sqlite->query($q, $query_args);
17090e37b17SErik Inge Bolsø        }
171ce9be9e9SSzymon Olewniczak
172ce9be9e9SSzymon Olewniczak        // Output List
173ce9be9e9SSzymon Olewniczak        $renderer->doc .= '<ul>';
174ce9be9e9SSzymon Olewniczak        while ($row = $sqlite->res_fetch_assoc($res)) {
175ce9be9e9SSzymon Olewniczak            $page = $row['page'];
176824684eaSSzymon Olewniczak            $timestamp = $row['timestamp'];
177b5c6cf14SSzymon Olewniczak            $lastread = $row['lastread'];
178824684eaSSzymon Olewniczak
179b5c6cf14SSzymon Olewniczak            if (!$timestamp && $lastread) {
1804b5448adSJan-Philipp Litza                $state = 'outdated';
181b5c6cf14SSzymon Olewniczak            } elseif (!$timestamp && !$lastread) {
182824684eaSSzymon Olewniczak                $state = 'unread';
183824684eaSSzymon Olewniczak            } else {
184824684eaSSzymon Olewniczak                $state = 'read';
1854b5448adSJan-Philipp Litza            }
186824684eaSSzymon Olewniczak
187c6a33c44SJan-Philipp Litza            if (!in_array($state, $params['state'])) {
1884b5448adSJan-Philipp Litza                continue;
1893b11506fSJan-Philipp Litza            }
1904b5448adSJan-Philipp Litza
191b5c6cf14SSzymon Olewniczak            $urlParameters = [];
192b5c6cf14SSzymon Olewniczak            if ($params['lastread'] && $state == 'outdated') {
193b5c6cf14SSzymon Olewniczak                $urlParameters['rev'] = $lastread;
194b5c6cf14SSzymon Olewniczak            }
195b5c6cf14SSzymon Olewniczak            $url = wl($page, $urlParameters);
19626c2d094SJan-Philipp Litza            $link = '<a class="wikilink1" href="' . $url . '">';
197ce9be9e9SSzymon Olewniczak            if (useHeading('content')) {
198ce9be9e9SSzymon Olewniczak                $heading = p_get_first_heading($page);
199ce9be9e9SSzymon Olewniczak                if (!blank($heading)) {
200ce9be9e9SSzymon Olewniczak                    $link .= $heading;
201ce9be9e9SSzymon Olewniczak                } else {
202ce9be9e9SSzymon Olewniczak                    $link .= noNSorNS($page);
203ce9be9e9SSzymon Olewniczak                }
204ce9be9e9SSzymon Olewniczak            } else {
205ce9be9e9SSzymon Olewniczak                $link .= noNSorNS($page);
206ce9be9e9SSzymon Olewniczak            }
207ce9be9e9SSzymon Olewniczak            $link .= '</a>';
20891359560SJan-Philipp Litza            $renderer->doc .= '<li class="li">' . $link . '</li>';
209ce9be9e9SSzymon Olewniczak        }
210ce9be9e9SSzymon Olewniczak        $renderer->doc .= '</ul>';
211ce9be9e9SSzymon Olewniczak    }
212ce9be9e9SSzymon Olewniczak}
213