xref: /plugin/ireadit/syntax/list.php (revision 13f6c79932364942534c54835bbbb6b994d388d9)
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
30824684eaSSzymon Olewniczak        $statemap = [
31824684eaSSzymon Olewniczak            'read' => ['read'],
32824684eaSSzymon Olewniczak            'outdated' => ['outdated'],
33824684eaSSzymon Olewniczak            'unread' => ['unread'],
34824684eaSSzymon Olewniczak            'not read' => ['outdated', 'unread'],
35824684eaSSzymon Olewniczak            'all' => ['read', 'outdated', 'unread'],
36824684eaSSzymon Olewniczak        ];
37824684eaSSzymon Olewniczak
38ce9be9e9SSzymon Olewniczak        $params = [
39ce9be9e9SSzymon Olewniczak            'user' => '$USER$',
40b5c6cf14SSzymon Olewniczak            'state' => $statemap['all'],
4190e37b17SErik Inge Bolsø            'lastread' => '0',
42dfc7cf29SErik Inge Bolsø            'overview' => '0',
43dfc7cf29SErik Inge Bolsø            'namespace' => '',
44dfc7cf29SErik Inge Bolsø            'filter' => false
45ce9be9e9SSzymon Olewniczak        ];
46ce9be9e9SSzymon Olewniczak
47ce9be9e9SSzymon Olewniczak        foreach ($lines as $line) {
48ce9be9e9SSzymon Olewniczak            $pair = explode(':', $line, 2);
49ce9be9e9SSzymon Olewniczak            if (count($pair) < 2) {
50ce9be9e9SSzymon Olewniczak                continue;
51ce9be9e9SSzymon Olewniczak            }
52ce9be9e9SSzymon Olewniczak            $key = trim($pair[0]);
53ce9be9e9SSzymon Olewniczak            $value = trim($pair[1]);
546116c7f6SJan-Philipp Litza            if ($key == 'state') {
55c6a33c44SJan-Philipp Litza                $states = array_map('trim', explode(',', strtolower($value)));
56c6a33c44SJan-Philipp Litza                $value = [];
57c6a33c44SJan-Philipp Litza                foreach ($states as $state) {
58c6a33c44SJan-Philipp Litza                    if (isset($statemap[$state])) {
59b5c6cf14SSzymon Olewniczak                        $value = array_merge($value, $statemap[$state]);
60c6a33c44SJan-Philipp Litza                    } else {
61c6a33c44SJan-Philipp Litza                        msg('ireadit plugin: unknown state "'.$state.'" should be: ' .
62824684eaSSzymon Olewniczak                            implode(', ', array_keys($statemap)), -1);
63ce9be9e9SSzymon Olewniczak                        return false;
64ce9be9e9SSzymon Olewniczak                    }
65ce9be9e9SSzymon Olewniczak                }
66dfc7cf29SErik Inge Bolsø            } elseif ($key == 'namespace') {
67dfc7cf29SErik Inge Bolsø                $value = trim(cleanID($value), ':');
68dfc7cf29SErik Inge Bolsø            } elseif($key == 'filter') {
69dfc7cf29SErik Inge Bolsø                $value = trim($value, '/');
70dfc7cf29SErik Inge Bolsø                if (preg_match('/' . $value . '/', null) === false) {
71dfc7cf29SErik Inge Bolsø                    msg('ireadit plugin: invalid filter regex', -1);
72dfc7cf29SErik Inge Bolsø                    return false;
73dfc7cf29SErik Inge Bolsø                }
74b5c6cf14SSzymon Olewniczak            } elseif ($key == 'lastread') {
75b5c6cf14SSzymon Olewniczak                if ($value != '0' && $value != '1') {
76b5c6cf14SSzymon Olewniczak                    msg('ireadit plugin: lastread should be 0 or 1', -1);
77b5c6cf14SSzymon Olewniczak                    return false;
78b5c6cf14SSzymon Olewniczak                }
7990e37b17SErik Inge Bolsø            } elseif ($key == 'overview') {
8090e37b17SErik Inge Bolsø                if ($value != '0' && $value != '1') {
8190e37b17SErik Inge Bolsø                    msg('ireadit plugin: overview should be 0 or 1', -1);
8290e37b17SErik Inge Bolsø                    return false;
8390e37b17SErik Inge Bolsø                }
843b11506fSJan-Philipp Litza            }
85ce9be9e9SSzymon Olewniczak            $params[$key] = $value;
86ce9be9e9SSzymon Olewniczak        }
87ce9be9e9SSzymon Olewniczak        return $params;
88ce9be9e9SSzymon Olewniczak    }
89ce9be9e9SSzymon Olewniczak
90ce9be9e9SSzymon Olewniczak    /**
91ce9be9e9SSzymon Olewniczak     * Render xhtml output or metadata
92ce9be9e9SSzymon Olewniczak     *
93ce9be9e9SSzymon Olewniczak     * @param string        $mode     Renderer mode (supported modes: xhtml)
94ce9be9e9SSzymon Olewniczak     * @param Doku_Renderer $renderer The renderer
95ce9be9e9SSzymon Olewniczak     * @param array         $data     The data from the handler() function
96ce9be9e9SSzymon Olewniczak     *
97ce9be9e9SSzymon Olewniczak     * @return bool If rendering was successful.
98ce9be9e9SSzymon Olewniczak     */
99ce9be9e9SSzymon Olewniczak
100ce9be9e9SSzymon Olewniczak    public function render($mode, Doku_Renderer $renderer, $data)
101ce9be9e9SSzymon Olewniczak    {
102d2cf7c78SSzymon Olewniczak        $method = "render_$mode";
103ce9be9e9SSzymon Olewniczak        if (method_exists($this, $method)) {
104ce9be9e9SSzymon Olewniczak            call_user_func([$this, $method], $renderer, $data);
105ce9be9e9SSzymon Olewniczak            return true;
106ce9be9e9SSzymon Olewniczak        }
107ce9be9e9SSzymon Olewniczak        return false;
108ce9be9e9SSzymon Olewniczak    }
109ce9be9e9SSzymon Olewniczak
110ce9be9e9SSzymon Olewniczak    /**
111ce9be9e9SSzymon Olewniczak     * Render metadata
112ce9be9e9SSzymon Olewniczak     *
113ce9be9e9SSzymon Olewniczak     * @param Doku_Renderer $renderer The renderer
114ce9be9e9SSzymon Olewniczak     * @param array         $params     The data from the handler() function
115ce9be9e9SSzymon Olewniczak     */
116d2cf7c78SSzymon Olewniczak    public function render_metadata(Doku_Renderer $renderer, $params)
117ce9be9e9SSzymon Olewniczak    {
118d2cf7c78SSzymon Olewniczak        $renderer->meta['plugin_ireadit_list'] = true;
119ce9be9e9SSzymon Olewniczak    }
120ce9be9e9SSzymon Olewniczak
121d2cf7c78SSzymon Olewniczak    public function render_xhtml(Doku_Renderer $renderer, $params)
122ce9be9e9SSzymon Olewniczak    {
123ce9be9e9SSzymon Olewniczak        global $INFO;
124ce9be9e9SSzymon Olewniczak
125692a1450SSzymon Olewniczak        try {
126ce9be9e9SSzymon Olewniczak            /** @var \helper_plugin_ireadit_db $db_helper */
127ce9be9e9SSzymon Olewniczak            $db_helper = plugin_load('helper', 'ireadit_db');
128ce9be9e9SSzymon Olewniczak            $sqlite = $db_helper->getDB();
129692a1450SSzymon Olewniczak        } catch (Exception $e) {
130692a1450SSzymon Olewniczak            msg($e->getMessage(), -1);
131692a1450SSzymon Olewniczak            return false;
132692a1450SSzymon Olewniczak        }
133692a1450SSzymon Olewniczak
134d2cf7c78SSzymon Olewniczak        //overview overrides user setting
13590e37b17SErik Inge Bolsø        if ($params['overview'] == '1') {
136d2cf7c78SSzymon Olewniczak            $user = NULL;
137d2cf7c78SSzymon Olewniczak        } elseif ($params['user'] == '$USER$') {
138d2cf7c78SSzymon Olewniczak            $user = $INFO['client'];
13990e37b17SErik Inge Bolsø        } else {
140d2cf7c78SSzymon Olewniczak            $user = $params['user'];
14190e37b17SErik Inge Bolsø        }
142ce9be9e9SSzymon Olewniczak
143d2cf7c78SSzymon Olewniczak        /** @var helper_plugin_ireadit $helper */
144d2cf7c78SSzymon Olewniczak        $helper = $this->loadHelper('ireadit');
145d2cf7c78SSzymon Olewniczak        $pages = $helper->get_list($user);
146d2cf7c78SSzymon Olewniczak
147d2cf7c78SSzymon Olewniczak        // apply "filter" and "namespace"
148d2cf7c78SSzymon Olewniczak        $pages = array_filter($pages, function ($k) use ($params) {
149d2cf7c78SSzymon Olewniczak            return substr($k, 0, strlen($params['namespace'])) == $params['namespace'];
150d2cf7c78SSzymon Olewniczak        }, ARRAY_FILTER_USE_KEY);
151d2cf7c78SSzymon Olewniczak        $pages = array_filter($pages, function ($k) use ($params) {
152d2cf7c78SSzymon Olewniczak            return preg_match('/' . $params['filter'] . '/', $k);
153d2cf7c78SSzymon Olewniczak        }, ARRAY_FILTER_USE_KEY);
154d2cf7c78SSzymon Olewniczak
155ce9be9e9SSzymon Olewniczak        // Output List
156ce9be9e9SSzymon Olewniczak        $renderer->doc .= '<ul>';
157d2cf7c78SSzymon Olewniczak        foreach ($pages as $page => $row) {
158d2cf7c78SSzymon Olewniczak            if (!in_array($row['state'], $params['state'])) {
1594b5448adSJan-Philipp Litza                continue;
1603b11506fSJan-Philipp Litza            }
1614b5448adSJan-Philipp Litza
162b5c6cf14SSzymon Olewniczak            $urlParameters = [];
163d2cf7c78SSzymon Olewniczak            if ($params['lastread'] && $row['state'] == 'outdated') {
164d2cf7c78SSzymon Olewniczak                $urlParameters['rev'] = $row['last_read_rev'];
165*13f6c799SSzymon Olewniczak            // in case of approve integration current_rev may be last approved revision
166*13f6c799SSzymon Olewniczak            } elseif ($this->getConf('approve_integration') &&
167*13f6c799SSzymon Olewniczak                $row['current_rev'] != p_get_metadata($page, 'last_change date')) {
168*13f6c799SSzymon Olewniczak                $urlParameters['rev'] = $row['current_rev'];
169b5c6cf14SSzymon Olewniczak            }
170b5c6cf14SSzymon Olewniczak            $url = wl($page, $urlParameters);
17126c2d094SJan-Philipp Litza            $link = '<a class="wikilink1" href="' . $url . '">';
172ce9be9e9SSzymon Olewniczak            if (useHeading('content')) {
173ce9be9e9SSzymon Olewniczak                $heading = p_get_first_heading($page);
174ce9be9e9SSzymon Olewniczak                if (!blank($heading)) {
175ce9be9e9SSzymon Olewniczak                    $link .= $heading;
176ce9be9e9SSzymon Olewniczak                } else {
177ce9be9e9SSzymon Olewniczak                    $link .= noNSorNS($page);
178ce9be9e9SSzymon Olewniczak                }
179ce9be9e9SSzymon Olewniczak            } else {
180ce9be9e9SSzymon Olewniczak                $link .= noNSorNS($page);
181ce9be9e9SSzymon Olewniczak            }
182ce9be9e9SSzymon Olewniczak            $link .= '</a>';
18391359560SJan-Philipp Litza            $renderer->doc .= '<li class="li">' . $link . '</li>';
184ce9be9e9SSzymon Olewniczak        }
185ce9be9e9SSzymon Olewniczak        $renderer->doc .= '</ul>';
186d2cf7c78SSzymon Olewniczak
187d2cf7c78SSzymon Olewniczak        return true;
188ce9be9e9SSzymon Olewniczak    }
189ce9be9e9SSzymon Olewniczak}
190