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