website_jukni/dokuwiki/lib/plugins/pagelist/helper.php
2017-12-29 15:51:59 +01:00

455 lines
16 KiB
PHP

<?php
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
* @author Esther Brunner <wikidesign@gmail.com>
* @author Gina Häußge <osd@foosel.net>
*/
// 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 = '<div class="table">'.DOKU_LF.'<table class="'.$class.'">'.DOKU_LF;
} else {
// Simplelist is enabled; Skip header and firsthl
$this->showheader = false;
$this->showfirsthl = false;
//$this->doc .= DOKU_LF.DOKU_TAB.'</tr>'.DOKU_LF;
$this->doc = '<ul>';
}
$this->page = NULL;
// check if some plugins are available - if yes, load them!
foreach ($this->plugins as $plug => $col) {
if (!$this->column[$col]) continue;
if (plugin_isdisabled($plug) || (!$this->$plug = plugin_load('helper', $plug)))
$this->column[$col] = false;
}
// header row
if ($this->showheader) {
$this->doc .= DOKU_TAB.'<tr>'.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 .= '<th class="images">'.$this->header['image'].'</th>';
}
foreach ($columns as $col) {
if ($this->column[$col]) {
if (!$this->header[$col]) $this->header[$col] = hsc($this->getLang($col));
$this->doc .= '<th class="'.$col.'">'.$this->header[$col].'</th>';
}
}
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 .= '<th class="'.$col.'">'.$this->header[$col].'</th>';
}
}
$this->doc .= DOKU_LF.DOKU_TAB.'</tr>'.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.'<tr'.$class.'>'.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.'</tr>'.DOKU_LF;
} else {
$class = '';
// simplelist is enabled; just output pagename
$this->doc .= DOKU_TAB . '<li>' . 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 = '<a href="'.wl($id).'" class="'.$class.'" title="'.$id.'">'.$title.'</a>';
$this->doc .= $content;
$this->doc .= DOKU_TAB . '</li>' . DOKU_LF;
}
return true;
}
/**
* Sets the list footer
*/
function finishList() {
if($this->style != 'simplelist') {
if (!isset($this->page)) $this->doc = '';
else $this->doc .= '</table>'.DOKU_LF.'</div>'.DOKU_LF;
} else {
$this->doc .= '</ul>' . 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 = '<img src="'.ml($this->page['titleimage']).'" class="media"';
if ($this->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 = '<a href="'.wl($id).($this->page['section'] ? '#'.$this->page['section'] : '').
'" class="'.$class.'" title="'.$id.'">'.$title.'</a>';
if ($this->style == 'list') $content = '<ul><li>'.$content.'</li></ul>';
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 = '<a href="'.wl($id, $url_params).($this->page['section'] ? '#'.$this->page['section'] : '').'" class="diff_link">
<img src="/lib/images/diff.png" width="15" height="11" title="'.hsc($this->getLang('diff_title')).'" alt="'.hsc($this->getLang('diff_alt')).'"/>
</a>';
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 = '&nbsp;';
$empty = true;
} else {
$empty = false;
}
$this->doc .= DOKU_TAB.DOKU_TAB.'<td class="'.$class.'">'.$content.'</td>'.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: