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