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