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 ]; 43 44 foreach ($lines as $line) { 45 $pair = explode(':', $line, 2); 46 if (count($pair) < 2) { 47 continue; 48 } 49 $key = trim($pair[0]); 50 $value = trim($pair[1]); 51 if ($key == 'state') { 52 $states = array_map('trim', explode(',', strtolower($value))); 53 $value = []; 54 foreach ($states as $state) { 55 if (isset($statemap[$state])) { 56 $value = array_merge($value, $statemap[$state]); 57 } else { 58 msg('ireadit plugin: unknown state "'.$state.'" should be: ' . 59 implode(', ', array_keys($statemap)), -1); 60 return false; 61 } 62 } 63 } elseif ($key == 'lastread') { 64 if ($value != '0' && $value != '1') { 65 msg('ireadit plugin: lastread should be 0 or 1', -1); 66 return false; 67 } 68 } 69 $params[$key] = $value; 70 } 71 return $params; 72 } 73 74 /** 75 * Render xhtml output or metadata 76 * 77 * @param string $mode Renderer mode (supported modes: xhtml) 78 * @param Doku_Renderer $renderer The renderer 79 * @param array $data The data from the handler() function 80 * 81 * @return bool If rendering was successful. 82 */ 83 84 public function render($mode, Doku_Renderer $renderer, $data) 85 { 86 $method = 'render' . ucfirst($mode); 87 if (method_exists($this, $method)) { 88 call_user_func([$this, $method], $renderer, $data); 89 return true; 90 } 91 return false; 92 } 93 94 /** 95 * Render metadata 96 * 97 * @param Doku_Renderer $renderer The renderer 98 * @param array $params The data from the handler() function 99 */ 100 public function renderMetadata(Doku_Renderer $renderer, $params) 101 { 102 $renderer->meta['plugin']['ireadit_list'] = []; 103 104 if ($params['user'] == '$USER$') { 105 $renderer->meta['plugin']['ireadit_list']['dynamic_user'] = true; 106 } 107 } 108 109 public function renderXhtml(Doku_Renderer $renderer, $params) 110 { 111 global $INFO; 112 113 try { 114 /** @var \helper_plugin_ireadit_db $db_helper */ 115 $db_helper = plugin_load('helper', 'ireadit_db'); 116 $sqlite = $db_helper->getDB(); 117 } catch (Exception $e) { 118 msg($e->getMessage(), -1); 119 return false; 120 } 121 122 if ($params['user'] == '$USER$') { 123 $params['user'] = $INFO['client']; 124 } 125 126 $user = $params['user']; 127 $q = 'SELECT I.page, I.timestamp, 128 (SELECT T.rev FROM ireadit T 129 WHERE T.page=I.page AND T.user=? AND T.timestamp IS NOT NULL 130 ORDER BY rev DESC LIMIT 1) lastread 131 FROM ireadit I INNER JOIN meta M ON I.page = M.page AND I.rev = M.last_change_date 132 WHERE I.user=?'; 133 $res = $sqlite->query($q, $user, $user); 134 135 // Output List 136 $renderer->doc .= '<ul>'; 137 while ($row = $sqlite->res_fetch_assoc($res)) { 138 $page = $row['page']; 139 $timestamp = $row['timestamp']; 140 $lastread = $row['lastread']; 141 142 if (!$timestamp && $lastread) { 143 $state = 'outdated'; 144 } elseif (!$timestamp && !$lastread) { 145 $state = 'unread'; 146 } else { 147 $state = 'read'; 148 } 149 150 if (!in_array($state, $params['state'])) { 151 continue; 152 } 153 154 $urlParameters = []; 155 if ($params['lastread'] && $state == 'outdated') { 156 $urlParameters['rev'] = $lastread; 157 } 158 $url = wl($page, $urlParameters); 159 $link = '<a class="wikilink1" href="' . $url . '">'; 160 if (useHeading('content')) { 161 $heading = p_get_first_heading($page); 162 if (!blank($heading)) { 163 $link .= $heading; 164 } else { 165 $link .= noNSorNS($page); 166 } 167 } else { 168 $link .= noNSorNS($page); 169 } 170 $link .= '</a>'; 171 $renderer->doc .= '<li class="li">' . $link . '</li>'; 172 } 173 $renderer->doc .= '</ul>'; 174 } 175} 176