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