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