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