xref: /plugin/ireadit/syntax/list.php (revision 90e37b170f33346869d162ad1ec4617532646a23)
1<?php
2
3// must be run within DokuWiki
4if(!defined('DOKU_INC')) die();
5
6
7class syntax_plugin_ireadit_list extends DokuWiki_Syntax_Plugin {
8
9    function getType() {
10        return 'substition';
11    }
12
13    function getSort() {
14        return 20;
15    }
16
17    function PType() {
18        return 'block';
19    }
20
21    function connectTo($mode) {
22        $this->Lexer->addSpecialPattern('----+ *ireadit list *-+\n.*?----+', $mode,'plugin_ireadit_list');
23    }
24
25    function handle($match, $state, $pos, Doku_Handler $handler){
26        $lines = explode("\n", $match);
27        array_shift($lines);
28        array_pop($lines);
29
30        $statemap = [
31            'read' => ['read'],
32            'outdated' => ['outdated'],
33            'unread' => ['unread'],
34            'not read' => ['outdated', 'unread'],
35            'all' => ['read', 'outdated', 'unread'],
36        ];
37
38        $params = [
39            'user' => '$USER$',
40            'state' => $statemap['all'],
41            'lastread' => '0',
42            'overview' => '0'
43        ];
44
45        foreach ($lines as $line) {
46            $pair = explode(':', $line, 2);
47            if (count($pair) < 2) {
48                continue;
49            }
50            $key = trim($pair[0]);
51            $value = trim($pair[1]);
52            if ($key == 'state') {
53                $states = array_map('trim', explode(',', strtolower($value)));
54                $value = [];
55                foreach ($states as $state) {
56                    if (isset($statemap[$state])) {
57                        $value = array_merge($value, $statemap[$state]);
58                    } else {
59                        msg('ireadit plugin: unknown state "'.$state.'" should be: ' .
60                            implode(', ', array_keys($statemap)), -1);
61                        return false;
62                    }
63                }
64            } elseif ($key == 'lastread') {
65                if ($value != '0' && $value != '1') {
66                    msg('ireadit plugin: lastread should be 0 or 1', -1);
67                    return false;
68                }
69            } elseif ($key == 'overview') {
70                if ($value != '0' && $value != '1') {
71                    msg('ireadit plugin: overview should be 0 or 1', -1);
72                    return false;
73                }
74            }
75            $params[$key] = $value;
76        }
77        return $params;
78    }
79
80    /**
81     * Render xhtml output or metadata
82     *
83     * @param string        $mode     Renderer mode (supported modes: xhtml)
84     * @param Doku_Renderer $renderer The renderer
85     * @param array         $data     The data from the handler() function
86     *
87     * @return bool If rendering was successful.
88     */
89
90    public function render($mode, Doku_Renderer $renderer, $data)
91    {
92        $method = 'render' . ucfirst($mode);
93        if (method_exists($this, $method)) {
94            call_user_func([$this, $method], $renderer, $data);
95            return true;
96        }
97        return false;
98    }
99
100    /**
101     * Render metadata
102     *
103     * @param Doku_Renderer $renderer The renderer
104     * @param array         $params     The data from the handler() function
105     */
106    public function renderMetadata(Doku_Renderer $renderer, $params)
107    {
108        $renderer->meta['plugin']['ireadit_list'] = [];
109
110        if ($params['user'] == '$USER$') {
111            $renderer->meta['plugin']['ireadit_list']['dynamic_user'] = true;
112        }
113    }
114
115    public function renderXhtml(Doku_Renderer $renderer, $params)
116    {
117        global $INFO;
118
119        try {
120            /** @var \helper_plugin_ireadit_db $db_helper */
121            $db_helper = plugin_load('helper', 'ireadit_db');
122            $sqlite = $db_helper->getDB();
123        } catch (Exception $e) {
124            msg($e->getMessage(), -1);
125            return false;
126        }
127
128        if ($params['user'] == '$USER$') {
129            $params['user'] = $INFO['client'];
130        }
131
132        if ($params['overview'] == '1') {
133            $q = 'SELECT I.page, I.timestamp,
134                    (SELECT T.rev FROM ireadit T
135                    WHERE T.page=I.page AND T.timestamp IS NOT NULL
136                    ORDER BY rev DESC LIMIT 1) lastread
137                    FROM ireadit I INNER JOIN meta M ON I.page = M.page AND I.rev = M.last_change_date
138                    ';
139            $res = $sqlite->query($q);
140        } else {
141            $user = $params['user'];
142            $q = 'SELECT I.page, I.timestamp,
143                    (SELECT T.rev FROM ireadit T
144                    WHERE T.page=I.page AND T.user=? AND T.timestamp IS NOT NULL
145                    ORDER BY rev DESC LIMIT 1) lastread
146                    FROM ireadit I INNER JOIN meta M ON I.page = M.page AND I.rev = M.last_change_date
147                    WHERE I.user=?';
148            $res = $sqlite->query($q, $user, $user);
149        }
150
151        // Output List
152        $renderer->doc .= '<ul>';
153        while ($row = $sqlite->res_fetch_assoc($res)) {
154            $page = $row['page'];
155            $timestamp = $row['timestamp'];
156            $lastread = $row['lastread'];
157
158            if (!$timestamp && $lastread) {
159                $state = 'outdated';
160            } elseif (!$timestamp && !$lastread) {
161                $state = 'unread';
162            } else {
163                $state = 'read';
164            }
165
166            if (!in_array($state, $params['state'])) {
167                continue;
168            }
169
170            $urlParameters = [];
171            if ($params['lastread'] && $state == 'outdated') {
172                $urlParameters['rev'] = $lastread;
173            }
174            $url = wl($page, $urlParameters);
175            $link = '<a class="wikilink1" href="' . $url . '">';
176            if (useHeading('content')) {
177                $heading = p_get_first_heading($page);
178                if (!blank($heading)) {
179                    $link .= $heading;
180                } else {
181                    $link .= noNSorNS($page);
182                }
183            } else {
184                $link .= noNSorNS($page);
185            }
186            $link .= '</a>';
187            $renderer->doc .= '<li class="li">' . $link . '</li>';
188        }
189        $renderer->doc .= '</ul>';
190    }
191}
192