xref: /plugin/approve/syntax/table.php (revision 4474ed8a8edd55319eb6dd1e4e69fdb09925ebf0)
1b81b1128SSzymon Olewniczak<?php
2b81b1128SSzymon Olewniczak
3b81b1128SSzymon Olewniczakuse dokuwiki\plugin\approve\meta\ApproveConst;
4*4474ed8aSSzymon Olewniczakuse dokuwiki\plugin\approve\meta\PageSearch;
5b81b1128SSzymon Olewniczak
6b81b1128SSzymon Olewniczak// must be run within DokuWiki
7b81b1128SSzymon Olewniczakif(!defined('DOKU_INC')) die();
8b81b1128SSzymon Olewniczak
9b81b1128SSzymon Olewniczak
10b81b1128SSzymon Olewniczakclass syntax_plugin_approve_table extends DokuWiki_Syntax_Plugin {
11b81b1128SSzymon Olewniczak
1299eaf3e2SSzymon Olewniczak    protected $states = [];
1399eaf3e2SSzymon Olewniczak
1499eaf3e2SSzymon Olewniczak    public function __construct() {
1599eaf3e2SSzymon Olewniczak        $this->states = [$this->getConf('sum approved'),
1699eaf3e2SSzymon Olewniczak                         $this->getConf('sum ready for approval'),
1799eaf3e2SSzymon Olewniczak                         $this->getConf('sum draft')];
1899eaf3e2SSzymon Olewniczak    }
19b81b1128SSzymon Olewniczak
20b81b1128SSzymon Olewniczak    function getType() {
21b81b1128SSzymon Olewniczak        return 'substition';
22b81b1128SSzymon Olewniczak    }
23b81b1128SSzymon Olewniczak
24b81b1128SSzymon Olewniczak    function getSort() {
25b81b1128SSzymon Olewniczak        return 20;
26b81b1128SSzymon Olewniczak    }
27b81b1128SSzymon Olewniczak
28b81b1128SSzymon Olewniczak    function PType() {
29b81b1128SSzymon Olewniczak        return 'block';
30b81b1128SSzymon Olewniczak    }
31b81b1128SSzymon Olewniczak
32b81b1128SSzymon Olewniczak    function connectTo($mode) {
33b81b1128SSzymon Olewniczak        $this->Lexer->addSpecialPattern('----+ *approve table *-+\n.*?----+', $mode,'plugin_approve_table');
34b81b1128SSzymon Olewniczak    }
35b81b1128SSzymon Olewniczak
36b81b1128SSzymon Olewniczak    function handle($match, $state, $pos, Doku_Handler $handler){
37b81b1128SSzymon Olewniczak        $lines = explode("\n", $match);
38b81b1128SSzymon Olewniczak        array_shift($lines);
39b81b1128SSzymon Olewniczak        array_pop($lines);
40b81b1128SSzymon Olewniczak
41b81b1128SSzymon Olewniczak        $params = [];
42b81b1128SSzymon Olewniczak        foreach ($lines as $line) {
43b81b1128SSzymon Olewniczak            $pair = explode(':', $line, 2);
44b81b1128SSzymon Olewniczak            if (count($pair) < 2) {
45b81b1128SSzymon Olewniczak                continue;
46b81b1128SSzymon Olewniczak            }
47b81b1128SSzymon Olewniczak            $key = trim($pair[0]);
48b81b1128SSzymon Olewniczak            $value = trim($pair[1]);
49b81b1128SSzymon Olewniczak            if ($key == 'states') {
50b81b1128SSzymon Olewniczak                $value = array_map('trim', explode(',', $value));
51b81b1128SSzymon Olewniczak                //normalize
52b81b1128SSzymon Olewniczak                $value = array_map('strtolower', $value);
53b81b1128SSzymon Olewniczak                $value = array_map('ucfirst', $value);
54b81b1128SSzymon Olewniczak                foreach ($value as $state) {
5599eaf3e2SSzymon Olewniczak                    if (!in_array($state, $this->states)) {
56b81b1128SSzymon Olewniczak                        msg('approve plugin: unknown state "'.$state.'" should be: ' .
5799eaf3e2SSzymon Olewniczak                            implode(', ', $this->states), -1);
58b81b1128SSzymon Olewniczak                        return false;
59b81b1128SSzymon Olewniczak                    }
60b81b1128SSzymon Olewniczak                }
61b81b1128SSzymon Olewniczak            } elseif($key == 'filter' && preg_match($value, null) === false) {
62b81b1128SSzymon Olewniczak                msg('approve plugin: invalid filter regex', -1);
63b81b1128SSzymon Olewniczak                return false;
645f33cda2SSzymon Olewniczak            } elseif ($key == 'summarize') {
655f33cda2SSzymon Olewniczak                $value = $value == '0' ? false : true;
66b81b1128SSzymon Olewniczak            }
67b81b1128SSzymon Olewniczak            $params[$key] = $value;
68b81b1128SSzymon Olewniczak        }
69b81b1128SSzymon Olewniczak        return $params;
70b81b1128SSzymon Olewniczak    }
71b81b1128SSzymon Olewniczak
72b81b1128SSzymon Olewniczak    function render($mode, Doku_Renderer $renderer, $params) {
73b81b1128SSzymon Olewniczak        global $conf;
74b81b1128SSzymon Olewniczak
75b81b1128SSzymon Olewniczak        if ($mode != 'xhtml') return false;
76b81b1128SSzymon Olewniczak        if ($params === false) return false;
77b81b1128SSzymon Olewniczak
78*4474ed8aSSzymon Olewniczak        $pageSearch = new PageSearch();
79*4474ed8aSSzymon Olewniczak
80b81b1128SSzymon Olewniczak        $defaults = [
81b81b1128SSzymon Olewniczak            'namespace' => '',
82b81b1128SSzymon Olewniczak            'filter' => false,
8399eaf3e2SSzymon Olewniczak            'states' => $this->states,
845f33cda2SSzymon Olewniczak            'summarize' => true,
85b81b1128SSzymon Olewniczak        ];
86b81b1128SSzymon Olewniczak
87b81b1128SSzymon Olewniczak        $params = array_replace($defaults, $params);
88b81b1128SSzymon Olewniczak
89b81b1128SSzymon Olewniczak        $namespace = cleanID(getNS($params['namespace'] . ":*"));
90b81b1128SSzymon Olewniczak
91*4474ed8aSSzymon Olewniczak        $pages = $pageSearch->getPagesFromNamespace($namespace, $params['filter'], $params['states']);
92b81b1128SSzymon Olewniczak
93*4474ed8aSSzymon Olewniczak        usort($pages, array($pageSearch, 'pageSorter'));
94b81b1128SSzymon Olewniczak
95b81b1128SSzymon Olewniczak        // Output Table
96b81b1128SSzymon Olewniczak        $renderer->doc .= '<table><tr>';
97b81b1128SSzymon Olewniczak        $renderer->doc .= '<th>' . $this->getLang('hdr_page') . '</th>';
98b81b1128SSzymon Olewniczak        $renderer->doc .= '<th>' . $this->getLang('hdr_state') . '</th>';
99b81b1128SSzymon Olewniczak        $renderer->doc .= '<th>' . $this->getLang('hdr_updated') . '</th>';
100b81b1128SSzymon Olewniczak        $renderer->doc .= '</tr>';
101b81b1128SSzymon Olewniczak
102b81b1128SSzymon Olewniczak
103b81b1128SSzymon Olewniczak        $all_approved = 0;
104b81b1128SSzymon Olewniczak        $all_approved_ready = 0;
105b81b1128SSzymon Olewniczak        $all = 0;
106b81b1128SSzymon Olewniczak
107b81b1128SSzymon Olewniczak        $working_ns = null;
108b81b1128SSzymon Olewniczak        foreach($pages as $page) {
109b81b1128SSzymon Olewniczak            // $page: 0 -> pagename, 1 -> true -> approved else false, 2 -> last changed date
110b81b1128SSzymon Olewniczak            $this_ns = getNS($page[0]);
111b81b1128SSzymon Olewniczak
112b81b1128SSzymon Olewniczak            if($this_ns != $working_ns) {
113b81b1128SSzymon Olewniczak                $name_ns = $this_ns;
114b81b1128SSzymon Olewniczak                if($this_ns == '') { $name_ns = 'root'; }
115b81b1128SSzymon Olewniczak                $renderer->doc .= '<tr><td colspan="3"><a href="';
116b81b1128SSzymon Olewniczak                $renderer->doc .= wl($this_ns . ':' . $this->getConf('start'));
117b81b1128SSzymon Olewniczak                $renderer->doc .= '">';
118b81b1128SSzymon Olewniczak                $renderer->doc .= $name_ns;
119b81b1128SSzymon Olewniczak                $renderer->doc .= '</a> ';
120b81b1128SSzymon Olewniczak                $renderer->doc .= '</td></tr>';
121b81b1128SSzymon Olewniczak                $working_ns = $this_ns;
122b81b1128SSzymon Olewniczak            }
123b81b1128SSzymon Olewniczak
124b81b1128SSzymon Olewniczak            $updated = '<a href="' . wl($page[0]) . '">' . dformat($page[2]) . '</a>';
125b81b1128SSzymon Olewniczak
126b81b1128SSzymon Olewniczak            $class = 'plugin__approve_red';
127b81b1128SSzymon Olewniczak            $state = $this->getLang('draft');
128b81b1128SSzymon Olewniczak            $all += 1;
129b81b1128SSzymon Olewniczak
130b81b1128SSzymon Olewniczak            if ($page[1] === 'approved') {
131b81b1128SSzymon Olewniczak                $class = 'plugin__approve_green';
132b81b1128SSzymon Olewniczak                $state = $this->getLang('approved');
133b81b1128SSzymon Olewniczak                $all_approved += 1;
134b81b1128SSzymon Olewniczak            } elseif ($page[1] === 'ready for approval' && $this->getConf('ready_for_approval') === 1) {
135b81b1128SSzymon Olewniczak                $class = 'plugin__approve_ready';
136b81b1128SSzymon Olewniczak                $state = $this->getLang('marked_approve_ready');
137b81b1128SSzymon Olewniczak                $all_approved_ready += 1;
138b81b1128SSzymon Olewniczak            }
139b81b1128SSzymon Olewniczak
140b81b1128SSzymon Olewniczak            $renderer->doc .= '<tr class="'.$class.'">';
141b81b1128SSzymon Olewniczak            $renderer->doc .= '<td><a href="';
142b81b1128SSzymon Olewniczak            $renderer->doc .= wl($page[0]);
143b81b1128SSzymon Olewniczak            $renderer->doc .= '">';
144b81b1128SSzymon Olewniczak            if ($conf['useheading'] === '1') {
145b81b1128SSzymon Olewniczak                $heading = p_get_first_heading($page[0]);
146b81b1128SSzymon Olewniczak                if ($heading != '') {
147b81b1128SSzymon Olewniczak                    $renderer->doc .= $heading;
148b81b1128SSzymon Olewniczak                } else {
149b81b1128SSzymon Olewniczak                    $renderer->doc .= $page[0];
150b81b1128SSzymon Olewniczak                }
151b81b1128SSzymon Olewniczak
152b81b1128SSzymon Olewniczak            } else {
153b81b1128SSzymon Olewniczak                $renderer->doc .= $page[0];
154b81b1128SSzymon Olewniczak            }
155b81b1128SSzymon Olewniczak
156b81b1128SSzymon Olewniczak            $renderer->doc .= '</a></td><td>';
157b81b1128SSzymon Olewniczak            $renderer->doc .= '<strong>'.$state. '</strong> '. $this->getLang('by'). ' ' . $page[4];
158b81b1128SSzymon Olewniczak            $renderer->doc .= '</td><td>';
159b81b1128SSzymon Olewniczak            $renderer->doc .= $updated;
160b81b1128SSzymon Olewniczak            $renderer->doc .= '</td></tr>';
161b81b1128SSzymon Olewniczak        }
162b81b1128SSzymon Olewniczak
1635f33cda2SSzymon Olewniczak        if ($params['summarize']) {
164b81b1128SSzymon Olewniczak            if($this->getConf('ready_for_approval') === 1) {
165b81b1128SSzymon Olewniczak                $renderer->doc .= '<tr><td><strong>';
166b81b1128SSzymon Olewniczak                $renderer->doc .= $this->getLang('all_approved_ready');
167b81b1128SSzymon Olewniczak                $renderer->doc .= '</strong></td>';
168b81b1128SSzymon Olewniczak
169b81b1128SSzymon Olewniczak                $renderer->doc .= '<td colspan="2">';
170b81b1128SSzymon Olewniczak                $percent       = 0;
171b81b1128SSzymon Olewniczak                if($all > 0) {
172b81b1128SSzymon Olewniczak                    $percent = $all_approved_ready * 100 / $all;
173b81b1128SSzymon Olewniczak                }
174b81b1128SSzymon Olewniczak                $renderer->doc .= $all_approved_ready . ' / ' . $all . sprintf(" (%.0f%%)", $percent);
175b81b1128SSzymon Olewniczak                $renderer->doc .= '</td></tr>';
176b81b1128SSzymon Olewniczak            }
177b81b1128SSzymon Olewniczak
178b81b1128SSzymon Olewniczak            $renderer->doc .= '<tr><td><strong>';
179b81b1128SSzymon Olewniczak            $renderer->doc .= $this->getLang('all_approved');
180b81b1128SSzymon Olewniczak            $renderer->doc .= '</strong></td>';
181b81b1128SSzymon Olewniczak
182b81b1128SSzymon Olewniczak            $renderer->doc .= '<td colspan="2">';
183b81b1128SSzymon Olewniczak            $percent       = 0;
184b81b1128SSzymon Olewniczak            if($all > 0) {
185b81b1128SSzymon Olewniczak                $percent = $all_approved * 100 / $all;
186b81b1128SSzymon Olewniczak            }
187b81b1128SSzymon Olewniczak            $renderer->doc .= $all_approved . ' / ' . $all . sprintf(" (%.0f%%)", $percent);
188b81b1128SSzymon Olewniczak            $renderer->doc .= '</td></tr>';
1895f33cda2SSzymon Olewniczak        }
190b81b1128SSzymon Olewniczak
191b81b1128SSzymon Olewniczak        $renderer->doc .= '</table>';
192b81b1128SSzymon Olewniczak        return true;
193b81b1128SSzymon Olewniczak    }
194b81b1128SSzymon Olewniczak}
195