1ce9be9e9SSzymon Olewniczak<?php 2ce9be9e9SSzymon Olewniczak 3ce9be9e9SSzymon Olewniczak// must be run within DokuWiki 4ce9be9e9SSzymon Olewniczakif(!defined('DOKU_INC')) die(); 5ce9be9e9SSzymon Olewniczak 6ce9be9e9SSzymon Olewniczak 7ce9be9e9SSzymon Olewniczakclass syntax_plugin_ireadit_list extends DokuWiki_Syntax_Plugin { 8ce9be9e9SSzymon Olewniczak 9ce9be9e9SSzymon Olewniczak function getType() { 10ce9be9e9SSzymon Olewniczak return 'substition'; 11ce9be9e9SSzymon Olewniczak } 12ce9be9e9SSzymon Olewniczak 13ce9be9e9SSzymon Olewniczak function getSort() { 14ce9be9e9SSzymon Olewniczak return 20; 15ce9be9e9SSzymon Olewniczak } 16ce9be9e9SSzymon Olewniczak 17ce9be9e9SSzymon Olewniczak function PType() { 18ce9be9e9SSzymon Olewniczak return 'block'; 19ce9be9e9SSzymon Olewniczak } 20ce9be9e9SSzymon Olewniczak 21ce9be9e9SSzymon Olewniczak function connectTo($mode) { 22ce9be9e9SSzymon Olewniczak $this->Lexer->addSpecialPattern('----+ *ireadit list *-+\n.*?----+', $mode,'plugin_ireadit_list'); 23ce9be9e9SSzymon Olewniczak } 24ce9be9e9SSzymon Olewniczak 25ce9be9e9SSzymon Olewniczak function handle($match, $state, $pos, Doku_Handler $handler){ 26ce9be9e9SSzymon Olewniczak $lines = explode("\n", $match); 27ce9be9e9SSzymon Olewniczak array_shift($lines); 28ce9be9e9SSzymon Olewniczak array_pop($lines); 29ce9be9e9SSzymon Olewniczak 30824684eaSSzymon Olewniczak $statemap = [ 31824684eaSSzymon Olewniczak 'read' => ['read'], 32824684eaSSzymon Olewniczak 'outdated' => ['outdated'], 33824684eaSSzymon Olewniczak 'unread' => ['unread'], 34824684eaSSzymon Olewniczak 'not read' => ['outdated', 'unread'], 35824684eaSSzymon Olewniczak 'all' => ['read', 'outdated', 'unread'], 36824684eaSSzymon Olewniczak ]; 37824684eaSSzymon Olewniczak 38ce9be9e9SSzymon Olewniczak $params = [ 39ce9be9e9SSzymon Olewniczak 'user' => '$USER$', 40b5c6cf14SSzymon Olewniczak 'state' => $statemap['all'], 4190e37b17SErik Inge Bolsø 'lastread' => '0', 42dfc7cf29SErik Inge Bolsø 'overview' => '0', 43dfc7cf29SErik Inge Bolsø 'namespace' => '', 44dfc7cf29SErik Inge Bolsø 'filter' => false 45ce9be9e9SSzymon Olewniczak ]; 46ce9be9e9SSzymon Olewniczak 47ce9be9e9SSzymon Olewniczak foreach ($lines as $line) { 48ce9be9e9SSzymon Olewniczak $pair = explode(':', $line, 2); 49ce9be9e9SSzymon Olewniczak if (count($pair) < 2) { 50ce9be9e9SSzymon Olewniczak continue; 51ce9be9e9SSzymon Olewniczak } 52ce9be9e9SSzymon Olewniczak $key = trim($pair[0]); 53ce9be9e9SSzymon Olewniczak $value = trim($pair[1]); 546116c7f6SJan-Philipp Litza if ($key == 'state') { 55c6a33c44SJan-Philipp Litza $states = array_map('trim', explode(',', strtolower($value))); 56c6a33c44SJan-Philipp Litza $value = []; 57c6a33c44SJan-Philipp Litza foreach ($states as $state) { 58c6a33c44SJan-Philipp Litza if (isset($statemap[$state])) { 59b5c6cf14SSzymon Olewniczak $value = array_merge($value, $statemap[$state]); 60c6a33c44SJan-Philipp Litza } else { 61c6a33c44SJan-Philipp Litza msg('ireadit plugin: unknown state "'.$state.'" should be: ' . 62824684eaSSzymon Olewniczak implode(', ', array_keys($statemap)), -1); 63ce9be9e9SSzymon Olewniczak return false; 64ce9be9e9SSzymon Olewniczak } 65ce9be9e9SSzymon Olewniczak } 66dfc7cf29SErik Inge Bolsø } elseif ($key == 'namespace') { 67dfc7cf29SErik Inge Bolsø $value = trim(cleanID($value), ':'); 68dfc7cf29SErik Inge Bolsø } elseif($key == 'filter') { 69dfc7cf29SErik Inge Bolsø $value = trim($value, '/'); 70dfc7cf29SErik Inge Bolsø if (preg_match('/' . $value . '/', null) === false) { 71dfc7cf29SErik Inge Bolsø msg('ireadit plugin: invalid filter regex', -1); 72dfc7cf29SErik Inge Bolsø return false; 73dfc7cf29SErik Inge Bolsø } 74b5c6cf14SSzymon Olewniczak } elseif ($key == 'lastread') { 75b5c6cf14SSzymon Olewniczak if ($value != '0' && $value != '1') { 76b5c6cf14SSzymon Olewniczak msg('ireadit plugin: lastread should be 0 or 1', -1); 77b5c6cf14SSzymon Olewniczak return false; 78b5c6cf14SSzymon Olewniczak } 7990e37b17SErik Inge Bolsø } elseif ($key == 'overview') { 8090e37b17SErik Inge Bolsø if ($value != '0' && $value != '1') { 8190e37b17SErik Inge Bolsø msg('ireadit plugin: overview should be 0 or 1', -1); 8290e37b17SErik Inge Bolsø return false; 8390e37b17SErik Inge Bolsø } 843b11506fSJan-Philipp Litza } 85ce9be9e9SSzymon Olewniczak $params[$key] = $value; 86ce9be9e9SSzymon Olewniczak } 87ce9be9e9SSzymon Olewniczak return $params; 88ce9be9e9SSzymon Olewniczak } 89ce9be9e9SSzymon Olewniczak 90ce9be9e9SSzymon Olewniczak /** 91ce9be9e9SSzymon Olewniczak * Render xhtml output or metadata 92ce9be9e9SSzymon Olewniczak * 93ce9be9e9SSzymon Olewniczak * @param string $mode Renderer mode (supported modes: xhtml) 94ce9be9e9SSzymon Olewniczak * @param Doku_Renderer $renderer The renderer 95ce9be9e9SSzymon Olewniczak * @param array $data The data from the handler() function 96ce9be9e9SSzymon Olewniczak * 97ce9be9e9SSzymon Olewniczak * @return bool If rendering was successful. 98ce9be9e9SSzymon Olewniczak */ 99ce9be9e9SSzymon Olewniczak 100ce9be9e9SSzymon Olewniczak public function render($mode, Doku_Renderer $renderer, $data) 101ce9be9e9SSzymon Olewniczak { 102d2cf7c78SSzymon Olewniczak $method = "render_$mode"; 103ce9be9e9SSzymon Olewniczak if (method_exists($this, $method)) { 104ce9be9e9SSzymon Olewniczak call_user_func([$this, $method], $renderer, $data); 105ce9be9e9SSzymon Olewniczak return true; 106ce9be9e9SSzymon Olewniczak } 107ce9be9e9SSzymon Olewniczak return false; 108ce9be9e9SSzymon Olewniczak } 109ce9be9e9SSzymon Olewniczak 110ce9be9e9SSzymon Olewniczak /** 111ce9be9e9SSzymon Olewniczak * Render metadata 112ce9be9e9SSzymon Olewniczak * 113ce9be9e9SSzymon Olewniczak * @param Doku_Renderer $renderer The renderer 114ce9be9e9SSzymon Olewniczak * @param array $params The data from the handler() function 115ce9be9e9SSzymon Olewniczak */ 116d2cf7c78SSzymon Olewniczak public function render_metadata(Doku_Renderer $renderer, $params) 117ce9be9e9SSzymon Olewniczak { 118d2cf7c78SSzymon Olewniczak $renderer->meta['plugin_ireadit_list'] = true; 119ce9be9e9SSzymon Olewniczak } 120ce9be9e9SSzymon Olewniczak 121d2cf7c78SSzymon Olewniczak public function render_xhtml(Doku_Renderer $renderer, $params) 122ce9be9e9SSzymon Olewniczak { 123ce9be9e9SSzymon Olewniczak global $INFO; 124ce9be9e9SSzymon Olewniczak 125692a1450SSzymon Olewniczak try { 126ce9be9e9SSzymon Olewniczak /** @var \helper_plugin_ireadit_db $db_helper */ 127ce9be9e9SSzymon Olewniczak $db_helper = plugin_load('helper', 'ireadit_db'); 128ce9be9e9SSzymon Olewniczak $sqlite = $db_helper->getDB(); 129692a1450SSzymon Olewniczak } catch (Exception $e) { 130692a1450SSzymon Olewniczak msg($e->getMessage(), -1); 131692a1450SSzymon Olewniczak return false; 132692a1450SSzymon Olewniczak } 133692a1450SSzymon Olewniczak 134d2cf7c78SSzymon Olewniczak //overview overrides user setting 13590e37b17SErik Inge Bolsø if ($params['overview'] == '1') { 136d2cf7c78SSzymon Olewniczak $user = NULL; 137d2cf7c78SSzymon Olewniczak } elseif ($params['user'] == '$USER$') { 138d2cf7c78SSzymon Olewniczak $user = $INFO['client']; 13990e37b17SErik Inge Bolsø } else { 140d2cf7c78SSzymon Olewniczak $user = $params['user']; 14190e37b17SErik Inge Bolsø } 142ce9be9e9SSzymon Olewniczak 143d2cf7c78SSzymon Olewniczak /** @var helper_plugin_ireadit $helper */ 144d2cf7c78SSzymon Olewniczak $helper = $this->loadHelper('ireadit'); 145d2cf7c78SSzymon Olewniczak $pages = $helper->get_list($user); 146d2cf7c78SSzymon Olewniczak 147d2cf7c78SSzymon Olewniczak // apply "filter" and "namespace" 148d2cf7c78SSzymon Olewniczak $pages = array_filter($pages, function ($k) use ($params) { 149d2cf7c78SSzymon Olewniczak return substr($k, 0, strlen($params['namespace'])) == $params['namespace']; 150d2cf7c78SSzymon Olewniczak }, ARRAY_FILTER_USE_KEY); 151d2cf7c78SSzymon Olewniczak $pages = array_filter($pages, function ($k) use ($params) { 152d2cf7c78SSzymon Olewniczak return preg_match('/' . $params['filter'] . '/', $k); 153d2cf7c78SSzymon Olewniczak }, ARRAY_FILTER_USE_KEY); 154d2cf7c78SSzymon Olewniczak 155ce9be9e9SSzymon Olewniczak // Output List 156ce9be9e9SSzymon Olewniczak $renderer->doc .= '<ul>'; 157d2cf7c78SSzymon Olewniczak foreach ($pages as $page => $row) { 158d2cf7c78SSzymon Olewniczak if (!in_array($row['state'], $params['state'])) { 1594b5448adSJan-Philipp Litza continue; 1603b11506fSJan-Philipp Litza } 1614b5448adSJan-Philipp Litza 162b5c6cf14SSzymon Olewniczak $urlParameters = []; 163d2cf7c78SSzymon Olewniczak if ($params['lastread'] && $row['state'] == 'outdated') { 164d2cf7c78SSzymon Olewniczak $urlParameters['rev'] = $row['last_read_rev']; 165*13f6c799SSzymon Olewniczak // in case of approve integration current_rev may be last approved revision 166*13f6c799SSzymon Olewniczak } elseif ($this->getConf('approve_integration') && 167*13f6c799SSzymon Olewniczak $row['current_rev'] != p_get_metadata($page, 'last_change date')) { 168*13f6c799SSzymon Olewniczak $urlParameters['rev'] = $row['current_rev']; 169b5c6cf14SSzymon Olewniczak } 170b5c6cf14SSzymon Olewniczak $url = wl($page, $urlParameters); 17126c2d094SJan-Philipp Litza $link = '<a class="wikilink1" href="' . $url . '">'; 172ce9be9e9SSzymon Olewniczak if (useHeading('content')) { 173ce9be9e9SSzymon Olewniczak $heading = p_get_first_heading($page); 174ce9be9e9SSzymon Olewniczak if (!blank($heading)) { 175ce9be9e9SSzymon Olewniczak $link .= $heading; 176ce9be9e9SSzymon Olewniczak } else { 177ce9be9e9SSzymon Olewniczak $link .= noNSorNS($page); 178ce9be9e9SSzymon Olewniczak } 179ce9be9e9SSzymon Olewniczak } else { 180ce9be9e9SSzymon Olewniczak $link .= noNSorNS($page); 181ce9be9e9SSzymon Olewniczak } 182ce9be9e9SSzymon Olewniczak $link .= '</a>'; 18391359560SJan-Philipp Litza $renderer->doc .= '<li class="li">' . $link . '</li>'; 184ce9be9e9SSzymon Olewniczak } 185ce9be9e9SSzymon Olewniczak $renderer->doc .= '</ul>'; 186d2cf7c78SSzymon Olewniczak 187d2cf7c78SSzymon Olewniczak return true; 188ce9be9e9SSzymon Olewniczak } 189ce9be9e9SSzymon Olewniczak} 190