xref: /plugin/ireadit/syntax/list.php (revision c9919bbd3bb2e851778bd771b31714be9df46080)
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                $states = ['read', 'not read', 'all'];
44                $value = strtolower($value);
45                if (!in_array($value, $states)) {
46                    msg('ireadit plugin: unknown state "'.$value.'" 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        try {
100            /** @var \helper_plugin_ireadit_db $db_helper */
101            $db_helper = plugin_load('helper', 'ireadit_db');
102            $sqlite = $db_helper->getDB();
103        } catch (Exception $e) {
104            msg($e->getMessage(), -1);
105            return false;
106        }
107
108
109        if ($params['user'] == '$USER$') {
110            $params['user'] = $INFO['client'];
111        }
112
113        $where_query = [];
114        $query_args = [];
115        if ($params['user']) {
116            $where_query[] = "ireadit.user=?";
117            $query_args[] = $params['user'];
118        }
119
120        if ($params['state'] == 'read') {
121            $where_query[] = "ireadit.timestamp IS NOT NULL";
122        } elseif($params['state'] == 'not read') {
123            $where_query[] = "ireadit.timestamp IS NULL";
124        }
125
126        $where_query_string = '';
127        if ($where_query) {
128            $where_query_string = 'WHERE ' . implode(' AND ', $where_query);
129        }
130
131        $q = "SELECT ireadit.page
132                FROM ireadit INNER JOIN meta
133                    ON (ireadit.page=meta.page AND ireadit.rev=meta.last_change_date)
134                    $where_query_string
135                    ORDER BY ireadit.page";
136
137        $res = $sqlite->query($q, $query_args);
138
139        // Output List
140        $renderer->doc .= '<ul>';
141        while ($row = $sqlite->res_fetch_assoc($res)) {
142            $page = $row['page'];
143            $link = '<a class="wikilink1" href="' . wl($page) . '">';
144            if (useHeading('content')) {
145                $heading = p_get_first_heading($page);
146                if (!blank($heading)) {
147                    $link .= $heading;
148                } else {
149                    $link .= noNSorNS($page);
150                }
151            } else {
152                $link .= noNSorNS($page);
153            }
154            $link .= '</a>';
155            $renderer->doc .= '<li class="li">' . $link . '</li>';
156        }
157        $renderer->doc .= '</ul>';
158    }
159}
160