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