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