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