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