* @author Gina Häußge */ // must be run within Dokuwiki if (!defined('DOKU_INC')) die(); if (!defined('DOKU_LF')) define('DOKU_LF', "\n"); if (!defined('DOKU_TAB')) define('DOKU_TAB', "\t"); if (!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN', DOKU_INC.'lib/plugins/'); class helper_plugin_pagelist extends DokuWiki_Plugin { /* public */ var $page = NULL; // associative array for page to list // must contain a value to key 'id' // can contain: 'title', 'date', 'user', 'desc', 'comments', // 'tags', 'status' and 'priority' var $style = ''; // table style: 'default', 'table', 'list' var $showheader = false; // show a heading line var $column = array(); // which columns to show var $header = array(); // language strings for table headers var $sort = false; // alphabetical sort of pages by pagename var $rsort = false; // reverse alphabetical sort of pages by pagename var $plugins = array(); // array of plugins to extend the pagelist var $discussion = NULL; // discussion class object var $tag = NULL; // tag class object var $doc = ''; // the final output XHTML string /* private */ var $_meta = NULL; // metadata array for page /** * Constructor gets default preferences * * These can be overriden by plugins using this class */ function __construct() { $this->style = $this->getConf('style'); $this->showheader = $this->getConf('showheader'); $this->showfirsthl = $this->getConf('showfirsthl'); $this->sort = $this->getConf('sort'); $this->rsort = $this->getConf('rsort'); $this->column = array( 'page' => true, 'date' => $this->getConf('showdate'), 'user' => $this->getConf('showuser'), 'desc' => $this->getConf('showdesc'), 'comments' => $this->getConf('showcomments'), 'linkbacks'=> $this->getConf('showlinkbacks'), 'tags' => $this->getConf('showtags'), 'image' => $this->getConf('showimage'), 'diff' => $this->getConf('showdiff'), ); $this->plugins = array( 'discussion' => 'comments', 'linkback' => 'linkbacks', 'tag' => 'tags', 'pageimage' => 'image', ); } function getMethods() { $result = array(); $result[] = array( 'name' => 'addColumn', 'desc' => 'adds an extra column for plugin data', 'params' => array( 'plugin name' => 'string', 'column key' => 'string'), ); $result[] = array( 'name' => 'setFlags', 'desc' => 'overrides standard values for showfooter and firstseconly settings', 'params' => array('flags' => 'array'), 'return' => array('success' => 'boolean'), ); $result[] = array( 'name' => 'startList', 'desc' => 'prepares the table header for the page list', ); $result[] = array( 'name' => 'addPage', 'desc' => 'adds a page to the list', 'params' => array("page attributes, 'id' required, others optional" => 'array'), ); $result[] = array( 'name' => 'finishList', 'desc' => 'returns the XHTML output', 'return' => array('xhtml' => 'string'), ); return $result; } /** * Adds an extra column for plugins */ function addColumn($plugin, $col) { $this->plugins[$plugin] = $col; $this->column[$col] = true; } /** * Overrides standard values for style, showheader and show(column) settings */ function setFlags($flags) { if (!is_array($flags)) return false; $columns = array('date', 'user', 'desc', 'comments', 'linkbacks', 'tags', 'image', 'diff'); foreach ($flags as $flag) { switch ($flag) { case 'default': $this->style = 'default'; break; case 'table': $this->style = 'table'; break; case 'list': $this->style = 'list'; break; case 'simplelist': $this->style = 'simplelist'; // Displays pagenames only, no other information break; case 'header': $this->showheader = true; break; case 'noheader': $this->showheader = false; break; case 'firsthl': $this->showfirsthl = true; break; case 'nofirsthl': $this->showfirsthl = false; break; case 'sort': $this->sort = true; $this->rsort = false; break; case 'rsort': $this->sort = false; $this->rsort = true; break; case 'nosort': $this->sort = false; $this->rsort = false; break; case 'showdiff': $flag = 'diff'; break; } if (substr($flag, 0, 2) == 'no') { $value = false; $flag = substr($flag, 2); } else { $value = true; } if (in_array($flag, $columns)) $this->column[$flag] = $value; } return true; } /** * Sets the list header */ function startList($callerClass=NULL) { // table style switch ($this->style) { case 'table': $class = 'inline'; break; case 'list': $class = 'ul'; break; case 'simplelist': $class = false; break; default: $class = 'pagelist'; } if($class) { if ($callerClass) { $class .= ' '.$callerClass; } $this->doc = '
'.DOKU_LF.''.DOKU_LF; } else { // Simplelist is enabled; Skip header and firsthl $this->showheader = false; $this->showfirsthl = false; //$this->doc .= DOKU_LF.DOKU_TAB.''.DOKU_LF; $this->doc = ''.DOKU_LF.DOKU_TAB.DOKU_TAB; $columns = array('page', 'date', 'user', 'desc', 'diff'); if ($this->column['image']) { if (!$this->header['image']) $this->header['image'] = hsc($this->pageimage->th()); $this->doc .= ''; } foreach ($columns as $col) { if ($this->column[$col]) { if (!$this->header[$col]) $this->header[$col] = hsc($this->getLang($col)); $this->doc .= ''; } } foreach ($this->plugins as $plug => $col) { if ($this->column[$col] && $col != 'image') { if (!$this->header[$col]) $this->header[$col] = hsc($this->$plug->th()); $this->doc .= ''; } } $this->doc .= DOKU_LF.DOKU_TAB.''.DOKU_LF; } return true; } /** * Sets a list row */ function addPage($page) { $id = $page['id']; if (!$id) return false; $this->page = $page; $this->_meta = NULL; if($this->style != 'simplelist') { // priority and draft if (!isset($this->page['draft'])) { $this->page['draft'] = ($this->_getMeta('type') == 'draft'); } $class = ''; if (isset($this->page['priority'])) $class .= 'priority'.$this->page['priority']. ' '; if ($this->page['draft']) $class .= 'draft '; if ($this->page['class']) $class .= $this->page['class']; if(!empty($class)) $class = ' class="' . $class . '"'; $this->doc .= DOKU_TAB.''.DOKU_LF; if ($this->column['image']) $this->_pluginCell('pageimage','image',$id); $this->_pageCell($id); if ($this->column['date']) $this->_dateCell(); if ($this->column['user']) $this->_userCell(); if ($this->column['desc']) $this->_descCell(); if ($this->column['diff']) $this->_diffCell($id); foreach ($this->plugins as $plug => $col) { if ($this->column[$col] && $col != 'image') $this->_pluginCell($plug, $col, $id); } $this->doc .= DOKU_TAB.''.DOKU_LF; } else { $class = ''; // simplelist is enabled; just output pagename $this->doc .= DOKU_TAB . '
  • ' . DOKU_LF; if(page_exists($id)) $class = 'wikilink1'; else $class = 'wikilink2'; if (!$this->page['title']) $this->page['title'] = str_replace('_', ' ', noNS($id)); $title = hsc($this->page['title']); $content = ''.$title.''; $this->doc .= $content; $this->doc .= DOKU_TAB . '
  • ' . DOKU_LF; } return true; } /** * Sets the list footer */ function finishList() { if($this->style != 'simplelist') { if (!isset($this->page)) $this->doc = ''; else $this->doc .= '
    '.$this->header['image'].''.$this->header[$col].''.$this->header[$col].'
    '.DOKU_LF.'
    '.DOKU_LF; } else { $this->doc .= '' . DOKU_LF; } // reset defaults $this->__construct(); return $this->doc; } /* ---------- Private Methods ---------- */ /** * Page title / link to page */ function _pageCell($id) { // check for page existence if (!isset($this->page['exists'])) { if (!isset($this->page['file'])) $this->page['file'] = wikiFN($id); $this->page['exists'] = @file_exists($this->page['file']); } if ($this->page['exists']) $class = 'wikilink1'; else $class = 'wikilink2'; // handle image and text titles if ($this->page['titleimage']) { $title = 'page['title']) $title .= ' title="'.hsc($this->page['title']).'"'. ' alt="'.hsc($this->page['title']).'"'; $title .= ' />'; } else { if($this->showfirsthl) { $this->page['title'] = $this->_getMeta('title'); } else { $this->page['title'] = $id; } if (!$this->page['title']) $this->page['title'] = str_replace('_', ' ', noNS($id)); $title = hsc($this->page['title']); } // produce output $content = ''.$title.''; if ($this->style == 'list') $content = ''; return $this->_printCell('page', $content); } /** * Date - creation or last modification date if not set otherwise */ function _dateCell() { global $conf; if($this->column['date'] == 2) { $this->page['date'] = $this->_getMeta(array('date', 'modified')); } elseif(!$this->page['date'] && $this->page['exists']) { $this->page['date'] = $this->_getMeta(array('date', 'created')); } if ((!$this->page['date']) || (!$this->page['exists'])) { return $this->_printCell('date', ''); } else { return $this->_printCell('date', dformat($this->page['date'], $conf['dformat'])); } } /** * User - page creator or contributors if not set otherwise */ function _userCell() { if (!array_key_exists('user', $this->page)) { if ($this->column['user'] == 2) { $users = $this->_getMeta('contributor'); if (is_array($users)) $this->page['user'] = join(', ', $users); } else { $this->page['user'] = $this->_getMeta('creator'); } } return $this->_printCell('user', hsc($this->page['user'])); } /** * Description - (truncated) auto abstract if not set otherwise */ function _descCell() { if (array_key_exists('desc', $this->page)) { $desc = $this->page['desc']; } elseif (strlen($this->page['description']) > 0) { // This condition will become true, when a page-description is given // inside the syntax-block $desc = $this->page['description']; } else { $desc = $this->_getMeta(array('description', 'abstract')); } $max = $this->column['desc']; if (($max > 1) && (utf8_strlen($desc) > $max)) $desc = utf8_substr($desc, 0, $max).'…'; return $this->_printCell('desc', hsc($desc)); } /** * Diff icon / link to diff page */ function _diffCell($id) { // check for page existence if (!isset($this->page['exists'])) { if (!isset($this->page['file'])) $this->page['file'] = wikiFN($id); $this->page['exists'] = @file_exists($this->page['file']); } // produce output $url_params = array(); $url_params ['do'] = 'diff'; $content = ' '.hsc($this->getLang('diff_alt')).' '; return $this->_printCell('page', $content); } /** * Plugins - respective plugins must be installed! */ function _pluginCell($plug, $col, $id) { if (!isset($this->page[$col])) $this->page[$col] = $this->$plug->td($id); return $this->_printCell($col, $this->page[$col]); } /** * Produce XHTML cell output */ function _printCell($class, $content) { if (!$content) { $content = ' '; $empty = true; } else { $empty = false; } $this->doc .= DOKU_TAB.DOKU_TAB.''.$content.''.DOKU_LF; return (!$empty); } /** * Get default value for an unset element */ function _getMeta($key) { if (!$this->page['exists']) return false; if (!isset($this->_meta)) $this->_meta = p_get_metadata($this->page['id'], '', METADATA_RENDER_USING_CACHE); if (is_array($key)) return $this->_meta[$key[0]][$key[1]]; else return $this->_meta[$key]; } } // vim:ts=4:sw=4:et: