xref: /plugin/ireadit/syntax/list.php (revision 3b11506f4236a0c328d412ef9e4209fcfbf78aa7)
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
30ce9be9e9SSzymon Olewniczak        $params = [
31ce9be9e9SSzymon Olewniczak            'user' => '$USER$',
32ce9be9e9SSzymon Olewniczak            'state' => 'all'
33ce9be9e9SSzymon Olewniczak        ];
34ce9be9e9SSzymon Olewniczak
35ce9be9e9SSzymon Olewniczak        foreach ($lines as $line) {
36ce9be9e9SSzymon Olewniczak            $pair = explode(':', $line, 2);
37ce9be9e9SSzymon Olewniczak            if (count($pair) < 2) {
38ce9be9e9SSzymon Olewniczak                continue;
39ce9be9e9SSzymon Olewniczak            }
40ce9be9e9SSzymon Olewniczak            $key = trim($pair[0]);
41ce9be9e9SSzymon Olewniczak            $value = trim($pair[1]);
426116c7f6SJan-Philipp Litza            if ($key == 'state') {
434b5448adSJan-Philipp Litza                $states = ['read', 'not read', 'outdated', 'all'];
44ce9be9e9SSzymon Olewniczak                $value = strtolower($value);
45*3b11506fSJan-Philipp Litza                $value = array_map('trim', explode(',', $value));
46*3b11506fSJan-Philipp Litza                foreach ($value as $item) {
47*3b11506fSJan-Philipp Litza                    if (!in_array($item, $states)) {
48*3b11506fSJan-Philipp Litza                        msg('ireadit plugin: unknown state "'.$item.'" should be: ' .
49ce9be9e9SSzymon Olewniczak                            implode(', ', $states), -1);
50ce9be9e9SSzymon Olewniczak                        return false;
51ce9be9e9SSzymon Olewniczak                    }
52ce9be9e9SSzymon Olewniczak                }
53*3b11506fSJan-Philipp Litza            }
54ce9be9e9SSzymon Olewniczak            $params[$key] = $value;
55ce9be9e9SSzymon Olewniczak        }
56ce9be9e9SSzymon Olewniczak        return $params;
57ce9be9e9SSzymon Olewniczak    }
58ce9be9e9SSzymon Olewniczak
59ce9be9e9SSzymon Olewniczak    /**
60ce9be9e9SSzymon Olewniczak     * Render xhtml output or metadata
61ce9be9e9SSzymon Olewniczak     *
62ce9be9e9SSzymon Olewniczak     * @param string        $mode     Renderer mode (supported modes: xhtml)
63ce9be9e9SSzymon Olewniczak     * @param Doku_Renderer $renderer The renderer
64ce9be9e9SSzymon Olewniczak     * @param array         $data     The data from the handler() function
65ce9be9e9SSzymon Olewniczak     *
66ce9be9e9SSzymon Olewniczak     * @return bool If rendering was successful.
67ce9be9e9SSzymon Olewniczak     */
68ce9be9e9SSzymon Olewniczak
69ce9be9e9SSzymon Olewniczak    public function render($mode, Doku_Renderer $renderer, $data)
70ce9be9e9SSzymon Olewniczak    {
71ce9be9e9SSzymon Olewniczak        $method = 'render' . ucfirst($mode);
72ce9be9e9SSzymon Olewniczak        if (method_exists($this, $method)) {
73ce9be9e9SSzymon Olewniczak            call_user_func([$this, $method], $renderer, $data);
74ce9be9e9SSzymon Olewniczak            return true;
75ce9be9e9SSzymon Olewniczak        }
76ce9be9e9SSzymon Olewniczak        return false;
77ce9be9e9SSzymon Olewniczak    }
78ce9be9e9SSzymon Olewniczak
79ce9be9e9SSzymon Olewniczak    /**
80ce9be9e9SSzymon Olewniczak     * Render metadata
81ce9be9e9SSzymon Olewniczak     *
82ce9be9e9SSzymon Olewniczak     * @param Doku_Renderer $renderer The renderer
83ce9be9e9SSzymon Olewniczak     * @param array         $params     The data from the handler() function
84ce9be9e9SSzymon Olewniczak     */
85ce9be9e9SSzymon Olewniczak    public function renderMetadata(Doku_Renderer $renderer, $params)
86ce9be9e9SSzymon Olewniczak    {
87ce9be9e9SSzymon Olewniczak        $renderer->meta['plugin']['ireadit_list'] = [];
88ce9be9e9SSzymon Olewniczak
89ce9be9e9SSzymon Olewniczak        if ($params['user'] == '$USER$') {
90ce9be9e9SSzymon Olewniczak            $renderer->meta['plugin']['ireadit_list']['dynamic_user'] = true;
91ce9be9e9SSzymon Olewniczak        }
92ce9be9e9SSzymon Olewniczak    }
93ce9be9e9SSzymon Olewniczak
94ce9be9e9SSzymon Olewniczak    public function renderXhtml(Doku_Renderer $renderer, $params)
95ce9be9e9SSzymon Olewniczak    {
96ce9be9e9SSzymon Olewniczak        global $INFO;
97ce9be9e9SSzymon Olewniczak
98ce9be9e9SSzymon Olewniczak        global $conf;
99ce9be9e9SSzymon Olewniczak        /** @var DokuWiki_Auth_Plugin $auth */
100ce9be9e9SSzymon Olewniczak        global $auth;
101ce9be9e9SSzymon Olewniczak
102692a1450SSzymon Olewniczak        try {
103ce9be9e9SSzymon Olewniczak            /** @var \helper_plugin_ireadit_db $db_helper */
104ce9be9e9SSzymon Olewniczak            $db_helper = plugin_load('helper', 'ireadit_db');
105ce9be9e9SSzymon Olewniczak            $sqlite = $db_helper->getDB();
106692a1450SSzymon Olewniczak        } catch (Exception $e) {
107692a1450SSzymon Olewniczak            msg($e->getMessage(), -1);
108692a1450SSzymon Olewniczak            return false;
109692a1450SSzymon Olewniczak        }
110692a1450SSzymon Olewniczak
111ce9be9e9SSzymon Olewniczak
112ce9be9e9SSzymon Olewniczak        if ($params['user'] == '$USER$') {
113ce9be9e9SSzymon Olewniczak            $params['user'] = $INFO['client'];
114ce9be9e9SSzymon Olewniczak        }
115ce9be9e9SSzymon Olewniczak
116ce9be9e9SSzymon Olewniczak        $where_query = [];
117ce9be9e9SSzymon Olewniczak        $query_args = [];
118ce9be9e9SSzymon Olewniczak        if ($params['user']) {
119ce9be9e9SSzymon Olewniczak            $where_query[] = "ireadit.user=?";
120ce9be9e9SSzymon Olewniczak            $query_args[] = $params['user'];
121ce9be9e9SSzymon Olewniczak        }
122ce9be9e9SSzymon Olewniczak
1234b5448adSJan-Philipp Litza        if($params['state'] == 'not read') {
124ce9be9e9SSzymon Olewniczak            $where_query[] = "ireadit.timestamp IS NULL";
1254b5448adSJan-Philipp Litza        } else {
1264b5448adSJan-Philipp Litza            $where_query[] = "ireadit.timestamp IS NOT NULL";
127ce9be9e9SSzymon Olewniczak        }
128ce9be9e9SSzymon Olewniczak
129ce9be9e9SSzymon Olewniczak        $where_query_string = '';
130ce9be9e9SSzymon Olewniczak        if ($where_query) {
131ce9be9e9SSzymon Olewniczak            $where_query_string = 'WHERE ' . implode(' AND ', $where_query);
132ce9be9e9SSzymon Olewniczak        }
133ce9be9e9SSzymon Olewniczak
1344b5448adSJan-Philipp Litza        $q = "SELECT ireadit.page, MAX(ireadit.rev) AS read_rev, MAX(meta.last_change_date) AS current_rev
135ce9be9e9SSzymon Olewniczak                FROM ireadit INNER JOIN meta
1364b5448adSJan-Philipp Litza                    ON (ireadit.page=meta.page)
137ce9be9e9SSzymon Olewniczak                    $where_query_string
1384b5448adSJan-Philipp Litza                    GROUP BY ireadit.page
139ce9be9e9SSzymon Olewniczak                    ORDER BY ireadit.page";
140ce9be9e9SSzymon Olewniczak
141ce9be9e9SSzymon Olewniczak        $res = $sqlite->query($q, $query_args);
142ce9be9e9SSzymon Olewniczak
143ce9be9e9SSzymon Olewniczak        // Output List
144ce9be9e9SSzymon Olewniczak        $renderer->doc .= '<ul>';
145ce9be9e9SSzymon Olewniczak        while ($row = $sqlite->res_fetch_assoc($res)) {
146ce9be9e9SSzymon Olewniczak            $page = $row['page'];
1474b5448adSJan-Philipp Litza            if (!isset($row['read_rev'])) {
1484b5448adSJan-Philipp Litza                $state = 'not read';
1494b5448adSJan-Philipp Litza            } elseif ($row['read_rev'] == $row['current_rev']) {
1504b5448adSJan-Philipp Litza                $state = 'read';
1514b5448adSJan-Philipp Litza            } else {
1524b5448adSJan-Philipp Litza                $state = 'outdated';
1534b5448adSJan-Philipp Litza            }
154*3b11506fSJan-Philipp Litza            if (!in_array($state, $params['state']) && !in_array('all', $params['state'])) {
1554b5448adSJan-Philipp Litza                continue;
156*3b11506fSJan-Philipp Litza            }
1574b5448adSJan-Philipp Litza
15826c2d094SJan-Philipp Litza            $url = wl($page);
15926c2d094SJan-Philipp Litza            if (isset($row['read_rev'])) {
16026c2d094SJan-Philipp Litza                $url .= '?rev=' . $row['read_rev'];
16126c2d094SJan-Philipp Litza            }
16226c2d094SJan-Philipp Litza            $link = '<a class="wikilink1" href="' . $url . '">';
163ce9be9e9SSzymon Olewniczak            if (useHeading('content')) {
164ce9be9e9SSzymon Olewniczak                $heading = p_get_first_heading($page);
165ce9be9e9SSzymon Olewniczak                if (!blank($heading)) {
166ce9be9e9SSzymon Olewniczak                    $link .= $heading;
167ce9be9e9SSzymon Olewniczak                } else {
168ce9be9e9SSzymon Olewniczak                    $link .= noNSorNS($page);
169ce9be9e9SSzymon Olewniczak                }
170ce9be9e9SSzymon Olewniczak            } else {
171ce9be9e9SSzymon Olewniczak                $link .= noNSorNS($page);
172ce9be9e9SSzymon Olewniczak            }
173ce9be9e9SSzymon Olewniczak            $link .= '</a>';
174ce9be9e9SSzymon Olewniczak            $renderer->doc .= '<div class="li">' . $link . '</div>';
175ce9be9e9SSzymon Olewniczak        }
176ce9be9e9SSzymon Olewniczak        $renderer->doc .= '</ul>';
177ce9be9e9SSzymon Olewniczak    }
178ce9be9e9SSzymon Olewniczak}
179