1ce9be9e9SSzymon Olewniczak<?php 2ce9be9e9SSzymon Olewniczak 3ce9be9e9SSzymon Olewniczak// must be run within DokuWiki 4ce9be9e9SSzymon Olewniczakif(!defined('DOKU_INC')) die(); 5ce9be9e9SSzymon Olewniczak 6ce9be9e9SSzymon Olewniczak 7ce9be9e9SSzymon Olewniczakclass syntax_plugin_ireadit_list extends DokuWiki_Syntax_Plugin { 8ce9be9e9SSzymon Olewniczak 9ce9be9e9SSzymon Olewniczak function getType() { 10ce9be9e9SSzymon Olewniczak return 'substition'; 11ce9be9e9SSzymon Olewniczak } 12ce9be9e9SSzymon Olewniczak 13ce9be9e9SSzymon Olewniczak function getSort() { 14ce9be9e9SSzymon Olewniczak return 20; 15ce9be9e9SSzymon Olewniczak } 16ce9be9e9SSzymon Olewniczak 17ce9be9e9SSzymon Olewniczak function PType() { 18ce9be9e9SSzymon Olewniczak return 'block'; 19ce9be9e9SSzymon Olewniczak } 20ce9be9e9SSzymon Olewniczak 21ce9be9e9SSzymon Olewniczak function connectTo($mode) { 22ce9be9e9SSzymon Olewniczak $this->Lexer->addSpecialPattern('----+ *ireadit list *-+\n.*?----+', $mode,'plugin_ireadit_list'); 23ce9be9e9SSzymon Olewniczak } 24ce9be9e9SSzymon Olewniczak 25ce9be9e9SSzymon Olewniczak function handle($match, $state, $pos, Doku_Handler $handler){ 26ce9be9e9SSzymon Olewniczak $lines = explode("\n", $match); 27ce9be9e9SSzymon Olewniczak array_shift($lines); 28ce9be9e9SSzymon Olewniczak array_pop($lines); 29ce9be9e9SSzymon Olewniczak 30ce9be9e9SSzymon Olewniczak $params = [ 31ce9be9e9SSzymon Olewniczak 'user' => '$USER$', 32ce9be9e9SSzymon Olewniczak 'state' => 'all' 33ce9be9e9SSzymon Olewniczak ]; 34ce9be9e9SSzymon Olewniczak 35ce9be9e9SSzymon Olewniczak foreach ($lines as $line) { 36ce9be9e9SSzymon Olewniczak $pair = explode(':', $line, 2); 37ce9be9e9SSzymon Olewniczak if (count($pair) < 2) { 38ce9be9e9SSzymon Olewniczak continue; 39ce9be9e9SSzymon Olewniczak } 40ce9be9e9SSzymon Olewniczak $key = trim($pair[0]); 41ce9be9e9SSzymon Olewniczak $value = trim($pair[1]); 426116c7f6SJan-Philipp Litza if ($key == 'state') { 434b5448adSJan-Philipp Litza $states = ['read', 'not read', 'outdated', 'all']; 44ce9be9e9SSzymon Olewniczak $value = strtolower($value); 45*3b11506fSJan-Philipp Litza $value = array_map('trim', explode(',', $value)); 46*3b11506fSJan-Philipp Litza foreach ($value as $item) { 47*3b11506fSJan-Philipp Litza if (!in_array($item, $states)) { 48*3b11506fSJan-Philipp Litza msg('ireadit plugin: unknown state "'.$item.'" should be: ' . 49ce9be9e9SSzymon Olewniczak implode(', ', $states), -1); 50ce9be9e9SSzymon Olewniczak return false; 51ce9be9e9SSzymon Olewniczak } 52ce9be9e9SSzymon Olewniczak } 53*3b11506fSJan-Philipp Litza } 54ce9be9e9SSzymon Olewniczak $params[$key] = $value; 55ce9be9e9SSzymon Olewniczak } 56ce9be9e9SSzymon Olewniczak return $params; 57ce9be9e9SSzymon Olewniczak } 58ce9be9e9SSzymon Olewniczak 59ce9be9e9SSzymon Olewniczak /** 60ce9be9e9SSzymon Olewniczak * Render xhtml output or metadata 61ce9be9e9SSzymon Olewniczak * 62ce9be9e9SSzymon Olewniczak * @param string $mode Renderer mode (supported modes: xhtml) 63ce9be9e9SSzymon Olewniczak * @param Doku_Renderer $renderer The renderer 64ce9be9e9SSzymon Olewniczak * @param array $data The data from the handler() function 65ce9be9e9SSzymon Olewniczak * 66ce9be9e9SSzymon Olewniczak * @return bool If rendering was successful. 67ce9be9e9SSzymon Olewniczak */ 68ce9be9e9SSzymon Olewniczak 69ce9be9e9SSzymon Olewniczak public function render($mode, Doku_Renderer $renderer, $data) 70ce9be9e9SSzymon Olewniczak { 71ce9be9e9SSzymon Olewniczak $method = 'render' . ucfirst($mode); 72ce9be9e9SSzymon Olewniczak if (method_exists($this, $method)) { 73ce9be9e9SSzymon Olewniczak call_user_func([$this, $method], $renderer, $data); 74ce9be9e9SSzymon Olewniczak return true; 75ce9be9e9SSzymon Olewniczak } 76ce9be9e9SSzymon Olewniczak return false; 77ce9be9e9SSzymon Olewniczak } 78ce9be9e9SSzymon Olewniczak 79ce9be9e9SSzymon Olewniczak /** 80ce9be9e9SSzymon Olewniczak * Render metadata 81ce9be9e9SSzymon Olewniczak * 82ce9be9e9SSzymon Olewniczak * @param Doku_Renderer $renderer The renderer 83ce9be9e9SSzymon Olewniczak * @param array $params The data from the handler() function 84ce9be9e9SSzymon Olewniczak */ 85ce9be9e9SSzymon Olewniczak public function renderMetadata(Doku_Renderer $renderer, $params) 86ce9be9e9SSzymon Olewniczak { 87ce9be9e9SSzymon Olewniczak $renderer->meta['plugin']['ireadit_list'] = []; 88ce9be9e9SSzymon Olewniczak 89ce9be9e9SSzymon Olewniczak if ($params['user'] == '$USER$') { 90ce9be9e9SSzymon Olewniczak $renderer->meta['plugin']['ireadit_list']['dynamic_user'] = true; 91ce9be9e9SSzymon Olewniczak } 92ce9be9e9SSzymon Olewniczak } 93ce9be9e9SSzymon Olewniczak 94ce9be9e9SSzymon Olewniczak public function renderXhtml(Doku_Renderer $renderer, $params) 95ce9be9e9SSzymon Olewniczak { 96ce9be9e9SSzymon Olewniczak global $INFO; 97ce9be9e9SSzymon Olewniczak 98ce9be9e9SSzymon Olewniczak global $conf; 99ce9be9e9SSzymon Olewniczak /** @var DokuWiki_Auth_Plugin $auth */ 100ce9be9e9SSzymon Olewniczak global $auth; 101ce9be9e9SSzymon Olewniczak 102692a1450SSzymon Olewniczak try { 103ce9be9e9SSzymon Olewniczak /** @var \helper_plugin_ireadit_db $db_helper */ 104ce9be9e9SSzymon Olewniczak $db_helper = plugin_load('helper', 'ireadit_db'); 105ce9be9e9SSzymon Olewniczak $sqlite = $db_helper->getDB(); 106692a1450SSzymon Olewniczak } catch (Exception $e) { 107692a1450SSzymon Olewniczak msg($e->getMessage(), -1); 108692a1450SSzymon Olewniczak return false; 109692a1450SSzymon Olewniczak } 110692a1450SSzymon Olewniczak 111ce9be9e9SSzymon Olewniczak 112ce9be9e9SSzymon Olewniczak if ($params['user'] == '$USER$') { 113ce9be9e9SSzymon Olewniczak $params['user'] = $INFO['client']; 114ce9be9e9SSzymon Olewniczak } 115ce9be9e9SSzymon Olewniczak 116ce9be9e9SSzymon Olewniczak $where_query = []; 117ce9be9e9SSzymon Olewniczak $query_args = []; 118ce9be9e9SSzymon Olewniczak if ($params['user']) { 119ce9be9e9SSzymon Olewniczak $where_query[] = "ireadit.user=?"; 120ce9be9e9SSzymon Olewniczak $query_args[] = $params['user']; 121ce9be9e9SSzymon Olewniczak } 122ce9be9e9SSzymon Olewniczak 1234b5448adSJan-Philipp Litza if($params['state'] == 'not read') { 124ce9be9e9SSzymon Olewniczak $where_query[] = "ireadit.timestamp IS NULL"; 1254b5448adSJan-Philipp Litza } else { 1264b5448adSJan-Philipp Litza $where_query[] = "ireadit.timestamp IS NOT NULL"; 127ce9be9e9SSzymon Olewniczak } 128ce9be9e9SSzymon Olewniczak 129ce9be9e9SSzymon Olewniczak $where_query_string = ''; 130ce9be9e9SSzymon Olewniczak if ($where_query) { 131ce9be9e9SSzymon Olewniczak $where_query_string = 'WHERE ' . implode(' AND ', $where_query); 132ce9be9e9SSzymon Olewniczak } 133ce9be9e9SSzymon Olewniczak 1344b5448adSJan-Philipp Litza $q = "SELECT ireadit.page, MAX(ireadit.rev) AS read_rev, MAX(meta.last_change_date) AS current_rev 135ce9be9e9SSzymon Olewniczak FROM ireadit INNER JOIN meta 1364b5448adSJan-Philipp Litza ON (ireadit.page=meta.page) 137ce9be9e9SSzymon Olewniczak $where_query_string 1384b5448adSJan-Philipp Litza GROUP BY ireadit.page 139ce9be9e9SSzymon Olewniczak ORDER BY ireadit.page"; 140ce9be9e9SSzymon Olewniczak 141ce9be9e9SSzymon Olewniczak $res = $sqlite->query($q, $query_args); 142ce9be9e9SSzymon Olewniczak 143ce9be9e9SSzymon Olewniczak // Output List 144ce9be9e9SSzymon Olewniczak $renderer->doc .= '<ul>'; 145ce9be9e9SSzymon Olewniczak while ($row = $sqlite->res_fetch_assoc($res)) { 146ce9be9e9SSzymon Olewniczak $page = $row['page']; 1474b5448adSJan-Philipp Litza if (!isset($row['read_rev'])) { 1484b5448adSJan-Philipp Litza $state = 'not read'; 1494b5448adSJan-Philipp Litza } elseif ($row['read_rev'] == $row['current_rev']) { 1504b5448adSJan-Philipp Litza $state = 'read'; 1514b5448adSJan-Philipp Litza } else { 1524b5448adSJan-Philipp Litza $state = 'outdated'; 1534b5448adSJan-Philipp Litza } 154*3b11506fSJan-Philipp Litza if (!in_array($state, $params['state']) && !in_array('all', $params['state'])) { 1554b5448adSJan-Philipp Litza continue; 156*3b11506fSJan-Philipp Litza } 1574b5448adSJan-Philipp Litza 15826c2d094SJan-Philipp Litza $url = wl($page); 15926c2d094SJan-Philipp Litza if (isset($row['read_rev'])) { 16026c2d094SJan-Philipp Litza $url .= '?rev=' . $row['read_rev']; 16126c2d094SJan-Philipp Litza } 16226c2d094SJan-Philipp Litza $link = '<a class="wikilink1" href="' . $url . '">'; 163ce9be9e9SSzymon Olewniczak if (useHeading('content')) { 164ce9be9e9SSzymon Olewniczak $heading = p_get_first_heading($page); 165ce9be9e9SSzymon Olewniczak if (!blank($heading)) { 166ce9be9e9SSzymon Olewniczak $link .= $heading; 167ce9be9e9SSzymon Olewniczak } else { 168ce9be9e9SSzymon Olewniczak $link .= noNSorNS($page); 169ce9be9e9SSzymon Olewniczak } 170ce9be9e9SSzymon Olewniczak } else { 171ce9be9e9SSzymon Olewniczak $link .= noNSorNS($page); 172ce9be9e9SSzymon Olewniczak } 173ce9be9e9SSzymon Olewniczak $link .= '</a>'; 174ce9be9e9SSzymon Olewniczak $renderer->doc .= '<div class="li">' . $link . '</div>'; 175ce9be9e9SSzymon Olewniczak } 176ce9be9e9SSzymon Olewniczak $renderer->doc .= '</ul>'; 177ce9be9e9SSzymon Olewniczak } 178ce9be9e9SSzymon Olewniczak} 179