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 30824684eaSSzymon Olewniczak $statemap = [ 31824684eaSSzymon Olewniczak 'read' => ['read'], 32824684eaSSzymon Olewniczak 'outdated' => ['outdated'], 33824684eaSSzymon Olewniczak 'unread' => ['unread'], 34824684eaSSzymon Olewniczak 'not read' => ['outdated', 'unread'], 35824684eaSSzymon Olewniczak 'all' => ['read', 'outdated', 'unread'], 36824684eaSSzymon Olewniczak ]; 37824684eaSSzymon Olewniczak 38ce9be9e9SSzymon Olewniczak $params = [ 39ce9be9e9SSzymon Olewniczak 'user' => '$USER$', 40b5c6cf14SSzymon Olewniczak 'state' => $statemap['all'], 41*90e37b17SErik Inge Bolsø 'lastread' => '0', 42*90e37b17SErik Inge Bolsø 'overview' => '0' 43ce9be9e9SSzymon Olewniczak ]; 44ce9be9e9SSzymon Olewniczak 45ce9be9e9SSzymon Olewniczak foreach ($lines as $line) { 46ce9be9e9SSzymon Olewniczak $pair = explode(':', $line, 2); 47ce9be9e9SSzymon Olewniczak if (count($pair) < 2) { 48ce9be9e9SSzymon Olewniczak continue; 49ce9be9e9SSzymon Olewniczak } 50ce9be9e9SSzymon Olewniczak $key = trim($pair[0]); 51ce9be9e9SSzymon Olewniczak $value = trim($pair[1]); 526116c7f6SJan-Philipp Litza if ($key == 'state') { 53c6a33c44SJan-Philipp Litza $states = array_map('trim', explode(',', strtolower($value))); 54c6a33c44SJan-Philipp Litza $value = []; 55c6a33c44SJan-Philipp Litza foreach ($states as $state) { 56c6a33c44SJan-Philipp Litza if (isset($statemap[$state])) { 57b5c6cf14SSzymon Olewniczak $value = array_merge($value, $statemap[$state]); 58c6a33c44SJan-Philipp Litza } else { 59c6a33c44SJan-Philipp Litza msg('ireadit plugin: unknown state "'.$state.'" should be: ' . 60824684eaSSzymon Olewniczak implode(', ', array_keys($statemap)), -1); 61ce9be9e9SSzymon Olewniczak return false; 62ce9be9e9SSzymon Olewniczak } 63ce9be9e9SSzymon Olewniczak } 64b5c6cf14SSzymon Olewniczak } elseif ($key == 'lastread') { 65b5c6cf14SSzymon Olewniczak if ($value != '0' && $value != '1') { 66b5c6cf14SSzymon Olewniczak msg('ireadit plugin: lastread should be 0 or 1', -1); 67b5c6cf14SSzymon Olewniczak return false; 68b5c6cf14SSzymon Olewniczak } 69*90e37b17SErik Inge Bolsø } elseif ($key == 'overview') { 70*90e37b17SErik Inge Bolsø if ($value != '0' && $value != '1') { 71*90e37b17SErik Inge Bolsø msg('ireadit plugin: overview should be 0 or 1', -1); 72*90e37b17SErik Inge Bolsø return false; 73*90e37b17SErik Inge Bolsø } 743b11506fSJan-Philipp Litza } 75ce9be9e9SSzymon Olewniczak $params[$key] = $value; 76ce9be9e9SSzymon Olewniczak } 77ce9be9e9SSzymon Olewniczak return $params; 78ce9be9e9SSzymon Olewniczak } 79ce9be9e9SSzymon Olewniczak 80ce9be9e9SSzymon Olewniczak /** 81ce9be9e9SSzymon Olewniczak * Render xhtml output or metadata 82ce9be9e9SSzymon Olewniczak * 83ce9be9e9SSzymon Olewniczak * @param string $mode Renderer mode (supported modes: xhtml) 84ce9be9e9SSzymon Olewniczak * @param Doku_Renderer $renderer The renderer 85ce9be9e9SSzymon Olewniczak * @param array $data The data from the handler() function 86ce9be9e9SSzymon Olewniczak * 87ce9be9e9SSzymon Olewniczak * @return bool If rendering was successful. 88ce9be9e9SSzymon Olewniczak */ 89ce9be9e9SSzymon Olewniczak 90ce9be9e9SSzymon Olewniczak public function render($mode, Doku_Renderer $renderer, $data) 91ce9be9e9SSzymon Olewniczak { 92ce9be9e9SSzymon Olewniczak $method = 'render' . ucfirst($mode); 93ce9be9e9SSzymon Olewniczak if (method_exists($this, $method)) { 94ce9be9e9SSzymon Olewniczak call_user_func([$this, $method], $renderer, $data); 95ce9be9e9SSzymon Olewniczak return true; 96ce9be9e9SSzymon Olewniczak } 97ce9be9e9SSzymon Olewniczak return false; 98ce9be9e9SSzymon Olewniczak } 99ce9be9e9SSzymon Olewniczak 100ce9be9e9SSzymon Olewniczak /** 101ce9be9e9SSzymon Olewniczak * Render metadata 102ce9be9e9SSzymon Olewniczak * 103ce9be9e9SSzymon Olewniczak * @param Doku_Renderer $renderer The renderer 104ce9be9e9SSzymon Olewniczak * @param array $params The data from the handler() function 105ce9be9e9SSzymon Olewniczak */ 106ce9be9e9SSzymon Olewniczak public function renderMetadata(Doku_Renderer $renderer, $params) 107ce9be9e9SSzymon Olewniczak { 108ce9be9e9SSzymon Olewniczak $renderer->meta['plugin']['ireadit_list'] = []; 109ce9be9e9SSzymon Olewniczak 110ce9be9e9SSzymon Olewniczak if ($params['user'] == '$USER$') { 111ce9be9e9SSzymon Olewniczak $renderer->meta['plugin']['ireadit_list']['dynamic_user'] = true; 112ce9be9e9SSzymon Olewniczak } 113ce9be9e9SSzymon Olewniczak } 114ce9be9e9SSzymon Olewniczak 115ce9be9e9SSzymon Olewniczak public function renderXhtml(Doku_Renderer $renderer, $params) 116ce9be9e9SSzymon Olewniczak { 117ce9be9e9SSzymon Olewniczak global $INFO; 118ce9be9e9SSzymon Olewniczak 119692a1450SSzymon Olewniczak try { 120ce9be9e9SSzymon Olewniczak /** @var \helper_plugin_ireadit_db $db_helper */ 121ce9be9e9SSzymon Olewniczak $db_helper = plugin_load('helper', 'ireadit_db'); 122ce9be9e9SSzymon Olewniczak $sqlite = $db_helper->getDB(); 123692a1450SSzymon Olewniczak } catch (Exception $e) { 124692a1450SSzymon Olewniczak msg($e->getMessage(), -1); 125692a1450SSzymon Olewniczak return false; 126692a1450SSzymon Olewniczak } 127692a1450SSzymon Olewniczak 128ce9be9e9SSzymon Olewniczak if ($params['user'] == '$USER$') { 129ce9be9e9SSzymon Olewniczak $params['user'] = $INFO['client']; 130ce9be9e9SSzymon Olewniczak } 131ce9be9e9SSzymon Olewniczak 132*90e37b17SErik Inge Bolsø if ($params['overview'] == '1') { 133*90e37b17SErik Inge Bolsø $q = 'SELECT I.page, I.timestamp, 134*90e37b17SErik Inge Bolsø (SELECT T.rev FROM ireadit T 135*90e37b17SErik Inge Bolsø WHERE T.page=I.page AND T.timestamp IS NOT NULL 136*90e37b17SErik Inge Bolsø ORDER BY rev DESC LIMIT 1) lastread 137*90e37b17SErik Inge Bolsø FROM ireadit I INNER JOIN meta M ON I.page = M.page AND I.rev = M.last_change_date 138*90e37b17SErik Inge Bolsø '; 139*90e37b17SErik Inge Bolsø $res = $sqlite->query($q); 140*90e37b17SErik Inge Bolsø } else { 141824684eaSSzymon Olewniczak $user = $params['user']; 142824684eaSSzymon Olewniczak $q = 'SELECT I.page, I.timestamp, 143b5c6cf14SSzymon Olewniczak (SELECT T.rev FROM ireadit T 144b5c6cf14SSzymon Olewniczak WHERE T.page=I.page AND T.user=? AND T.timestamp IS NOT NULL 145b5c6cf14SSzymon Olewniczak ORDER BY rev DESC LIMIT 1) lastread 146824684eaSSzymon Olewniczak FROM ireadit I INNER JOIN meta M ON I.page = M.page AND I.rev = M.last_change_date 147824684eaSSzymon Olewniczak WHERE I.user=?'; 148824684eaSSzymon Olewniczak $res = $sqlite->query($q, $user, $user); 149*90e37b17SErik Inge Bolsø } 150ce9be9e9SSzymon Olewniczak 151ce9be9e9SSzymon Olewniczak // Output List 152ce9be9e9SSzymon Olewniczak $renderer->doc .= '<ul>'; 153ce9be9e9SSzymon Olewniczak while ($row = $sqlite->res_fetch_assoc($res)) { 154ce9be9e9SSzymon Olewniczak $page = $row['page']; 155824684eaSSzymon Olewniczak $timestamp = $row['timestamp']; 156b5c6cf14SSzymon Olewniczak $lastread = $row['lastread']; 157824684eaSSzymon Olewniczak 158b5c6cf14SSzymon Olewniczak if (!$timestamp && $lastread) { 1594b5448adSJan-Philipp Litza $state = 'outdated'; 160b5c6cf14SSzymon Olewniczak } elseif (!$timestamp && !$lastread) { 161824684eaSSzymon Olewniczak $state = 'unread'; 162824684eaSSzymon Olewniczak } else { 163824684eaSSzymon Olewniczak $state = 'read'; 1644b5448adSJan-Philipp Litza } 165824684eaSSzymon Olewniczak 166c6a33c44SJan-Philipp Litza if (!in_array($state, $params['state'])) { 1674b5448adSJan-Philipp Litza continue; 1683b11506fSJan-Philipp Litza } 1694b5448adSJan-Philipp Litza 170b5c6cf14SSzymon Olewniczak $urlParameters = []; 171b5c6cf14SSzymon Olewniczak if ($params['lastread'] && $state == 'outdated') { 172b5c6cf14SSzymon Olewniczak $urlParameters['rev'] = $lastread; 173b5c6cf14SSzymon Olewniczak } 174b5c6cf14SSzymon Olewniczak $url = wl($page, $urlParameters); 17526c2d094SJan-Philipp Litza $link = '<a class="wikilink1" href="' . $url . '">'; 176ce9be9e9SSzymon Olewniczak if (useHeading('content')) { 177ce9be9e9SSzymon Olewniczak $heading = p_get_first_heading($page); 178ce9be9e9SSzymon Olewniczak if (!blank($heading)) { 179ce9be9e9SSzymon Olewniczak $link .= $heading; 180ce9be9e9SSzymon Olewniczak } else { 181ce9be9e9SSzymon Olewniczak $link .= noNSorNS($page); 182ce9be9e9SSzymon Olewniczak } 183ce9be9e9SSzymon Olewniczak } else { 184ce9be9e9SSzymon Olewniczak $link .= noNSorNS($page); 185ce9be9e9SSzymon Olewniczak } 186ce9be9e9SSzymon Olewniczak $link .= '</a>'; 18791359560SJan-Philipp Litza $renderer->doc .= '<li class="li">' . $link . '</li>'; 188ce9be9e9SSzymon Olewniczak } 189ce9be9e9SSzymon Olewniczak $renderer->doc .= '</ul>'; 190ce9be9e9SSzymon Olewniczak } 191ce9be9e9SSzymon Olewniczak} 192