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