xref: /plugin/ireadit/syntax/list.php (revision ce9be9e9c1ec866d658e8f1bd79fef3f5ed26fc0)
1*ce9be9e9SSzymon Olewniczak<?php
2*ce9be9e9SSzymon Olewniczak
3*ce9be9e9SSzymon Olewniczak// must be run within DokuWiki
4*ce9be9e9SSzymon Olewniczakif(!defined('DOKU_INC')) die();
5*ce9be9e9SSzymon Olewniczak
6*ce9be9e9SSzymon Olewniczak
7*ce9be9e9SSzymon Olewniczakclass syntax_plugin_ireadit_list extends DokuWiki_Syntax_Plugin {
8*ce9be9e9SSzymon Olewniczak
9*ce9be9e9SSzymon Olewniczak    function getType() {
10*ce9be9e9SSzymon Olewniczak        return 'substition';
11*ce9be9e9SSzymon Olewniczak    }
12*ce9be9e9SSzymon Olewniczak
13*ce9be9e9SSzymon Olewniczak    function getSort() {
14*ce9be9e9SSzymon Olewniczak        return 20;
15*ce9be9e9SSzymon Olewniczak    }
16*ce9be9e9SSzymon Olewniczak
17*ce9be9e9SSzymon Olewniczak    function PType() {
18*ce9be9e9SSzymon Olewniczak        return 'block';
19*ce9be9e9SSzymon Olewniczak    }
20*ce9be9e9SSzymon Olewniczak
21*ce9be9e9SSzymon Olewniczak    function connectTo($mode) {
22*ce9be9e9SSzymon Olewniczak        $this->Lexer->addSpecialPattern('----+ *ireadit list *-+\n.*?----+', $mode,'plugin_ireadit_list');
23*ce9be9e9SSzymon Olewniczak    }
24*ce9be9e9SSzymon Olewniczak
25*ce9be9e9SSzymon Olewniczak    function handle($match, $state, $pos, Doku_Handler $handler){
26*ce9be9e9SSzymon Olewniczak        $lines = explode("\n", $match);
27*ce9be9e9SSzymon Olewniczak        array_shift($lines);
28*ce9be9e9SSzymon Olewniczak        array_pop($lines);
29*ce9be9e9SSzymon Olewniczak
30*ce9be9e9SSzymon Olewniczak        $params = [
31*ce9be9e9SSzymon Olewniczak            'user' => '$USER$',
32*ce9be9e9SSzymon Olewniczak            'state' => 'all'
33*ce9be9e9SSzymon Olewniczak        ];
34*ce9be9e9SSzymon Olewniczak
35*ce9be9e9SSzymon Olewniczak        foreach ($lines as $line) {
36*ce9be9e9SSzymon Olewniczak            $pair = explode(':', $line, 2);
37*ce9be9e9SSzymon Olewniczak            if (count($pair) < 2) {
38*ce9be9e9SSzymon Olewniczak                continue;
39*ce9be9e9SSzymon Olewniczak            }
40*ce9be9e9SSzymon Olewniczak            $key = trim($pair[0]);
41*ce9be9e9SSzymon Olewniczak            $value = trim($pair[1]);
42*ce9be9e9SSzymon Olewniczak            if ($key == 'states') {
43*ce9be9e9SSzymon Olewniczak                $states = ['read', 'not read', 'all'];
44*ce9be9e9SSzymon Olewniczak                $value = strtolower($value);
45*ce9be9e9SSzymon Olewniczak                if (!in_array($state, $states)) {
46*ce9be9e9SSzymon Olewniczak                    msg('ireadit plugin: unknown state "'.$state.'" should be: ' .
47*ce9be9e9SSzymon Olewniczak                        implode(', ', $states), -1);
48*ce9be9e9SSzymon Olewniczak                    return false;
49*ce9be9e9SSzymon Olewniczak                }
50*ce9be9e9SSzymon Olewniczak            }
51*ce9be9e9SSzymon Olewniczak            $params[$key] = $value;
52*ce9be9e9SSzymon Olewniczak        }
53*ce9be9e9SSzymon Olewniczak        return $params;
54*ce9be9e9SSzymon Olewniczak    }
55*ce9be9e9SSzymon Olewniczak
56*ce9be9e9SSzymon Olewniczak    /**
57*ce9be9e9SSzymon Olewniczak     * Render xhtml output or metadata
58*ce9be9e9SSzymon Olewniczak     *
59*ce9be9e9SSzymon Olewniczak     * @param string        $mode     Renderer mode (supported modes: xhtml)
60*ce9be9e9SSzymon Olewniczak     * @param Doku_Renderer $renderer The renderer
61*ce9be9e9SSzymon Olewniczak     * @param array         $data     The data from the handler() function
62*ce9be9e9SSzymon Olewniczak     *
63*ce9be9e9SSzymon Olewniczak     * @return bool If rendering was successful.
64*ce9be9e9SSzymon Olewniczak     */
65*ce9be9e9SSzymon Olewniczak
66*ce9be9e9SSzymon Olewniczak    public function render($mode, Doku_Renderer $renderer, $data)
67*ce9be9e9SSzymon Olewniczak    {
68*ce9be9e9SSzymon Olewniczak        $method = 'render' . ucfirst($mode);
69*ce9be9e9SSzymon Olewniczak        if (method_exists($this, $method)) {
70*ce9be9e9SSzymon Olewniczak            call_user_func([$this, $method], $renderer, $data);
71*ce9be9e9SSzymon Olewniczak            return true;
72*ce9be9e9SSzymon Olewniczak        }
73*ce9be9e9SSzymon Olewniczak        return false;
74*ce9be9e9SSzymon Olewniczak    }
75*ce9be9e9SSzymon Olewniczak
76*ce9be9e9SSzymon Olewniczak    /**
77*ce9be9e9SSzymon Olewniczak     * Render metadata
78*ce9be9e9SSzymon Olewniczak     *
79*ce9be9e9SSzymon Olewniczak     * @param Doku_Renderer $renderer The renderer
80*ce9be9e9SSzymon Olewniczak     * @param array         $params     The data from the handler() function
81*ce9be9e9SSzymon Olewniczak     */
82*ce9be9e9SSzymon Olewniczak    public function renderMetadata(Doku_Renderer $renderer, $params)
83*ce9be9e9SSzymon Olewniczak    {
84*ce9be9e9SSzymon Olewniczak        $renderer->meta['plugin']['ireadit_list'] = [];
85*ce9be9e9SSzymon Olewniczak
86*ce9be9e9SSzymon Olewniczak        if ($params['user'] == '$USER$') {
87*ce9be9e9SSzymon Olewniczak            $renderer->meta['plugin']['ireadit_list']['dynamic_user'] = true;
88*ce9be9e9SSzymon Olewniczak        }
89*ce9be9e9SSzymon Olewniczak    }
90*ce9be9e9SSzymon Olewniczak
91*ce9be9e9SSzymon Olewniczak    public function renderXhtml(Doku_Renderer $renderer, $params)
92*ce9be9e9SSzymon Olewniczak    {
93*ce9be9e9SSzymon Olewniczak        global $INFO;
94*ce9be9e9SSzymon Olewniczak
95*ce9be9e9SSzymon Olewniczak        global $conf;
96*ce9be9e9SSzymon Olewniczak        /** @var DokuWiki_Auth_Plugin $auth */
97*ce9be9e9SSzymon Olewniczak        global $auth;
98*ce9be9e9SSzymon Olewniczak
99*ce9be9e9SSzymon Olewniczak        /** @var \helper_plugin_ireadit_db $db_helper */
100*ce9be9e9SSzymon Olewniczak        $db_helper = plugin_load('helper', 'ireadit_db');
101*ce9be9e9SSzymon Olewniczak        $sqlite = $db_helper->getDB();
102*ce9be9e9SSzymon Olewniczak
103*ce9be9e9SSzymon Olewniczak        if ($params['user'] == '$USER$') {
104*ce9be9e9SSzymon Olewniczak            $params['user'] = $INFO['client'];
105*ce9be9e9SSzymon Olewniczak        }
106*ce9be9e9SSzymon Olewniczak
107*ce9be9e9SSzymon Olewniczak        $where_query = [];
108*ce9be9e9SSzymon Olewniczak        $query_args = [];
109*ce9be9e9SSzymon Olewniczak        if ($params['user']) {
110*ce9be9e9SSzymon Olewniczak            $where_query[] = "ireadit.user=?";
111*ce9be9e9SSzymon Olewniczak            $query_args[] = $params['user'];
112*ce9be9e9SSzymon Olewniczak        }
113*ce9be9e9SSzymon Olewniczak
114*ce9be9e9SSzymon Olewniczak        if ($params['state'] == 'read') {
115*ce9be9e9SSzymon Olewniczak            $where_query[] = "ireadit.timestamp IS NOT NULL";
116*ce9be9e9SSzymon Olewniczak        } elseif($params['state'] == 'not read') {
117*ce9be9e9SSzymon Olewniczak            $where_query[] = "ireadit.timestamp IS NULL";
118*ce9be9e9SSzymon Olewniczak        }
119*ce9be9e9SSzymon Olewniczak
120*ce9be9e9SSzymon Olewniczak        $where_query_string = '';
121*ce9be9e9SSzymon Olewniczak        if ($where_query) {
122*ce9be9e9SSzymon Olewniczak            $where_query_string = 'WHERE ' . implode(' AND ', $where_query);
123*ce9be9e9SSzymon Olewniczak        }
124*ce9be9e9SSzymon Olewniczak
125*ce9be9e9SSzymon Olewniczak        $q = "SELECT ireadit.page
126*ce9be9e9SSzymon Olewniczak                FROM ireadit INNER JOIN meta
127*ce9be9e9SSzymon Olewniczak                    ON (ireadit.page=meta.page AND ireadit.rev=meta.last_change_date)
128*ce9be9e9SSzymon Olewniczak                    $where_query_string
129*ce9be9e9SSzymon Olewniczak                    ORDER BY ireadit.page";
130*ce9be9e9SSzymon Olewniczak
131*ce9be9e9SSzymon Olewniczak        $res = $sqlite->query($q, $query_args);
132*ce9be9e9SSzymon Olewniczak
133*ce9be9e9SSzymon Olewniczak        // Output List
134*ce9be9e9SSzymon Olewniczak        $renderer->doc .= '<ul>';
135*ce9be9e9SSzymon Olewniczak        while ($row = $sqlite->res_fetch_assoc($res)) {
136*ce9be9e9SSzymon Olewniczak            $page = $row['page'];
137*ce9be9e9SSzymon Olewniczak            $link = '<a class="wikilink1" href="' . wl($page) . '">';
138*ce9be9e9SSzymon Olewniczak            if (useHeading('content')) {
139*ce9be9e9SSzymon Olewniczak                $heading = p_get_first_heading($page);
140*ce9be9e9SSzymon Olewniczak                if (!blank($heading)) {
141*ce9be9e9SSzymon Olewniczak                    $link .= $heading;
142*ce9be9e9SSzymon Olewniczak                } else {
143*ce9be9e9SSzymon Olewniczak                    $link .= noNSorNS($page);
144*ce9be9e9SSzymon Olewniczak                }
145*ce9be9e9SSzymon Olewniczak            } else {
146*ce9be9e9SSzymon Olewniczak                $link .= noNSorNS($page);
147*ce9be9e9SSzymon Olewniczak            }
148*ce9be9e9SSzymon Olewniczak            $link .= '</a>';
149*ce9be9e9SSzymon Olewniczak            $renderer->doc .= '<div class="li">' . $link . '</div>';
150*ce9be9e9SSzymon Olewniczak        }
151*ce9be9e9SSzymon Olewniczak        $renderer->doc .= '</ul>';
152*ce9be9e9SSzymon Olewniczak    }
153*ce9be9e9SSzymon Olewniczak}
154